rails_select_on_includes 0.4.5 → 0.4.8

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: 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