aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/arel/nodes/select_core.rb10
-rw-r--r--lib/arel/nodes/unary.rb1
-rw-r--r--lib/arel/select_manager.rb4
-rw-r--r--lib/arel/visitors/depth_first.rb2
-rw-r--r--lib/arel/visitors/informix.rb7
-rw-r--r--lib/arel/visitors/to_sql.rb10
-rw-r--r--test/nodes/test_select_core.rb8
-rw-r--r--test/test_select_manager.rb10
-rw-r--r--test/visitors/test_depth_first.rb5
-rw-r--r--test/visitors/test_dot.rb1
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,