rails_select_on_includes 0.4.5 → 0.4.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7f82283cf1c50efd25ad1e3fa2e2f12b1a8b5ae1
4
- data.tar.gz: 1c2b9e966c24424aade16aa96047cdb68c1dff4a
3
+ metadata.gz: 6a2caeab29b58b5631fc738fa18f31f5256108e1
4
+ data.tar.gz: 7d9fd421155250e63ed2557b8e60c60c3b9b8650
5
5
  SHA512:
6
- metadata.gz: 88f9bc17c2c226ac0cc510820f70d981c84d45f548bffb1791d3fdb022c8d303d51de6e2bf90e3d7183af27f8806958cd02db8008e7ee35fe3700ab44021c940
7
- data.tar.gz: 78a8698e7084c34a279649d860e5fe57f4f445d9e3178fafd7e7bba53327eb022c8ac67be143cc47823c3cbab4dbda1059cbd3e626f94ac9c73a9636c8ae026c
6
+ metadata.gz: fbe99ddb4401a7ddfbbec3d391880d3350e627e28ea75561a7aa39816439e9462ba75102c80aadc45ff1e70bf2e23e74e68d83faa8931f8659ad026c6977f13e
7
+ data.tar.gz: 600c219a75816d2dce8fb54563e77ff9b185a2b014928e37de8550bf6f33dfc2e128d917448cbbf6a6254c46ba997c61dcf1057bede6d2eb0c01535f945b1f5a
@@ -19,6 +19,8 @@ module ActiveRecord
19
19
  }
20
20
  @base_class_node_aliases ||= h[table.node] if table.node.is_a?(ActiveRecord::Associations::JoinDependency::JoinBase)
21
21
  }
22
+
23
+ @virtual_attributes_names = []
22
24
  end
23
25
  # valid formats are:
24
26
  # 1 'table_name.column' or 'table_name.column as column_1' will be parsed! distinct on can be used also
@@ -30,65 +32,72 @@ module ActiveRecord
30
32
  # if sv is symbol that we assume that its a base table column and it will be aliased and added as usual
31
33
  # all we need is some specials joins+select from related tables
32
34
  if sv.is_a?(Hash)
33
- flatten_hash_values(sv).each{|sub_sv| @base_class_node_aliases << [sub_sv, sub_sv] }
35
+ flatten_hash_values(sv).each{|sub_sv| @base_class_node_aliases << [sub_sv, sub_sv]; @virtual_attributes_names << sub_sv }
34
36
  elsif sv.is_a?(String)
35
37
  # this is the case of long raw select
36
38
  sv.split( ", " ).each do |sub_sv|
37
39
  if sub_sv[/.+ as .+/i]
38
40
  selected_column = sub_sv[/ as .+/i][4..-1]
39
41
  @base_class_node_aliases << [selected_column, selected_column]
42
+ @virtual_attributes_names << selected_column
40
43
  elsif sub_sv[/.+\.[^\*]+/]
41
44
  selected_column = sub_sv[/\..+/][1..-1]
42
45
  @base_class_node_aliases << [selected_column, selected_column]
46
+ @virtual_attributes_names << selected_column
43
47
  end
44
48
  end
45
49
  end
46
50
  end
47
51
  end
48
52
 
53
+ def slice_selected_attr_types( column_types )
54
+ column_types.slice( *@virtual_attributes_names )
55
+ end
56
+
49
57
  private
50
58
  def flatten_hash_values( some_hash )
51
59
  some_hash.values.map{ |value| value.is_a?(Hash) ? flatten_hash_values( value ) : value }.flatten
52
60
  end
53
61
  end
54
62
 
55
- # class JoinPart
56
- # def instantiate(row, aliases, column_types = {}, &block)
57
- # base_klass.instantiate(extract_record(row, aliases), column_types, &block)
58
- # end
59
- # end
60
- #
61
- # def instantiate(result_set, aliases)
62
- # primary_key = aliases.column_alias(join_root, join_root.primary_key)
63
- #
64
- # seen = Hash.new { |i, object_id|
65
- # i[object_id] = Hash.new { |j, child_class|
66
- # j[child_class] = {}
67
- # }
68
- # }
69
- #
70
- # model_cache = Hash.new { |h,klass| h[klass] = {} }
71
- # parents = model_cache[join_root]
72
- # column_aliases = aliases.column_aliases join_root
73
- #
74
- # message_bus = ActiveSupport::Notifications.instrumenter
75
- #
76
- # payload = {
77
- # record_count: result_set.length,
78
- # class_name: join_root.base_klass.name
79
- # }
80
- #
81
- # message_bus.instrument('instantiation.active_record', payload) do
82
- # result_set.each { |row_hash|
83
- # parent_key = primary_key ? row_hash[primary_key] : row_hash
84
- # # DISTINCTION PART > join_root.instantiate(row_hash, column_aliases, result_set.column_types )
85
- # # PREVIOUS > join_root.instantiate(row_hash, column_aliases )
86
- # parent = parents[parent_key] ||= join_root.instantiate(row_hash, column_aliases, result_set.column_types )
87
- # construct(parent, join_root, row_hash, result_set, seen, model_cache, aliases)
88
- # }
89
- # end
90
- # parents.values
91
- # end
63
+ class JoinBase
64
+ def instantiate(row, aliases, column_types = {}, &block)
65
+ base_klass.instantiate(extract_record(row, aliases), column_types, &block)
66
+ end
67
+ end
68
+
69
+ def instantiate(result_set, aliases)
70
+ primary_key = aliases.column_alias(join_root, join_root.primary_key)
71
+
72
+ seen = Hash.new { |h,parent_klass|
73
+ h[parent_klass] = Hash.new { |i,parent_id|
74
+ i[parent_id] = Hash.new { |j,child_klass| j[child_klass] = {} }
75
+ }
76
+ }
77
+
78
+ model_cache = Hash.new { |h,klass| h[klass] = {} }
79
+ parents = model_cache[join_root]
80
+ column_aliases = aliases.column_aliases join_root
81
+
82
+ message_bus = ActiveSupport::Notifications.instrumenter
83
+
84
+ payload = {
85
+ record_count: result_set.length,
86
+ class_name: join_root.base_klass.name
87
+ }
88
+
89
+ message_bus.instrument('instantiation.active_record', payload) do
90
+ result_set.each { |row_hash|
91
+ parent_key = primary_key ? row_hash[primary_key] : row_hash
92
+ # DISTINCTION PART > join_root.instantiate(row_hash, column_aliases, aliases.slice_selected_attr_types( result_set.column_types ) )
93
+ # PREVIOUS > join_root.instantiate(row_hash, column_aliases )
94
+ parent = parents[parent_key] ||= join_root.instantiate(row_hash, column_aliases, aliases.slice_selected_attr_types( result_set.column_types ) )
95
+ construct(parent, join_root, row_hash, result_set, seen, model_cache, aliases)
96
+ }
97
+ end
98
+
99
+ parents.values
100
+ end
92
101
 
93
102
  end
94
103
  end
@@ -1,3 +1,3 @@
1
1
  module RailsSelectOnIncludes
2
- VERSION = "0.4.5"
2
+ VERSION = "0.4.8"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_select_on_includes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.5
4
+ version: 0.4.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - alekseyl