partitioned 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. data/Gemfile +17 -0
  2. data/LICENSE +30 -0
  3. data/PARTITIONING_EXPLAINED.txt +351 -0
  4. data/README +111 -0
  5. data/Rakefile +27 -0
  6. data/examples/README +23 -0
  7. data/examples/company_id.rb +417 -0
  8. data/examples/company_id_and_created_at.rb +689 -0
  9. data/examples/created_at.rb +590 -0
  10. data/examples/created_at_referencing_awards.rb +1000 -0
  11. data/examples/id.rb +475 -0
  12. data/examples/lib/by_company_id.rb +11 -0
  13. data/examples/lib/command_line_tool_mixin.rb +71 -0
  14. data/examples/lib/company.rb +29 -0
  15. data/examples/lib/get_options.rb +44 -0
  16. data/examples/lib/roman.rb +41 -0
  17. data/examples/start_date.rb +621 -0
  18. data/init.rb +1 -0
  19. data/lib/monkey_patch_activerecord.rb +92 -0
  20. data/lib/monkey_patch_postgres.rb +73 -0
  21. data/lib/partitioned.rb +26 -0
  22. data/lib/partitioned/active_record_overrides.rb +34 -0
  23. data/lib/partitioned/bulk_methods_mixin.rb +288 -0
  24. data/lib/partitioned/by_created_at.rb +13 -0
  25. data/lib/partitioned/by_foreign_key.rb +21 -0
  26. data/lib/partitioned/by_id.rb +35 -0
  27. data/lib/partitioned/by_integer_field.rb +32 -0
  28. data/lib/partitioned/by_monthly_time_field.rb +23 -0
  29. data/lib/partitioned/by_time_field.rb +65 -0
  30. data/lib/partitioned/by_weekly_time_field.rb +30 -0
  31. data/lib/partitioned/multi_level.rb +20 -0
  32. data/lib/partitioned/multi_level/configurator/data.rb +14 -0
  33. data/lib/partitioned/multi_level/configurator/dsl.rb +32 -0
  34. data/lib/partitioned/multi_level/configurator/reader.rb +162 -0
  35. data/lib/partitioned/multi_level/partition_manager.rb +47 -0
  36. data/lib/partitioned/partitioned_base.rb +354 -0
  37. data/lib/partitioned/partitioned_base/configurator.rb +6 -0
  38. data/lib/partitioned/partitioned_base/configurator/data.rb +62 -0
  39. data/lib/partitioned/partitioned_base/configurator/dsl.rb +628 -0
  40. data/lib/partitioned/partitioned_base/configurator/reader.rb +209 -0
  41. data/lib/partitioned/partitioned_base/partition_manager.rb +138 -0
  42. data/lib/partitioned/partitioned_base/sql_adapter.rb +286 -0
  43. data/lib/partitioned/version.rb +3 -0
  44. data/lib/tasks/desirable_tasks.rake +4 -0
  45. data/partitioned.gemspec +21 -0
  46. data/spec/dummy/.rspec +1 -0
  47. data/spec/dummy/README.rdoc +261 -0
  48. data/spec/dummy/Rakefile +7 -0
  49. data/spec/dummy/app/assets/javascripts/application.js +9 -0
  50. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  51. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  52. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  53. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  54. data/spec/dummy/config.ru +4 -0
  55. data/spec/dummy/config/application.rb +51 -0
  56. data/spec/dummy/config/boot.rb +10 -0
  57. data/spec/dummy/config/database.yml +32 -0
  58. data/spec/dummy/config/environment.rb +5 -0
  59. data/spec/dummy/config/environments/development.rb +30 -0
  60. data/spec/dummy/config/environments/production.rb +60 -0
  61. data/spec/dummy/config/environments/test.rb +39 -0
  62. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  63. data/spec/dummy/config/initializers/inflections.rb +10 -0
  64. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  65. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  66. data/spec/dummy/config/initializers/session_store.rb +8 -0
  67. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  68. data/spec/dummy/config/locales/en.yml +5 -0
  69. data/spec/dummy/config/routes.rb +58 -0
  70. data/spec/dummy/public/404.html +26 -0
  71. data/spec/dummy/public/422.html +26 -0
  72. data/spec/dummy/public/500.html +26 -0
  73. data/spec/dummy/public/favicon.ico +0 -0
  74. data/spec/dummy/script/rails +6 -0
  75. data/spec/dummy/spec/spec_helper.rb +27 -0
  76. data/spec/monkey_patch_posgres_spec.rb +176 -0
  77. data/spec/partitioned/bulk_methods_mixin_spec.rb +512 -0
  78. data/spec/partitioned/by_created_at_spec.rb +62 -0
  79. data/spec/partitioned/by_foreign_key_spec.rb +95 -0
  80. data/spec/partitioned/by_id_spec.rb +97 -0
  81. data/spec/partitioned/by_integer_field_spec.rb +143 -0
  82. data/spec/partitioned/by_monthly_time_field_spec.rb +100 -0
  83. data/spec/partitioned/by_time_field_spec.rb +182 -0
  84. data/spec/partitioned/by_weekly_time_field_spec.rb +100 -0
  85. data/spec/partitioned/multi_level/configurator/dsl_spec.rb +88 -0
  86. data/spec/partitioned/multi_level/configurator/reader_spec.rb +147 -0
  87. data/spec/partitioned/partitioned_base/configurator/dsl_spec.rb +459 -0
  88. data/spec/partitioned/partitioned_base/configurator/reader_spec.rb +513 -0
  89. data/spec/partitioned/partitioned_base/sql_adapter_spec.rb +204 -0
  90. data/spec/partitioned/partitioned_base_spec.rb +173 -0
  91. data/spec/spec_helper.rb +32 -0
  92. data/spec/support/shared_example_spec_helper_for_integer_key.rb +137 -0
  93. data/spec/support/shared_example_spec_helper_for_time_key.rb +147 -0
  94. data/spec/support/tables_spec_helper.rb +47 -0
  95. metadata +250 -0
@@ -0,0 +1,689 @@
1
+ #!/usr/bin/env ../spec/dummy/script/rails runner
2
+ # if you use linux, please change previous line to the
3
+ # "#! ../spec/dummy/script/rails runner"
4
+
5
+ # Before running this example you should execute "bundle install" and "rake db:create".
6
+ # To run this example you should open 'example' directory and execute example with one of the following flags:
7
+ # -C cleanup data in database and exit;
8
+ # -F cleanup data in database before creating new data;
9
+ #
10
+ # For example:
11
+ # ./company_id_and_created_at.rb - F
12
+
13
+ # Initial data:
14
+ #
15
+ # Companies table is completed by four companies:
16
+ #
17
+ # create table companies (
18
+ # id serial not null primary key,
19
+ # created_at timestamp not null default now(),
20
+ # updated_at timestamp,
21
+ # name text null
22
+ # );
23
+ #
24
+ # insert into companies (created_at,id,name) values
25
+ # ('2012-03-13 13:26:52.184347',1,'Fluent Mobile, inc.'),
26
+ # ('2012-03-13 13:26:52.184347',2,'Fiksu, inc.'),
27
+ # ('2012-03-13 13:26:52.184347',3,'AppExchanger, inc.'),
28
+ # ('2012-03-13 13:26:52.184347',4,'FreeMyApps, inc.');
29
+ #
30
+ # id | created_at | updated_at | name
31
+ # ---+----------------------------+------------+---------------------
32
+ # 1 | 2012-03-11 13:26:52.184347 | | Fluent Mobile, inc.
33
+ # 2 | 2012-03-11 13:26:52.184347 | | Fiksu, inc.
34
+ # 3 | 2012-03-11 13:26:52.184347 | | AppExchanger, inc.
35
+ # 4 | 2012-03-11 13:26:52.184347 | | FreeMyApps, inc.
36
+ #
37
+ # Employees table is associated with companies table via key - id:
38
+ #
39
+ # create table employees (
40
+ # id serial not null primary key,
41
+ # created_at timestamp not null default now(),
42
+ # updated_at timestamp,
43
+ # name text not null,
44
+ # salary money not null,
45
+ # company_id integer not null
46
+ # );
47
+ #
48
+ # id | created_at | updated_at | name | salary | company_id
49
+ # ----+------------+------------+------+--------+------------
50
+ #
51
+ # Task:
52
+ #
53
+ # To increase the speed of requests to the database and to reduce the time
54
+ # of the request, need to split the Employees table to the partition tables.
55
+ # Break criterion are company(company_id) and created date(created_at).
56
+ #
57
+ # Implementation:
58
+ #
59
+ # Class Employee inherits from the abstract class MultiLevel,
60
+ # which supports multilevel partitioning.
61
+ #
62
+ # class Employee < Partitioned::MultiLevel
63
+ #
64
+ # Indicates a relationship to the companies table.
65
+ # belongs_to :company, :class_name => 'Company'
66
+ #
67
+ # Create a rules for each partition.
68
+ # Will be created on the partition for each company,
69
+ # And will be created on the partition for each company in increments of one week.
70
+ #
71
+ # partitioned do |partition|
72
+ # partition.using_classes ByCompanyId, Partitioned::ByCreatedAt
73
+ # end
74
+ # end
75
+ #
76
+ # Create a schema employees_partitions, within which to store all of our partitions:
77
+ #
78
+ # Employee.create_infrastructure
79
+ #
80
+ # Create a partition for each of company and each of company across the week:
81
+ #
82
+ # Where partition_key_values is array of pairs company_id and date.
83
+ # Employee.create_new_partition_tables(partition_key_values)
84
+ #
85
+ # Each of partition has the same structure as that of the employees table:
86
+ #
87
+ # id | created_at | updated_at | name | salary | company_id
88
+ # ----+------------+------------+------+--------+------------
89
+ #
90
+ # CREATE TABLE "employees_partitions"."p1" (CHECK (( company_id = 1 ))) INHERITS (employees);
91
+ # CREATE TABLE "employees_partitions"."p1_20101227" (CHECK (created_at >= '2010-12-27'
92
+ # AND created_at < '2011-01-03')) INHERITS (employees_partitions.p1);
93
+ # CREATE TABLE "employees_partitions"."p1_20110103" (CHECK (created_at >= '2011-01-03'
94
+ # AND created_at < '2011-01-10')) INHERITS (employees_partitions.p1);
95
+ # CREATE TABLE "employees_partitions"."p1_20110110" (CHECK (created_at >= '2011-01-10'
96
+ # AND created_at < '2011-01-17')) INHERITS (employees_partitions.p1);
97
+ # ...
98
+ # CREATE TABLE "employees_partitions"."p1_20111212" (CHECK (created_at >= '2011-12-12'
99
+ # AND created_at < '2011-12-19')) INHERITS (employees_partitions.p1);
100
+ # CREATE TABLE "employees_partitions"."p1_20111219" (CHECK (created_at >= '2011-12-19'
101
+ # AND created_at < '2011-12-26')) INHERITS (employees_partitions.p1);
102
+ # CREATE TABLE "employees_partitions"."p1_20111226" (CHECK (created_at >= '2011-12-26'
103
+ # AND created_at < '2012-01-02')) INHERITS (employees_partitions.p1);
104
+ #
105
+ # CREATE TABLE "employees_partitions"."p2" (CHECK (( company_id = 2 ))) INHERITS (employees);
106
+ # CREATE TABLE "employees_partitions"."p2_20101227" (CHECK (created_at >= '2010-12-27'
107
+ # AND created_at < '2011-01-03')) INHERITS (employees_partitions.p2);
108
+ # CREATE TABLE "employees_partitions"."p2_20110103" (CHECK (created_at >= '2011-01-03'
109
+ # AND created_at < '2011-01-10')) INHERITS (employees_partitions.p2);
110
+ # CREATE TABLE "employees_partitions"."p2_20110110" (CHECK (created_at >= '2011-01-10'
111
+ # AND created_at < '2011-01-17')) INHERITS (employees_partitions.p2);
112
+ # ...
113
+ # CREATE TABLE "employees_partitions"."p2_20111212" (CHECK (created_at >= '2011-12-12'
114
+ # AND created_at < '2011-12-19')) INHERITS (employees_partitions.p2);
115
+ # CREATE TABLE "employees_partitions"."p2_20111219" (CHECK (created_at >= '2011-12-19'
116
+ # AND created_at < '2011-12-26')) INHERITS (employees_partitions.p2);
117
+ # CREATE TABLE "employees_partitions"."p2_20111226" (CHECK (created_at >= '2011-12-26'
118
+ # AND created_at < '2012-01-02')) INHERITS (employees_partitions.p2);
119
+ #
120
+ # CREATE TABLE "employees_partitions"."p3" (CHECK (( company_id = 3 ))) INHERITS (employees);
121
+ # CREATE TABLE "employees_partitions"."p3_20101227" (CHECK (created_at >= '2010-12-27'
122
+ # AND created_at < '2011-01-03')) INHERITS (employees_partitions.p3);
123
+ # CREATE TABLE "employees_partitions"."p3_20110103" (CHECK (created_at >= '2011-01-03'
124
+ # AND created_at < '2011-01-10')) INHERITS (employees_partitions.p3);
125
+ # CREATE TABLE "employees_partitions"."p3_20110110" (CHECK (created_at >= '2011-01-10'
126
+ # AND created_at < '2011-01-17')) INHERITS (employees_partitions.p3);
127
+ # ...
128
+ # CREATE TABLE "employees_partitions"."p3_20111212" (CHECK (created_at >= '2011-12-12'
129
+ # AND created_at < '2011-12-19')) INHERITS (employees_partitions.p3);
130
+ # CREATE TABLE "employees_partitions"."p3_20111219" (CHECK (created_at >= '2011-12-19'
131
+ # AND created_at < '2011-12-26')) INHERITS (employees_partitions.p3);
132
+ # CREATE TABLE "employees_partitions"."p3_20111226" (CHECK (created_at >= '2011-12-26'
133
+ # AND created_at < '2012-01-02')) INHERITS (employees_partitions.p3);
134
+ #
135
+ # CREATE TABLE "employees_partitions"."p4" (CHECK (( company_id = 4 ))) INHERITS (employees);
136
+ # CREATE TABLE "employees_partitions"."p4_20101227" (CHECK (created_at >= '2010-12-27'
137
+ # AND created_at < '2011-01-03')) INHERITS (employees_partitions.p4);
138
+ # CREATE TABLE "employees_partitions"."p4_20110103" (CHECK (created_at >= '2011-01-03'
139
+ # AND created_at < '2011-01-10')) INHERITS (employees_partitions.p4);
140
+ # CREATE TABLE "employees_partitions"."p4_20110110" (CHECK (created_at >= '2011-01-10'
141
+ # AND created_at < '2011-01-17')) INHERITS (employees_partitions.p4);
142
+ # ...
143
+ # CREATE TABLE "employees_partitions"."p4_20111212" (CHECK (created_at >= '2011-12-12'
144
+ # AND created_at < '2011-12-19')) INHERITS (employees_partitions.p4);
145
+ # CREATE TABLE "employees_partitions"."p4_20111219" (CHECK (created_at >= '2011-12-19'
146
+ # AND created_at < '2011-12-26')) INHERITS (employees_partitions.p4);
147
+ # CREATE TABLE "employees_partitions"."p4_20111226" (CHECK (created_at >= '2011-12-26'
148
+ # AND created_at < '2012-01-02')) INHERITS (employees_partitions.p4);
149
+ #
150
+ # You should have the following tables:
151
+ # employees_partitions.p1
152
+ # employees_partitions.p2
153
+ # employees_partitions.p3
154
+ # employees_partitions.p4
155
+ # employees_partitions.p1_20101227
156
+ # employees_partitions.p1_20110103
157
+ # employees_partitions.p1_20110110
158
+ # employees_partitions.p1_20110117
159
+ # employees_partitions.p1_20110124
160
+ # employees_partitions.p1_20110131
161
+ # employees_partitions.p1_20110207
162
+ # employees_partitions.p1_20110214
163
+ # employees_partitions.p1_20110221
164
+ # employees_partitions.p1_20110228
165
+ # employees_partitions.p1_20110307
166
+ # employees_partitions.p1_20110314
167
+ # employees_partitions.p1_20110321
168
+ # employees_partitions.p1_20110328
169
+ # employees_partitions.p1_20110404
170
+ # employees_partitions.p1_20110411
171
+ # employees_partitions.p1_20110418
172
+ # employees_partitions.p1_20110425
173
+ # employees_partitions.p1_20110502
174
+ # employees_partitions.p1_20110509
175
+ # employees_partitions.p1_20110516
176
+ # employees_partitions.p1_20110523
177
+ # employees_partitions.p1_20110530
178
+ # employees_partitions.p1_20110606
179
+ # employees_partitions.p1_20110613
180
+ # employees_partitions.p1_20110620
181
+ # employees_partitions.p1_20110627
182
+ # employees_partitions.p1_20110704
183
+ # employees_partitions.p1_20110711
184
+ # employees_partitions.p1_20110718
185
+ # employees_partitions.p1_20110725
186
+ # employees_partitions.p1_20110801
187
+ # employees_partitions.p1_20110808
188
+ # employees_partitions.p1_20110815
189
+ # employees_partitions.p1_20110822
190
+ # employees_partitions.p1_20110829
191
+ # employees_partitions.p1_20110905
192
+ # employees_partitions.p1_20110912
193
+ # employees_partitions.p1_20110919
194
+ # employees_partitions.p1_20110926
195
+ # employees_partitions.p1_20111003
196
+ # employees_partitions.p1_20111010
197
+ # employees_partitions.p1_20111017
198
+ # employees_partitions.p1_20111024
199
+ # employees_partitions.p1_20111031
200
+ # employees_partitions.p1_20111107
201
+ # employees_partitions.p1_20111114
202
+ # employees_partitions.p1_20111121
203
+ # employees_partitions.p1_20111128
204
+ # employees_partitions.p1_20111205
205
+ # employees_partitions.p1_20111212
206
+ # employees_partitions.p1_20111219
207
+ # employees_partitions.p1_20111226
208
+ # For the next three lines the similar partitions are generated.
209
+ # Difference only in company_id prefix.
210
+ # employees_partitions.p2_20101227 - employees_partitions.p2_20111226
211
+ # employees_partitions.p3_20101227 - employees_partitions.p3_20111226
212
+ # employees_partitions.p4_20101227 - employees_partitions.p4_20111226
213
+ #
214
+ # Each of partitions inherits from employees table,
215
+ # thus a new row will automatically be added to the employees table .
216
+ #
217
+ # To add data, we use the following constructions,
218
+ # in which employees and employee_data - a random data:
219
+ #
220
+ # create_many - allows you to add multiple records
221
+ # Employee.create_many(employees)
222
+ # create - allows you to add one record
223
+ # Employee.create(employee_data)
224
+ # new/save! - allows you to add one record without using "create" method
225
+ # employee = Employee.new(employee_data)
226
+ # employee.save!
227
+ #
228
+ # For update data, we use the following constructions,
229
+ # in which updates - a random data:
230
+ #
231
+ # update_many - allows you to update multiple records.
232
+ # :set_array - additional option, you may read the description
233
+ # of the method in the file update_many bulk_methods_mixin.rb about this option.
234
+ # Employee.update_many(updates, { :set_array => '"salary = #{table_name}.salary +
235
+ # datatable.salary, updated_at = now()"' })
236
+ #
237
+ # This construction using for update one record. You also may use update method.
238
+ # employee = Employee.from_partition(employee_record[:company_id],
239
+ # employee_record[:created_at]).find(employee_record[:id])
240
+ # employee.save
241
+ #
242
+ # The data get into the employees table ONLY through partition tables.
243
+ # You can not do an insert row into a table employees directly.
244
+ # For this purpose special restrictions are imposed on the table employees.
245
+ #
246
+ # Result:
247
+ #
248
+ # We have table companies:
249
+ #
250
+ # id | created_at | updated_at | name
251
+ # ---+----------------------------+------------+---------------------
252
+ # 1 | 2012-03-11 13:26:52.184347 | | Fluent Mobile, inc.
253
+ # 2 | 2012-03-11 13:26:52.184347 | | Fiksu, inc.
254
+ # 3 | 2012-03-11 13:26:52.184347 | | AppExchanger, inc.
255
+ # 4 | 2012-03-11 13:26:52.184347 | | FreeMyApps, inc.
256
+ #
257
+ # Table employees with random data from 1 to 5000:
258
+ #
259
+ # id | created_at | updated_at | name | salary | company_id
260
+ #------+---------------------+----------------------------+-----------------------------------+-------------+------------
261
+ # 1 | 2011-03-06 21:06:59 | 2012-03-26 12:41:40.32776 | Winston J. Sillypants, I | $125,499.00 | 3
262
+ # 2 | 2011-11-19 21:03:15 | | Winston J. Sillypants, II | $84,881.00 | 2
263
+ # 3 | 2011-10-04 10:06:14 | 2012-03-26 12:41:40.478717 | Winston J. Sillypants, III | $124,067.00 | 3
264
+ # ...
265
+ # 4998 | 2011-09-23 06:10:23 | 2012-03-26 11:41:30.218432 | Picholine Pimplenad, MMMMCMXCVIII | $121,474.00 | 3
266
+ # 4999 | 2011-08-26 18:24:12 | 2012-03-26 11:41:30.222835 | Picholine Pimplenad, MMMMCMXCIX | $134,549.00 | 4
267
+ # 5000 | 2011-10-01 18:29:33 | 2012-03-26 12:41:40.544125 | Picholine Pimplenad, _V | $135,786.00 | 1
268
+ #
269
+ #
270
+ # Partition employees_partitions.p1 - partition where company_id = 1:
271
+ #
272
+ # id | created_at | updated_at | name | salary | company_id
273
+ #------+---------------------+----------------------------+----------------------------------+-------------+------------
274
+ # 5 | 2011-05-04 02:18:47 | | Winston J. Sillypants, V | $80,891.00 | 1
275
+ # 7 | 2011-08-08 03:59:22 | | Winston J. Sillypants, VII | $139,737.00 | 1
276
+ # 12 | 2011-08-15 11:06:28 | | Winston J. Sillypants, XII | $73,080.00 | 1
277
+ # ...
278
+ # 4994 | 2011-09-10 19:57:12 | 2012-03-26 11:41:30.200199 | Picholine Pimplenad, MMMMCMXCIV | $130,988.00 | 1
279
+ # 4997 | 2011-02-12 01:19:43 | 2012-03-26 11:41:30.213843 | Picholine Pimplenad, MMMMCMXCVII | $74,378.00 | 1
280
+ # 5000 | 2011-10-01 18:29:33 | 2012-03-26 12:41:40.544125 | Picholine Pimplenad, _V | $135,786.00 | 1
281
+ #
282
+ # Partition employees_partitions.p2 - partition where company_id = 2:
283
+ #
284
+ # id | created_at | updated_at | name | salary | company_id
285
+ #------+---------------------+----------------------------+----------------------------------+-------------+------------
286
+ # 2 | 2011-11-19 21:03:15 | | Winston J. Sillypants, II | $84,881.00 | 2
287
+ # 4 | 2011-05-10 17:00:58 | | Winston J. Sillypants, IV | $75,230.00 | 2
288
+ # 8 | 2011-03-30 01:00:17 | | Winston J. Sillypants, VIII | $69,076.00 | 2
289
+ # ...
290
+ # 4991 | 2011-09-07 11:18:00 | 2012-03-26 11:41:30.186616 | Picholine Pimplenad, MMMMCMXCI | $116,773.00 | 2
291
+ # 4992 | 2011-01-08 13:01:50 | 2012-03-26 11:41:31.962307 | Picholine Pimplenad, MMMMCMXCII | $127,687.00 | 2
292
+ # 4996 | 2011-10-16 03:51:57 | 2012-03-26 11:41:36.227312 | Picholine Pimplenad, MMMMCMXCVI | $74,418.00 | 2
293
+ #
294
+ # Partition employees_partitions.p3 - partition where company_id = 3:
295
+ #
296
+ # id | created_at | updated_at | name | salary | company_id
297
+ #------+---------------------+----------------------------+----------------------------------+-------------+------------
298
+ # 1 | 2011-03-06 21:06:59 | 2012-03-26 12:41:40.32776 | Winston J. Sillypants, I | $125,499.00 | 3
299
+ # 3 | 2011-10-04 10:06:14 | 2012-03-26 12:41:40.478717 | Winston J. Sillypants, III | $124,067.00 | 3
300
+ # 10 | 2011-05-29 07:14:12 | | Winston J. Sillypants, X | $63,104.00 | 3
301
+ # ...
302
+ # 4990 | 2011-02-22 06:41:15 | 2012-03-26 11:41:30.182068 | Picholine Pimplenad, MMMMCMXC | $113,361.00 | 3
303
+ # 4995 | 2011-12-03 05:07:19 | 2012-03-26 12:41:40.202759 | Picholine Pimplenad, MMMMCMXCV | $114,038.00 | 3
304
+ # 4998 | 2011-09-23 06:10:23 | 2012-03-26 11:41:30.218432 | Picholine Pimplenad, MMMMCMXCVIII| $121,474.00 | 3
305
+ #
306
+ # Partition employees_partitions.p4 - partition where company_id = 4:
307
+ #
308
+ # id | created_at | updated_at | name | salary | company_id
309
+ #------+---------------------+----------------------------+----------------------------------+-------------+------------
310
+ # 6 | 2011-08-04 08:24:38 | 2012-03-26 12:41:40.176512 | Winston J. Sillypants, VI | $77,371.00 | 4
311
+ # 13 | 2011-06-23 01:39:10 | | Winston J. Sillypants, XIII | $64,291.00 | 4
312
+ # 14 | 2011-02-23 00:58:10 | | Winston J. Sillypants, XIV | $131,059.00 | 4
313
+ # ...
314
+ # 4982 | 2011-09-19 08:05:20 | 2012-03-26 11:41:30.145857 | Picholine Pimplenad, MMMMCMLXXXII| $66,049.00 | 4
315
+ # 4989 | 2011-02-25 11:44:56 | 2012-03-26 11:41:30.17755 | Picholine Pimplenad, MMMMCMLXXXIX| $121,402.00 | 4
316
+ # 4999 | 2011-08-26 18:24:12 | 2012-03-26 11:41:30.222835 | Picholine Pimplenad, MMMMCMXCIX | $134,549.00 | 4
317
+ #
318
+ # Partition employees_partitions.p1_20101227 - partition where company_id = 1
319
+ # and created_at >= '2010-12-27 00:00:00' AND created_at < '2011-01-03 00:00:00':
320
+ #
321
+ # id | created_at | updated_at | name | salary | company_id
322
+ #------+---------------------+----------------------------+----------------------------------+-------------+------------
323
+ # 941 | 2011-01-01 20:26:25 | | Winston J. Sillypants, CMXLI | $89,025.00 | 1
324
+ # 1095 | 2011-01-02 22:35:39 | | Winston J. Sillypants, MXCV | $87,774.00 | 1
325
+ # 1215 | 2011-01-02 08:11:15 | | Winston J. Sillypants, MCCXV | $114,288.00 | 1
326
+ # 3882 | 2011-01-02 16:06:25 | 2012-03-26 11:41:24.637678 | Jonathan Crabapple, MMMDCCCLXXXII| $77,973.00 | 1
327
+ #
328
+ # Partition employees_partitions.p1_20110103 - partition where company_id = 1
329
+ # and created_at >= '2011-01-03 00:00:00' AND created_at < '2011-01-10 00:00:00':
330
+ #
331
+ # id | created_at | updated_at | name | salary | company_id
332
+ #------+---------------------+----------------------------+-------------------------------------+-------------+------------
333
+ # 103 | 2011-01-07 21:16:49 | | Winston J. Sillypants, CIII | $120,113.00 | 1
334
+ # 357 | 2011-01-04 05:38:30 | 2012-03-26 12:41:39.982053 | Winston J. Sillypants, CCCLVII | $106,232.00 | 1
335
+ # 659 | 2011-01-09 11:03:37 | | Winston J. Sillypants, DCLIX | $123,277.00 | 1
336
+ # 772 | 2011-01-07 19:38:57 | | Winston J. Sillypants, DCCLXXII | $101,343.00 | 1
337
+ # 954 | 2011-01-03 03:54:49 | 2012-03-26 11:41:32.366725 | Winston J. Sillypants, CMLIV | $86,807.00 | 1
338
+ # 1392 | 2011-01-05 05:41:35 | 2012-03-26 12:41:39.982053 | Winston J. Sillypants, MCCCXCII | $88,342.00 | 1
339
+ # 1531 | 2011-01-07 00:27:07 | | Winston J. Sillypants, MDXXXI | $75,970.00 | 1
340
+ # 1744 | 2011-01-05 00:33:42 | | Winston J. Sillypants, MDCCXLIV | $133,429.00 | 1
341
+ # 1848 | 2011-01-03 11:26:23 | 2012-03-26 12:41:39.982053 | Winston J. Sillypants, MDCCCXLVIII | $109,972.00 | 1
342
+ # 2244 | 2011-01-08 22:40:11 | 2012-03-26 12:41:39.982053 | Winston J. Sillypants, MMCCXLIV | $139,564.00 | 1
343
+ # 2582 | 2011-01-04 15:41:31 | | Winston J. Sillypants, MMDLXXXII | $77,274.00 | 1
344
+ # 2631 | 2011-01-09 05:36:52 | | Winston J. Sillypants, MMDCXXXI | $82,723.00 | 1
345
+ # 2695 | 2011-01-05 10:42:01 | 2012-03-26 11:41:33.452627 | Winston J. Sillypants, MMDCXCV | $122,804.00 | 1
346
+ # 3011 | 2011-01-06 09:39:40 | 2012-03-26 11:41:20.006112 | Jonathan Crabapple, MMMXI | $110,734.00 | 1
347
+ # 3012 | 2011-01-09 15:53:01 | 2012-03-26 11:41:34.50332 | Jonathan Crabapple, MMMXII | $81,894.00 | 1
348
+ # 3271 | 2011-01-08 07:13:09 | 2012-03-26 12:41:39.982053 | Jonathan Crabapple, MMMCCLXXI | $124,440.00 | 1
349
+ # 3426 | 2011-01-06 19:18:33 | 2012-03-26 11:41:22.246979 | Jonathan Crabapple, MMMCDXXVI | $133,000.00 | 1
350
+ # 3516 | 2011-01-09 17:37:28 | 2012-03-26 11:41:22.736326 | Jonathan Crabapple, MMMDXVI | $133,313.00 | 1
351
+ # 3659 | 2011-01-07 09:01:39 | 2012-03-26 11:41:23.459928 | Jonathan Crabapple, MMMDCLIX | $126,074.00 | 1
352
+ # 3694 | 2011-01-03 21:27:01 | 2012-03-26 11:41:23.637282 | Jonathan Crabapple, MMMDCXCIV | $77,741.00 | 1
353
+ # 4089 | 2011-01-04 00:44:02 | 2012-03-26 12:41:39.982053 | Picholine Pimplenad, MMMMLXXXIX | $108,649.00 | 1
354
+ # 4288 | 2011-01-06 19:15:58 | 2012-03-26 11:41:26.689476 | Picholine Pimplenad, MMMMCCLXXXVIII | $119,212.00 | 1
355
+ # 4602 | 2011-01-09 09:25:28 | 2012-03-26 11:41:28.240448 | Picholine Pimplenad, MMMMDCII | $107,141.00 | 1
356
+ # 4701 | 2011-01-04 17:08:40 | 2012-03-26 11:41:28.753281 | Picholine Pimplenad, MMMMDCCI | $108,088.00 | 1
357
+ # 4806 | 2011-01-09 15:07:05 | 2012-03-26 12:41:39.982053 | Picholine Pimplenad, MMMMDCCCVI | $102,352.00 | 1
358
+ #
359
+ # ...
360
+ #
361
+ # Partition employees_partitions.p1_20111219 - partition where company_id = 1
362
+ # and created_at >= '2011-12-19 00:00:00' AND created_at < '2011-12-26 00:00:00':
363
+ #
364
+ # id | created_at | updated_at | name | salary | company_id
365
+ #------+---------------------+----------------------------+------------------------------------+-------------+------------
366
+ # 426 | 2011-12-21 08:39:22 | 2012-03-26 12:41:40.484584 | Winston J. Sillypants, CDXXVI | $72,017.00 | 1
367
+ # 668 | 2011-12-22 10:15:37 | 2012-03-26 12:41:40.484584 | Winston J. Sillypants, DCLXVIII | $131,558.00 | 1
368
+ # 1230 | 2011-12-21 03:35:53 | | Winston J. Sillypants, MCCXXX | $69,077.00 | 1
369
+ # 1397 | 2011-12-22 22:00:53 | | Winston J. Sillypants, MCCCXCVII | $86,444.00 | 1
370
+ # 1481 | 2011-12-19 12:14:14 | | Winston J. Sillypants, MCDLXXXI | $119,621.00 | 1
371
+ # 1623 | 2011-12-22 05:27:10 | | Winston J. Sillypants, MDCXXIII | $60,037.00 | 1
372
+ # 1779 | 2011-12-20 23:13:24 | | Winston J. Sillypants, MDCCLXXIX | $111,578.00 | 1
373
+ # 2180 | 2011-12-22 01:23:11 | | Winston J. Sillypants, MMCLXXX | $73,307.00 | 1
374
+ # 2192 | 2011-12-19 15:01:57 | | Winston J. Sillypants, MMCXCII | $89,245.00 | 1
375
+ # 2330 | 2011-12-20 16:17:34 | | Winston J. Sillypants, MMCCCXXX | $81,206.00 | 1
376
+ # 2434 | 2011-12-19 14:37:29 | 2012-03-26 12:41:40.484584 | Winston J. Sillypants, MMCDXXXIV | $97,325.00 | 1
377
+ # 2899 | 2011-12-20 12:52:28 | | Winston J. Sillypants, MMDCCCXCIX | $113,013.00 | 1
378
+ # 3239 | 2011-12-25 04:16:59 | 2012-03-26 11:41:21.274165 | Jonathan Crabapple, MMMCCXXXIX | $113,709.00 | 1
379
+ # 3368 | 2011-12-25 09:06:53 | 2012-03-26 11:41:21.958145 | Jonathan Crabapple, MMMCCCLXVIII | $103,363.00 | 1
380
+ # 3692 | 2011-12-24 04:26:47 | 2012-03-26 11:41:37.466462 | Jonathan Crabapple, MMMDCXCII | $135,681.00 | 1
381
+ # 3762 | 2011-12-25 05:55:07 | 2012-03-26 11:41:24.021495 | Jonathan Crabapple, MMMDCCLXII | $99,464.00 | 1
382
+ # 3895 | 2011-12-19 01:27:20 | 2012-03-26 11:41:24.702233 | Jonathan Crabapple, MMMDCCCXCV | $84,213.00 | 1
383
+ # 4092 | 2011-12-19 12:11:48 | 2012-03-26 11:41:33.112306 | Picholine Pimplenad, MMMMXCII | $70,843.00 | 1
384
+ # 4104 | 2011-12-19 22:34:49 | 2012-03-26 11:41:25.726682 | Picholine Pimplenad, MMMMCIV | $61,785.00 | 1
385
+ # 4570 | 2011-12-19 18:19:31 | 2012-03-26 11:41:28.091344 | Picholine Pimplenad, MMMMDLXX | $110,348.00 | 1
386
+ # 4773 | 2011-12-21 20:13:59 | 2012-03-26 11:41:29.08274 | Picholine Pimplenad, MMMMDCCLXXIII | $132,882.00 | 1
387
+ # 4981 | 2011-12-22 15:54:12 | 2012-03-26 11:41:33.279564 | Picholine Pimplenad, MMMMCMLXXXI | $98,870.00 | 1
388
+ #
389
+ # Partition employees_partitions.p1_20111226 - partition where company_id = 1
390
+ # and created_at >= '2011-12-26 00:00:00' AND created_at < '2012-01-02 00:00:00':
391
+ #
392
+ # id | created_at | updated_at | name | salary | company_id
393
+ #------+---------------------+----------------------------+------------------------------------+-------------+------------
394
+ # 472 | 2011-12-26 02:03:03 | | Winston J. Sillypants, CDLXXII | $135,441.00 | 1
395
+ # 628 | 2011-12-27 07:51:26 | | Winston J. Sillypants, DCXXVIII | $110,916.00 | 1
396
+ # 752 | 2011-12-26 17:17:41 | | Winston J. Sillypants, DCCLII | $65,324.00 | 1
397
+ # 1322 | 2011-12-30 17:36:06 | | Winston J. Sillypants, MCCCXXII | $129,800.00 | 1
398
+ # 1551 | 2011-12-30 13:15:13 | | Winston J. Sillypants, MDLI | $121,257.00 | 1
399
+ # 1677 | 2011-12-27 00:19:32 | 2012-03-26 12:41:40.519792 | Winston J. Sillypants, MDCLXXVII | $91,205.00 | 1
400
+ # 1801 | 2011-12-26 23:24:22 | 2012-03-26 11:41:37.824209 | Winston J. Sillypants, MDCCCI | $78,008.00 | 1
401
+ # 1903 | 2011-12-27 15:09:50 | 2012-03-26 11:41:36.071137 | Winston J. Sillypants, MCMIII | $72,188.00 | 1
402
+ # 2207 | 2011-12-26 13:14:00 | 2012-03-26 11:41:32.551838 | Winston J. Sillypants, MMCCVII | $85,783.00 | 1
403
+ # 2443 | 2011-12-26 12:57:37 | 2012-03-26 11:41:37.584218 | Winston J. Sillypants, MMCDXLIII | $69,366.00 | 1
404
+ # 2719 | 2011-12-26 13:26:59 | | Winston J. Sillypants, MMDCCXIX | $115,327.00 | 1
405
+ # 2914 | 2011-12-28 05:10:10 | | Winston J. Sillypants, MMCMXIV | $98,958.00 | 1
406
+ # 3212 | 2011-12-27 04:46:51 | 2012-03-26 11:41:21.093833 | Jonathan Crabapple, MMMCCXII | $75,632.00 | 1
407
+ # 3667 | 2011-12-30 18:36:50 | 2012-03-26 11:41:34.97244 | Jonathan Crabapple, MMMDCLXVII | $75,279.00 | 1
408
+ # 3697 | 2011-12-26 03:14:06 | 2012-03-26 11:41:23.651512 | Jonathan Crabapple, MMMDCXCVII | $104,874.00 | 1
409
+ # 3994 | 2011-12-30 08:12:20 | 2012-03-26 11:41:25.219097 | Jonathan Crabapple, MMMCMXCIV | $72,999.00 | 1
410
+ # 4191 | 2011-12-30 16:10:08 | 2012-03-26 11:41:26.183611 | Picholine Pimplenad, MMMMCXCI | $84,720.00 | 1
411
+ # 4677 | 2011-12-28 00:49:02 | 2012-03-26 11:41:28.643459 | Picholine Pimplenad, MMMMDCLXXVII | $61,137.00 | 1
412
+ # 4897 | 2011-12-27 03:26:12 | 2012-03-26 11:41:32.167034 | Picholine Pimplenad, MMMMDCCCXCVII | $104,534.00 | 1
413
+ #
414
+ # A similar behavior for all other partitions where company_id = 2, 3, 4.
415
+
416
+ require File.expand_path(File.dirname(__FILE__) + "/lib/command_line_tool_mixin")
417
+ require File.expand_path(File.dirname(__FILE__) + "/lib/get_options")
418
+
419
+ include CommandLineToolMixin
420
+
421
+ $cleanup = false
422
+ $force = false
423
+ $create_many = 3000
424
+ $create_individual = 1000
425
+ $new_individual = 1000
426
+ $update_many = 1000
427
+ $update_individual = 1000
428
+
429
+ @options = {
430
+ "--cleanup" => {
431
+ :short => "-C",
432
+ :argument => GetoptLong::NO_ARGUMENT,
433
+ :note => "cleanup data in database and exit"
434
+ },
435
+ "--force" => {
436
+ :short => "-F",
437
+ :argument => GetoptLong::NO_ARGUMENT,
438
+ :note => "cleanup data in database before creating new data"
439
+ },
440
+ "--create-many" => {
441
+ :short => "-m",
442
+ :argument => GetoptLong::REQUIRED_ARGUMENT,
443
+ :note => "how many objects to create via create_many",
444
+ :argument_note => "NUMBER"
445
+ },
446
+ "--create-individual" => {
447
+ :short => "-i",
448
+ :argument => GetoptLong::REQUIRED_ARGUMENT,
449
+ :note => "how many objects to create via create",
450
+ :argument_note => "NUMBER"
451
+ },
452
+ "--new-individual" => {
453
+ :short => "-I",
454
+ :argument => GetoptLong::REQUIRED_ARGUMENT,
455
+ :note => "how many objects to create via new/save",
456
+ :argument_note => "NUMBER"
457
+ },
458
+ "--update-individual" => {
459
+ :short => "-u",
460
+ :argument => GetoptLong::REQUIRED_ARGUMENT,
461
+ :note => "how many objects to update individually",
462
+ :argument_note => "NUMBER"
463
+ },
464
+ "--update-many" => {
465
+ :short => "-U",
466
+ :argument => GetoptLong::REQUIRED_ARGUMENT,
467
+ :note => "how many objects to update via update_many",
468
+ :argument_note => "NUMBER"
469
+ },
470
+ }
471
+
472
+ command_line_options(@options) do |option,argument|
473
+ if option == '--cleanup'
474
+ $cleanup = true
475
+ elsif option == '--force'
476
+ $force = true
477
+ elsif option == '--create-many'
478
+ $create_many = argument.to_i
479
+ elsif option == '--create-individual'
480
+ $create_individual = argument.to_i
481
+ elsif option == '--new-individual'
482
+ $new_individual = argument.to_i
483
+ elsif option == '--update-individual'
484
+ $update_individual = argument.to_i
485
+ elsif option == '--update-many'
486
+ $update_many = argument.to_i
487
+ end
488
+ end
489
+
490
+ if $cleanup || $force
491
+ ActiveRecord::Base.connection.drop_schema("employees_partitions", :cascade => true) rescue nil
492
+ ActiveRecord::Base.connection.drop_table("employees") rescue nil
493
+ ActiveRecord::Base.connection.drop_table("companies") rescue nil
494
+ exit(0) if $cleanup
495
+ end
496
+
497
+ $total_records = $create_many + $create_individual + $new_individual
498
+
499
+ puts "total records: #{$total_records}"
500
+
501
+ START_DATE = Date.parse('2011-01-01')
502
+ END_DATE = Date.parse('2011-12-31')
503
+
504
+ # the ActiveRecord classes
505
+ require File.expand_path(File.dirname(__FILE__) + "/lib/company")
506
+ require File.expand_path(File.dirname(__FILE__) + "/lib/by_company_id")
507
+
508
+ class Employee < Partitioned::MultiLevel
509
+ belongs_to :company, :class_name => 'Company'
510
+ attr_accessible :created_at, :salary, :company_id, :name
511
+
512
+ partitioned do |partition|
513
+ partition.using_classes ByCompanyId, Partitioned::ByCreatedAt
514
+ end
515
+
516
+ connection.execute <<-SQL
517
+ create table employees
518
+ (
519
+ id serial not null primary key,
520
+ created_at timestamp not null default now(),
521
+ updated_at timestamp,
522
+ name text not null,
523
+ salary money not null,
524
+ company_id integer not null
525
+ );
526
+ SQL
527
+ end
528
+
529
+ # You should have the following tables:
530
+ # public.companies
531
+ # public.employees
532
+
533
+ # add some companies
534
+
535
+ Company.create_many(COMPANIES)
536
+ company_ids = Company.all.map(&:id)
537
+ dates = Partitioned::ByCreatedAt.partition_generate_range(START_DATE, END_DATE)
538
+
539
+ partition_key_values = []
540
+ company_ids.each do |company_id|
541
+ partition_key_values << company_id
542
+ dates.each do |date|
543
+ partition_key_values << [company_id, date]
544
+ end
545
+ end
546
+
547
+ # create the infrastructure for EMPLOYEES table which includes the schema
548
+ Employee.create_infrastructure
549
+
550
+ # You should have the following schema:
551
+ # employees_partitions
552
+
553
+ # create the employees partition tables
554
+ Employee.create_new_partition_tables(partition_key_values)
555
+
556
+ # You should have the following tables:
557
+ # employees_partitions.p1
558
+ # employees_partitions.p2
559
+ # employees_partitions.p3
560
+ # employees_partitions.p4
561
+ # employees_partitions.p1_20101227
562
+ # employees_partitions.p1_20110103
563
+ # employees_partitions.p1_20110110
564
+ # employees_partitions.p1_20110117
565
+ # employees_partitions.p1_20110124
566
+ # employees_partitions.p1_20110131
567
+ # employees_partitions.p1_20110207
568
+ # employees_partitions.p1_20110214
569
+ # employees_partitions.p1_20110221
570
+ # employees_partitions.p1_20110228
571
+ # employees_partitions.p1_20110307
572
+ # employees_partitions.p1_20110314
573
+ # employees_partitions.p1_20110321
574
+ # employees_partitions.p1_20110328
575
+ # employees_partitions.p1_20110404
576
+ # employees_partitions.p1_20110411
577
+ # employees_partitions.p1_20110418
578
+ # employees_partitions.p1_20110425
579
+ # employees_partitions.p1_20110502
580
+ # employees_partitions.p1_20110509
581
+ # employees_partitions.p1_20110516
582
+ # employees_partitions.p1_20110523
583
+ # employees_partitions.p1_20110530
584
+ # employees_partitions.p1_20110606
585
+ # employees_partitions.p1_20110613
586
+ # employees_partitions.p1_20110620
587
+ # employees_partitions.p1_20110627
588
+ # employees_partitions.p1_20110704
589
+ # employees_partitions.p1_20110711
590
+ # employees_partitions.p1_20110718
591
+ # employees_partitions.p1_20110725
592
+ # employees_partitions.p1_20110801
593
+ # employees_partitions.p1_20110808
594
+ # employees_partitions.p1_20110815
595
+ # employees_partitions.p1_20110822
596
+ # employees_partitions.p1_20110829
597
+ # employees_partitions.p1_20110905
598
+ # employees_partitions.p1_20110912
599
+ # employees_partitions.p1_20110919
600
+ # employees_partitions.p1_20110926
601
+ # employees_partitions.p1_20111003
602
+ # employees_partitions.p1_20111010
603
+ # employees_partitions.p1_20111017
604
+ # employees_partitions.p1_20111024
605
+ # employees_partitions.p1_20111031
606
+ # employees_partitions.p1_20111107
607
+ # employees_partitions.p1_20111114
608
+ # employees_partitions.p1_20111121
609
+ # employees_partitions.p1_20111128
610
+ # employees_partitions.p1_20111205
611
+ # employees_partitions.p1_20111212
612
+ # employees_partitions.p1_20111219
613
+ # employees_partitions.p1_20111226
614
+ # For the next three lines the similar partitions are generated.
615
+ # Difference only in company_id prefix.
616
+ # employees_partitions.p2_20101227 - employees_partitions.p2_20111226
617
+ # employees_partitions.p3_20101227 - employees_partitions.p3_20111226
618
+ # employees_partitions.p4_20101227 - employees_partitions.p4_20111226
619
+
620
+ employees = []
621
+
622
+ require File.expand_path(File.dirname(__FILE__) + "/lib/roman")
623
+
624
+ # generates data for employees_partitions and employees tables
625
+
626
+
627
+ base = 0
628
+ (1..$create_many).each do |i|
629
+ employees << {
630
+ :name => "Winston J. Sillypants, #{to_roman(base+i)}",
631
+ :created_at => START_DATE + rand(END_DATE - START_DATE) + rand(1.day.seconds).seconds,
632
+ :salary => rand(80000) + 60000,
633
+ :company_id => company_ids[rand company_ids.length]
634
+ }
635
+ end
636
+
637
+ puts "creating many #{$create_many}"
638
+ Employee.create_many(employees)
639
+ base += $create_many
640
+
641
+ puts "creating individual #{$create_individual}"
642
+ (1..$create_individual).each do |i|
643
+ employee_data = {
644
+ :name => "Jonathan Crabapple, #{to_roman(base+i)}",
645
+ :created_at => START_DATE + rand(END_DATE - START_DATE) + rand(1.day.seconds).seconds,
646
+ :salary => rand(80000) + 60000,
647
+ :company_id => company_ids[rand company_ids.length]
648
+ }
649
+ employees << Employee.create(employee_data)
650
+ end
651
+ base += $create_individual
652
+
653
+ puts "new individual #{$new_individual}"
654
+ (1..$new_individual).each do |i|
655
+ employee_data = {
656
+ :name => "Picholine Pimplenad, #{to_roman(base+i)}",
657
+ :created_at => START_DATE + rand(END_DATE - START_DATE) + rand(1.day.seconds).seconds,
658
+ :salary => rand(80000) + 60000,
659
+ :company_id => company_ids[rand company_ids.length]
660
+ }
661
+ employee = Employee.new(employee_data)
662
+ employee.save!
663
+ employees << employee
664
+ end
665
+ base += $new_individual
666
+
667
+ updates = {}
668
+ puts "update many #{$update_many}"
669
+ (1..$update_many).each do |i|
670
+ employee_record = employees[rand(employees.length)]
671
+ updates[{
672
+ :id => employee_record[:id],
673
+ :company_id => employee_record[:company_id],
674
+ :created_at => employee_record[:created_at]
675
+ }] = {
676
+ :salary => 100
677
+ }
678
+ end
679
+
680
+ Employee.update_many(updates, {:set_array => '"salary = #{table_name}.salary + datatable.salary, updated_at = now()"'})
681
+
682
+ puts "update individual #{$update_individual}"
683
+ (1..$update_individual).each do |i|
684
+ employee_record = employees[rand(employees.length)]
685
+ employee = Employee.from_partition(employee_record[:company_id], employee_record[:created_at]).find(employee_record[:id])
686
+ employee.salary += 1000
687
+ employee.save
688
+ end
689
+