active_record-mti 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 775e9a363f5a8e4679c072bda8cb445a5de901ed
4
- data.tar.gz: 0242e47c271bdeb7d17f6031262141f47d19db03
3
+ metadata.gz: e8cdbcbf3783467af40aaad29b0b016112319bec
4
+ data.tar.gz: b00afc13f0a76d4514551e23484bd90f85034f99
5
5
  SHA512:
6
- metadata.gz: 40c60c73d749220cfbb22a4992612f40e93ed0ea9fc6053ae95e4ba30fc43d6903d04721315fe4dd8b287728135ca8c8ce089b281a117954b0e493afcd356bd2
7
- data.tar.gz: 091b6937861bf16fe0b41fcc7ab28e50aa9c58aca70d1e236c664109e4b4ee7e1361032ceac51e8c2a3b5616c64bb0970b319257b0ddd4d7a0f3ed1415741f16
6
+ metadata.gz: 1a35b8c190e745a86b4da18427d51f2c676e5aa0645ebd41c5de709ef6aa0fa74d133376130b17f7f55be8aa389e724668fca318c0f7ac1876fd24fbc5706bd6
7
+ data.tar.gz: f1dce0c6e1750a27d1bb08bd905119468bdc8330a7589342fc7385c4a18fed57a7b8ed01593feb03ecae022bb3d272666a999e2d5c91719f33d19eb403a18dbb
@@ -4,10 +4,86 @@ module ActiveRecord
4
4
 
5
5
  private
6
6
 
7
+ def execute_grouped_calculation(operation, column_name, distinct) #:nodoc:
8
+ group_attrs = group_values
9
+
10
+ if group_attrs.first.respond_to?(:to_sym)
11
+ association = @klass._reflect_on_association(group_attrs.first)
12
+ associated = group_attrs.size == 1 && association && association.belongs_to? # only count belongs_to associations
13
+ group_fields = Array(associated ? association.foreign_key : group_attrs)
14
+ else
15
+ group_fields = group_attrs
16
+ end
17
+ group_fields = arel_columns(group_fields)
18
+
19
+ group_aliases = group_fields.map { |field|
20
+ column_alias_for(field)
21
+ }
22
+ group_columns = group_aliases.zip(group_fields).map { |aliaz,field|
23
+ [aliaz, field]
24
+ }
25
+
26
+ group = group_fields
27
+
28
+ if operation == 'count' && column_name == :all
29
+ aggregate_alias = 'count_all'
30
+ else
31
+ aggregate_alias = column_alias_for([operation, column_name].join(' '))
32
+ end
33
+
34
+ select_values = [
35
+ operation_over_aggregate_column(
36
+ aggregate_column(column_name),
37
+ operation,
38
+ distinct).as(aggregate_alias)
39
+ ]
40
+ select_values += select_values unless having_values.empty?
41
+
42
+ select_values.concat group_fields.zip(group_aliases).map { |field,aliaz|
43
+ if field.respond_to?(:as)
44
+ field.as(aliaz)
45
+ else
46
+ "#{field} AS #{aliaz}"
47
+ end
48
+ }
49
+
50
+ relation = except(:group)
51
+ relation.group_values = group
52
+ relation.select_values = select_values
53
+
54
+ # Remove our cast otherwise PSQL will insist that it be included in the GROUP
55
+ relation.arel.projections.select!{ |p| p.to_s != "cast(\"#{klass.table_name}\".\"tableoid\"::regclass as text)" } if @klass.using_multi_table_inheritance?
56
+
57
+ calculated_data = @klass.connection.select_all(relation, nil, relation.arel.bind_values + bind_values)
58
+
59
+ if association
60
+ key_ids = calculated_data.collect { |row| row[group_aliases.first] }
61
+ key_records = association.klass.base_class.find(key_ids)
62
+ key_records = Hash[key_records.map { |r| [r.id, r] }]
63
+ end
64
+
65
+ Hash[calculated_data.map do |row|
66
+ key = group_columns.map { |aliaz, col_name|
67
+ column = calculated_data.column_types.fetch(aliaz) do
68
+ type_for(col_name)
69
+ end
70
+ type_cast_calculated_value(row[aliaz], column)
71
+ }
72
+ key = key.first if key.size == 1
73
+ key = key_records[key] if associated
74
+
75
+ column_type = calculated_data.column_types.fetch(aggregate_alias) { type_for(column_name) }
76
+ [key, type_cast_calculated_value(row[aggregate_alias], column_type, operation)]
77
+ end]
78
+ end
79
+
7
80
  def execute_simple_calculation(operation, column_name, distinct) #:nodoc:
8
81
  # Postgresql doesn't like ORDER BY when there are no GROUP BY
9
82
  relation = unscope(:order)
10
83
 
84
+ # Remove our cast otherwise PSQL will insist that it be included in the GROUP
85
+ relation.arel.projections.select!{ |p| p.to_s != "cast(\"#{klass.table_name}\".\"tableoid\"::regclass as text)" } if @klass.using_multi_table_inheritance?
86
+
11
87
  column_alias = column_name
12
88
 
13
89
  bind_values = nil
@@ -27,9 +103,6 @@ module ActiveRecord
27
103
  column_alias ||= @klass.connection.column_name_for_operation(operation, select_value)
28
104
  relation.select_values = [select_value]
29
105
 
30
- # Remove our cast otherwise PSQL will insist that it be included in the GROUP
31
- relation.arel.projections.select!{ |p| p.to_s != "cast(\"#{klass.table_name}\".\"tableoid\"::regclass as text)" } if @klass.using_multi_table_inheritance?
32
-
33
106
  query_builder = relation.arel
34
107
  bind_values = query_builder.bind_values + relation.bind_values
35
108
  end
@@ -1,5 +1,5 @@
1
1
  module ActiveRecord
2
2
  module MTI
3
- VERSION = '0.0.3'
3
+ VERSION = '0.0.4'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record-mti
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dale Stevens