partitioned 0.8.0

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 (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
+