Module: DataMapper::AggregateFunctions
- Included in:
- Collection, Model
- Defined in:
- lib/gems/dm-aggregates-0.9.9/lib/dm-aggregates/aggregate_functions.rb
Instance Method Summary collapse
-
#aggregate(*args) ⇒ Array, ...
Perform aggregate queries.
-
#avg(*args) ⇒ Integer
Get the average value of a property.
-
#count(*args) ⇒ Integer
Count results (given the conditions).
-
#max(*args) ⇒ Integer
Get the highest value of a property.
-
#min(*args) ⇒ Integer
Get the lowest value of a property.
-
#sum(*args) ⇒ Integer
Get the total value of a property.
Instance Method Details
#aggregate(*args) ⇒ Array, ...
Perform aggregate queries
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
# File 'lib/gems/dm-aggregates-0.9.9/lib/dm-aggregates/aggregate_functions.rb', line 150 def aggregate(*args) query = args.last.kind_of?(Hash) ? args.pop : {} query[:fields] ||= [] query[:fields] |= args query[:fields].map! { |f| normalize_field(f) } query[:order] ||= query[:fields].select { |p| p.kind_of?(Property) } raise ArgumentError, 'query[:fields] must not be empty' if query[:fields].empty? query = scoped_query(query) if query.fields.any? { |p| p.kind_of?(Property) } # explicitly specify the fields to circumvent a bug in Query#update query.repository.aggregate(query.update(:fields => query.fields, :unique => true)) else query.repository.aggregate(query).first # only return one row end end |
#avg(*args) ⇒ Integer
Get the average value of a property
100 101 102 103 104 105 106 107 |
# File 'lib/gems/dm-aggregates-0.9.9/lib/dm-aggregates/aggregate_functions.rb', line 100 def avg(*args) query = args.last.kind_of?(Hash) ? args.pop : {} property_name = args.first assert_property_type property_name, Integer, Float, BigDecimal aggregate(query.merge(:fields => [ property_name.avg ])) end |
#count(*args) ⇒ Integer
Count results (given the conditions)
29 30 31 32 33 34 35 36 37 38 |
# File 'lib/gems/dm-aggregates-0.9.9/lib/dm-aggregates/aggregate_functions.rb', line 29 def count(*args) query = args.last.kind_of?(Hash) ? args.pop : {} property_name = args.first if property_name assert_kind_of 'property', property_by_name(property_name), Property end aggregate(query.merge(:fields => [ property_name ? property_name.count : :all.count ])) end |
#max(*args) ⇒ Integer
Get the highest value of a property
77 78 79 80 81 82 83 84 |
# File 'lib/gems/dm-aggregates-0.9.9/lib/dm-aggregates/aggregate_functions.rb', line 77 def max(*args) query = args.last.kind_of?(Hash) ? args.pop : {} property_name = args.first assert_property_type property_name, Integer, Float, BigDecimal, DateTime, Date, Time aggregate(query.merge(:fields => [ property_name.max ])) end |
#min(*args) ⇒ Integer
Get the lowest value of a property
54 55 56 57 58 59 60 61 |
# File 'lib/gems/dm-aggregates-0.9.9/lib/dm-aggregates/aggregate_functions.rb', line 54 def min(*args) query = args.last.kind_of?(Hash) ? args.pop : {} property_name = args.first assert_property_type property_name, Integer, Float, BigDecimal, DateTime, Date, Time aggregate(query.merge(:fields => [ property_name.min ])) end |
#sum(*args) ⇒ Integer
Get the total value of a property
123 124 125 126 127 128 129 130 |
# File 'lib/gems/dm-aggregates-0.9.9/lib/dm-aggregates/aggregate_functions.rb', line 123 def sum(*args) query = args.last.kind_of?(Hash) ? args.pop : {} property_name = args.first assert_property_type property_name, Integer, Float, BigDecimal aggregate(query.merge(:fields => [ property_name.sum ])) end |