ree_lib 1.0.59 → 1.0.61
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/ree_lib/packages/ree_dao/package/ree_dao/association.rb +68 -57
- 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_spec.rb +74 -0
- data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/load_agg/ree_dao_load_agg_test.rb +25 -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: a16fe3f260e9c08dfa590a34ffeafce9413115416aaedc37bcb4ee50fbd5ae67
|
4
|
+
data.tar.gz: d93566783538e0ea2eb9aba94938a3eccdb34901197d5e38afa9f03da9e5f826
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d1b98f584c71eb035a29a411161a9556aef71ce4b2d9e292e219e767e335ba9cbfa3c8b7fa49e776d846732f84af7c7f6cc5ce91bcfe5a975bd7cf91a843ad83
|
7
|
+
data.tar.gz: b4106abe1f03951c28959f8b9edc4c5f66ff05dcc1788bd2c1e268dd02f0487350ba5074c62eafd73244435dd42a3e034d87e873aaf5c5e11f3791b4884a83f4
|
data/Gemfile.lock
CHANGED
@@ -2,16 +2,15 @@ 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 :underscore, from: :ree_string
|
9
7
|
|
10
|
-
attr_reader :parent, :list, :global_opts
|
8
|
+
attr_reader :parent, :parent_dao_name, :list, :global_opts
|
11
9
|
|
12
|
-
contract(ReeDao::Associations, Array, Ksplat[RestKeys => Any] => Any)
|
13
|
-
def initialize(parent, list, **global_opts)
|
10
|
+
contract(ReeDao::Associations, Symbol, Array, Ksplat[RestKeys => Any] => Any)
|
11
|
+
def initialize(parent, parent_dao_name, list, **global_opts)
|
14
12
|
@parent = parent
|
13
|
+
@parent_dao_name = parent_dao_name
|
15
14
|
@list = list
|
16
15
|
@global_opts = global_opts
|
17
16
|
end
|
@@ -37,13 +36,18 @@ module ReeDao
|
|
37
36
|
Optblock => Nilor[Array]
|
38
37
|
)
|
39
38
|
def load_association(assoc_type, assoc_name, **opts, &block)
|
39
|
+
opts[:autoload_children] ||= false
|
40
|
+
|
40
41
|
assoc_index = load_association_by_type(
|
41
42
|
assoc_type,
|
42
43
|
assoc_name,
|
43
44
|
**opts
|
44
45
|
)
|
45
46
|
|
46
|
-
|
47
|
+
dao = find_dao(assoc_name, parent, opts[:scope])
|
48
|
+
dao_name = dao.first_source_table
|
49
|
+
|
50
|
+
process_block(assoc_index, opts[:autoload_children], opts[:to_dto], dao_name, &block) if block_given?
|
47
51
|
|
48
52
|
list
|
49
53
|
end
|
@@ -57,6 +61,7 @@ module ReeDao
|
|
57
61
|
case type
|
58
62
|
when :belongs_to
|
59
63
|
one_to_one(
|
64
|
+
parent_dao_name,
|
60
65
|
assoc_name,
|
61
66
|
list,
|
62
67
|
scope: opts[:scope],
|
@@ -67,44 +72,46 @@ module ReeDao
|
|
67
72
|
)
|
68
73
|
when :has_one
|
69
74
|
one_to_one(
|
75
|
+
parent_dao_name,
|
70
76
|
assoc_name,
|
71
77
|
list,
|
72
78
|
scope: opts[:scope],
|
73
79
|
primary_key: opts[:primary_key],
|
74
80
|
foreign_key: opts[:foreign_key],
|
81
|
+
to_dto: opts[:to_dto],
|
75
82
|
setter: opts[:setter],
|
76
83
|
reverse: true
|
77
84
|
)
|
78
85
|
when :has_many
|
79
86
|
one_to_many(
|
87
|
+
parent_dao_name,
|
80
88
|
assoc_name,
|
81
89
|
list,
|
82
90
|
scope: opts[:scope],
|
83
91
|
primary_key: opts[:primary_key],
|
84
92
|
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],
|
93
|
+
to_dto: opts[:to_dto],
|
94
94
|
setter: opts[:setter]
|
95
95
|
)
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
99
|
-
contract(Or[Hash, Array], Bool, Block => Any)
|
100
|
-
def process_block(assoc, autoload_children, &block)
|
99
|
+
contract(Or[Hash, Array], Bool, Nilor[Proc], Symbol, Block => Any)
|
100
|
+
def process_block(assoc, autoload_children, to_dto, parent_dao_name, &block)
|
101
101
|
assoc_list = assoc.is_a?(Array) ? assoc : assoc.values.flatten
|
102
102
|
|
103
|
+
if to_dto
|
104
|
+
assoc_list = assoc_list.map do |item|
|
105
|
+
to_dto.call(item)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
103
109
|
if ReeDao::Associations.sync_mode?
|
104
110
|
ReeDao::Associations.new(
|
105
111
|
parent.agg_caller,
|
106
112
|
assoc_list,
|
107
113
|
parent.local_vars,
|
114
|
+
parent_dao_name,
|
108
115
|
autoload_children,
|
109
116
|
**global_opts
|
110
117
|
).instance_exec(assoc_list, &block)
|
@@ -113,6 +120,7 @@ module ReeDao
|
|
113
120
|
parent.agg_caller,
|
114
121
|
assoc_list,
|
115
122
|
parent.local_vars,
|
123
|
+
parent_dao_name,
|
116
124
|
autoload_children,
|
117
125
|
**global_opts
|
118
126
|
).instance_exec(assoc_list, &block)
|
@@ -131,6 +139,7 @@ module ReeDao
|
|
131
139
|
end
|
132
140
|
|
133
141
|
contract(
|
142
|
+
Symbol,
|
134
143
|
Symbol,
|
135
144
|
Array,
|
136
145
|
Kwargs[
|
@@ -138,10 +147,11 @@ module ReeDao
|
|
138
147
|
foreign_key: Nilor[Symbol],
|
139
148
|
scope: Nilor[Sequel::Dataset, Array],
|
140
149
|
setter: Nilor[Or[Symbol, Proc]],
|
150
|
+
to_dto: Nilor[Proc],
|
141
151
|
reverse: Bool
|
142
152
|
] => Or[Hash, Array]
|
143
153
|
)
|
144
|
-
def one_to_one(assoc_name, list, scope: nil, primary_key: :id, foreign_key: nil, setter: nil, reverse: true)
|
154
|
+
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
155
|
return {} if list.empty?
|
146
156
|
|
147
157
|
primary_key ||= :id
|
@@ -153,39 +163,26 @@ module ReeDao
|
|
153
163
|
|
154
164
|
if reverse
|
155
165
|
if !foreign_key
|
156
|
-
|
157
|
-
foreign_key = "#{name}_id".to_sym
|
166
|
+
foreign_key = "#{parent_assoc_name.to_s.gsub(/e?s$/,'')}_id".to_sym
|
158
167
|
end
|
159
168
|
|
160
169
|
root_ids = list.map(&:id).uniq
|
161
170
|
else
|
162
171
|
if !foreign_key
|
163
|
-
|
164
|
-
.opts[:schema_mapper]
|
165
|
-
.dto(:db_load)
|
166
|
-
|
167
|
-
name = underscore(demodulize(dto_class.name))
|
168
|
-
|
169
|
-
root_ids = list.map(&:"#{"#{name}_id".to_sym}").uniq
|
170
|
-
foreign_key = :id
|
171
|
-
else
|
172
|
-
root_ids = list.map(&:"#{foreign_key}")
|
173
|
-
foreign_key = :id
|
172
|
+
foreign_key = :"#{assoc_name}_id"
|
174
173
|
end
|
174
|
+
|
175
|
+
root_ids = list.map(&:"#{foreign_key}").compact
|
175
176
|
end
|
176
177
|
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
items = add_scopes(default_scope, scope, global_opts[assoc_name])
|
178
|
+
scope ||= assoc_dao
|
179
|
+
scope = scope.where((reverse ? foreign_key : :id) => root_ids)
|
180
|
+
|
181
|
+
items = add_scopes(scope, global_opts[assoc_name])
|
182
182
|
end
|
183
183
|
|
184
|
-
|
185
|
-
|
186
|
-
else
|
187
|
-
items
|
188
|
-
end
|
184
|
+
|
185
|
+
assoc = index_by(items) { _1.send(reverse ? foreign_key : :id) }
|
189
186
|
|
190
187
|
populate_association(
|
191
188
|
list,
|
@@ -193,23 +190,26 @@ module ReeDao
|
|
193
190
|
assoc_name,
|
194
191
|
setter: setter,
|
195
192
|
reverse: reverse,
|
196
|
-
primary_key: primary_key
|
193
|
+
primary_key: primary_key,
|
194
|
+
to_dto: to_dto
|
197
195
|
)
|
198
196
|
|
199
197
|
assoc
|
200
198
|
end
|
201
199
|
|
202
200
|
contract(
|
201
|
+
Symbol,
|
203
202
|
Symbol,
|
204
203
|
Array,
|
205
204
|
Kwargs[
|
206
205
|
foreign_key: Nilor[Symbol],
|
207
206
|
primary_key: Nilor[Symbol],
|
208
207
|
scope: Nilor[Sequel::Dataset, Array],
|
209
|
-
setter: Nilor[Or[Symbol, Proc]]
|
208
|
+
setter: Nilor[Or[Symbol, Proc]],
|
209
|
+
to_dto: Nilor[Proc]
|
210
210
|
] => Or[Hash, Array]
|
211
211
|
)
|
212
|
-
def one_to_many(assoc_name, list, primary_key: nil, foreign_key: nil, scope: nil, setter: nil)
|
212
|
+
def one_to_many(parent_assoc_name, assoc_name, list, primary_key: nil, foreign_key: nil, scope: nil, setter: nil, to_dto: nil)
|
213
213
|
return {} if list.empty?
|
214
214
|
|
215
215
|
primary_key ||= :id
|
@@ -220,15 +220,14 @@ module ReeDao
|
|
220
220
|
assoc_dao = nil
|
221
221
|
assoc_dao = find_dao(assoc_name, parent, scope)
|
222
222
|
|
223
|
-
foreign_key ||= "#{
|
223
|
+
foreign_key ||= "#{parent_assoc_name.to_s.gsub(/e?s$/,'')}_id".to_sym
|
224
224
|
|
225
225
|
root_ids = list.map(&:"#{primary_key}")
|
226
226
|
|
227
|
-
|
228
|
-
|
229
|
-
end
|
227
|
+
scope ||= assoc_dao
|
228
|
+
scope = scope.where(foreign_key => root_ids)
|
230
229
|
|
231
|
-
items = add_scopes(
|
230
|
+
items = add_scopes(scope, global_opts[assoc_name])
|
232
231
|
end
|
233
232
|
|
234
233
|
assoc = if foreign_key
|
@@ -243,6 +242,7 @@ module ReeDao
|
|
243
242
|
assoc_name,
|
244
243
|
setter: setter,
|
245
244
|
primary_key: primary_key,
|
245
|
+
to_dto: to_dto,
|
246
246
|
multiple: true
|
247
247
|
)
|
248
248
|
|
@@ -257,10 +257,11 @@ module ReeDao
|
|
257
257
|
primary_key: Nilor[Symbol],
|
258
258
|
reverse: Nilor[Bool],
|
259
259
|
setter: Nilor[Or[Symbol, Proc]],
|
260
|
+
to_dto: Nilor[Proc],
|
260
261
|
multiple: Bool
|
261
262
|
] => Any
|
262
263
|
)
|
263
|
-
def populate_association(list, association_index, assoc_name, primary_key: nil, reverse: nil, setter: nil, multiple: false)
|
264
|
+
def populate_association(list, association_index, assoc_name, primary_key: nil, reverse: nil, setter: nil, to_dto: nil, multiple: false)
|
264
265
|
assoc_setter = if setter
|
265
266
|
setter
|
266
267
|
else
|
@@ -278,7 +279,17 @@ module ReeDao
|
|
278
279
|
end
|
279
280
|
value = association_index[item.send(key)]
|
280
281
|
|
281
|
-
|
282
|
+
if to_dto && !value.nil?
|
283
|
+
if value.is_a?(Array)
|
284
|
+
value = value.map { to_dto.call(_1) }
|
285
|
+
else
|
286
|
+
value = to_dto.call(value)
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
if value.nil? && multiple
|
291
|
+
value = []
|
292
|
+
end
|
282
293
|
|
283
294
|
begin
|
284
295
|
item.send(assoc_setter, value)
|
@@ -289,12 +300,12 @@ module ReeDao
|
|
289
300
|
end
|
290
301
|
end
|
291
302
|
|
292
|
-
contract(Nilor[Sequel::Dataset], Nilor[
|
293
|
-
def add_scopes(
|
294
|
-
res =
|
295
|
-
|
296
|
-
|
297
|
-
|
303
|
+
contract(Nilor[Sequel::Dataset], Nilor[Proc] => Array)
|
304
|
+
def add_scopes(scope, named_scope)
|
305
|
+
res = if named_scope
|
306
|
+
named_scope.call(scope)
|
307
|
+
else
|
308
|
+
scope
|
298
309
|
end
|
299
310
|
|
300
311
|
res.all
|
@@ -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
|
}
|
@@ -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,27 @@ 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
|
+
{ to_dto: -> (book) { ReeDaoLoadAggTest::BookDto.new(book) }}
|
178
|
+
end
|
179
|
+
|
180
|
+
def author_opts
|
181
|
+
{ to_dto: -> (author) { ReeDaoLoadAggTest::AuthorDto.new(author) }}
|
182
|
+
end
|
183
|
+
|
184
|
+
def chapters_opts
|
185
|
+
{ to_dto: -> (chapter) { ReeDaoLoadAggTest::ChapterDto.new(chapter) }}
|
186
|
+
end
|
165
187
|
end
|
166
188
|
|
167
189
|
class ReeDaoLoadAggTest::UsersAggAutoloadBooksChildren
|
@@ -278,6 +300,7 @@ RSpec.describe :load_agg do
|
|
278
300
|
belongs_to :organization
|
279
301
|
|
280
302
|
has_many :books, -> { books_opts(title) }
|
303
|
+
has_many :active_books, books
|
281
304
|
end
|
282
305
|
end
|
283
306
|
|
@@ -369,6 +392,12 @@ RSpec.describe :load_agg do
|
|
369
392
|
users.put(user_1)
|
370
393
|
users.put(user_2)
|
371
394
|
|
395
|
+
book_1 = ReeDaoLoadAggTest::Book.new(user_id: user_1.id, title: "1984")
|
396
|
+
books.put(book_1)
|
397
|
+
|
398
|
+
authors.put(ReeDaoLoadAggTest::Author.new(book_id: book_1.id, name: "George Orwell"))
|
399
|
+
chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_1.id, title: "interlude"))
|
400
|
+
|
372
401
|
res = users_agg_with_dto.call(
|
373
402
|
users.all,
|
374
403
|
to_dto: -> (user) {
|
@@ -381,7 +410,12 @@ RSpec.describe :load_agg do
|
|
381
410
|
}
|
382
411
|
)
|
383
412
|
|
413
|
+
book = res.first.books.first
|
414
|
+
|
384
415
|
expect(res.first.class).to eq(ReeDaoLoadAggTest::UserDto)
|
416
|
+
expect(book.class).to eq(ReeDaoLoadAggTest::BookDto)
|
417
|
+
expect(book.author.class).to eq(ReeDaoLoadAggTest::AuthorDto)
|
418
|
+
expect(book.chapters.first.class).to eq(ReeDaoLoadAggTest::ChapterDto)
|
385
419
|
}
|
386
420
|
|
387
421
|
it {
|
@@ -508,6 +542,45 @@ RSpec.describe :load_agg do
|
|
508
542
|
expect(res[0].books[1].author).to eq(nil)
|
509
543
|
}
|
510
544
|
|
545
|
+
it {
|
546
|
+
organizations.delete_all
|
547
|
+
users.delete_all
|
548
|
+
user_passports.delete_all
|
549
|
+
books.delete_all
|
550
|
+
chapters.delete_all
|
551
|
+
|
552
|
+
organization = ReeDaoLoadAggTest::Organization.new(name: "Test Org")
|
553
|
+
organizations.put(organization)
|
554
|
+
|
555
|
+
user_1 = ReeDaoLoadAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
|
556
|
+
user_2 = ReeDaoLoadAggTest::User.new(name: "Sam", age: 21, organization_id: organization.id)
|
557
|
+
users.put(user_1)
|
558
|
+
users.put(user_2)
|
559
|
+
|
560
|
+
book_1 = ReeDaoLoadAggTest::Book.new(user_id: user_1.id, title: "1984")
|
561
|
+
book_2 = ReeDaoLoadAggTest::Book.new(user_id: user_1.id, title: "1408")
|
562
|
+
|
563
|
+
books.put(book_1)
|
564
|
+
books.put(book_2)
|
565
|
+
|
566
|
+
res = users_agg.call(
|
567
|
+
users.all
|
568
|
+
)
|
569
|
+
|
570
|
+
expect(res[0].books).to_not eq([])
|
571
|
+
expect(res[1].books).to eq([])
|
572
|
+
|
573
|
+
books.delete(book_1)
|
574
|
+
books.delete(book_2)
|
575
|
+
|
576
|
+
res = users_agg.call(
|
577
|
+
users.all
|
578
|
+
)
|
579
|
+
|
580
|
+
expect(res[0].books).to eq([])
|
581
|
+
expect(res[1].books).to eq([])
|
582
|
+
}
|
583
|
+
|
511
584
|
it {
|
512
585
|
organizations.delete_all
|
513
586
|
users.delete_all
|
@@ -533,6 +606,7 @@ RSpec.describe :load_agg do
|
|
533
606
|
expect(res_user.id).to eq(user_1.id)
|
534
607
|
expect(res_user.organization).to eq(organization)
|
535
608
|
expect(res_user.books.count).to eq(1)
|
609
|
+
expect(res_user.active_books.count).to eq(2)
|
536
610
|
}
|
537
611
|
|
538
612
|
it {
|
@@ -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
|
|
@@ -105,6 +108,14 @@ class ReeDaoLoadAggTest::User
|
|
105
108
|
@books
|
106
109
|
end
|
107
110
|
|
111
|
+
def set_active_books(books)
|
112
|
+
@active_books = books
|
113
|
+
end
|
114
|
+
|
115
|
+
def active_books
|
116
|
+
@active_books
|
117
|
+
end
|
118
|
+
|
108
119
|
contract(ArrayOf[ReeDaoLoadAggTest::Book] => nil)
|
109
120
|
def set_books(books)
|
110
121
|
@books = books; nil
|
@@ -151,6 +162,14 @@ class ReeDaoLoadAggTest::UserDto
|
|
151
162
|
def organization
|
152
163
|
@organization
|
153
164
|
end
|
165
|
+
|
166
|
+
def set_books(books)
|
167
|
+
@books = books; nil
|
168
|
+
end
|
169
|
+
|
170
|
+
def books
|
171
|
+
@books
|
172
|
+
end
|
154
173
|
end
|
155
174
|
|
156
175
|
class ReeDaoLoadAggTest::Organization
|
@@ -268,6 +287,9 @@ class ReeDaoLoadAggTest::Chapter
|
|
268
287
|
attr_accessor :title, :book_id
|
269
288
|
end
|
270
289
|
|
290
|
+
class ReeDaoLoadAggTest::ChapterDto < SimpleDelegator
|
291
|
+
end
|
292
|
+
|
271
293
|
class ReeDaoLoadAggTest::Author
|
272
294
|
include ReeDto::EntityDSL
|
273
295
|
|
@@ -280,6 +302,9 @@ class ReeDaoLoadAggTest::Author
|
|
280
302
|
attr_accessor :name, :book_id
|
281
303
|
end
|
282
304
|
|
305
|
+
class ReeDaoLoadAggTest::AuthorDto < SimpleDelegator
|
306
|
+
end
|
307
|
+
|
283
308
|
class ReeDaoLoadAggTest::Review
|
284
309
|
include ReeDto::EntityDSL
|
285
310
|
|
data/lib/ree_lib/version.rb
CHANGED