diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/active_relation.rb | 3 | ||||
-rw-r--r-- | lib/active_relation/primitives.rb | 3 | ||||
-rw-r--r-- | lib/active_relation/primitives/aggregation.rb | 21 | ||||
-rw-r--r-- | lib/active_relation/primitives/attribute.rb (renamed from lib/active_relation/relations/attribute.rb) | 43 | ||||
-rw-r--r-- | lib/active_relation/relations.rb | 1 | ||||
-rw-r--r-- | lib/active_relation/relations/table.rb | 2 |
6 files changed, 61 insertions, 12 deletions
diff --git a/lib/active_relation.rb b/lib/active_relation.rb index cdac17facb..0b55ed74d0 100644 --- a/lib/active_relation.rb +++ b/lib/active_relation.rb @@ -6,5 +6,6 @@ require 'activerecord' require 'active_relation/sql_builder' require 'active_relation/extensions' +require 'active_relation/predicates' require 'active_relation/relations' -require 'active_relation/predicates'
\ No newline at end of file +require 'active_relation/primitives'
\ No newline at end of file diff --git a/lib/active_relation/primitives.rb b/lib/active_relation/primitives.rb new file mode 100644 index 0000000000..5d35f42564 --- /dev/null +++ b/lib/active_relation/primitives.rb @@ -0,0 +1,3 @@ +require 'active_relation/primitives/attribute' +require 'active_relation/primitives/aggregation' + diff --git a/lib/active_relation/primitives/aggregation.rb b/lib/active_relation/primitives/aggregation.rb new file mode 100644 index 0000000000..20fdcf46c5 --- /dev/null +++ b/lib/active_relation/primitives/aggregation.rb @@ -0,0 +1,21 @@ +module ActiveRelation + module Primitives + class Aggregation + include SqlBuilder + + attr_reader :attribute, :function_sql + + def initialize(attribute, function_sql) + @attribute, @function_sql = attribute, function_sql + end + + def to_sql(options = {}) + "#{function_sql}(@attribute.to_sql)" + end + + def ==(other) + self.class == other.class and attribute == other.attribute and function_sql == other.function_sql + end + end + end +end
\ No newline at end of file diff --git a/lib/active_relation/relations/attribute.rb b/lib/active_relation/primitives/attribute.rb index 2fe702cb14..65ae12cf36 100644 --- a/lib/active_relation/relations/attribute.rb +++ b/lib/active_relation/primitives/attribute.rb @@ -1,7 +1,7 @@ module ActiveRelation module Primitives class Attribute - include ::ActiveRelation::SqlBuilder + include SqlBuilder attr_reader :relation, :name, :alias @@ -10,7 +10,7 @@ module ActiveRelation end def alias(aliaz = nil) - aliaz ? ActiveRelation::Primitives::Attribute.new(relation, name, aliaz) : @alias + aliaz ? Attribute.new(relation, name, aliaz) : @alias end def qualified_name @@ -25,32 +25,57 @@ module ActiveRelation relation == other.relation and name == other.name and @alias == other.alias end - module Predications + module Predications + include Predicates + def equals(other) - Predicates::Equality.new(self, other) + Equality.new(self, other) end def less_than(other) - Predicates::LessThan.new(self, other) + LessThan.new(self, other) end def less_than_or_equal_to(other) - Predicates::LessThanOrEqualTo.new(self, other) + LessThanOrEqualTo.new(self, other) end def greater_than(other) - Predicates::GreaterThan.new(self, other) + GreaterThan.new(self, other) end def greater_than_or_equal_to(other) - Predicates::GreaterThanOrEqualTo.new(self, other) + GreaterThanOrEqualTo.new(self, other) end def matches(regexp) - Predicates::Match.new(self, regexp) + Match.new(self, regexp) end end include Predications + + module Aggregations + def count + Aggregation.new(self, "COUNT") + end + + def sum + Aggregation.new(self, "SUM") + end + + def maximum + Aggregation.new(self, "MAX") + end + + def minimum + Aggregation.new(self, "MIN") + end + + def average + Aggregation.new(self, "AVG") + end + end + include Aggregations def to_sql(options = {}) "#{quote_table_name(relation.table)}.#{quote_column_name(name)}" + (options[:use_alias] && self.alias ? " AS #{self.alias.to_s.to_sql}" : "") diff --git a/lib/active_relation/relations.rb b/lib/active_relation/relations.rb index f7d1bc207a..a25e82f607 100644 --- a/lib/active_relation/relations.rb +++ b/lib/active_relation/relations.rb @@ -2,7 +2,6 @@ require 'active_relation/relations/base' require 'active_relation/relations/compound' require 'active_relation/relations/table' require 'active_relation/relations/join' -require 'active_relation/relations/attribute' require 'active_relation/relations/projection' require 'active_relation/relations/selection' require 'active_relation/relations/order' diff --git a/lib/active_relation/relations/table.rb b/lib/active_relation/relations/table.rb index 38f540cc52..d642851687 100644 --- a/lib/active_relation/relations/table.rb +++ b/lib/active_relation/relations/table.rb @@ -23,7 +23,7 @@ module ActiveRelation private def attributes_by_name @attributes_by_name ||= connection.columns(table, "#{table} Columns").inject({}) do |attributes_by_name, column| - attributes_by_name.merge(column.name => ActiveRelation::Primitives::Attribute.new(self, column.name.to_sym)) + attributes_by_name.merge(column.name => Primitives::Attribute.new(self, column.name.to_sym)) end end |