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,15 @@
1
+ class ReeDao::DaoDatasetContract
2
+ extend Ree::Contracts::Truncatable
3
+
4
+ def self.valid?(obj)
5
+ obj.class.ancestors.include?(ReeDao::DatasetExtensions::InstanceMethods)
6
+ end
7
+
8
+ def self.to_s
9
+ "PackageName::DaoName::Dao: \"SELECT * FROM `table`\""
10
+ end
11
+
12
+ def self.message(value, name, lvl = 1)
13
+ "expected #{to_s}, got => #{truncate(value.inspect)}"
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ class ReeDao::EntityContract
2
+ extend Ree::Contracts::Truncatable
3
+
4
+ def self.valid?(obj)
5
+ obj.class.ancestors.include?(ReeDto::EntityDSL)
6
+ end
7
+
8
+ def self.to_s
9
+ "PackageName::Entity"
10
+ end
11
+
12
+ def self.message(value, name, lvl = 1)
13
+ "expected #{to_s}, got => #{truncate(value.inspect)}"
14
+ end
15
+ end
@@ -111,6 +111,10 @@ module ReeDao
111
111
  nil
112
112
  end
113
113
 
114
+ def ids(ids_list)
115
+ where(id: ids_list)
116
+ end
117
+
114
118
  def update(hash_or_entity)
115
119
  return __original_update(hash_or_entity) if !opts[:schema_mapper]
116
120
  return __original_update(hash_or_entity) if hash_or_entity.is_a?(Hash)
@@ -16,7 +16,7 @@ module ReeDao::DSL
16
16
  module InstanceMethods
17
17
  def build
18
18
  dataset_class = db.dataset_class
19
- klass = Class.new(dataset_class)
19
+ klass = self.class.const_set(:Dao, Class.new(dataset_class))
20
20
  filters = self.class.instance_variable_get(:@filters) || []
21
21
 
22
22
  filters.each do |filter|
@@ -26,6 +26,7 @@ class ReeDao::BuildPgConnection
26
26
  search_path?: String,
27
27
  use_iso_date_format?: Bool,
28
28
  max_connections?: Integer,
29
+ pool_timeout?: Integer
29
30
  },
30
31
  Ksplat[
31
32
  RestKeys => Any # inherited from `build_connection` opts
@@ -14,6 +14,7 @@ class ReeDao::BuildSqliteConnection
14
14
  readonly?: Bool,
15
15
  timeout?: Integer,
16
16
  max_connections?: Integer,
17
+ pool_timeout?: Integer
17
18
  },
18
19
  Ksplat[
19
20
  RestKeys => Any # inherited from `build_connection` opts
@@ -9,7 +9,7 @@ class ReeDao::DropCache
9
9
 
10
10
  contract(None => nil)
11
11
  def call
12
- dao_cache.drop_thread_group_cache(Thread.current.group)
12
+ dao_cache.drop_thread_cache(Thread.current)
13
13
  nil
14
14
  end
15
15
  end
@@ -9,7 +9,7 @@ class ReeDao::InitCache
9
9
 
10
10
  contract(None => nil)
11
11
  def call
12
- dao_cache.add_thread_group_cache(Thread.current.group)
12
+ dao_cache.add_thread_cache(Thread.current)
13
13
  nil
14
14
  end
15
15
  end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ReeDao::LoadAgg
4
+ include Ree::FnDSL
5
+
6
+ fn :load_agg do
7
+ link "ree_dao/associations", -> { Associations }
8
+ link "ree_dao/contract/dao_dataset_contract", -> { DaoDatasetContract }
9
+ link "ree_dao/contract/entity_contract", -> { EntityContract }
10
+ end
11
+
12
+ contract(
13
+ Or[Sequel::Dataset, ArrayOf[Integer], ArrayOf[EntityContract], Integer],
14
+ Nilor[DaoDatasetContract],
15
+ Ksplat[
16
+ only?: ArrayOf[Symbol],
17
+ except?: ArrayOf[Symbol],
18
+ RestKeys => Any
19
+ ],
20
+ Optblock => ArrayOf[Any]
21
+ )
22
+ def call(ids_or_scope, dao = nil, **opts, &block)
23
+ scope = if ids_or_scope.is_a?(Array) && ids_or_scope.any? { _1.is_a?(Integer) }
24
+ raise ArgumentError.new("Dao should be provided") if dao.nil?
25
+ return [] if ids_or_scope.empty?
26
+
27
+ dao.where(id: ids_or_scope)
28
+ elsif ids_or_scope.is_a?(Integer)
29
+ raise ArgumentError.new("Dao should be provided") if dao.nil?
30
+
31
+ dao.where(id: ids_or_scope)
32
+ else
33
+ ids_or_scope
34
+ end
35
+
36
+ list = scope.is_a?(Sequel::Dataset) ? scope.all : scope
37
+
38
+ load_associations(list, **opts, &block) if block_given?
39
+
40
+ if ids_or_scope.is_a?(Array)
41
+ list.sort_by { ids_or_scope.index(_1.id) }
42
+ else
43
+ list
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def load_associations(list, **opts, &block)
50
+ local_vars = block.binding.eval(<<-CODE, __FILE__, __LINE__ + 1)
51
+ vars = self.instance_variables
52
+ vars.reduce({}) { |hsh, var| hsh[var] = self.instance_variable_get(var); hsh }
53
+ CODE
54
+
55
+ agg_caller = block.binding.eval("self")
56
+
57
+ if ReeDao.load_sync_associations_enabled?
58
+ Associations.new(agg_caller, list, local_vars, **opts).instance_exec(list, &block)
59
+ else
60
+ Associations.new(agg_caller, list, local_vars, **opts).instance_exec(list, &block).map(&:join)
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,40 @@
1
+ require 'thread'
2
+
3
+ module ThreadParent
4
+ class Parents
5
+
6
+ def initialize(child)
7
+ @child = child
8
+ end
9
+
10
+ def [](key)
11
+ if @child.key?(key)
12
+ @child[key]
13
+ elsif @child.parent
14
+ @child.parent.parents[key]
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ class Thread
21
+
22
+ alias_method :_initialize, :initialize
23
+
24
+ def initialize(*args, &block)
25
+ @_parent = Thread.current
26
+ _initialize(*args, &block)
27
+ end
28
+
29
+ def parent
30
+ @_parent
31
+ end
32
+
33
+ def parents
34
+ ThreadParent::Parents.new(self)
35
+ end
36
+
37
+ def self.parents
38
+ ThreadParent::Parents.new(Thread.current)
39
+ end
40
+ end
@@ -12,9 +12,14 @@ module ReeDao
12
12
  depends_on :ree_mapper
13
13
  depends_on :ree_string
14
14
  depends_on :ree_object
15
+ depends_on :ree_hash
15
16
  end
16
17
 
17
18
  require_relative "./ree_dao/dsl"
19
+ require_relative "./ree_dao/thread_parents"
20
+ require_relative "./ree_dao/aggregate_dsl"
21
+ require_relative "./ree_dao/associations"
22
+ require_relative "./ree_dao/association"
18
23
 
19
24
  def self.init_cache(thread)
20
25
  ReeDao::Cache.init_cache(thread)
@@ -23,4 +28,8 @@ module ReeDao
23
28
  def self.drop_cache(thread)
24
29
  ReeDao::Cache.delete_cache(thread)
25
30
  end
31
+
32
+ def self.load_sync_associations_enabled?
33
+ ENV.has_key?("REE_DAO_SYNC_ASSOCIATIONS") && ENV["REE_DAO_SYNC_ASSOCIATIONS"] == "true"
34
+ end
26
35
  end
@@ -17,7 +17,7 @@
17
17
  {
18
18
  "arg": "conn_opts",
19
19
  "arg_type": "req",
20
- "type": "{:conn_str? => String, :adapter => String, :database? => String, :encoding? => String, :user? => String, :password? => String, :host? => String, :port? => Or[String, Integer], :convert_infinite_timestamps? => Or[string, nil, float], :connect_timeout? => Integer, :driver_options? => Hash, :notice_receiver? => Proc, :sslmode? => Or[disable, allow, prefer, require, verify-ca, verify-full...], :sslrootcert? => String, :search_path? => String, :use_iso_date_format? => Bool, :max_connections? => Integer}"
20
+ "type": "{:conn_str? => String, :adapter => String, :database? => String, :encoding? => String, :user? => String, :password? => String, :host? => String, :port? => Or[String, Integer], :convert_infinite_timestamps? => Or[string, nil, float], :connect_timeout? => Integer, :driver_options? => Hash, :notice_receiver? => Proc, :sslmode? => Or[disable, allow, prefer, require, verify-ca, verify-full...], :sslrootcert? => String, :search_path? => String, :use_iso_date_format? => Bool, :max_connections? => Integer, :pool_timeout? => Integer}"
21
21
  },
22
22
  {
23
23
  "arg": "opts",
@@ -17,7 +17,7 @@
17
17
  {
18
18
  "arg": "conn_opts",
19
19
  "arg_type": "req",
20
- "type": "{:database => String, :readonly? => Bool, :timeout? => Integer, :max_connections? => Integer}"
20
+ "type": "{:database => String, :readonly? => Bool, :timeout? => Integer, :max_connections? => Integer, :pool_timeout? => Integer}"
21
21
  },
22
22
  {
23
23
  "arg": "opts",
@@ -0,0 +1,43 @@
1
+ {
2
+ "schema_type": "object",
3
+ "schema_version": "1.1",
4
+ "name": "load_agg",
5
+ "path": "packages/ree_dao/package/ree_dao/functions/load_agg.rb",
6
+ "mount_as": "fn",
7
+ "class": "ReeDao::LoadAgg",
8
+ "factory": null,
9
+ "methods": [
10
+ {
11
+ "doc": "",
12
+ "throws": [
13
+
14
+ ],
15
+ "return": "ArrayOf[Any]",
16
+ "args": [
17
+ {
18
+ "arg": "ids_or_scope",
19
+ "arg_type": "req",
20
+ "type": "Or[Sequel::Dataset, ArrayOf[Integer], ArrayOf[PackageName::Entity], Integer]"
21
+ },
22
+ {
23
+ "arg": "dao",
24
+ "arg_type": "opt",
25
+ "type": "Nilor[PackageName::DaoName::Dao: \"SELECT * FROM `table`\"]"
26
+ },
27
+ {
28
+ "arg": "opts",
29
+ "arg_type": "keyrest",
30
+ "type": "Ksplat[:only? => ArrayOf[Symbol], :except? => ArrayOf[Symbol], \"RestKeys\" => Any]"
31
+ },
32
+ {
33
+ "arg": "block",
34
+ "arg_type": "block",
35
+ "type": "Block"
36
+ }
37
+ ]
38
+ }
39
+ ],
40
+ "links": [
41
+
42
+ ]
43
+ }
@@ -0,0 +1,414 @@
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
+ NUM_OF_USERS = 100
10
+ ASSOC_COUNT = 10
11
+
12
+ after do
13
+ Ree.disable_irb_mode
14
+ end
15
+
16
+ before :all do
17
+ connection = build_pg_connection(ReeDaoLoadAggTest::Db::DB_CONFIG)
18
+
19
+ connection.drop_table(:organizations, cascade: true) if connection.table_exists?(:organizations)
20
+ connection.drop_table(:users, cascade: true) if connection.table_exists?(:users)
21
+ connection.drop_table(:user_passports, cascade: true) if connection.table_exists?(:user_passports)
22
+ connection.drop_table(:books, cascade: true) if connection.table_exists?(:books)
23
+ connection.drop_table(:movies, cascade: true) if connection.table_exists?(:movies)
24
+ connection.drop_table(:videogames, cascade: true) if connection.table_exists?(:videogames)
25
+ connection.drop_table(:hobbies, cascade: true) if connection.table_exists?(:hobbies)
26
+ connection.drop_table(:vinyls, cascade: true) if connection.table_exists?(:vinyls)
27
+ connection.drop_table(:pets, cascade: true) if connection.table_exists?(:pets)
28
+ connection.drop_table(:skills, cascade: true) if connection.table_exists?(:skills)
29
+ connection.drop_table(:dreams, cascade: true) if connection.table_exists?(:dreams)
30
+
31
+ connection.create_table :organizations do
32
+ primary_key :id
33
+
34
+ column :name, 'varchar(256)'
35
+ end
36
+
37
+ connection.create_table :users do
38
+ primary_key :id
39
+
40
+ column :name, 'varchar(256)'
41
+ column :age, :integer
42
+ foreign_key :organization_id, :organizations, null: false, on_delete: :cascade
43
+ end
44
+
45
+ connection.create_table :user_passports do
46
+ primary_key :id
47
+
48
+ foreign_key :user_id, :users, null: false, on_delete: :cascade
49
+ column :info, 'varchar(256)'
50
+ end
51
+
52
+ connection.create_table :books do
53
+ primary_key :id
54
+
55
+ foreign_key :user_id, :users, null: false, on_delete: :cascade
56
+ column :title, 'varchar(256)'
57
+ end
58
+
59
+ connection.create_table :movies do
60
+ primary_key :id
61
+
62
+ foreign_key :user_id, :users, null: false, on_delete: :cascade
63
+ column :title, 'varchar(256)'
64
+ end
65
+
66
+ connection.create_table :videogames do
67
+ primary_key :id
68
+
69
+ foreign_key :user_id, :users, null: false, on_delete: :cascade
70
+ column :title, 'varchar(256)'
71
+ end
72
+
73
+ connection.create_table :hobbies do
74
+ primary_key :id
75
+
76
+ foreign_key :user_id, :users, null: false, on_delete: :cascade
77
+ column :title, 'varchar(256)'
78
+ end
79
+
80
+ connection.create_table :vinyls do
81
+ primary_key :id
82
+
83
+ foreign_key :user_id, :users, null: false, on_delete: :cascade
84
+ column :title, 'varchar(256)'
85
+ end
86
+
87
+ connection.create_table :pets do
88
+ primary_key :id
89
+
90
+ foreign_key :user_id, :users, null: false, on_delete: :cascade
91
+ column :name, 'varchar(256)'
92
+ end
93
+
94
+ connection.create_table :skills do
95
+ primary_key :id
96
+
97
+ foreign_key :user_id, :users, null: false, on_delete: :cascade
98
+ column :title, 'varchar(256)'
99
+ end
100
+
101
+ connection.create_table :dreams do
102
+ primary_key :id
103
+
104
+ foreign_key :user_id, :users, null: false, on_delete: :cascade
105
+ column :description, 'varchar(256)'
106
+ end
107
+
108
+ connection.disconnect
109
+ end
110
+
111
+ require_relative 'ree_dao_load_agg_test'
112
+
113
+ class ReeDaoLoadAggTest::UsersAggBenchmark
114
+ include ReeDao::AggregateDSL
115
+
116
+ aggregate :users_agg_benchmark do
117
+ link :users, from: :ree_dao_load_agg_test
118
+ link :organizations, from: :ree_dao_load_agg_test
119
+ link :user_passports, from: :ree_dao_load_agg_test
120
+ link :books, from: :ree_dao_load_agg_test
121
+ link :movies, from: :ree_dao_load_agg_test
122
+ link :videogames, from: :ree_dao_load_agg_test
123
+ link :hobbies, from: :ree_dao_load_agg_test
124
+ link :vinyls, from: :ree_dao_load_agg_test
125
+ link :pets, from: :ree_dao_load_agg_test
126
+ link :skills, from: :ree_dao_load_agg_test
127
+ link :dreams, from: :ree_dao_load_agg_test
128
+ link :load_agg, from: :ree_dao
129
+ end
130
+
131
+ def call(ids_or_scope)
132
+ load_agg(ids_or_scope, users) do
133
+ belongs_to :organization
134
+
135
+ has_many :books
136
+ has_many :movies
137
+ has_many :videogames
138
+ has_many :hobbies
139
+ has_many :vinyls
140
+ has_many :pets
141
+ has_many :skills
142
+ has_many :dreams
143
+
144
+ has_one :passport, foreign_key: :user_id, scope: user_passports
145
+ end
146
+ end
147
+ end
148
+
149
+ class ReeDaoLoadAggTest::UsersSyncFetcher
150
+ include Ree::FnDSL
151
+
152
+ fn :users_sync_fetcher do
153
+ link :users, from: :ree_dao_load_agg_test
154
+ link :organizations, from: :ree_dao_load_agg_test
155
+ link :user_passports, from: :ree_dao_load_agg_test
156
+ link :books, from: :ree_dao_load_agg_test
157
+ link :movies, from: :ree_dao_load_agg_test
158
+ link :videogames, from: :ree_dao_load_agg_test
159
+ link :hobbies, from: :ree_dao_load_agg_test
160
+ link :vinyls, from: :ree_dao_load_agg_test
161
+ link :pets, from: :ree_dao_load_agg_test
162
+ link :skills, from: :ree_dao_load_agg_test
163
+ link :dreams, from: :ree_dao_load_agg_test
164
+ link :one_to_many, from: :ree_dao
165
+ link :one_to_one, from: :ree_dao
166
+ end
167
+
168
+ contract(
169
+ Or[Sequel::Dataset, ArrayOf[Integer]],
170
+ Kwargs[
171
+ include: ArrayOf[Symbol]
172
+ ] => ArrayOf[ReeDaoLoadAggTest::User]
173
+ )
174
+ def call(ids_or_scope, include: [])
175
+ scope = if ids_or_scope.is_a?(Array)
176
+ return [] if ids_or_scope.empty?
177
+ users.where(id: ids_or_scope)
178
+ else
179
+ ids_or_scope
180
+ end
181
+
182
+ list = scope.all
183
+ return [] if list.empty?
184
+
185
+ if include.include?(:organization)
186
+ one_to_one(list, organizations.order(:id))
187
+ end
188
+
189
+ if include.include?(:books)
190
+ one_to_many(list, books.order(:id))
191
+ end
192
+
193
+ if include.include?(:movies)
194
+ one_to_many(list, movies.order(:id))
195
+ end
196
+
197
+ if include.include?(:videogames)
198
+ one_to_many(list, videogames.order(:id))
199
+ end
200
+
201
+ if include.include?(:hobbies)
202
+ one_to_many(list, hobbies.order(:id), assoc_setter: :set_hobbies)
203
+ end
204
+
205
+ if include.include?(:skills)
206
+ one_to_many(list, skills.order(:id))
207
+ end
208
+
209
+ if include.include?(:vinyls)
210
+ one_to_many(list, vinyls.order(:id))
211
+ end
212
+
213
+ if include.include?(:pets)
214
+ one_to_many(list, pets.order(:id))
215
+ end
216
+
217
+ if include.include?(:dreams)
218
+ one_to_many(list, dreams.order(:id))
219
+ end
220
+
221
+ if include.include?(:passport)
222
+ one_to_one(list, user_passports.order(:id), reverse: true, assoc_setter: :set_passport)
223
+ end
224
+
225
+ if ids_or_scope.is_a?(Array)
226
+ list.sort_by { ids_or_scope.index(_1.id) }
227
+ else
228
+ list
229
+ end
230
+ end
231
+ end
232
+
233
+ let(:users_agg) { ReeDaoLoadAggTest::UsersAggBenchmark.new }
234
+ let(:users_sync_fetcher) { ReeDaoLoadAggTest::UsersSyncFetcher.new }
235
+
236
+ let(:organizations) { ReeDaoLoadAggTest::Organizations.new }
237
+ let(:users) { ReeDaoLoadAggTest::Users.new }
238
+ let(:user_passports) { ReeDaoLoadAggTest::UserPassports.new }
239
+ let(:books) { ReeDaoLoadAggTest::Books.new }
240
+ let(:movies) { ReeDaoLoadAggTest::Movies.new }
241
+ let(:videogames) { ReeDaoLoadAggTest::Videogames.new }
242
+ let(:hobbies) { ReeDaoLoadAggTest::Hobbies.new }
243
+ let(:vinyls) { ReeDaoLoadAggTest::Vinyls.new }
244
+ let(:pets) { ReeDaoLoadAggTest::Pets.new }
245
+ let(:skills) { ReeDaoLoadAggTest::Skills.new }
246
+ let(:dreams) { ReeDaoLoadAggTest::Dreams.new }
247
+
248
+ before(:each) do
249
+ organization = ReeDaoLoadAggTest::Organization.new(name: "Test Org")
250
+ organizations.put(organization)
251
+
252
+ _users = []
253
+ st_time = Time.now
254
+ puts "Starting to seed #{NUM_OF_USERS} users..."
255
+ NUM_OF_USERS.times do
256
+ u = ReeDaoLoadAggTest::User.new(
257
+ name: Faker::Name.name,
258
+ age: rand(18..50),
259
+ organization_id: organization.id
260
+ )
261
+
262
+ _users << u
263
+ users.put(u)
264
+ end
265
+
266
+ _users.each do |user|
267
+ ASSOC_COUNT.times do
268
+ books.put(
269
+ ReeDaoLoadAggTest::Book.new(
270
+ title: Faker::Book.title,
271
+ user_id: user.id
272
+ )
273
+ )
274
+ end
275
+
276
+ ASSOC_COUNT.times do
277
+ movies.put(
278
+ ReeDaoLoadAggTest::Movie.new(
279
+ user_id: user.id,
280
+ title: Faker::Movie.title
281
+ )
282
+ )
283
+ end
284
+
285
+ ASSOC_COUNT.times do
286
+ videogames.put(
287
+ ReeDaoLoadAggTest::Videogame.new(
288
+ user_id: user.id,
289
+ title: Faker::Game.title
290
+ )
291
+ )
292
+ end
293
+
294
+ ASSOC_COUNT.times do
295
+ hobbies.put(
296
+ ReeDaoLoadAggTest::Hobby.new(
297
+ user_id: user.id,
298
+ title: Faker::Hobby.activity
299
+ )
300
+ )
301
+ end
302
+
303
+ ASSOC_COUNT.times do
304
+ vinyls.put(
305
+ ReeDaoLoadAggTest::Vinyl.new(
306
+ user_id: user.id,
307
+ title: Faker::Music.band
308
+ )
309
+ )
310
+ end
311
+
312
+ ASSOC_COUNT.times do
313
+ pets.put(
314
+ ReeDaoLoadAggTest::Pet.new(
315
+ user_id: user.id,
316
+ name: Faker::Creature::Animal.name
317
+ )
318
+ )
319
+ end
320
+
321
+ ASSOC_COUNT.times do
322
+ skills.put(
323
+ ReeDaoLoadAggTest::Skill.new(
324
+ user_id: user.id,
325
+ title: Faker::Job.key_skill
326
+ )
327
+ )
328
+ end
329
+
330
+ ASSOC_COUNT.times do
331
+ dreams.put(
332
+ ReeDaoLoadAggTest::Dream.new(
333
+ user_id: user.id,
334
+ description: Faker::ChuckNorris.fact
335
+ )
336
+ )
337
+ end
338
+
339
+ ASSOC_COUNT.times do
340
+ user_passports.put(
341
+ ReeDaoLoadAggTest::UserPassport.new(
342
+ user_id: user.id,
343
+ info: "Passport info #{user.id}"
344
+ )
345
+ )
346
+ end
347
+ end
348
+
349
+ puts "Seeding is complete! #{Time.now - st_time}"
350
+ end
351
+
352
+ it {
353
+ res1 = nil
354
+ res2 = nil
355
+ res3 = nil
356
+
357
+ benchmark_res = Benchmark.bm do |x|
358
+ x.report("async_load_agg") do
359
+ res1 = users_agg.call(users.all.map(&:id))
360
+ end
361
+
362
+ x.report("sync_load_agg ") do
363
+ ENV['REE_DAO_SYNC_ASSOCIATIONS'] = "true"
364
+ res2 = users_agg.call(users.all.map(&:id))
365
+ ENV.delete('REE_DAO_SYNC_ASSOCIATIONS')
366
+ end
367
+
368
+ x.report("sync_fetcher ") do
369
+ res3 = users_sync_fetcher.call(
370
+ users.all.map(&:id),
371
+ include: [
372
+ :organization,
373
+ :books,
374
+ :movies,
375
+ :videogames,
376
+ :hobbies,
377
+ :vinyls,
378
+ :pets,
379
+ :skills,
380
+ :dreams,
381
+ :passport
382
+ ]
383
+ )
384
+ end
385
+ end
386
+
387
+ expect(res1).to eq(res3)
388
+ expect(res1[0].organization).to eq(res3[0].organization)
389
+ expect(res1[0].passport).to eq(res3[0].passport)
390
+ expect(res1[0].books).to eq(res3[0].books)
391
+ expect(res1[0].movies).to eq(res3[0].movies)
392
+ expect(res1[0].books).to eq(res3[0].books)
393
+ expect(res1[0].videogames).to eq(res3[0].videogames)
394
+ expect(res1[0].hobbies).to eq(res3[0].hobbies)
395
+ expect(res1[0].vinyls).to eq(res3[0].vinyls)
396
+ expect(res1[0].pets).to eq(res3[0].pets)
397
+ expect(res1[0].skills).to eq(res3[0].skills)
398
+ expect(res1[0].dreams).to eq(res3[0].dreams)
399
+
400
+ expect(res2).to eq(res3)
401
+ expect(res2[0].organization).to eq(res3[0].organization)
402
+ expect(res2[0].books).to eq(res3[0].books)
403
+ expect(res2[0].movies).to eq(res3[0].movies)
404
+ expect(res2[0].videogames).to eq(res3[0].videogames)
405
+ expect(res2[0].hobbies).to eq(res3[0].hobbies)
406
+ expect(res2[0].vinyls).to eq(res3[0].vinyls)
407
+ expect(res2[0].pets).to eq(res3[0].pets)
408
+ expect(res2[0].skills).to eq(res3[0].skills)
409
+ expect(res2[0].dreams).to eq(res3[0].dreams)
410
+
411
+ # expect(benchmark_res[0].real).to be < benchmark_res[1].real
412
+ # expect(benchmark_res[0].real).to be < benchmark_res[2].real
413
+ }
414
+ end