From a3b8ef8375056cd3b6a8cea49dec671f2a8f6c41 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Sun, 22 Aug 2010 18:13:39 -0700 Subject: orders are working --- lib/arel/nodes/select_statement.rb | 7 ++++--- lib/arel/select_manager.rb | 5 +++++ lib/arel/visitors/to_sql.rb | 1 + spec/arel/nodes/insert_statement_spec.rb | 4 ++-- spec/arel/nodes/select_core_spec.rb | 8 ++++---- spec/arel/nodes/update_statement_spec.rb | 4 ++-- spec/arel/select_manager_spec.rb | 31 +++++++++++++++++++++++++++++++ 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 -- cgit v1.2.3