aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMohammad Habbab <moh.habbab@gmail.com>2016-05-04 10:15:06 +0800
committerMohammad Habbab <moh.habbab@gmail.com>2016-05-04 12:18:12 +0800
commit76fca40eb0d43a425dde3c3183912b3bc8e02c05 (patch)
tree646f2de4a273fe4b291410910135d09a74132d82 /lib
parentf2ad22320d82021277ab835d4d44bef5e8b61866 (diff)
downloadrails-76fca40eb0d43a425dde3c3183912b3bc8e02c05.tar.gz
rails-76fca40eb0d43a425dde3c3183912b3bc8e02c05.tar.bz2
rails-76fca40eb0d43a425dde3c3183912b3bc8e02c05.zip
Add Support for GroupBy Cube, Rollup and Grouping Set Syntax for PostgreSQL Visitor
Diffstat (limited to 'lib')
-rw-r--r--lib/arel/nodes/unary.rb8
-rw-r--r--lib/arel/visitors/depth_first.rb4
-rw-r--r--lib/arel/visitors/dot.rb4
-rw-r--r--lib/arel/visitors/postgresql.rb36
4 files changed, 50 insertions, 2 deletions
diff --git a/lib/arel/nodes/unary.rb b/lib/arel/nodes/unary.rb
index a0062ff5be..50946980b4 100644
--- a/lib/arel/nodes/unary.rb
+++ b/lib/arel/nodes/unary.rb
@@ -22,15 +22,19 @@ module Arel
%w{
Bin
+ Cube
+ DistinctOn
Group
+ GroupingElement
+ GroupingSet
Limit
+ Lock
Not
Offset
On
Ordering
+ RollUp
Top
- Lock
- DistinctOn
}.each do |name|
const_set(name, Class.new(Unary))
end
diff --git a/lib/arel/visitors/depth_first.rb b/lib/arel/visitors/depth_first.rb
index fb21fb1e70..d38795e640 100644
--- a/lib/arel/visitors/depth_first.rb
+++ b/lib/arel/visitors/depth_first.rb
@@ -18,6 +18,10 @@ module Arel
end
alias :visit_Arel_Nodes_Else :unary
alias :visit_Arel_Nodes_Group :unary
+ alias :visit_Arel_Nodes_Cube :unary
+ alias :visit_Arel_Nodes_RollUp :unary
+ alias :visit_Arel_Nodes_GroupingSet :unary
+ alias :visit_Arel_Nodes_GroupingElement :unary
alias :visit_Arel_Nodes_Grouping :unary
alias :visit_Arel_Nodes_Having :unary
alias :visit_Arel_Nodes_Limit :unary
diff --git a/lib/arel/visitors/dot.rb b/lib/arel/visitors/dot.rb
index da75423523..95da652278 100644
--- a/lib/arel/visitors/dot.rb
+++ b/lib/arel/visitors/dot.rb
@@ -69,6 +69,10 @@ module Arel
visit_edge o, "expr"
end
alias :visit_Arel_Nodes_Group :unary
+ alias :visit_Arel_Nodes_Cube :unary
+ alias :visit_Arel_Nodes_RollUp :unary
+ alias :visit_Arel_Nodes_GroupingSet :unary
+ alias :visit_Arel_Nodes_GroupingElement :unary
alias :visit_Arel_Nodes_Grouping :unary
alias :visit_Arel_Nodes_Having :unary
alias :visit_Arel_Nodes_Limit :unary
diff --git a/lib/arel/visitors/postgresql.rb b/lib/arel/visitors/postgresql.rb
index 1ef0261bdd..ef0f0ea2ef 100644
--- a/lib/arel/visitors/postgresql.rb
+++ b/lib/arel/visitors/postgresql.rb
@@ -1,6 +1,10 @@
module Arel
module Visitors
class PostgreSQL < Arel::Visitors::ToSql
+ CUBE = 'CUBE'
+ ROLLUP = 'ROLLUP'
+ GROUPING_SET = 'GROUPING SET'
+
private
def visit_Arel_Nodes_Matches o, collector
@@ -43,6 +47,38 @@ module Arel
def visit_Arel_Nodes_BindParam o, collector
collector.add_bind(o) { |i| "$#{i}" }
end
+
+ def visit_Arel_Nodes_GroupingElement o, collector
+ collector << "( "
+ visit(o.expr, collector) << " )"
+ end
+
+ def visit_Arel_Nodes_Cube o, collector
+ collector << CUBE
+ grouping_array_or_grouping_element o, collector
+ end
+
+ def visit_Arel_Nodes_RollUp o, collector
+ collector << ROLLUP
+ grouping_array_or_grouping_element o, collector
+ end
+
+ def visit_Arel_Nodes_GroupingSet o, collector
+ collector << GROUPING_SET
+ grouping_array_or_grouping_element o, collector
+ end
+
+ # Utilized by GroupingSet, Cube & RollUp visitors to
+ # handle grouping aggregation semantics
+ def grouping_array_or_grouping_element o, collector
+ if o.expr.is_a? Array
+ collector << "( "
+ visit o.expr, collector
+ collector << " )"
+ else
+ visit o.expr, collector
+ end
+ end
end
end
end