diff options
Diffstat (limited to 'lib/arel')
-rw-r--r-- | lib/arel/nodes.rb | 1 | ||||
-rw-r--r-- | lib/arel/nodes/count.rb | 3 | ||||
-rw-r--r-- | lib/arel/nodes/function.rb | 3 | ||||
-rw-r--r-- | lib/arel/nodes/named_function.rb | 12 | ||||
-rw-r--r-- | lib/arel/visitors/depth_first.rb | 8 | ||||
-rw-r--r-- | lib/arel/visitors/dot.rb | 25 | ||||
-rw-r--r-- | lib/arel/visitors/to_sql.rb | 6 |
7 files changed, 47 insertions, 11 deletions
diff --git a/lib/arel/nodes.rb b/lib/arel/nodes.rb index c43134bb50..64f2cc13fd 100644 --- a/lib/arel/nodes.rb +++ b/lib/arel/nodes.rb @@ -28,6 +28,7 @@ require 'arel/nodes/and' require 'arel/nodes/function' require 'arel/nodes/count' require 'arel/nodes/values' +require 'arel/nodes/named_function' # joins require 'arel/nodes/inner_join' diff --git a/lib/arel/nodes/count.rb b/lib/arel/nodes/count.rb index c6e19afb34..5c8ade1cf9 100644 --- a/lib/arel/nodes/count.rb +++ b/lib/arel/nodes/count.rb @@ -1,9 +1,6 @@ module Arel module Nodes class Count < Arel::Nodes::Function - - attr_accessor :distinct - def initialize expr, distinct = false, aliaz = nil super(expr, aliaz) @distinct = distinct diff --git a/lib/arel/nodes/function.rb b/lib/arel/nodes/function.rb index e4e45bff31..b58eba7f38 100644 --- a/lib/arel/nodes/function.rb +++ b/lib/arel/nodes/function.rb @@ -2,11 +2,12 @@ module Arel module Nodes class Function < Arel::Nodes::Node include Arel::Expression - attr_accessor :expressions, :alias + attr_accessor :expressions, :alias, :distinct def initialize expr, aliaz = nil @expressions = expr @alias = aliaz + @distinct = false end def as aliaz diff --git a/lib/arel/nodes/named_function.rb b/lib/arel/nodes/named_function.rb new file mode 100644 index 0000000000..56669bf858 --- /dev/null +++ b/lib/arel/nodes/named_function.rb @@ -0,0 +1,12 @@ +module Arel + module Nodes + class NamedFunction < Arel::Nodes::Function + attr_accessor :name + + def initialize name, expr, aliaz = nil + super(expr, aliaz) + @name = name + end + end + end +end diff --git a/lib/arel/visitors/depth_first.rb b/lib/arel/visitors/depth_first.rb index ed95cad472..914b2d1999 100644 --- a/lib/arel/visitors/depth_first.rb +++ b/lib/arel/visitors/depth_first.rb @@ -28,6 +28,7 @@ module Arel def function o visit o.expressions visit o.alias + visit o.distinct end alias :visit_Arel_Nodes_Avg :function alias :visit_Arel_Nodes_Exists :function @@ -35,6 +36,13 @@ module Arel alias :visit_Arel_Nodes_Min :function alias :visit_Arel_Nodes_Sum :function + def visit_Arel_Nodes_NamedFunction o + visit o.name + visit o.expressions + visit o.distinct + visit o.alias + end + def visit_Arel_Nodes_Count o visit o.expressions visit o.alias diff --git a/lib/arel/visitors/dot.rb b/lib/arel/visitors/dot.rb index 3c4fe12d1f..92d05c7b67 100644 --- a/lib/arel/visitors/dot.rb +++ b/lib/arel/visitors/dot.rb @@ -38,13 +38,6 @@ module Arel visit_edge o, "relation" end - def visit_Arel_Nodes_Sum o - visit_edge o, "expressions" - visit_edge o, "alias" - end - alias :visit_Arel_Nodes_Max :visit_Arel_Nodes_Sum - alias :visit_Arel_Nodes_Avg :visit_Arel_Nodes_Sum - def visit_Arel_Nodes_Count o visit_edge o, "expressions" visit_edge o, "distinct" @@ -82,6 +75,24 @@ module Arel alias :visit_Arel_Nodes_Top :unary alias :visit_Arel_Nodes_UnqualifiedColumn :unary + def function o + visit_edge o, "expressions" + visit_edge o, "distinct" + visit_edge o, "alias" + end + alias :visit_Arel_Nodes_Exists :function + alias :visit_Arel_Nodes_Min :function + alias :visit_Arel_Nodes_Max :function + alias :visit_Arel_Nodes_Avg :function + alias :visit_Arel_Nodes_Sum :function + + def visit_Arel_Nodes_NamedFunction o + visit_edge o, "name" + visit_edge o, "expressions" + visit_edge o, "distinct" + visit_edge o, "alias" + end + def visit_Arel_Nodes_InsertStatement o visit_edge o, "relation" visit_edge o, "columns" diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb index 4eae5a9ae5..d5534384f8 100644 --- a/lib/arel/visitors/to_sql.rb +++ b/lib/arel/visitors/to_sql.rb @@ -183,6 +183,12 @@ eowarn visit o.expr end + def visit_Arel_Nodes_NamedFunction o + "#{o.name}(#{o.distinct ? 'DISTINCT ' : ''}#{o.expressions.map { |x| + visit x + }.join(', ')})#{o.alias ? " AS #{visit o.alias}" : ''}" + end + def visit_Arel_Nodes_Count o "COUNT(#{o.distinct ? 'DISTINCT ' : ''}#{o.expressions.map { |x| visit x |