diff options
Diffstat (limited to 'lib/arel')
-rw-r--r-- | lib/arel/attributes/attribute.rb | 4 | ||||
-rw-r--r-- | lib/arel/nodes.rb | 1 | ||||
-rw-r--r-- | lib/arel/nodes/sum.rb | 12 | ||||
-rw-r--r-- | lib/arel/visitors/to_sql.rb | 5 |
4 files changed, 22 insertions, 0 deletions
diff --git a/lib/arel/attributes/attribute.rb b/lib/arel/attributes/attribute.rb index 464d78188a..af9bbdd478 100644 --- a/lib/arel/attributes/attribute.rb +++ b/lib/arel/attributes/attribute.rb @@ -12,6 +12,10 @@ module Arel def count distinct = false Nodes::Count.new [self], distinct end + + def sum + Nodes::Sum.new [self], Nodes::SqlLiteral.new('sum_id') + end end class String < Attribute; end diff --git a/lib/arel/nodes.rb b/lib/arel/nodes.rb index bf7ae830d0..24a71c54a2 100644 --- a/lib/arel/nodes.rb +++ b/lib/arel/nodes.rb @@ -5,6 +5,7 @@ require 'arel/nodes/and' require 'arel/nodes/in' require 'arel/nodes/count' +require 'arel/nodes/sum' require 'arel/nodes/sql_literal' require 'arel/nodes/select_core' require 'arel/nodes/select_statement' diff --git a/lib/arel/nodes/sum.rb b/lib/arel/nodes/sum.rb new file mode 100644 index 0000000000..ecd66aba7a --- /dev/null +++ b/lib/arel/nodes/sum.rb @@ -0,0 +1,12 @@ +module Arel + module Nodes + class Sum + attr_accessor :expressions, :alias + + def initialize expr, aliaz = nil + @expressions = expr + @alias = aliaz + end + end + end +end diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb index f45bbab793..ada8aa6a16 100644 --- a/lib/arel/visitors/to_sql.rb +++ b/lib/arel/visitors/to_sql.rb @@ -69,6 +69,11 @@ module Arel }.join(', ')})#{o.alias ? " AS #{visit o.alias}" : ''}" end + def visit_Arel_Nodes_Sum o + "SUM(#{o.expressions.map { |x| + visit x }.join(', ')})#{o.alias ? " AS #{visit o.alias}" : ''}" + end + def visit_Arel_Nodes_TableAlias o "#{visit o.relation} #{quote_table_name o.name}" end |