mm_eager_includer 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 +5 -13
- data/lib/mongo_mapper/eager_includer.rb +89 -118
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ZGU3NmMyMjMyYWFiNWI4N2UzOGY4NzI5OTJiMWQ4ZGNkOGEzODI4Zg==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7332631d4be05cc147356b553f3c0c64fd0c9ac0
|
4
|
+
data.tar.gz: fca0a9ad9712a1b1ec7a7d6018d38949ea85bc8d
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
MDk0MTZhNmQ2ZTJkZDdiMTY1ODFhNWExN2VmY2NiZmYxYjZlYjNlYjdhZGUy
|
11
|
-
NmQwMTE3OTkxMjljNmMyNTJkMDczZDQxNDgwNTczZTRkYzRhY2Y=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
NWQ0YzY5NjU3MDM4NDVjMTUwZjVlYzc1ZGVmOGJkNGZjODgwZDQ4ZWY1Mzlk
|
14
|
-
YTAzMWI0ZmM1MDZhNTE1NjJhODQ3MmFiNDY1MjcxMTViMGY1OTg2N2E5NGY3
|
15
|
-
OWViZmVhNWY0YmU5ODc0MjczNzkxMjhjMTdjZmViZjc3ZjM2ZjM=
|
6
|
+
metadata.gz: 1528a173b37634d5e4f27969344be8ab26b990ae3f61cbee9b46f9c7ec29cad335be327453825d686295cc836c08d568ecb99bfa40cfb46b63d83b0585850732
|
7
|
+
data.tar.gz: b5fc7442713502e7bf4b4995a312668818c9edd9d6c7c2644b5d127a181be6e09e92e3341d19e72836cfbe623909dc160f24648a4346d3fb8e40b024a2786d40
|
@@ -1,122 +1,119 @@
|
|
1
1
|
require 'mongo_mapper'
|
2
2
|
|
3
3
|
class MongoMapper::EagerIncluder
|
4
|
-
|
5
|
-
|
6
|
-
(
|
7
|
-
end
|
8
|
-
|
9
|
-
def enabled=(bool)
|
10
|
-
@enabled = bool
|
11
|
-
end
|
12
|
-
|
13
|
-
def eager_include(record_or_records, *association_names, &block)
|
14
|
-
association_names.each do |association_name|
|
15
|
-
new(record_or_records, association_name).eager_include(&block)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def write_to_cache(object_id, association_name, value)
|
20
|
-
cache[association_name] ||= {}
|
21
|
-
cache[association_name][object_id] = value
|
22
|
-
end
|
23
|
-
|
24
|
-
def read_from_cache(object_id, association_name)
|
25
|
-
cache[association_name][object_id]
|
26
|
-
end
|
27
|
-
|
28
|
-
def clear_cache!
|
29
|
-
@cache = {}
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
def cache
|
35
|
-
@cache ||= {}
|
4
|
+
def self.eager_include(record_or_records, *association_names, &query_alteration_block)
|
5
|
+
association_names.each do |association_name|
|
6
|
+
new(record_or_records, association_name, &query_alteration_block).eager_include
|
36
7
|
end
|
37
8
|
end
|
38
9
|
|
39
|
-
def initialize(record_or_records, association_name)
|
40
|
-
|
41
|
-
|
42
|
-
@records = Array(record_or_records)
|
43
|
-
|
44
|
-
if @records.length == 0
|
45
|
-
return
|
10
|
+
def initialize(record_or_records, association_name, &query_alteration_block)
|
11
|
+
if record_or_records.is_a? Plucky::Query
|
12
|
+
raise "You must call `to_a` on `Plucky::Query` objects before passing to eager_include"
|
46
13
|
end
|
14
|
+
@records = Array(record_or_records)
|
47
15
|
|
16
|
+
return if @records.length == 0
|
48
17
|
@association_name = association_name.to_sym
|
49
|
-
@
|
18
|
+
@query_alteration_block = query_alteration_block
|
19
|
+
@association = @records.first.associations[@association_name]
|
50
20
|
if !@association
|
51
21
|
raise "Could not find association `#{association_name}` on instance of #{@records.first.class}"
|
52
22
|
end
|
53
|
-
|
54
|
-
@proxy_class = @association.proxy_class
|
55
23
|
end
|
56
24
|
|
57
|
-
def
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
def eager_include(&block)
|
62
|
-
return if !enabled?
|
63
|
-
|
64
|
-
if @records.length == 0
|
65
|
-
return
|
25
|
+
def eager_include
|
26
|
+
@records.reject! do |record|
|
27
|
+
record.instance_variable_defined?(instance_variable_name)
|
66
28
|
end
|
67
29
|
|
68
|
-
if @
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
30
|
+
return if @records.length == 0
|
31
|
+
|
32
|
+
@association_type = case @association.proxy_class.to_s
|
33
|
+
when 'MongoMapper::Plugins::Associations::ManyDocumentsProxy'
|
34
|
+
:has_many
|
35
|
+
when 'MongoMapper::Plugins::Associations::BelongsToProxy'
|
36
|
+
:belongs_to
|
37
|
+
when 'MongoMapper::Plugins::Associations::OneProxy'
|
38
|
+
:has_one
|
39
|
+
when 'MongoMapper::Plugins::Associations::InArrayProxy'
|
40
|
+
:has_many_in
|
76
41
|
else
|
77
|
-
raise NotImplementedError, "#{@proxy_class} not supported yet!"
|
42
|
+
raise NotImplementedError, "#{@association.proxy_class} not supported yet!"
|
78
43
|
end
|
44
|
+
|
45
|
+
send("eager_include_#{@association_type}")
|
79
46
|
end
|
80
47
|
|
81
48
|
private
|
82
49
|
|
83
|
-
|
84
|
-
association_name = association_name.to_sym
|
50
|
+
attr_reader :association_name
|
85
51
|
|
86
|
-
|
52
|
+
def instance_variable_name
|
53
|
+
"@eager_loaded_#{association_name}"
|
54
|
+
end
|
87
55
|
|
88
|
-
|
56
|
+
def setup_association(record, value)
|
57
|
+
code = <<-RUBY
|
89
58
|
def #{association_name}
|
90
|
-
|
59
|
+
#{instance_variable_name}
|
91
60
|
end
|
92
|
-
|
93
|
-
|
61
|
+
RUBY
|
94
62
|
record.instance_eval(code, __FILE__, __LINE__)
|
63
|
+
record.instance_variable_set(instance_variable_name, value)
|
64
|
+
end
|
65
|
+
|
66
|
+
def association_class
|
67
|
+
@association_class ||= @association.klass
|
95
68
|
end
|
96
69
|
|
97
70
|
def foreign_keys
|
98
|
-
@association.options[:in]
|
71
|
+
@foreign_keys ||= @association.options[:in]
|
99
72
|
end
|
100
73
|
|
101
74
|
def foreign_key
|
102
|
-
@association_name.to_s.foreign_key
|
75
|
+
@foreign_key ||= @association_name.to_s.foreign_key
|
103
76
|
end
|
104
77
|
|
105
78
|
def primary_key
|
106
|
-
@association.options[:foreign_key] || @records.first.class.name.foreign_key
|
79
|
+
@primary_key ||= @association.options[:foreign_key] || @records.first.class.name.foreign_key
|
80
|
+
end
|
81
|
+
|
82
|
+
def record_ids
|
83
|
+
case @association_type
|
84
|
+
when :has_many, :has_one
|
85
|
+
@records.map(&:id)
|
86
|
+
when :belongs_to
|
87
|
+
@records.map do |record|
|
88
|
+
record.send(foreign_key)
|
89
|
+
end
|
90
|
+
when :has_many_in
|
91
|
+
@records.map do |record|
|
92
|
+
record.send(foreign_keys)
|
93
|
+
end.flatten
|
94
|
+
end.uniq
|
95
|
+
end
|
96
|
+
|
97
|
+
def load_association_records!
|
98
|
+
@association_records_query = case @association_type
|
99
|
+
when :has_many, :has_one
|
100
|
+
association_class.where({ primary_key => { '$in' => record_ids } })
|
101
|
+
when :belongs_to, :has_many_in
|
102
|
+
association_class.where({ _id: { '$in' => record_ids } })
|
103
|
+
end
|
104
|
+
|
105
|
+
if @query_alteration_block
|
106
|
+
@association_records_query = @query_alteration_block.call(@association_records_query)
|
107
|
+
end
|
108
|
+
@association_records = @association_records_query.all
|
107
109
|
end
|
108
110
|
|
109
111
|
def eager_include_has_many(&block)
|
110
|
-
|
111
|
-
proxy_records = @association.klass.where({
|
112
|
-
primary_key => {
|
113
|
-
'$in' => ids
|
114
|
-
}
|
115
|
-
}).all
|
112
|
+
load_association_records!
|
116
113
|
|
117
114
|
@records.each do |record|
|
118
|
-
|
119
|
-
record_or_records =
|
115
|
+
matching_association_records = @association_records.select do |association_record|
|
116
|
+
record_or_records = association_record.send(primary_key)
|
120
117
|
if record_or_records.is_a?(Array)
|
121
118
|
record_or_records.include?(record.id)
|
122
119
|
else
|
@@ -124,71 +121,45 @@ private
|
|
124
121
|
end
|
125
122
|
end
|
126
123
|
|
127
|
-
setup_association(record,
|
124
|
+
setup_association(record, matching_association_records)
|
128
125
|
end
|
129
126
|
end
|
130
127
|
|
131
128
|
def eager_include_has_one(&block)
|
132
|
-
|
133
|
-
proxy_records = @association.klass.where({
|
134
|
-
primary_key => ids
|
135
|
-
})
|
136
|
-
|
137
|
-
if block
|
138
|
-
proxy_records = block.call(proxy_records)
|
139
|
-
end
|
140
|
-
|
141
|
-
proxy_records = proxy_records.all
|
129
|
+
load_association_records!
|
142
130
|
|
143
131
|
@records.each do |record|
|
144
|
-
|
145
|
-
|
132
|
+
matching_association_record = @association_records.detect do |association_record|
|
133
|
+
association_record.send(primary_key) == record.id
|
146
134
|
end
|
147
135
|
|
148
|
-
setup_association(record,
|
136
|
+
setup_association(record, matching_association_record)
|
149
137
|
end
|
150
138
|
end
|
151
139
|
|
152
140
|
def eager_include_belongs_to(&block)
|
153
|
-
|
154
|
-
|
155
|
-
proxy_records = @association.klass.where({
|
156
|
-
:_id => {
|
157
|
-
'$in' => ids
|
158
|
-
}
|
159
|
-
})
|
160
|
-
|
161
|
-
if block
|
162
|
-
proxy_records = block.call(proxy_records)
|
163
|
-
end
|
164
|
-
|
165
|
-
proxy_records = proxy_records.all
|
141
|
+
load_association_records!
|
166
142
|
|
167
143
|
@records.each do |record|
|
168
|
-
|
169
|
-
|
144
|
+
matching_association_record = @association_records.detect do |association_record|
|
145
|
+
association_record.id == record.send(foreign_key)
|
170
146
|
end
|
171
147
|
|
172
|
-
setup_association(record,
|
148
|
+
setup_association(record, matching_association_record)
|
173
149
|
end
|
174
150
|
end
|
175
151
|
|
176
152
|
def eager_include_has_many_in(&block)
|
177
|
-
|
178
|
-
proxy_records = @association.klass.where({
|
179
|
-
'_id' => {
|
180
|
-
'$in' => ids
|
181
|
-
}
|
182
|
-
}).all
|
153
|
+
load_association_records!
|
183
154
|
|
184
155
|
@records.each do |record|
|
185
|
-
|
156
|
+
association_record_ids = record.send(foreign_keys)
|
186
157
|
|
187
|
-
|
188
|
-
|
158
|
+
matching_association_records = association_record_ids.map do |association_record_id|
|
159
|
+
@association_records.detect { |association_record| association_record.id == association_record_id }
|
189
160
|
end
|
190
161
|
|
191
|
-
setup_association(record,
|
162
|
+
setup_association(record, matching_association_records)
|
192
163
|
end
|
193
164
|
end
|
194
165
|
end
|
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mm_eager_includer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Scott Taylor
|
8
8
|
- Andrew Pariser
|
9
|
+
- Jared Grippe
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date:
|
13
|
+
date: 2016-05-09 00:00:00.000000000 Z
|
13
14
|
dependencies: []
|
14
15
|
description: Eager include associations with mongo mapper
|
15
16
|
email: scott@railsnewbie.com
|
@@ -28,17 +29,17 @@ require_paths:
|
|
28
29
|
- lib
|
29
30
|
required_ruby_version: !ruby/object:Gem::Requirement
|
30
31
|
requirements:
|
31
|
-
- -
|
32
|
+
- - ">="
|
32
33
|
- !ruby/object:Gem::Version
|
33
34
|
version: '0'
|
34
35
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
36
|
requirements:
|
36
|
-
- -
|
37
|
+
- - ">="
|
37
38
|
- !ruby/object:Gem::Version
|
38
39
|
version: '0'
|
39
40
|
requirements: []
|
40
41
|
rubyforge_project:
|
41
|
-
rubygems_version: 2.4.
|
42
|
+
rubygems_version: 2.4.8
|
42
43
|
signing_key:
|
43
44
|
specification_version: 4
|
44
45
|
summary: Eager include associations with mongo mapper
|