aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/arel/nodes/select_statement.rb7
-rw-r--r--lib/arel/select_manager.rb5
-rw-r--r--lib/arel/visitors/to_sql.rb1
-rw-r--r--spec/arel/nodes/insert_statement_spec.rb4
-rw-r--r--spec/arel/nodes/select_core_spec.rb8
-rw-r--r--spec/arel/nodes/update_statement_spec.rb4
-rw-r--r--spec/arel/select_manager_spec.rb31
7 files changed, 49 insertions, 11 deletions
diff --git a/lib/arel/nodes/select_statement.rb b/lib/arel/nodes/select_statement.rb
index 50fef776f6..d00a079dc3 100644
--- a/lib/arel/nodes/select_statement.rb
+++ b/lib/arel/nodes/select_statement.rb
@@ -2,11 +2,12 @@ module Arel
module Nodes
class SelectStatement
attr_reader :cores
- attr_accessor :limit
+ attr_accessor :limit, :orders
def initialize cores = [SelectCore.new]
- @cores = cores
- @limit = nil
+ @cores = cores
+ @orders = []
+ @limit = nil
end
def initialize_copy other
diff --git a/lib/arel/select_manager.rb b/lib/arel/select_manager.rb
index 462b0765a5..3d6aef0745 100644
--- a/lib/arel/select_manager.rb
+++ b/lib/arel/select_manager.rb
@@ -28,6 +28,11 @@ module Arel
self
end
+ def order *expr
+ @head.orders.concat expr
+ self
+ end
+
def wheres
Compatibility::Wheres.new @engine, @ctx.wheres
end
diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb
index 401bdb3255..55ed53177e 100644
--- a/lib/arel/visitors/to_sql.rb
+++ b/lib/arel/visitors/to_sql.rb
@@ -45,6 +45,7 @@ module Arel
def visit_Arel_Nodes_SelectStatement o
[
o.cores.map { |x| visit x }.join,
+ ("ORDER BY #{o.orders.map { |x| visit x }.join(', ')}" unless o.orders.empty?),
("LIMIT #{o.limit}" if o.limit)
].compact.join ' '
end
diff --git a/spec/arel/nodes/insert_statement_spec.rb b/spec/arel/nodes/insert_statement_spec.rb
index 644e3fb192..286a44130c 100644
--- a/spec/arel/nodes/insert_statement_spec.rb
+++ b/spec/arel/nodes/insert_statement_spec.rb
@@ -15,8 +15,8 @@ describe Arel::Nodes::InsertStatement do
end
dolly = statement.clone
- dolly.columns.should == %w[a0 b1 c2]
- dolly.values.should == %w[x0 y1 z2]
+ check dolly.columns.should == %w[a0 b1 c2]
+ check dolly.values.should == %w[x0 y1 z2]
end
end
end
diff --git a/spec/arel/nodes/select_core_spec.rb b/spec/arel/nodes/select_core_spec.rb
index cf717a3904..30927abea6 100644
--- a/spec/arel/nodes/select_core_spec.rb
+++ b/spec/arel/nodes/select_core_spec.rb
@@ -13,11 +13,11 @@ describe Arel::Nodes::SelectCore do
o.should_receive(:clone).and_return("#{o}#{j}")
end
end
-
+
dolly = core.clone
- dolly.froms.should == %w[a0 b1 c2]
- dolly.projections.should == %w[d0 e1 f2]
- dolly.wheres.should == %w[g0 h1 i2]
+ check dolly.froms.should == %w[a0 b1 c2]
+ check dolly.projections.should == %w[d0 e1 f2]
+ check dolly.wheres.should == %w[g0 h1 i2]
end
end
end
diff --git a/spec/arel/nodes/update_statement_spec.rb b/spec/arel/nodes/update_statement_spec.rb
index 8cbca1fd73..3d425e2843 100644
--- a/spec/arel/nodes/update_statement_spec.rb
+++ b/spec/arel/nodes/update_statement_spec.rb
@@ -15,8 +15,8 @@ describe Arel::Nodes::UpdateStatement do
end
dolly = statement.clone
- dolly.wheres.should == %w[a0 b1 c2]
- dolly.values.should == %w[x0 y1 z2]
+ check dolly.wheres.should == %w[a0 b1 c2]
+ check dolly.values.should == %w[x0 y1 z2]
end
end
end
diff --git a/spec/arel/select_manager_spec.rb b/spec/arel/select_manager_spec.rb
index bf4ce2e13f..c29754cb55 100644
--- a/spec/arel/select_manager_spec.rb
+++ b/spec/arel/select_manager_spec.rb
@@ -23,6 +23,37 @@ module Arel
end
describe 'select manager' do
+ describe 'order' do
+ it 'generates order clauses' do
+ table = Table.new :users
+ manager = Arel::SelectManager.new Table.engine
+ manager.project SqlLiteral.new '*'
+ manager.from table
+ manager.order table[:id]
+ manager.to_sql.should be_like %{
+ SELECT * FROM "users" ORDER BY "users"."id"
+ }
+ end
+
+ # FIXME: I would like to deprecate this
+ it 'takes *args' do
+ table = Table.new :users
+ manager = Arel::SelectManager.new Table.engine
+ manager.project SqlLiteral.new '*'
+ manager.from table
+ manager.order table[:id], table[:name]
+ manager.to_sql.should be_like %{
+ SELECT * FROM "users" ORDER BY "users"."id", "users"."name"
+ }
+ end
+
+ it 'chains' do
+ table = Table.new :users
+ manager = Arel::SelectManager.new Table.engine
+ check manager.order(table[:id]).should == manager
+ end
+ end
+
describe 'joins' do
it 'returns join sql' do
table = Table.new :users