ree_lib 1.0.49 → 1.0.50

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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +4 -3
  3. data/lib/ree_lib/Packages.schema.json +4 -0
  4. data/lib/ree_lib/packages/ree_actions/spec/ree_actions/dsl_spec.rb +17 -10
  5. data/lib/ree_lib/packages/ree_dao/Package.schema.json +10 -0
  6. data/lib/ree_lib/packages/ree_dao/package/ree_dao/aggregate_dsl.rb +26 -0
  7. data/lib/ree_lib/packages/ree_dao/package/ree_dao/association.rb +311 -0
  8. data/lib/ree_lib/packages/ree_dao/package/ree_dao/associations.rb +148 -0
  9. data/lib/ree_lib/packages/ree_dao/package/ree_dao/beans/dao_cache.rb +40 -19
  10. data/lib/ree_lib/packages/ree_dao/package/ree_dao/contract/dao_dataset_contract.rb +15 -0
  11. data/lib/ree_lib/packages/ree_dao/package/ree_dao/contract/entity_contract.rb +15 -0
  12. data/lib/ree_lib/packages/ree_dao/package/ree_dao/dataset_extensions.rb +4 -0
  13. data/lib/ree_lib/packages/ree_dao/package/ree_dao/dsl.rb +1 -1
  14. data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/build_pg_connection.rb +1 -0
  15. data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/build_sqlite_connection.rb +1 -0
  16. data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/drop_cache.rb +1 -1
  17. data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/init_cache.rb +1 -1
  18. data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/load_agg.rb +63 -0
  19. data/lib/ree_lib/packages/ree_dao/package/ree_dao/thread_parents.rb +40 -0
  20. data/lib/ree_lib/packages/ree_dao/package/ree_dao.rb +9 -0
  21. data/lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/build_pg_connection.schema.json +1 -1
  22. data/lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/build_sqlite_connection.schema.json +1 -1
  23. data/lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/load_agg.schema.json +43 -0
  24. data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/load_agg/load_agg_benchmark_spec.rb +414 -0
  25. data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/load_agg/load_agg_spec.rb +605 -0
  26. data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/load_agg/ree_dao_load_agg_test.rb +524 -0
  27. data/lib/ree_lib/packages/ree_logger/package/ree_logger/multi_logger.rb +19 -10
  28. data/lib/ree_lib/packages/ree_logger/spec/ree_logger/multi_logger_spec.rb +10 -0
  29. data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper_factory_proxy.rb +6 -3
  30. data/lib/ree_lib/packages/ree_std/.gitignore +0 -0
  31. data/lib/ree_lib/packages/ree_std/.rspec +2 -0
  32. data/lib/ree_lib/packages/ree_std/Package.schema.json +24 -0
  33. data/lib/ree_lib/packages/ree_std/bin/console +5 -0
  34. data/lib/ree_lib/packages/ree_std/package/ree_std/functions/retry_on_fail.rb +46 -0
  35. data/lib/ree_lib/packages/ree_std/package/ree_std/retry.rb +67 -0
  36. data/lib/ree_lib/packages/ree_std/package/ree_std.rb +6 -0
  37. data/lib/ree_lib/packages/ree_std/schemas/ree_std/functions/retry_on_fail.schema.json +38 -0
  38. data/lib/ree_lib/packages/ree_std/spec/package_schema_spec.rb +14 -0
  39. data/lib/ree_lib/packages/ree_std/spec/ree_std/functions/retry_on_fail_spec.rb +97 -0
  40. data/lib/ree_lib/packages/ree_std/spec/spec_helper.rb +3 -0
  41. data/lib/ree_lib/packages/ree_swagger/package/ree_swagger/functions/build_request_body_schema.rb +5 -0
  42. data/lib/ree_lib/packages/ree_swagger/package/ree_swagger/functions/build_serializer_schema.rb +5 -0
  43. data/lib/ree_lib/packages/ree_swagger/spec/functions/build_endpoint_schema_spec.rb +4 -2
  44. data/lib/ree_lib/packages/ree_swagger/spec/functions/build_request_body_spec.rb +4 -2
  45. data/lib/ree_lib/version.rb +1 -1
  46. metadata +38 -2
@@ -0,0 +1,605 @@
1
+ # frozen_string_literal: true
2
+ require 'faker'
3
+ require 'benchmark'
4
+
5
+ RSpec.describe :load_agg do
6
+ link :build_pg_connection, from: :ree_dao
7
+ link :load_agg, from: :ree_dao
8
+
9
+ after do
10
+ Ree.disable_irb_mode
11
+ end
12
+
13
+ before :all do
14
+ connection = build_pg_connection(ReeDaoLoadAggTest::Db::DB_CONFIG)
15
+
16
+ connection.drop_table(:organizations, cascade: true) if connection.table_exists?(:organizations)
17
+ connection.drop_table(:users, cascade: true) if connection.table_exists?(:users)
18
+ connection.drop_table(:user_passports, cascade: true) if connection.table_exists?(:user_passports)
19
+ connection.drop_table(:books, cascade: true) if connection.table_exists?(:books)
20
+ connection.drop_table(:chapters, cascade: true) if connection.table_exists?(:chapters)
21
+ connection.drop_table(:authors, cascade: true) if connection.table_exists?(:authors)
22
+ connection.drop_table(:reviews, cascade: true) if connection.table_exists?(:reviews)
23
+ connection.drop_table(:review_authors, cascade: true) if connection.table_exists?(:review_authors)
24
+
25
+ connection.create_table :organizations do
26
+ primary_key :id
27
+
28
+ column :name, 'varchar(256)'
29
+ end
30
+
31
+ connection.create_table :users do
32
+ primary_key :id
33
+
34
+ column :name, 'varchar(256)'
35
+ column :age, :integer
36
+ foreign_key :organization_id, :organizations, null: false, on_delete: :cascade
37
+ end
38
+
39
+ connection.create_table :user_passports do
40
+ primary_key :id
41
+
42
+ foreign_key :user_id, :users, null: false, on_delete: :cascade
43
+ column :info, 'varchar(256)'
44
+ end
45
+
46
+ connection.create_table :books do
47
+ primary_key :id
48
+
49
+ foreign_key :user_id, :users, null: false, on_delete: :cascade
50
+ column :title, 'varchar(256)'
51
+ end
52
+
53
+ connection.create_table :chapters do
54
+ primary_key :id
55
+
56
+ foreign_key :book_id, :books, null: false, on_delete: :cascade
57
+ column :title, 'varchar(256)'
58
+ end
59
+
60
+ connection.create_table :reviews do
61
+ primary_key :id
62
+
63
+ foreign_key :book_id, :books, null: false, on_delete: :cascade
64
+ column :rating, :integer
65
+ end
66
+
67
+ connection.create_table :review_authors do
68
+ primary_key :id
69
+
70
+ foreign_key :review_id, :reviews, null: false, on_delete: :cascade
71
+ column :name, 'varchar(256)'
72
+ end
73
+
74
+ connection.create_table :authors do
75
+ primary_key :id
76
+
77
+ foreign_key :book_id, :books, null: false, on_delete: :cascade
78
+ column :name, 'varchar(256)'
79
+ end
80
+
81
+ connection.disconnect
82
+ end
83
+
84
+ require_relative 'ree_dao_load_agg_test'
85
+
86
+ class ReeDaoLoadAggTest::UsersAgg
87
+ include ReeDao::AggregateDSL
88
+
89
+ aggregate :users_agg do
90
+ link :users, from: :ree_dao_load_agg_test
91
+ link :organizations, from: :ree_dao_load_agg_test
92
+ link :user_passports, from: :ree_dao_load_agg_test
93
+ link :books, from: :ree_dao_load_agg_test
94
+ link :chapters, from: :ree_dao_load_agg_test
95
+ link :authors, from: :ree_dao_load_agg_test
96
+ link :reviews, from: :ree_dao_load_agg_test
97
+ link :review_authors, from: :ree_dao_load_agg_test
98
+ link :load_agg, from: :ree_dao
99
+ end
100
+
101
+ def call(ids_or_scope, **opts)
102
+ load_agg(ids_or_scope, users, **opts) do
103
+ belongs_to :organization
104
+ has_many :books do
105
+ has_one :author
106
+ has_many :chapters
107
+
108
+ has_many :reviews do
109
+ has_one :review_author
110
+ end
111
+ end
112
+
113
+ has_one :passport, foreign_key: :user_id, scope: user_passports
114
+ field :custom_field, scope: books.where(title: "1984")
115
+ end
116
+ end
117
+ end
118
+
119
+ class ReeDaoLoadAggTest::UsersAggAutoloadBooksChildren
120
+ include ReeDao::AggregateDSL
121
+
122
+ aggregate :users_agg_autoload_books_children do
123
+ link :users, from: :ree_dao_load_agg_test
124
+ link :books, from: :ree_dao_load_agg_test
125
+ link :chapters, from: :ree_dao_load_agg_test
126
+ link :authors, from: :ree_dao_load_agg_test
127
+ link :reviews, from: :ree_dao_load_agg_test
128
+ link :review_authors, from: :ree_dao_load_agg_test
129
+ link :load_agg, from: :ree_dao
130
+ end
131
+
132
+ def call(ids_or_scope, **opts)
133
+ load_agg(ids_or_scope, users, **opts) do
134
+ belongs_to :organization
135
+ has_many :books, autoload_children: true do
136
+ has_one :author
137
+ has_many :chapters
138
+
139
+ has_many :reviews do
140
+ has_one :review_author
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
146
+
147
+ class ReeDaoLoadAggTest::UsersAggAutoloadReviewsChildren
148
+ include ReeDao::AggregateDSL
149
+
150
+ aggregate :users_agg_autoload_reviews_children do
151
+ link :users, from: :ree_dao_load_agg_test
152
+ link :books, from: :ree_dao_load_agg_test
153
+ link :chapters, from: :ree_dao_load_agg_test
154
+ link :authors, from: :ree_dao_load_agg_test
155
+ link :reviews, from: :ree_dao_load_agg_test
156
+ link :review_authors, from: :ree_dao_load_agg_test
157
+ link :load_agg, from: :ree_dao
158
+ end
159
+
160
+ def call(ids_or_scope, **opts)
161
+ load_agg(ids_or_scope, users, **opts) do
162
+ belongs_to :organization
163
+ has_many :books do
164
+ has_one :author
165
+ has_many :chapters
166
+
167
+ has_many :reviews, autoload_children: true do
168
+ has_one :review_author
169
+ end
170
+ end
171
+ end
172
+ end
173
+ end
174
+
175
+ class ReeDaoLoadAggTest::UsersAggBlockTest
176
+ include ReeDao::AggregateDSL
177
+
178
+ aggregate :users_agg_block_test do
179
+ link :users, from: :ree_dao_load_agg_test
180
+ link :organizations, from: :ree_dao_load_agg_test
181
+ link :books, from: :ree_dao_load_agg_test
182
+ link :load_agg, from: :ree_dao
183
+ end
184
+
185
+ def call(ids_or_scope, **opts)
186
+ load_agg(ids_or_scope, users, **opts) do
187
+ belongs_to :organization
188
+ has_many :books, setter: -> (item, items_index) {
189
+ item.set_books([1337, 1337])
190
+ }
191
+ end
192
+ end
193
+ end
194
+
195
+ class ReeDaoLoadAggTest::UsersAggScopeMethodTest
196
+ include ReeDao::AggregateDSL
197
+
198
+ aggregate :users_agg_scope_method_test do
199
+ link :users, from: :ree_dao_load_agg_test
200
+ link :organizations, from: :ree_dao_load_agg_test
201
+ link :books, from: :ree_dao_load_agg_test
202
+ link :load_agg, from: :ree_dao
203
+ end
204
+
205
+ def call(ids_or_scope, **opts)
206
+ load_agg(ids_or_scope, users, **opts) do
207
+ title = "1984"
208
+ belongs_to :organization
209
+
210
+ has_many :books, scope: books_scope(title)
211
+ end
212
+ end
213
+
214
+ private
215
+
216
+ def books_scope(title)
217
+ books.where(title: title)
218
+ end
219
+ end
220
+
221
+ class ReeDaoLoadAggTest::UsersAggWithoutDao
222
+ include ReeDao::AggregateDSL
223
+
224
+ aggregate :users_agg_without_dao do
225
+ link :users, from: :ree_dao_load_agg_test
226
+ link :organizations, from: :ree_dao_load_agg_test
227
+ link :books, from: :ree_dao_load_agg_test
228
+ link :load_agg, from: :ree_dao
229
+ end
230
+
231
+ def call(ids_or_scope, **opts)
232
+ load_agg(ids_or_scope, users, **opts) do
233
+ has_many :something
234
+ end
235
+ end
236
+ end
237
+
238
+ let(:users_agg) { ReeDaoLoadAggTest::UsersAgg.new }
239
+ let(:users_agg_block) { ReeDaoLoadAggTest::UsersAggBlockTest.new }
240
+ let(:users_agg_scope_method) { ReeDaoLoadAggTest::UsersAggScopeMethodTest.new }
241
+ let(:users_agg_autoload_books_children) { ReeDaoLoadAggTest::UsersAggAutoloadBooksChildren.new }
242
+ let(:users_agg_autoload_reviews_children) { ReeDaoLoadAggTest::UsersAggAutoloadReviewsChildren.new }
243
+ let(:users_agg_without_dao) { ReeDaoLoadAggTest::UsersAggWithoutDao.new }
244
+ let(:organizations) { ReeDaoLoadAggTest::Organizations.new }
245
+ let(:users) { ReeDaoLoadAggTest::Users.new }
246
+ let(:user_passports) { ReeDaoLoadAggTest::UserPassports.new }
247
+ let(:books) { ReeDaoLoadAggTest::Books.new }
248
+ let(:chapters) { ReeDaoLoadAggTest::Chapters.new }
249
+ let(:authors) { ReeDaoLoadAggTest::Authors.new }
250
+ let(:reviews) { ReeDaoLoadAggTest::Reviews.new }
251
+ let(:review_authors) { ReeDaoLoadAggTest::ReviewAuthors.new }
252
+
253
+ it {
254
+ organizations.delete_all
255
+ users.delete_all
256
+
257
+ organization = ReeDaoLoadAggTest::Organization.new(name: "Test Org")
258
+ organizations.put(organization)
259
+
260
+ user = ReeDaoLoadAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
261
+ users.put(user)
262
+
263
+ expect {
264
+ users_agg_without_dao.call(users.all)
265
+ }.to raise_error(ArgumentError)
266
+ }
267
+
268
+ it {
269
+ organizations.delete_all
270
+ users.delete_all
271
+ user_passports.delete_all
272
+ books.delete_all
273
+ chapters.delete_all
274
+
275
+ organization = ReeDaoLoadAggTest::Organization.new(name: "Test Org")
276
+ organizations.put(organization)
277
+
278
+ user_1 = ReeDaoLoadAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
279
+ user_2 = ReeDaoLoadAggTest::User.new(name: "Sam", age: 21, organization_id: organization.id)
280
+ users.put(user_1)
281
+ users.put(user_2)
282
+
283
+ passport_1 = ReeDaoLoadAggTest::UserPassport.new(user_id: user_1.id, info: "some info")
284
+ user_passports.put(passport_1)
285
+ user_passports.put(ReeDaoLoadAggTest::UserPassport.new(user_id: user_2.id, info: "another info"))
286
+
287
+ book_1 = ReeDaoLoadAggTest::Book.new(user_id: user_1.id, title: "1984")
288
+ book_2 = ReeDaoLoadAggTest::Book.new(user_id: user_1.id, title: "1408")
289
+
290
+ books.put(book_1)
291
+ books.put(book_2)
292
+
293
+ chapter = ReeDaoLoadAggTest::Chapter.new(book_id: book_1.id, title: "beginning")
294
+ chapters.put(chapter)
295
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_1.id, title: "interlude"))
296
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_1.id, title: "tragic ending"))
297
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_2.id, title: "beginning"))
298
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_2.id, title: "ending"))
299
+
300
+
301
+ authors.put(ReeDaoLoadAggTest::Author.new(book_id: book_1.id, name: "George Orwell"))
302
+ review = ReeDaoLoadAggTest::Review.new(book_id: book_1.id, rating: 10)
303
+ reviews.put(review)
304
+ reviews.put(ReeDaoLoadAggTest::Review.new(book_id: book_1.id, rating: 7))
305
+ review_authors.put(ReeDaoLoadAggTest::ReviewAuthor.new(review_id: review.id, name: "John Review"))
306
+
307
+ res = users_agg.call(
308
+ users.all,
309
+ chapters: -> (scope) { scope.ids(chapter.id) }
310
+ )
311
+
312
+ res_user = res[0]
313
+ expect(res_user.id).to eq(user_1.id)
314
+ expect(res_user.organization).to eq(organization)
315
+ expect(res_user.passport).to eq(passport_1)
316
+ expect(res_user.passport.info).to eq("some info")
317
+ expect(res_user.books.count).to eq(2)
318
+ expect(res_user.books[0].author.name).to eq("George Orwell")
319
+ expect(res_user.books[0].chapters.map(&:title)).to eq(["beginning"])
320
+ expect(res_user.books[0].reviews[0].review_author.name).to eq("John Review")
321
+ expect(res_user.custom_field).to_not eq(nil)
322
+ }
323
+
324
+ it {
325
+ organizations.delete_all
326
+ users.delete_all
327
+ books.delete_all
328
+
329
+ organization = ReeDaoLoadAggTest::Organization.new(name: "Test Org")
330
+ organizations.put(organization)
331
+
332
+ user_1 = ReeDaoLoadAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
333
+ user_2 = ReeDaoLoadAggTest::User.new(name: "Sam", age: 21, organization_id: organization.id)
334
+ users.put(user_1)
335
+ users.put(user_2)
336
+
337
+ book_1 = ReeDaoLoadAggTest::Book.new(user_id: user_1.id, title: "1984")
338
+ book_2 = ReeDaoLoadAggTest::Book.new(user_id: user_1.id, title: "1408")
339
+
340
+ books.put(book_1)
341
+ books.put(book_2)
342
+
343
+ res = users_agg_scope_method.call(users.all)
344
+
345
+ res_user = res[0]
346
+ expect(res_user.id).to eq(user_1.id)
347
+ expect(res_user.organization).to eq(organization)
348
+ expect(res_user.books.count).to eq(1)
349
+ }
350
+
351
+ it {
352
+ organizations.delete_all
353
+ users.delete_all
354
+ user_passports.delete_all
355
+ books.delete_all
356
+ chapters.delete_all
357
+
358
+ organization = ReeDaoLoadAggTest::Organization.new(name: "Test Org")
359
+ organizations.put(organization)
360
+
361
+ user_1 = ReeDaoLoadAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
362
+ users.put(user_1)
363
+
364
+ book_1 = ReeDaoLoadAggTest::Book.new(user_id: user_1.id, title: "1984")
365
+ book_2 = ReeDaoLoadAggTest::Book.new(user_id: user_1.id, title: "1408")
366
+
367
+ books.put(book_1)
368
+ books.put(book_2)
369
+
370
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_1.id, title: "beginning"))
371
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_1.id, title: "interlude"))
372
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_1.id, title: "tragic ending"))
373
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_2.id, title: "beginning"))
374
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_2.id, title: "ending"))
375
+
376
+ res = users_agg.call(
377
+ users.all,
378
+ only: [:books, :chapters]
379
+ )
380
+
381
+ u = res[0]
382
+ expect(u.books.count).to eq(2)
383
+ expect(u.books[0].chapters.count).to_not eq(0)
384
+ }
385
+
386
+ it {
387
+ organizations.delete_all
388
+ users.delete_all
389
+ user_passports.delete_all
390
+ books.delete_all
391
+ chapters.delete_all
392
+
393
+ organization = ReeDaoLoadAggTest::Organization.new(name: "Test Org")
394
+ organizations.put(organization)
395
+
396
+ user_1 = ReeDaoLoadAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
397
+ users.put(user_1)
398
+
399
+ book_1 = ReeDaoLoadAggTest::Book.new(user_id: user_1.id, title: "1984")
400
+ book_2 = ReeDaoLoadAggTest::Book.new(user_id: user_1.id, title: "1408")
401
+
402
+ books.put(book_1)
403
+ books.put(book_2)
404
+
405
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_1.id, title: "beginning"))
406
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_1.id, title: "interlude"))
407
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_1.id, title: "tragic ending"))
408
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_2.id, title: "beginning"))
409
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_2.id, title: "ending"))
410
+
411
+ res = users_agg.call(
412
+ users.all,
413
+ only: [:books, :chapters]
414
+ )
415
+
416
+ u = res[0]
417
+ expect(u.books.count).to eq(2)
418
+ expect(u.books[0].chapters.count).to_not eq(0)
419
+ }
420
+
421
+ it {
422
+ organizations.delete_all
423
+ users.delete_all
424
+ user_passports.delete_all
425
+ books.delete_all
426
+ chapters.delete_all
427
+
428
+ organization = ReeDaoLoadAggTest::Organization.new(name: "Test Org")
429
+ organizations.put(organization)
430
+
431
+ user = ReeDaoLoadAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
432
+ users.put(user)
433
+
434
+ book = ReeDaoLoadAggTest::Book.new(user_id: user.id, title: "1984")
435
+ books.put(book)
436
+
437
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book.id, title: "beginning"))
438
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book.id, title: "interlude"))
439
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book.id, title: "tragic ending"))
440
+
441
+ authors.put(ReeDaoLoadAggTest::Author.new(book_id: book.id, name: "George Orwell"))
442
+
443
+ review = ReeDaoLoadAggTest::Review.new(book_id: book.id, rating: 5)
444
+ reviews.put(review)
445
+ review_authors.put(ReeDaoLoadAggTest::ReviewAuthor.new(review_id: review.id, name: "John"))
446
+
447
+ res = users_agg_autoload_books_children.call(
448
+ users.all,
449
+ only: [:books]
450
+ )
451
+
452
+ u = res[0]
453
+ expect(u.books).to_not eq(nil)
454
+ expect(u.books[0].chapters).to_not eq(nil)
455
+ expect(u.books[0].author).to_not eq(nil)
456
+ expect(u.books[0].reviews).to_not eq(nil)
457
+ expect(u.books[0].reviews[0].review_author).to eq(nil)
458
+ }
459
+
460
+ it {
461
+ organizations.delete_all
462
+ users.delete_all
463
+ user_passports.delete_all
464
+ books.delete_all
465
+ chapters.delete_all
466
+
467
+ organization = ReeDaoLoadAggTest::Organization.new(name: "Test Org")
468
+ organizations.put(organization)
469
+
470
+ user = ReeDaoLoadAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
471
+ users.put(user)
472
+
473
+ book = ReeDaoLoadAggTest::Book.new(user_id: user.id, title: "1984")
474
+ books.put(book)
475
+
476
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book.id, title: "beginning"))
477
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book.id, title: "interlude"))
478
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book.id, title: "tragic ending"))
479
+
480
+ authors.put(ReeDaoLoadAggTest::Author.new(book_id: book.id, name: "George Orwell"))
481
+
482
+ review = ReeDaoLoadAggTest::Review.new(book_id: book.id, rating: 5)
483
+ reviews.put(review)
484
+ review_authors.put(ReeDaoLoadAggTest::ReviewAuthor.new(review_id: review.id, name: "John"))
485
+
486
+ res = users_agg_autoload_reviews_children.call(
487
+ users.all,
488
+ only: [:books, :reviews]
489
+ )
490
+
491
+ u = res[0]
492
+ expect(u.books).to_not eq(nil)
493
+ expect(u.books[0].chapters).to eq(nil)
494
+ expect(u.books[0].author).to eq(nil)
495
+ expect(u.books[0].reviews).to_not eq(nil)
496
+ expect(u.books[0].reviews[0].review_author).to_not eq(nil)
497
+ }
498
+
499
+ it {
500
+ organizations.delete_all
501
+ users.delete_all
502
+ user_passports.delete_all
503
+ books.delete_all
504
+
505
+ organization = ReeDaoLoadAggTest::Organization.new(name: "Test Org")
506
+ organizations.put(organization)
507
+
508
+ user_1 = ReeDaoLoadAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
509
+ users.put(user_1)
510
+
511
+ book_1 = ReeDaoLoadAggTest::Book.new(user_id: user_1.id, title: "1984")
512
+
513
+ books.put(book_1)
514
+
515
+ res = users_agg_block.call(user_1.id)
516
+
517
+ u = res[0]
518
+ expect(u.books).to eq([1337, 1337])
519
+ }
520
+
521
+ it {
522
+ organizations.delete_all
523
+ users.delete_all
524
+ user_passports.delete_all
525
+ books.delete_all
526
+ chapters.delete_all
527
+
528
+ organization = ReeDaoLoadAggTest::Organization.new(name: "Test Org")
529
+ organizations.put(organization)
530
+
531
+ user_1 = ReeDaoLoadAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
532
+ users.put(user_1)
533
+
534
+ book_1 = ReeDaoLoadAggTest::Book.new(user_id: user_1.id, title: "1984")
535
+ book_2 = ReeDaoLoadAggTest::Book.new(user_id: user_1.id, title: "1408")
536
+
537
+ books.put(book_1)
538
+ books.put(book_2)
539
+
540
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_1.id, title: "beginning"))
541
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_1.id, title: "interlude"))
542
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_1.id, title: "tragic ending"))
543
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_2.id, title: "beginning"))
544
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_2.id, title: "ending"))
545
+
546
+ res = users_agg.call(
547
+ users.all,
548
+ except: [:organization, :passport, :custom_field]
549
+ )
550
+
551
+ u = res[0]
552
+ expect(u.books.count).to eq(2)
553
+ expect(u.passport).to eq(nil)
554
+ expect(u.organization).to eq(nil)
555
+ expect(u.custom_field).to eq(nil)
556
+ }
557
+
558
+ it {
559
+ organizations.delete_all
560
+ users.delete_all
561
+
562
+ organization = ReeDaoLoadAggTest::Organization.new(name: "Test Org")
563
+ organizations.put(organization)
564
+
565
+ user_1 = ReeDaoLoadAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
566
+ user_2 = ReeDaoLoadAggTest::User.new(name: "Sam", age: 21, organization_id: organization.id)
567
+ users.put(user_1)
568
+ users.put(user_2)
569
+
570
+ ids = [user_1, user_2].map(&:id)
571
+
572
+ res = load_agg(ids, users)
573
+ expect(res.count).to eq(2)
574
+ }
575
+
576
+ it {
577
+ organizations.delete_all
578
+ users.delete_all
579
+
580
+ organization = ReeDaoLoadAggTest::Organization.new(name: "Test Org")
581
+ organizations.put(organization)
582
+
583
+ user_1 = ReeDaoLoadAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
584
+ users.put(user_1)
585
+
586
+ res = load_agg(user_1.id, users)
587
+ expect(res.count).to eq(1)
588
+ }
589
+
590
+ it {
591
+ organizations.delete_all
592
+ users.delete_all
593
+
594
+ organization = ReeDaoLoadAggTest::Organization.new(name: "Test Org")
595
+ organizations.put(organization)
596
+
597
+ user_1 = ReeDaoLoadAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
598
+ user_2 = ReeDaoLoadAggTest::User.new(name: "Sam", age: 21, organization_id: organization.id)
599
+ users.put(user_1)
600
+ users.put(user_2)
601
+
602
+ res = load_agg(users.where(organization_id: organization.id), users)
603
+ expect(res.count).to eq(2)
604
+ }
605
+ end