ree_lib 1.0.60 → 1.0.62
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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/ree_lib/packages/ree_dao/package/ree_dao/association.rb +71 -36
- data/lib/ree_lib/packages/ree_dao/package/ree_dao/associations.rb +5 -4
- data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/load_agg.rb +11 -3
- data/lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/load_agg.schema.json +15 -0
- data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/load_agg/load_agg_benchmark_spec.rb +3 -3
- data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/load_agg/load_agg_spec.rb +44 -6
- data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/load_agg/ree_dao_load_agg_test.rb +17 -0
- data/lib/ree_lib/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e69b23ef012a6748604d4b82d1d81c791902ee23bc6179d231a340e48289a5d7
|
4
|
+
data.tar.gz: 6233c958a32bfdeea0efaf5b5692d0e824a5e04d9d334bf002d519b0789d6cc3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eee96a99fe5217675f4ff9c3db4915571ae444c7af4a33ca763b786b51a07f77f55fe794aa004688ccfd0f6c00f478631ba100181625de5d5f8d503f62b85edb
|
7
|
+
data.tar.gz: 1abc64ad140c4901e52f62b9a74f30e16f9fd4364a5e066f5321597c4246b7c5d7e2a0cba0515396b1a18aacd27d786321b17fa29004ed7336fac22a8ee75b06
|
data/Gemfile.lock
CHANGED
@@ -2,16 +2,16 @@ module ReeDao
|
|
2
2
|
class Association
|
3
3
|
include Ree::LinkDSL
|
4
4
|
|
5
|
-
link :demodulize, from: :ree_string
|
6
5
|
link :group_by, from: :ree_array
|
7
6
|
link :index_by, from: :ree_array
|
8
|
-
link :
|
7
|
+
link :transform_values, from: :ree_hash
|
9
8
|
|
10
|
-
attr_reader :parent, :list, :global_opts
|
9
|
+
attr_reader :parent, :parent_dao_name, :list, :global_opts
|
11
10
|
|
12
|
-
contract(ReeDao::Associations, Array, Ksplat[RestKeys => Any] => Any)
|
13
|
-
def initialize(parent, list, **global_opts)
|
11
|
+
contract(ReeDao::Associations, Symbol, Array, Ksplat[RestKeys => Any] => Any)
|
12
|
+
def initialize(parent, parent_dao_name, list, **global_opts)
|
14
13
|
@parent = parent
|
14
|
+
@parent_dao_name = parent_dao_name
|
15
15
|
@list = list
|
16
16
|
@global_opts = global_opts
|
17
17
|
end
|
@@ -37,13 +37,18 @@ module ReeDao
|
|
37
37
|
Optblock => Nilor[Array]
|
38
38
|
)
|
39
39
|
def load_association(assoc_type, assoc_name, **opts, &block)
|
40
|
+
opts[:autoload_children] ||= false
|
41
|
+
|
40
42
|
assoc_index = load_association_by_type(
|
41
43
|
assoc_type,
|
42
44
|
assoc_name,
|
43
45
|
**opts
|
44
46
|
)
|
45
47
|
|
46
|
-
|
48
|
+
dao = find_dao(assoc_name, parent, opts[:scope])
|
49
|
+
dao_name = dao.first_source_table
|
50
|
+
|
51
|
+
process_block(assoc_index, opts[:autoload_children], opts[:to_dto], dao_name, &block) if block_given?
|
47
52
|
|
48
53
|
list
|
49
54
|
end
|
@@ -57,6 +62,7 @@ module ReeDao
|
|
57
62
|
case type
|
58
63
|
when :belongs_to
|
59
64
|
one_to_one(
|
65
|
+
parent_dao_name,
|
60
66
|
assoc_name,
|
61
67
|
list,
|
62
68
|
scope: opts[:scope],
|
@@ -67,44 +73,46 @@ module ReeDao
|
|
67
73
|
)
|
68
74
|
when :has_one
|
69
75
|
one_to_one(
|
76
|
+
parent_dao_name,
|
70
77
|
assoc_name,
|
71
78
|
list,
|
72
79
|
scope: opts[:scope],
|
73
80
|
primary_key: opts[:primary_key],
|
74
81
|
foreign_key: opts[:foreign_key],
|
82
|
+
to_dto: opts[:to_dto],
|
75
83
|
setter: opts[:setter],
|
76
84
|
reverse: true
|
77
85
|
)
|
78
86
|
when :has_many
|
79
87
|
one_to_many(
|
88
|
+
parent_dao_name,
|
80
89
|
assoc_name,
|
81
90
|
list,
|
82
91
|
scope: opts[:scope],
|
83
92
|
primary_key: opts[:primary_key],
|
84
93
|
foreign_key: opts[:foreign_key],
|
85
|
-
|
86
|
-
)
|
87
|
-
else
|
88
|
-
one_to_many(
|
89
|
-
assoc_name,
|
90
|
-
list,
|
91
|
-
scope: opts[:scope],
|
92
|
-
primary_key: opts[:primary_key],
|
93
|
-
foreign_key: opts[:foreign_key],
|
94
|
+
to_dto: opts[:to_dto],
|
94
95
|
setter: opts[:setter]
|
95
96
|
)
|
96
97
|
end
|
97
98
|
end
|
98
99
|
|
99
|
-
contract(Or[Hash, Array], Bool, Block => Any)
|
100
|
-
def process_block(assoc, autoload_children, &block)
|
100
|
+
contract(Or[Hash, Array], Bool, Nilor[Proc], Symbol, Block => Any)
|
101
|
+
def process_block(assoc, autoload_children, to_dto, parent_dao_name, &block)
|
101
102
|
assoc_list = assoc.is_a?(Array) ? assoc : assoc.values.flatten
|
102
103
|
|
104
|
+
if to_dto
|
105
|
+
assoc_list = assoc_list.map do |item|
|
106
|
+
to_dto.call(item)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
103
110
|
if ReeDao::Associations.sync_mode?
|
104
111
|
ReeDao::Associations.new(
|
105
112
|
parent.agg_caller,
|
106
113
|
assoc_list,
|
107
114
|
parent.local_vars,
|
115
|
+
parent_dao_name,
|
108
116
|
autoload_children,
|
109
117
|
**global_opts
|
110
118
|
).instance_exec(assoc_list, &block)
|
@@ -113,6 +121,7 @@ module ReeDao
|
|
113
121
|
parent.agg_caller,
|
114
122
|
assoc_list,
|
115
123
|
parent.local_vars,
|
124
|
+
parent_dao_name,
|
116
125
|
autoload_children,
|
117
126
|
**global_opts
|
118
127
|
).instance_exec(assoc_list, &block)
|
@@ -132,16 +141,18 @@ module ReeDao
|
|
132
141
|
|
133
142
|
contract(
|
134
143
|
Symbol,
|
135
|
-
|
144
|
+
Symbol,
|
145
|
+
Array,
|
136
146
|
Kwargs[
|
137
147
|
primary_key: Nilor[Symbol],
|
138
148
|
foreign_key: Nilor[Symbol],
|
139
149
|
scope: Nilor[Sequel::Dataset, Array],
|
140
150
|
setter: Nilor[Or[Symbol, Proc]],
|
151
|
+
to_dto: Nilor[Proc],
|
141
152
|
reverse: Bool
|
142
153
|
] => Or[Hash, Array]
|
143
154
|
)
|
144
|
-
def one_to_one(assoc_name, list, scope: nil, primary_key: :id, foreign_key: nil, setter: nil, reverse: true)
|
155
|
+
def one_to_one(parent_assoc_name, assoc_name, list, scope: nil, primary_key: :id, foreign_key: nil, setter: nil, to_dto: nil, reverse: true)
|
145
156
|
return {} if list.empty?
|
146
157
|
|
147
158
|
primary_key ||= :id
|
@@ -150,13 +161,12 @@ module ReeDao
|
|
150
161
|
items = scope
|
151
162
|
else
|
152
163
|
assoc_dao = find_dao(assoc_name, parent, scope)
|
153
|
-
|
164
|
+
|
154
165
|
if reverse
|
155
166
|
if !foreign_key
|
156
|
-
|
157
|
-
foreign_key = "#{name}_id".to_sym
|
167
|
+
foreign_key = "#{parent_assoc_name.to_s.gsub(/s$/,'')}_id".to_sym
|
158
168
|
end
|
159
|
-
|
169
|
+
|
160
170
|
root_ids = list.map(&:id).uniq
|
161
171
|
else
|
162
172
|
if !foreign_key
|
@@ -165,13 +175,14 @@ module ReeDao
|
|
165
175
|
|
166
176
|
root_ids = list.map(&:"#{foreign_key}").compact
|
167
177
|
end
|
168
|
-
|
178
|
+
|
169
179
|
scope ||= assoc_dao
|
170
180
|
scope = scope.where((reverse ? foreign_key : :id) => root_ids)
|
171
|
-
|
181
|
+
|
172
182
|
items = add_scopes(scope, global_opts[assoc_name])
|
173
183
|
end
|
174
184
|
|
185
|
+
|
175
186
|
assoc = index_by(items) { _1.send(reverse ? foreign_key : :id) }
|
176
187
|
|
177
188
|
populate_association(
|
@@ -180,23 +191,26 @@ module ReeDao
|
|
180
191
|
assoc_name,
|
181
192
|
setter: setter,
|
182
193
|
reverse: reverse,
|
183
|
-
primary_key: primary_key
|
194
|
+
primary_key: primary_key,
|
195
|
+
to_dto: to_dto
|
184
196
|
)
|
185
197
|
|
186
198
|
assoc
|
187
199
|
end
|
188
200
|
|
189
201
|
contract(
|
202
|
+
Symbol,
|
190
203
|
Symbol,
|
191
204
|
Array,
|
192
205
|
Kwargs[
|
193
206
|
foreign_key: Nilor[Symbol],
|
194
207
|
primary_key: Nilor[Symbol],
|
195
208
|
scope: Nilor[Sequel::Dataset, Array],
|
196
|
-
setter: Nilor[Or[Symbol, Proc]]
|
209
|
+
setter: Nilor[Or[Symbol, Proc]],
|
210
|
+
to_dto: Nilor[Proc]
|
197
211
|
] => Or[Hash, Array]
|
198
212
|
)
|
199
|
-
def one_to_many(assoc_name, list, primary_key: nil, foreign_key: nil, scope: nil, setter: nil)
|
213
|
+
def one_to_many(parent_assoc_name, assoc_name, list, primary_key: nil, foreign_key: nil, scope: nil, setter: nil, to_dto: nil)
|
200
214
|
return {} if list.empty?
|
201
215
|
|
202
216
|
primary_key ||= :id
|
@@ -206,14 +220,14 @@ module ReeDao
|
|
206
220
|
else
|
207
221
|
assoc_dao = nil
|
208
222
|
assoc_dao = find_dao(assoc_name, parent, scope)
|
209
|
-
|
210
|
-
foreign_key ||= "#{
|
211
|
-
|
223
|
+
|
224
|
+
foreign_key ||= "#{parent_assoc_name.to_s.gsub(/s$/, '')}_id".to_sym
|
225
|
+
|
212
226
|
root_ids = list.map(&:"#{primary_key}")
|
213
|
-
|
227
|
+
|
214
228
|
scope ||= assoc_dao
|
215
229
|
scope = scope.where(foreign_key => root_ids)
|
216
|
-
|
230
|
+
|
217
231
|
items = add_scopes(scope, global_opts[assoc_name])
|
218
232
|
end
|
219
233
|
|
@@ -229,6 +243,7 @@ module ReeDao
|
|
229
243
|
assoc_name,
|
230
244
|
setter: setter,
|
231
245
|
primary_key: primary_key,
|
246
|
+
to_dto: to_dto,
|
232
247
|
multiple: true
|
233
248
|
)
|
234
249
|
|
@@ -243,10 +258,11 @@ module ReeDao
|
|
243
258
|
primary_key: Nilor[Symbol],
|
244
259
|
reverse: Nilor[Bool],
|
245
260
|
setter: Nilor[Or[Symbol, Proc]],
|
261
|
+
to_dto: Nilor[Proc],
|
246
262
|
multiple: Bool
|
247
263
|
] => Any
|
248
264
|
)
|
249
|
-
def populate_association(list, association_index, assoc_name, primary_key: nil, reverse: nil, setter: nil, multiple: false)
|
265
|
+
def populate_association(list, association_index, assoc_name, primary_key: nil, reverse: nil, setter: nil, to_dto: nil, multiple: false)
|
250
266
|
assoc_setter = if setter
|
251
267
|
setter
|
252
268
|
else
|
@@ -255,16 +271,35 @@ module ReeDao
|
|
255
271
|
|
256
272
|
list.each do |item|
|
257
273
|
if setter && setter.is_a?(Proc)
|
258
|
-
|
274
|
+
if to_dto
|
275
|
+
assoc_index = transform_values(association_index) do |key, value|
|
276
|
+
to_dto.call(value)
|
277
|
+
end
|
278
|
+
|
279
|
+
self.instance_exec(item, assoc_index, &assoc_setter)
|
280
|
+
else
|
281
|
+
self.instance_exec(item, association_index, &assoc_setter)
|
282
|
+
end
|
259
283
|
else
|
260
284
|
key = if reverse.nil?
|
261
285
|
primary_key
|
262
286
|
else
|
263
287
|
reverse ? primary_key : "#{assoc_name}_id"
|
264
288
|
end
|
289
|
+
|
265
290
|
value = association_index[item.send(key)]
|
266
291
|
|
267
|
-
|
292
|
+
if to_dto && !value.nil?
|
293
|
+
if value.is_a?(Array)
|
294
|
+
value = value.map { to_dto.call(_1) }
|
295
|
+
else
|
296
|
+
value = to_dto.call(value)
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
if value.nil? && multiple
|
301
|
+
value = []
|
302
|
+
end
|
268
303
|
|
269
304
|
begin
|
270
305
|
item.send(assoc_setter, value)
|
@@ -2,15 +2,16 @@ module ReeDao
|
|
2
2
|
class Associations
|
3
3
|
include Ree::LinkDSL
|
4
4
|
|
5
|
-
attr_reader :agg_caller, :list, :local_vars, :only, :except, :autoload_children, :global_opts
|
5
|
+
attr_reader :agg_caller, :list, :local_vars, :only, :except, :parent_dao_name, :autoload_children, :global_opts
|
6
6
|
|
7
|
-
def initialize(agg_caller, list, local_vars, autoload_children = false, **opts)
|
7
|
+
def initialize(agg_caller, list, local_vars, parent_dao_name, autoload_children = false, **opts)
|
8
8
|
@agg_caller = agg_caller
|
9
9
|
@list = list
|
10
10
|
@local_vars = local_vars
|
11
11
|
@global_opts = opts || {}
|
12
12
|
@only = opts[:only] if opts[:only]
|
13
13
|
@except = opts[:except] if opts[:except]
|
14
|
+
@parent_dao_name = parent_dao_name
|
14
15
|
@autoload_children = autoload_children
|
15
16
|
|
16
17
|
raise ArgumentError.new("you can't use both :only and :except arguments at the same time") if @only && @except
|
@@ -83,7 +84,7 @@ module ReeDao
|
|
83
84
|
if self.class.sync_mode?
|
84
85
|
return if association_is_not_included?(assoc_name) || list.empty?
|
85
86
|
|
86
|
-
association = Association.new(self, list, **global_opts)
|
87
|
+
association = Association.new(self, parent_dao_name, list, **global_opts)
|
87
88
|
if assoc_type == :field
|
88
89
|
association.handle_field(assoc_name, opts)
|
89
90
|
else
|
@@ -94,7 +95,7 @@ module ReeDao
|
|
94
95
|
return { association_threads: @assoc_threads, field_threads: @field_threads }
|
95
96
|
end
|
96
97
|
|
97
|
-
association = Association.new(self, list, **global_opts)
|
98
|
+
association = Association.new(self, parent_dao_name, list, **global_opts)
|
98
99
|
|
99
100
|
if assoc_type == :field
|
100
101
|
field_proc = opts
|
@@ -4,6 +4,8 @@ class ReeDao::LoadAgg
|
|
4
4
|
include Ree::FnDSL
|
5
5
|
|
6
6
|
fn :load_agg do
|
7
|
+
link :demodulize, from: :ree_string
|
8
|
+
link :underscore, from: :ree_string
|
7
9
|
link "ree_dao/associations", -> { Associations }
|
8
10
|
link "ree_dao/contract/dao_dataset_contract", -> { DaoDatasetContract }
|
9
11
|
link "ree_dao/contract/entity_contract", -> { EntityContract }
|
@@ -34,6 +36,12 @@ class ReeDao::LoadAgg
|
|
34
36
|
ids_or_scope
|
35
37
|
end
|
36
38
|
|
39
|
+
if dao
|
40
|
+
dao_name = dao.first_source_table
|
41
|
+
else
|
42
|
+
dao_name = underscore(demodulize(scope.first.class.name)).to_sym
|
43
|
+
end
|
44
|
+
|
37
45
|
list = scope.is_a?(Sequel::Dataset) ? scope.all : scope
|
38
46
|
|
39
47
|
if opts[:to_dto]
|
@@ -42,7 +50,7 @@ class ReeDao::LoadAgg
|
|
42
50
|
end
|
43
51
|
end
|
44
52
|
|
45
|
-
load_associations(list, **opts, &block) if block_given?
|
53
|
+
load_associations(dao_name, list, **opts, &block) if block_given?
|
46
54
|
|
47
55
|
if ids_or_scope.is_a?(Array)
|
48
56
|
list.sort_by { ids_or_scope.index(_1.id) }
|
@@ -53,7 +61,7 @@ class ReeDao::LoadAgg
|
|
53
61
|
|
54
62
|
private
|
55
63
|
|
56
|
-
def load_associations(list, **opts, &block)
|
64
|
+
def load_associations(dao_name, list, **opts, &block)
|
57
65
|
return if list.empty?
|
58
66
|
|
59
67
|
local_vars = block.binding.eval(<<-CODE, __FILE__, __LINE__ + 1)
|
@@ -63,7 +71,7 @@ class ReeDao::LoadAgg
|
|
63
71
|
|
64
72
|
agg_caller = block.binding.eval("self")
|
65
73
|
|
66
|
-
associations = Associations.new(agg_caller, list, local_vars, **opts).instance_exec(list, &block)
|
74
|
+
associations = Associations.new(agg_caller, list, local_vars, dao_name, **opts).instance_exec(list, &block)
|
67
75
|
|
68
76
|
if ReeDao.load_sync_associations_enabled?
|
69
77
|
associations
|
@@ -38,6 +38,21 @@
|
|
38
38
|
}
|
39
39
|
],
|
40
40
|
"links": [
|
41
|
+
{
|
42
|
+
"target": "demodulize",
|
43
|
+
"package_name": "ree_string",
|
44
|
+
"as": "demodulize",
|
45
|
+
"imports": [
|
46
|
+
|
47
|
+
]
|
48
|
+
},
|
49
|
+
{
|
50
|
+
"target": "underscore",
|
51
|
+
"package_name": "ree_string",
|
52
|
+
"as": "underscore",
|
53
|
+
"imports": [
|
41
54
|
|
55
|
+
]
|
56
|
+
}
|
42
57
|
]
|
43
58
|
}
|
data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/load_agg/load_agg_benchmark_spec.rb
CHANGED
@@ -129,7 +129,7 @@ RSpec.describe :load_agg do
|
|
129
129
|
end
|
130
130
|
|
131
131
|
def call(ids_or_scope)
|
132
|
-
load_agg(
|
132
|
+
load_agg(users, ids_or_scope) do
|
133
133
|
belongs_to :organization
|
134
134
|
|
135
135
|
has_many :books
|
@@ -141,7 +141,7 @@ RSpec.describe :load_agg do
|
|
141
141
|
has_many :skills
|
142
142
|
has_many :dreams
|
143
143
|
|
144
|
-
has_one :passport, foreign_key: :user_id, scope: user_passports
|
144
|
+
has_one :passport, -> { {foreign_key: :user_id, scope: user_passports} }
|
145
145
|
end
|
146
146
|
end
|
147
147
|
end
|
@@ -251,7 +251,7 @@ RSpec.describe :load_agg do
|
|
251
251
|
|
252
252
|
_users = []
|
253
253
|
st_time = Time.now
|
254
|
-
puts "
|
254
|
+
puts "Seeding #{NUM_OF_USERS} users..."
|
255
255
|
NUM_OF_USERS.times do
|
256
256
|
u = ReeDaoLoadAggTest::User.new(
|
257
257
|
name: Faker::Name.name,
|
@@ -104,7 +104,7 @@ RSpec.describe :load_agg do
|
|
104
104
|
has_many :books do |books_list|
|
105
105
|
has_one :author
|
106
106
|
has_many :chapters
|
107
|
-
|
107
|
+
|
108
108
|
has_many :reviews do |reviews_list|
|
109
109
|
has_one :review_author
|
110
110
|
|
@@ -113,7 +113,7 @@ RSpec.describe :load_agg do
|
|
113
113
|
|
114
114
|
field :book_calculatetable_field, -> { change_book_titles(books_list) }
|
115
115
|
end
|
116
|
-
|
116
|
+
|
117
117
|
has_one :passport, -> { passport_opts }
|
118
118
|
has_one :custom_field, -> { custom_field_opts }
|
119
119
|
|
@@ -153,6 +153,9 @@ RSpec.describe :load_agg do
|
|
153
153
|
|
154
154
|
aggregate :users_agg_with_dto do
|
155
155
|
link :users, from: :ree_dao_load_agg_test
|
156
|
+
link :books, from: :ree_dao_load_agg_test
|
157
|
+
link :authors, from: :ree_dao_load_agg_test
|
158
|
+
link :chapters, from: :ree_dao_load_agg_test
|
156
159
|
link :organizations, from: :ree_dao_load_agg_test
|
157
160
|
link :load_agg, from: :ree_dao
|
158
161
|
end
|
@@ -160,8 +163,32 @@ RSpec.describe :load_agg do
|
|
160
163
|
def call(ids_or_scope, **opts)
|
161
164
|
load_agg(users, ids_or_scope, **opts) do
|
162
165
|
belongs_to :organization
|
166
|
+
|
167
|
+
has_many :books, -> { books_opts } do
|
168
|
+
has_one :author, -> { author_opts }
|
169
|
+
has_many :chapters, -> { chapters_opts }
|
170
|
+
end
|
163
171
|
end
|
164
172
|
end
|
173
|
+
|
174
|
+
private
|
175
|
+
|
176
|
+
def books_opts
|
177
|
+
{
|
178
|
+
to_dto: -> (book) { ReeDaoLoadAggTest::BookDto.new(book) },
|
179
|
+
setter: -> (item, child_index) {
|
180
|
+
item.set_books(child_index[item.id] || [])
|
181
|
+
}
|
182
|
+
}
|
183
|
+
end
|
184
|
+
|
185
|
+
def author_opts
|
186
|
+
{ to_dto: -> (author) { ReeDaoLoadAggTest::AuthorDto.new(author) }}
|
187
|
+
end
|
188
|
+
|
189
|
+
def chapters_opts
|
190
|
+
{ to_dto: -> (chapter) { ReeDaoLoadAggTest::ChapterDto.new(chapter) }}
|
191
|
+
end
|
165
192
|
end
|
166
193
|
|
167
194
|
class ReeDaoLoadAggTest::UsersAggAutoloadBooksChildren
|
@@ -183,7 +210,7 @@ RSpec.describe :load_agg do
|
|
183
210
|
has_many :books, -> { books_opts } do
|
184
211
|
has_one :author
|
185
212
|
has_many :chapters
|
186
|
-
|
213
|
+
|
187
214
|
has_many :reviews do
|
188
215
|
has_one :review_author
|
189
216
|
end
|
@@ -192,7 +219,7 @@ RSpec.describe :load_agg do
|
|
192
219
|
end
|
193
220
|
|
194
221
|
private
|
195
|
-
|
222
|
+
|
196
223
|
def books_opts
|
197
224
|
{ autoload_children: true }
|
198
225
|
end
|
@@ -217,7 +244,7 @@ RSpec.describe :load_agg do
|
|
217
244
|
has_many :books do
|
218
245
|
has_one :author
|
219
246
|
has_many :chapters
|
220
|
-
|
247
|
+
|
221
248
|
has_many :reviews, -> { { autoload_children: true } } do
|
222
249
|
has_one :review_author
|
223
250
|
end
|
@@ -370,6 +397,12 @@ RSpec.describe :load_agg do
|
|
370
397
|
users.put(user_1)
|
371
398
|
users.put(user_2)
|
372
399
|
|
400
|
+
book_1 = ReeDaoLoadAggTest::Book.new(user_id: user_1.id, title: "1984")
|
401
|
+
books.put(book_1)
|
402
|
+
|
403
|
+
authors.put(ReeDaoLoadAggTest::Author.new(book_id: book_1.id, name: "George Orwell"))
|
404
|
+
chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_1.id, title: "interlude"))
|
405
|
+
|
373
406
|
res = users_agg_with_dto.call(
|
374
407
|
users.all,
|
375
408
|
to_dto: -> (user) {
|
@@ -382,7 +415,12 @@ RSpec.describe :load_agg do
|
|
382
415
|
}
|
383
416
|
)
|
384
417
|
|
418
|
+
book = res.first.books.first
|
419
|
+
|
385
420
|
expect(res.first.class).to eq(ReeDaoLoadAggTest::UserDto)
|
421
|
+
expect(book.class).to eq(ReeDaoLoadAggTest::BookDto)
|
422
|
+
expect(book.author.class).to eq(ReeDaoLoadAggTest::AuthorDto)
|
423
|
+
expect(book.chapters.first.class).to eq(ReeDaoLoadAggTest::ChapterDto)
|
386
424
|
}
|
387
425
|
|
388
426
|
it {
|
@@ -402,7 +440,7 @@ RSpec.describe :load_agg do
|
|
402
440
|
books.put(book_1)
|
403
441
|
books.put(book_2)
|
404
442
|
books.put(book_3)
|
405
|
-
|
443
|
+
|
406
444
|
res = users_agg_only_dataset.call(users.where(name: "John"))
|
407
445
|
|
408
446
|
user = res[0]
|
@@ -75,6 +75,9 @@ class ReeDaoLoadAggTest::Book
|
|
75
75
|
attr_accessor :title, :user_id
|
76
76
|
end
|
77
77
|
|
78
|
+
class ReeDaoLoadAggTest::BookDto < SimpleDelegator
|
79
|
+
end
|
80
|
+
|
78
81
|
class ReeDaoLoadAggTest::User
|
79
82
|
include ReeDto::EntityDSL
|
80
83
|
|
@@ -159,6 +162,14 @@ class ReeDaoLoadAggTest::UserDto
|
|
159
162
|
def organization
|
160
163
|
@organization
|
161
164
|
end
|
165
|
+
|
166
|
+
def set_books(books)
|
167
|
+
@books = books; nil
|
168
|
+
end
|
169
|
+
|
170
|
+
def books
|
171
|
+
@books
|
172
|
+
end
|
162
173
|
end
|
163
174
|
|
164
175
|
class ReeDaoLoadAggTest::Organization
|
@@ -276,6 +287,9 @@ class ReeDaoLoadAggTest::Chapter
|
|
276
287
|
attr_accessor :title, :book_id
|
277
288
|
end
|
278
289
|
|
290
|
+
class ReeDaoLoadAggTest::ChapterDto < SimpleDelegator
|
291
|
+
end
|
292
|
+
|
279
293
|
class ReeDaoLoadAggTest::Author
|
280
294
|
include ReeDto::EntityDSL
|
281
295
|
|
@@ -288,6 +302,9 @@ class ReeDaoLoadAggTest::Author
|
|
288
302
|
attr_accessor :name, :book_id
|
289
303
|
end
|
290
304
|
|
305
|
+
class ReeDaoLoadAggTest::AuthorDto < SimpleDelegator
|
306
|
+
end
|
307
|
+
|
291
308
|
class ReeDaoLoadAggTest::Review
|
292
309
|
include ReeDto::EntityDSL
|
293
310
|
|
data/lib/ree_lib/version.rb
CHANGED