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,513 @@
1
+ require 'spec_helper'
2
+
3
+ module Partitioned
4
+ class PartitionedBase
5
+ module Configurator
6
+ describe Reader do
7
+
8
+ before(:all) do
9
+ class Employee < ById
10
+ def self.partition_field
11
+ :id
12
+ end
13
+ def self.foreign_key_field
14
+ :company_id
15
+ end
16
+ end
17
+ end
18
+
19
+ after(:all) do
20
+ Partitioned::PartitionedBase::Configurator.send(:remove_const, :Employee)
21
+ end
22
+
23
+ let!(:dsl) { Partitioned::PartitionedBase::Configurator::Dsl.new(Employee) }
24
+ let!(:default_reader) { Partitioned::PartitionedBase::Configurator::Reader.new(Employee) }
25
+ let!(:reader) do
26
+ reader = Partitioned::PartitionedBase::Configurator::Reader.new(Employee)
27
+ reader.stub!(:configurators).and_return([dsl])
28
+ reader
29
+ end
30
+
31
+ describe "configurators" do
32
+
33
+ context "checking arrays length" do
34
+
35
+ it "returns 3" do
36
+ default_reader.send(:configurators).length.should == 3
37
+ end
38
+
39
+ end # checking array length
40
+
41
+ context "checking models class for each of configurators" do
42
+
43
+ it "returns 'Partitioned::ById'" do
44
+ default_reader.send(:configurators)[0].model.to_s.should == "Partitioned::ById"
45
+ end
46
+
47
+ it "returns 'Partitioned::ByIntegerField'" do
48
+ default_reader.send(:configurators)[1].model.to_s.should == "Partitioned::ByIntegerField"
49
+ end
50
+
51
+ it "returns 'Partitioned::PartitionedBase'" do
52
+ default_reader.send(:configurators)[2].model.to_s.should == "Partitioned::PartitionedBase"
53
+ end
54
+
55
+ end # checking models class for each of configurators
56
+
57
+ end # configurators
58
+
59
+ describe "schema_name" do
60
+
61
+ context "when schema_name value is set by default" do
62
+
63
+ it "returns 'employees_partitions'" do
64
+ default_reader.schema_name.should == "employees_partitions"
65
+ end
66
+
67
+ end # when schema_name value is set by default
68
+
69
+ context "when schema_name value is set by value" do
70
+
71
+ it "returns 'employees_partitions'" do
72
+ dsl.schema_name("employees_partitions")
73
+ reader.schema_name.should == "employees_partitions"
74
+ end
75
+
76
+ end # when schema_name value is set by value
77
+
78
+ context "when schema_name value is set by string" do
79
+
80
+ it "returns 'employees_partitions'" do
81
+ dsl.schema_name('#{model.table_name}_partitions')
82
+ reader.schema_name.should == "employees_partitions"
83
+ end
84
+
85
+ end # when schema_name value is set by string
86
+
87
+ context "when schema_name value is set by proc" do
88
+
89
+ let(:lmd) do
90
+ lambda {|model, *value|
91
+ return "#{model.table_name}_partitions"
92
+ }
93
+ end
94
+
95
+ it "returns 'employees_partitions'" do
96
+ dsl.schema_name lmd
97
+ reader.schema_name.should == "employees_partitions"
98
+ end
99
+
100
+ end # when schema_name value is set by proc
101
+
102
+ end # schema_name
103
+
104
+ describe "on_fields" do
105
+
106
+ context "when on_field value is set by default" do
107
+
108
+ it "returns [:id]" do
109
+ default_reader.on_fields.should == [:id]
110
+ end
111
+
112
+ end # when on_filed value is set by default
113
+
114
+ context "when on_field value is set by symbol" do
115
+
116
+ it "returns [:company_id]" do
117
+ dsl.on :company_id
118
+ reader.on_fields.should == [:company_id]
119
+ end
120
+
121
+ end # "when on_field value is set by symbol
122
+
123
+ context "when on_field value is set by string" do
124
+
125
+ it "returns [:id]" do
126
+ dsl.on '#{model.partition_field}'
127
+ reader.on_fields.should == [:id]
128
+ end
129
+
130
+ end # "when on_field value is set by string
131
+
132
+ context "when on_field value is set by proc" do
133
+
134
+ let(:lmd) do
135
+ lambda { |model| model.partition_field }
136
+ end
137
+
138
+ it "returns [:id]" do
139
+ dsl.on lmd
140
+ reader.on_fields.should == [:id]
141
+ end
142
+
143
+ end # "when on_field value is set by proc
144
+
145
+ end # on_fields
146
+
147
+ describe "indexes" do
148
+
149
+ context "when indexes value is set by default" do
150
+
151
+ it "returns { :id => { :unique => true } }" do
152
+ default_reader.indexes.should == { :id => { :unique => true } }
153
+ end
154
+
155
+ end # when indexes value is set by default
156
+
157
+ context "when indexes value is set by values" do
158
+
159
+ it "returns { :id => { :unique => false } }" do
160
+ dsl.index(:id, { :unique => false })
161
+ reader.indexes.should == { :id => { :unique => false } }
162
+ end
163
+
164
+ end # when indexes value is set by values
165
+
166
+ context "when indexes value is set by proc" do
167
+
168
+ let(:lmd) do
169
+ lambda { |model, *partition_key_values|
170
+ return Partitioned::PartitionedBase::Configurator::Data::Index.new(model.partition_field, {})
171
+ }
172
+ end
173
+
174
+ it "returns { :id => {} }" do
175
+ dsl.index lmd
176
+ reader.indexes.should == { :id => {} }
177
+ end
178
+
179
+ end # when indexes value is set by proc
180
+
181
+ end # indexes
182
+
183
+ describe "foreign_keys" do
184
+
185
+ context "when foreign_keys value is set by symbol" do
186
+
187
+ it "returns foreign_keys" do
188
+ dsl.foreign_key(:company_id)
189
+ reader.foreign_keys.first.referenced_field.should == :id
190
+ reader.foreign_keys.first.referenced_table.should == "companies"
191
+ reader.foreign_keys.first.referencing_field.should == :company_id
192
+ end
193
+
194
+ end # when foreign_keys value is set by symbol
195
+
196
+ context "when foreign_keys value is set by proc" do
197
+
198
+ let(:lmd) do
199
+ lambda { |model, *partition_key_values|
200
+ return Partitioned::PartitionedBase::Configurator::Data::ForeignKey.new(model.foreign_key_field)
201
+ }
202
+ end
203
+
204
+ it "returns foreign_keys" do
205
+ dsl.foreign_key lmd
206
+ reader.foreign_keys.first.referenced_field.should == :id
207
+ reader.foreign_keys.first.referenced_table.should == "companies"
208
+ reader.foreign_keys.first.referencing_field.should == :company_id
209
+ end
210
+
211
+ end # when foreign_keys value is set by proc
212
+
213
+ end # foreign_keys
214
+
215
+ describe "check_constraint" do
216
+
217
+ context "when check_constraint value is set by string" do
218
+
219
+ it "returns 'company_id = 1'" do
220
+ dsl.check_constraint('company_id = #{field_value}')
221
+ reader.check_constraint(1).should == "company_id = 1"
222
+ end
223
+
224
+ end # when check_constraint value is set by string
225
+
226
+ context "when check_constraint value is set by proc" do
227
+
228
+ let(:lmd) do
229
+ lambda {|model, value|
230
+ return "#{model.partition_field} = #{value}"
231
+ }
232
+ end
233
+
234
+ it "returns 'id = 1'" do
235
+ dsl.check_constraint lmd
236
+ reader.check_constraint(1).should == "id = 1"
237
+ end
238
+
239
+ end # when check_constraint value is set by proc
240
+
241
+ end # check_constraint
242
+
243
+ describe "parent_table_name" do
244
+
245
+ context "when parent_table_name value is set by default" do
246
+
247
+ it "returns employees" do
248
+ default_reader.parent_table_name.should == "employees"
249
+ end
250
+
251
+ end # when parent_table_name value is set by default
252
+
253
+ context "when parent_table_name value is set by value" do
254
+
255
+ it "returns employees" do
256
+ dsl.parent_table_name("employees")
257
+ reader.parent_table_name.should == "employees"
258
+ end
259
+
260
+ end # when parent_table_name value is set by value
261
+
262
+ context "when parent_table_name value is set by string" do
263
+
264
+ it "returns employees" do
265
+ dsl.parent_table_name('#{model.table_name}')
266
+ reader.parent_table_name.should == "employees"
267
+ end
268
+
269
+ end # when parent_table_name value is set by string
270
+
271
+ context "when parent_table_name value is set by proc" do
272
+
273
+ let(:lmd) do
274
+ lambda {|model, *partition_key_values|
275
+ return "#{model.table_name}"
276
+ }
277
+ end
278
+
279
+ it "returns employees" do
280
+ dsl.parent_table_name lmd
281
+ reader.parent_table_name.should == "employees"
282
+ end
283
+
284
+ end # when parent_table_name value is set by proc
285
+
286
+ end # parent_table_name
287
+
288
+ describe "parent_table_schema_name" do
289
+
290
+ context "when parent_table_schema_name value is set by default" do
291
+
292
+ it "returns public" do
293
+ default_reader.parent_table_schema_name.should == "public"
294
+ end
295
+
296
+ end # when parent_table_schema_name value is set by default
297
+
298
+ context "when parent_table_schema_name value is set by value" do
299
+
300
+ it "returns employees" do
301
+ dsl.parent_table_schema_name("employees")
302
+ reader.parent_table_schema_name.should == "employees"
303
+ end
304
+
305
+ end # when parent_table_schema_name value is set by value
306
+
307
+ context "when parent_table_schema_name value is set by string" do
308
+
309
+ it "returns employees" do
310
+ dsl.parent_table_schema_name('#{model.table_name}')
311
+ reader.parent_table_schema_name.should == "employees"
312
+ end
313
+
314
+ end # when parent_table_schema_name value is set by string
315
+
316
+ context "when parent_table_schema_name value is set by proc" do
317
+
318
+ let(:lmd) do
319
+ lambda {|model, *partition_key_values|
320
+ return "#{model.table_name}"
321
+ }
322
+ end
323
+
324
+ it "returns employees" do
325
+ dsl.parent_table_schema_name lmd
326
+ reader.parent_table_schema_name.should == "employees"
327
+ end
328
+
329
+ end # when parent_table_schema_name value is set by proc
330
+
331
+ end # parent_table_schema_name
332
+
333
+ describe "table_name" do
334
+
335
+ context "when table_name value is set by default" do
336
+
337
+ it "returns employees_partitions.p10000000" do
338
+ default_reader.table_name(10000000).should == "employees_partitions.p10000000"
339
+ end
340
+
341
+ end # when table_name value is set by default
342
+
343
+ context "when table_name value is set by value" do
344
+
345
+ it "returns employees_partitions.p42" do
346
+ dsl.table_name("employees_partitions.p42")
347
+ reader.table_name.should == "employees_partitions.p42"
348
+ end
349
+
350
+ end # when table_name value is set by value
351
+
352
+ context "when table_name value is set by string" do
353
+
354
+ it "returns employees_partitions.employees_child_10000000" do
355
+ dsl.table_name('#{model.table_name}_partitions.#{model.table_name}_child_#{model.partition_normalize_key_value(field_value)}')
356
+ reader.table_name(10000000).should == "employees_partitions.employees_child_10000000"
357
+ end
358
+
359
+ end # when table_name value is set by string
360
+
361
+ context "when table_name value is set by proc" do
362
+
363
+ let(:lmd) do
364
+ lambda {|model, *partition_key_values|
365
+ return "#{model.table_name}_partitions.#{model.table_name}_child_#{model.partition_normalize_key_value(partition_key_values.first)}"
366
+ }
367
+ end
368
+
369
+ it "returns employees_partitions.employees_child_10000000" do
370
+ dsl.table_name lmd
371
+ reader.table_name(10000000).should == "employees_partitions.employees_child_10000000"
372
+ end
373
+
374
+ end # when table_name value is set by proc
375
+
376
+ end # table_name
377
+
378
+ describe "base_name" do
379
+
380
+ context "when base_name value is set by value" do
381
+
382
+ it "returns 42" do
383
+ dsl.base_name("42")
384
+ reader.base_name.should == "42"
385
+ end
386
+
387
+ end # when base_name value is set by value
388
+
389
+ context "when base_name value is set by string" do
390
+
391
+ it "returns 10000000" do
392
+ dsl.base_name('#{model.partition_normalize_key_value(field_value)}')
393
+ reader.base_name(10000000).should == "10000000"
394
+ end
395
+
396
+ end # when base_name value is set by string
397
+
398
+ context "when base_name value is set by proc" do
399
+
400
+ let(:lmd) do
401
+ lambda {|model, *partition_key_values|
402
+ return model.partition_normalize_key_value(*partition_key_values).to_s
403
+ }
404
+ end
405
+
406
+ it "returns 10000000" do
407
+ dsl.base_name lmd
408
+ reader.base_name(10000000).should == "10000000"
409
+ end
410
+
411
+ end # when base_name value is set by proc
412
+
413
+ end # base_name
414
+
415
+ describe "name_prefix" do
416
+
417
+ context "when name_prefix value is set by default" do
418
+
419
+ it "returns 'p'" do
420
+ default_reader.name_prefix.should == "p"
421
+ end
422
+
423
+ end # when name_prefix value is set by default
424
+
425
+ context "when name_prefix value is set by value" do
426
+
427
+ it "returns 'p'" do
428
+ dsl.name_prefix("p")
429
+ reader.name_prefix.should == "p"
430
+ end
431
+
432
+ end # when name_prefix value is set by value
433
+
434
+ context "when name_prefix value is set by string" do
435
+
436
+ it "returns 'employees_child_'" do
437
+ dsl.name_prefix('#{model.table_name}_child_')
438
+ reader.name_prefix.should == "employees_child_"
439
+ end
440
+
441
+ end # when name_prefix value is set by string
442
+
443
+ context "when name_prefix value is set by proc" do
444
+
445
+ let(:lmd) do
446
+ lambda {|model, *value|
447
+ return "#{model.table_name}_child_"
448
+ }
449
+ end
450
+
451
+ it "returns 'employees_child_'" do
452
+ dsl.name_prefix lmd
453
+ reader.name_prefix.should == "employees_child_"
454
+ end
455
+
456
+ end # when name_prefix value is set by proc
457
+
458
+ end # name_prefix
459
+
460
+ describe "part_name" do
461
+
462
+ context "when part_name value is set by value" do
463
+
464
+ it "returns 'p42'" do
465
+ dsl.part_name("p42")
466
+ reader.part_name.should == "p42"
467
+ end
468
+
469
+ end # when part_name value is set by value
470
+
471
+ context "when part_name value is set by string" do
472
+
473
+ it "returns 'employees_child_10000000'" do
474
+ dsl.part_name('#{model.table_name}_child_#{model.partition_normalize_key_value(field_value)}')
475
+ reader.part_name(10000000).should == "employees_child_10000000"
476
+ end
477
+
478
+ end # when part_name value is set by string
479
+
480
+ context "when part_name value is set by proc" do
481
+
482
+ let(:lmd) do
483
+ lambda {|model, *partition_key_values|
484
+ return "#{model.table_name}_child_#{model.partition_normalize_key_value(partition_key_values.first)}"
485
+ }
486
+ end
487
+
488
+ it "returns 'employees_child_10000000'" do
489
+ dsl.part_name lmd
490
+ reader.part_name(10000000).should == "employees_child_10000000"
491
+ end
492
+
493
+ end # when part_name value is set by proc
494
+
495
+ end # part_name
496
+
497
+ describe "last_partitions_order_by_clause" do
498
+
499
+ context "when order value is set by value" do
500
+
501
+ it "returns 'tablename desc'" do
502
+ dsl.order('tablename desc')
503
+ reader.last_partitions_order_by_clause.should == "tablename desc"
504
+ end
505
+
506
+ end # when order value is set by value
507
+
508
+ end # last_partitions_order_by_clause
509
+
510
+ end # Reader
511
+ end # Configurator
512
+ end # PartitionedBase
513
+ end # Partitioned