diff options
author | Sean Griffin <sean@thoughtbot.com> | 2015-01-27 09:52:54 -0700 |
---|---|---|
committer | Sean Griffin <sean@thoughtbot.com> | 2015-01-27 09:52:54 -0700 |
commit | aac9da257f291ad8d2d4f914528881c240848bb2 (patch) | |
tree | 4ba06fbdc5f8f2d2a533abc7e7b3c0f14ad5d1aa | |
parent | d36a769234911c8374e09069eb054d4c60eb1b99 (diff) | |
download | rails-aac9da257f291ad8d2d4f914528881c240848bb2.tar.gz rails-aac9da257f291ad8d2d4f914528881c240848bb2.tar.bz2 rails-aac9da257f291ad8d2d4f914528881c240848bb2.zip |
Change the interface of `having` to match that of `where`
These two clauses have nearly identical semantics with regards to how
they would be constructed as an AST. It doesn't make sense for their
interfaces to be separate.
-rw-r--r-- | lib/arel/nodes/select_core.rb | 10 | ||||
-rw-r--r-- | lib/arel/nodes/unary.rb | 1 | ||||
-rw-r--r-- | lib/arel/select_manager.rb | 4 | ||||
-rw-r--r-- | lib/arel/visitors/depth_first.rb | 2 | ||||
-rw-r--r-- | lib/arel/visitors/informix.rb | 7 | ||||
-rw-r--r-- | lib/arel/visitors/to_sql.rb | 10 | ||||
-rw-r--r-- | test/nodes/test_select_core.rb | 8 | ||||
-rw-r--r-- | test/test_select_manager.rb | 10 | ||||
-rw-r--r-- | test/visitors/test_depth_first.rb | 5 | ||||
-rw-r--r-- | test/visitors/test_dot.rb | 1 |
10 files changed, 29 insertions, 29 deletions
diff --git a/lib/arel/nodes/select_core.rb b/lib/arel/nodes/select_core.rb index 09ae420aa1..3696dd20af 100644 --- a/lib/arel/nodes/select_core.rb +++ b/lib/arel/nodes/select_core.rb @@ -2,7 +2,7 @@ module Arel module Nodes class SelectCore < Arel::Nodes::Node attr_accessor :top, :projections, :wheres, :groups, :windows - attr_accessor :having, :source, :set_quantifier + attr_accessor :havings, :source, :set_quantifier def initialize super() @@ -14,7 +14,7 @@ module Arel @projections = [] @wheres = [] @groups = [] - @having = nil + @havings = [] @windows = [] end @@ -35,14 +35,14 @@ module Arel @projections = @projections.clone @wheres = @wheres.clone @groups = @groups.clone - @having = @having.clone if @having + @havings = @havings.clone @windows = @windows.clone end def hash [ @source, @top, @set_quantifier, @projections, - @wheres, @groups, @having, @windows + @wheres, @groups, @havings, @windows ].hash end @@ -54,7 +54,7 @@ module Arel self.projections == other.projections && self.wheres == other.wheres && self.groups == other.groups && - self.having == other.having && + self.havings == other.havings && self.windows == other.windows end alias :== :eql? diff --git a/lib/arel/nodes/unary.rb b/lib/arel/nodes/unary.rb index 3d4a4b014a..a0062ff5be 100644 --- a/lib/arel/nodes/unary.rb +++ b/lib/arel/nodes/unary.rb @@ -23,7 +23,6 @@ module Arel %w{ Bin Group - Having Limit Not Offset diff --git a/lib/arel/select_manager.rb b/lib/arel/select_manager.rb index dd1ae37b65..e5fdbc887c 100644 --- a/lib/arel/select_manager.rb +++ b/lib/arel/select_manager.rb @@ -118,8 +118,8 @@ module Arel join(relation, Nodes::OuterJoin) end - def having *exprs - @ctx.having = Nodes::Having.new(collapse(exprs, @ctx.having)) + def having expr + @ctx.havings << expr self end diff --git a/lib/arel/visitors/depth_first.rb b/lib/arel/visitors/depth_first.rb index d7d85cfcc6..22704dd038 100644 --- a/lib/arel/visitors/depth_first.rb +++ b/lib/arel/visitors/depth_first.rb @@ -146,7 +146,7 @@ module Arel visit o.wheres visit o.groups visit o.windows - visit o.having + visit o.havings end def visit_Arel_Nodes_SelectStatement o diff --git a/lib/arel/visitors/informix.rb b/lib/arel/visitors/informix.rb index 7e8a3ea458..c33ef50554 100644 --- a/lib/arel/visitors/informix.rb +++ b/lib/arel/visitors/informix.rb @@ -34,8 +34,13 @@ module Arel collector = inject_join o.groups, collector, ", " end - maybe_visit o.having, collector + if o.havings.any? + collector << " HAVING " + collector = inject_join o.havings, collector, " AND " + end + collector end + def visit_Arel_Nodes_Offset o, collector collector << "SKIP " visit o.expr, collector diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb index acf0a74d37..7dfa86a575 100644 --- a/lib/arel/visitors/to_sql.rb +++ b/lib/arel/visitors/to_sql.rb @@ -265,7 +265,10 @@ module Arel end end - collector = maybe_visit o.having, collector + unless o.havings.empty? + collector << " HAVING " + inject_join o.havings, collector, AND + end unless o.windows.empty? collector << WINDOW @@ -404,11 +407,6 @@ module Arel end end - def visit_Arel_Nodes_Having o, collector - collector << "HAVING " - visit o.expr, collector - end - def visit_Arel_Nodes_Offset o, collector collector << "OFFSET " visit o.expr, collector diff --git a/test/nodes/test_select_core.rb b/test/nodes/test_select_core.rb index ca4f070444..4114bcf4ff 100644 --- a/test/nodes/test_select_core.rb +++ b/test/nodes/test_select_core.rb @@ -34,14 +34,14 @@ module Arel core1.wheres = %w[g h i] core1.groups = %w[j k l] core1.windows = %w[m n o] - core1.having = %w[p q r] + core1.havings = %w[p q r] core2 = SelectCore.new core2.froms = %w[a b c] core2.projections = %w[d e f] core2.wheres = %w[g h i] core2.groups = %w[j k l] core2.windows = %w[m n o] - core2.having = %w[p q r] + core2.havings = %w[p q r] array = [core1, core2] assert_equal 1, array.uniq.size end @@ -53,14 +53,14 @@ module Arel core1.wheres = %w[g h i] core1.groups = %w[j k l] core1.windows = %w[m n o] - core1.having = %w[p q r] + core1.havings = %w[p q r] core2 = SelectCore.new core2.froms = %w[a b c] core2.projections = %w[d e f] core2.wheres = %w[g h i] core2.groups = %w[j k l] core2.windows = %w[m n o] - core2.having = %w[l o l] + core2.havings = %w[l o l] array = [core1, core2] assert_equal 2, array.uniq.size end diff --git a/test/test_select_manager.rb b/test/test_select_manager.rb index 809f0de8df..7192027df4 100644 --- a/test/test_select_manager.rb +++ b/test/test_select_manager.rb @@ -111,22 +111,22 @@ module Arel it 'converts strings to SQLLiterals' do table = Table.new :users mgr = table.from - mgr.having 'foo' + mgr.having Arel.sql('foo') mgr.to_sql.must_be_like %{ SELECT FROM "users" HAVING foo } end it 'can have multiple items specified separately' do table = Table.new :users mgr = table.from - mgr.having 'foo' - mgr.having 'bar' + mgr.having Arel.sql('foo') + mgr.having Arel.sql('bar') mgr.to_sql.must_be_like %{ SELECT FROM "users" HAVING foo AND bar } end - it 'can have multiple items specified together' do + it 'can receive any node' do table = Table.new :users mgr = table.from - mgr.having 'foo', 'bar' + mgr.having Arel::Nodes::And.new([Arel.sql('foo'), Arel.sql('bar')]) mgr.to_sql.must_be_like %{ SELECT FROM "users" HAVING foo AND bar } end end diff --git a/test/visitors/test_depth_first.rb b/test/visitors/test_depth_first.rb index d50ea3e59a..3356759b7d 100644 --- a/test/visitors/test_depth_first.rb +++ b/test/visitors/test_depth_first.rb @@ -30,7 +30,6 @@ module Arel Arel::Nodes::Grouping, Arel::Nodes::Offset, Arel::Nodes::Ordering, - Arel::Nodes::Having, Arel::Nodes::StringJoin, Arel::Nodes::UnqualifiedColumn, Arel::Nodes::Top, @@ -206,7 +205,7 @@ module Arel core.wheres << :c core.groups << :d core.windows << :e - core.having = :f + core.havings << :f @visitor.accept core assert_equal [ @@ -216,7 +215,7 @@ module Arel :c, core.wheres, :d, core.groups, :e, core.windows, - :f, + :f, core.havings, core], @collector.calls end diff --git a/test/visitors/test_dot.rb b/test/visitors/test_dot.rb index 7763350f5c..4dc3c9c6c5 100644 --- a/test/visitors/test_dot.rb +++ b/test/visitors/test_dot.rb @@ -34,7 +34,6 @@ module Arel Arel::Nodes::Grouping, Arel::Nodes::Offset, Arel::Nodes::Ordering, - Arel::Nodes::Having, Arel::Nodes::UnqualifiedColumn, Arel::Nodes::Top, Arel::Nodes::Limit, |