# File lib/dm-aggregates/adapters/dm-do-adapter.rb, line 6 6: def aggregate(query) 7: fields = query.fields 8: types = fields.map { |p| p.respond_to?(:operator) ? String : p.primitive } 9: 10: field_size = fields.size 11: 12: records = [] 13: 14: with_connection do |connection| 15: statement, bind_values = select_statement(query) 16: 17: command = connection.create_command(statement) 18: command.set_types(types) 19: 20: reader = command.execute_reader(*bind_values) 21: 22: begin 23: while(reader.next!) 24: row = fields.zip(reader.values).map do |field, value| 25: if field.respond_to?(:operator) 26: send(field.operator, field.target, value) 27: else 28: field.load(value) 29: end 30: end 31: 32: records << (field_size > 1 ? row : row[0]) 33: end 34: ensure 35: reader.close 36: end 37: end 38: 39: records 40: end
# File lib/dm-aggregates/adapters/dm-do-adapter.rb, line 79 79: def aggregate_field_statement(aggregate_function, property, qualify) 80: column_name = if aggregate_function == :count && property == :all 81: '*' 82: else 83: property_to_column_name(property, qualify) 84: end 85: 86: function_name = case aggregate_function 87: when :count then 'COUNT' 88: when :min then 'MIN' 89: when :max then 'MAX' 90: when :avg then 'AVG' 91: when :sum then 'SUM' 92: else raise "Invalid aggregate function: #{aggregate_function.inspect}" 93: end 94: 95: "#{function_name}(#{column_name})" 96: end
# File lib/dm-aggregates/adapters/dm-do-adapter.rb, line 56 56: def avg(property, value) 57: property.primitive == ::Integer ? value.to_f : property.load(value) 58: end
# File lib/dm-aggregates/adapters/dm-do-adapter.rb, line 44 44: def count(property, value) 45: value.to_i 46: end
# File lib/dm-aggregates/adapters/dm-do-adapter.rb, line 52 52: def max(property, value) 53: property.load(value) 54: end
# File lib/dm-aggregates/adapters/dm-do-adapter.rb, line 48 48: def min(property, value) 49: property.load(value) 50: end
# File lib/dm-aggregates/adapters/dm-do-adapter.rb, line 65 65: def property_to_column_name(property, qualify) 66: case property 67: when DataMapper::Query::Operator 68: aggregate_field_statement(property.operator, property.target, qualify) 69: 70: when Property, DataMapper::Query::Path 71: super 72: 73: else 74: raise ArgumentError, "+property+ must be a DataMapper::Query::Operator, a DataMapper::Property or a Query::Path, but was a #{property.class} (#{property.inspect})" 75: end 76: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.