diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/arel/attributes/attribute.rb | 4 | ||||
-rw-r--r-- | lib/arel/nodes.rb | 1 | ||||
-rw-r--r-- | lib/arel/nodes/max.rb | 22 | ||||
-rw-r--r-- | lib/arel/visitors/to_sql.rb | 5 |
4 files changed, 32 insertions, 0 deletions
diff --git a/lib/arel/attributes/attribute.rb b/lib/arel/attributes/attribute.rb index af9bbdd478..bb85af4634 100644 --- a/lib/arel/attributes/attribute.rb +++ b/lib/arel/attributes/attribute.rb @@ -16,6 +16,10 @@ module Arel def sum Nodes::Sum.new [self], Nodes::SqlLiteral.new('sum_id') end + + def maximum + Nodes::Max.new [self], Nodes::SqlLiteral.new('max_id') + end end class String < Attribute; end diff --git a/lib/arel/nodes.rb b/lib/arel/nodes.rb index 24a71c54a2..28b9e61fb6 100644 --- a/lib/arel/nodes.rb +++ b/lib/arel/nodes.rb @@ -6,6 +6,7 @@ require 'arel/nodes/and' require 'arel/nodes/in' require 'arel/nodes/count' require 'arel/nodes/sum' +require 'arel/nodes/max' require 'arel/nodes/sql_literal' require 'arel/nodes/select_core' require 'arel/nodes/select_statement' diff --git a/lib/arel/nodes/max.rb b/lib/arel/nodes/max.rb new file mode 100644 index 0000000000..1766c56058 --- /dev/null +++ b/lib/arel/nodes/max.rb @@ -0,0 +1,22 @@ +module Arel + module Nodes + class Max + attr_accessor :expressions, :alias + + def initialize expr, aliaz = nil + @expressions = expr + @alias = aliaz + end + + def as aliaz + self.alias = SqlLiteral.new(aliaz) + self + end + + def to_sql + viz = Visitors::ToSql.new Table.engine + viz.accept self + end + end + end +end diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb index 2a96444d59..e1cf0f3778 100644 --- a/lib/arel/visitors/to_sql.rb +++ b/lib/arel/visitors/to_sql.rb @@ -76,6 +76,11 @@ module Arel visit x }.join(', ')})#{o.alias ? " AS #{visit o.alias}" : ''}" end + def visit_Arel_Nodes_Max o + "MAX(#{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 |