composite_primary_keys 12.0.8 → 13.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +888 -874
  3. data/README.rdoc +181 -180
  4. data/lib/composite_primary_keys/active_model/attribute_assignment.rb +19 -19
  5. data/lib/composite_primary_keys/associations/association_scope.rb +66 -68
  6. data/lib/composite_primary_keys/associations/join_dependency.rb +137 -103
  7. data/lib/composite_primary_keys/attribute_methods/primary_key.rb +0 -2
  8. data/lib/composite_primary_keys/attribute_methods/read.rb +30 -30
  9. data/lib/composite_primary_keys/attribute_methods/write.rb +35 -35
  10. data/lib/composite_primary_keys/attribute_methods.rb +21 -9
  11. data/lib/composite_primary_keys/base.rb +141 -141
  12. data/lib/composite_primary_keys/composite_predicates.rb +2 -1
  13. data/lib/composite_primary_keys/connection_adapters/abstract/database_statements.rb +37 -22
  14. data/lib/composite_primary_keys/connection_adapters/sqlserver/database_statements.rb +44 -44
  15. data/lib/composite_primary_keys/core.rb +48 -48
  16. data/lib/composite_primary_keys/nested_attributes.rb +1 -1
  17. data/lib/composite_primary_keys/persistence.rb +82 -81
  18. data/lib/composite_primary_keys/reflection.rb +91 -29
  19. data/lib/composite_primary_keys/relation/batches.rb +15 -7
  20. data/lib/composite_primary_keys/relation/calculations.rb +104 -81
  21. data/lib/composite_primary_keys/relation/finder_methods.rb +235 -235
  22. data/lib/composite_primary_keys/relation/predicate_builder/association_query_value.rb +39 -20
  23. data/lib/composite_primary_keys/relation/query_methods.rb +42 -42
  24. data/lib/composite_primary_keys/relation/where_clause.rb +18 -23
  25. data/lib/composite_primary_keys/relation.rb +197 -193
  26. data/lib/composite_primary_keys/table_metadata.rb +11 -0
  27. data/lib/composite_primary_keys/version.rb +8 -8
  28. data/lib/composite_primary_keys.rb +119 -119
  29. data/test/abstract_unit.rb +114 -114
  30. data/test/connections/databases.ci.yml +22 -22
  31. data/test/fixtures/db_definitions/db2-create-tables.sql +112 -112
  32. data/test/fixtures/db_definitions/db2-drop-tables.sql +16 -16
  33. data/test/fixtures/db_definitions/mysql.sql +180 -180
  34. data/test/fixtures/db_definitions/oracle.drop.sql +41 -41
  35. data/test/fixtures/db_definitions/oracle.sql +199 -199
  36. data/test/fixtures/db_definitions/postgresql.sql +182 -182
  37. data/test/fixtures/db_definitions/sqlite.sql +169 -169
  38. data/test/fixtures/db_definitions/sqlserver.sql +176 -176
  39. data/test/fixtures/department.rb +16 -16
  40. data/test/fixtures/departments.yml +19 -15
  41. data/test/fixtures/employees.yml +33 -28
  42. data/test/fixtures/membership.rb +8 -6
  43. data/test/fixtures/restaurants_suburbs.yml +10 -10
  44. data/test/fixtures/streets.yml +16 -16
  45. data/test/fixtures/suburbs.yml +14 -14
  46. data/test/fixtures/user.rb +11 -11
  47. data/test/test_associations.rb +372 -358
  48. data/test/test_attributes.rb +75 -60
  49. data/test/test_calculations.rb +49 -42
  50. data/test/test_create.rb +218 -206
  51. data/test/test_delete.rb +188 -179
  52. data/test/test_exists.rb +39 -39
  53. data/test/test_find.rb +170 -164
  54. data/test/test_ids.rb +112 -112
  55. data/test/test_nested_attributes.rb +67 -67
  56. data/test/test_update.rb +102 -96
  57. metadata +6 -6
  58. data/lib/composite_primary_keys/connection_adapters/mysql/database_statements.rb +0 -24
data/test/test_delete.rb CHANGED
@@ -1,179 +1,188 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestDelete < ActiveSupport::TestCase
4
- fixtures :articles, :departments, :employees, :products, :tariffs, :product_tariffs,
5
- :reference_types, :reference_codes
6
-
7
- def test_delete_one
8
- assert_equal(5, ReferenceCode.count)
9
- ReferenceCode.first.delete
10
- assert_equal(4, ReferenceCode.count)
11
- end
12
-
13
- def test_delete_one_with_id
14
- assert_equal(5, ReferenceCode.count)
15
- ReferenceCode.delete(ReferenceCode.first.id)
16
- assert_equal(4, ReferenceCode.count)
17
- end
18
-
19
- def test_destroy_one
20
- assert_equal(5, ReferenceCode.count)
21
- ReferenceCode.first.destroy
22
- assert_equal(4, ReferenceCode.count)
23
- end
24
-
25
- def test_delete_all
26
- refute_empty(ReferenceCode.all)
27
- ReferenceCode.delete_all
28
- assert_empty(ReferenceCode.all)
29
- end
30
-
31
- def test_delete_all_with_join
32
- employee = employees(:mindy)
33
-
34
- assert_equal(4, Department.count)
35
-
36
- Department.joins(:employees).
37
- where('employees.name = ?', employee.name).
38
- delete_all
39
-
40
- assert_equal(3, Department.count)
41
- end
42
-
43
- def test_clear_association
44
- department = Department.find([1,1])
45
- assert_equal(2, department.employees.size, "Before clear employee count should be 2.")
46
-
47
- department.employees.clear
48
- assert_equal(0, department.employees.size, "After clear employee count should be 0.")
49
-
50
- department.reload
51
- assert_equal(0, department.employees.size, "After clear and a reload from DB employee count should be 0.")
52
- end
53
-
54
- def test_delete_association
55
- department = Department.find([1,1])
56
- assert_equal 2, department.employees.size , "Before delete employee count should be 2."
57
- first_employee = department.employees[0]
58
- department.employees.delete(first_employee)
59
- assert_equal 1, department.employees.size, "After delete employee count should be 1."
60
- department.reload
61
- assert_equal 1, department.employees.size, "After delete and a reload from DB employee count should be 1."
62
- end
63
-
64
- def test_has_many_replace
65
- tariff = tariffs(:flat)
66
- assert_equal(1, tariff.product_tariffs.length)
67
-
68
- tariff.product_tariffs = [product_tariffs(:first_free), product_tariffs(:second_free)]
69
- tariff.reload
70
-
71
- assert_equal(2, tariff.product_tariffs.length)
72
- refute(tariff.product_tariffs.include?(tariff))
73
- end
74
-
75
- def test_destroy_has_one
76
- # In this case the association is a has_one with
77
- # dependent set to :destroy
78
- department = departments(:engineering)
79
- assert_not_nil(department.head)
80
-
81
- # Get head employee id
82
- head_id = department.head.id
83
-
84
- # Delete department - should delete the head
85
- department.destroy
86
-
87
- # Verify the head is also
88
- assert_raise(ActiveRecord::RecordNotFound) do
89
- Employee.find(head_id)
90
- end
91
- end
92
-
93
- def test_destroy_has_and_belongs_to_many_on_non_cpk
94
- steve = employees(:steve)
95
- records_before = ActiveRecord::Base.connection.execute('select * from employees_groups')
96
- steve.destroy
97
- records_after = ActiveRecord::Base.connection.execute('select * from employees_groups')
98
- if records_before.respond_to?(:count)
99
- assert_equal records_after.count, records_before.count - steve.groups.count
100
- elsif records_before.respond_to?(:row_count) # OCI8:Cursor for oracle adapter
101
- assert_equal records_after.row_count, records_before.row_count - steve.groups.count
102
- end
103
- end
104
-
105
- def test_create_destroy_has_and_belongs_to_many_on_non_cpk
106
- records_before = ActiveRecord::Base.connection.execute('select * from employees_groups')
107
- employee = Employee.create!(department_id: 3, location_id: 2, name: 'Jon')
108
- employee.groups << Group.create(name: 'test')
109
- employee.destroy!
110
- records_after = ActiveRecord::Base.connection.execute('select * from employees_groups')
111
- if records_before.respond_to?(:count)
112
- assert_equal records_before.count, records_after.count
113
- elsif records_before.respond_to?(:row_count) # OCI8:Cursor for oracle adapter
114
- assert_equal records_before.row_count, records_after.row_count
115
- end
116
- end
117
-
118
- def test_create_destroy_all_has_and_belongs_to_many_on_non_cpk
119
- records_before = ActiveRecord::Base.connection.execute('select * from employees_groups')
120
- employee = Employee.create!(department_id: 3, location_id: 2, name: 'Jon')
121
- employee.groups << Group.create(name: 'test')
122
- employee.groups.destroy_all
123
- records_after = ActiveRecord::Base.connection.execute('select * from employees_groups')
124
- if records_before.respond_to?(:count)
125
- assert_equal records_before.count, records_after.count
126
- elsif records_before.respond_to?(:row_count) # OCI8:Cursor for oracle adapter
127
- assert_equal records_before.row_count, records_after.row_count
128
- end
129
- end
130
-
131
- def test_delete_not_destroy_on_cpk
132
- tariff = Tariff.where(tariff_id: 2).first
133
- tariff.delete
134
- refute(tariff.persisted?)
135
- end
136
-
137
- def test_delete_not_destroy_on_non_cpk
138
- article = articles(:third)
139
- article.delete
140
- refute(article.persisted?)
141
- end
142
-
143
- def test_destroy_has_many_delete_all
144
- # In this case the association is a has_many composite key with
145
- # dependent set to :delete_all
146
- product = Product.find(1)
147
- assert_equal(2, product.product_tariffs.length)
148
-
149
- # Get product_tariff length
150
- product_tariff_size = ProductTariff.count
151
-
152
- # Delete product - should delete 2 product tariffs
153
- product.destroy
154
-
155
- # Verify product_tariff are deleted
156
- assert_equal(product_tariff_size - 2, ProductTariff.count)
157
- end
158
-
159
- def test_delete_cpk_association
160
- product = Product.find(1)
161
- assert_equal(2, product.product_tariffs.length)
162
-
163
- product_tariff = product.product_tariffs.first
164
- product.product_tariffs.delete(product_tariff)
165
-
166
- product.reload
167
- assert_equal(1, product.product_tariffs.length)
168
- end
169
-
170
- def test_delete_records_for_has_many_association_with_composite_primary_key
171
- reference_type = ReferenceType.find(1)
172
- codes_to_delete = reference_type.reference_codes[0..1]
173
- assert_equal(3, reference_type.reference_codes.size, "Before deleting records reference_code count should be 3.")
174
-
175
- reference_type.reference_codes.delete(codes_to_delete)
176
- reference_type.reload
177
- assert_equal(1, reference_type.reference_codes.size, "After deleting 2 records and a reload from DB reference_code count should be 1.")
178
- end
179
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestDelete < ActiveSupport::TestCase
4
+ fixtures :articles, :departments, :employees, :products, :tariffs, :product_tariffs,
5
+ :reference_types, :reference_codes
6
+
7
+ def test_delete_one
8
+ assert_equal(5, ReferenceCode.count)
9
+ ReferenceCode.first.delete
10
+ assert_equal(4, ReferenceCode.count)
11
+ end
12
+
13
+ def test_delete_one_with_id
14
+ assert_equal(5, ReferenceCode.count)
15
+ deleted = ReferenceCode.delete(ReferenceCode.first.id)
16
+ assert_equal(4, ReferenceCode.count)
17
+ assert_equal(1, deleted)
18
+ end
19
+
20
+ def test_destroy_one
21
+ assert_equal(5, ReferenceCode.count)
22
+ ReferenceCode.first.destroy
23
+ assert_equal(4, ReferenceCode.count)
24
+ end
25
+
26
+ def test_delete_all
27
+ refute_empty(ReferenceCode.all)
28
+ deleted = ReferenceCode.delete_all
29
+ assert_empty(ReferenceCode.all)
30
+ assert_equal(5, deleted)
31
+ end
32
+
33
+ def test_delete_all_with_join
34
+ tested_delete_all = false
35
+ Arel::Table.engine = nil # should not rely on the global Arel::Table.engine
36
+ employee = employees(:mindy)
37
+
38
+ assert_equal(5, Department.count)
39
+
40
+ deleted = Department.joins(:employees).
41
+ where('employees.name = ?', employee.name).
42
+ delete_all
43
+
44
+ assert_equal(4, Department.count)
45
+ assert_equal(1, deleted)
46
+ tested_delete_all = true
47
+ ensure
48
+ Arel::Table.engine = ActiveRecord::Base
49
+ assert tested_delete_all
50
+ end
51
+
52
+ def test_clear_association
53
+ department = Department.find([1,1])
54
+ assert_equal(2, department.employees.size, "Before clear employee count should be 2.")
55
+
56
+ department.employees.clear
57
+ assert_equal(0, department.employees.size, "After clear employee count should be 0.")
58
+
59
+ department.reload
60
+ assert_equal(0, department.employees.size, "After clear and a reload from DB employee count should be 0.")
61
+ end
62
+
63
+ def test_delete_association
64
+ department = Department.find([1,1])
65
+ assert_equal 2, department.employees.size , "Before delete employee count should be 2."
66
+ first_employee = department.employees[0]
67
+ department.employees.delete(first_employee)
68
+ assert_equal 1, department.employees.size, "After delete employee count should be 1."
69
+ department.reload
70
+ assert_equal 1, department.employees.size, "After delete and a reload from DB employee count should be 1."
71
+ end
72
+
73
+ def test_has_many_replace
74
+ tariff = tariffs(:flat)
75
+ assert_equal(1, tariff.product_tariffs.length)
76
+
77
+ tariff.product_tariffs = [product_tariffs(:first_free), product_tariffs(:second_free)]
78
+ tariff.reload
79
+
80
+ assert_equal(2, tariff.product_tariffs.length)
81
+ refute(tariff.product_tariffs.include?(tariff))
82
+ end
83
+
84
+ def test_destroy_has_one
85
+ # In this case the association is a has_one with
86
+ # dependent set to :destroy
87
+ department = departments(:engineering)
88
+ assert_not_nil(department.head)
89
+
90
+ # Get head employee id
91
+ head_id = department.head.id
92
+
93
+ # Delete department - should delete the head
94
+ department.destroy
95
+
96
+ # Verify the head is also
97
+ assert_raise(ActiveRecord::RecordNotFound) do
98
+ Employee.find(head_id)
99
+ end
100
+ end
101
+
102
+ def test_destroy_has_and_belongs_to_many_on_non_cpk
103
+ steve = employees(:steve)
104
+ records_before = ActiveRecord::Base.connection.execute('select * from employees_groups')
105
+ steve.destroy
106
+ records_after = ActiveRecord::Base.connection.execute('select * from employees_groups')
107
+ if records_before.respond_to?(:count)
108
+ assert_equal records_after.count, records_before.count - steve.groups.count
109
+ elsif records_before.respond_to?(:row_count) # OCI8:Cursor for oracle adapter
110
+ assert_equal records_after.row_count, records_before.row_count - steve.groups.count
111
+ end
112
+ end
113
+
114
+ def test_create_destroy_has_and_belongs_to_many_on_non_cpk
115
+ records_before = ActiveRecord::Base.connection.execute('select * from employees_groups')
116
+ employee = Employee.create!(department_id: 3, location_id: 2, name: 'Jon')
117
+ employee.groups << Group.create(name: 'test')
118
+ employee.destroy!
119
+ records_after = ActiveRecord::Base.connection.execute('select * from employees_groups')
120
+ if records_before.respond_to?(:count)
121
+ assert_equal records_before.count, records_after.count
122
+ elsif records_before.respond_to?(:row_count) # OCI8:Cursor for oracle adapter
123
+ assert_equal records_before.row_count, records_after.row_count
124
+ end
125
+ end
126
+
127
+ def test_create_destroy_all_has_and_belongs_to_many_on_non_cpk
128
+ records_before = ActiveRecord::Base.connection.execute('select * from employees_groups')
129
+ employee = Employee.create!(department_id: 3, location_id: 2, name: 'Jon')
130
+ employee.groups << Group.create(name: 'test')
131
+ employee.groups.destroy_all
132
+ records_after = ActiveRecord::Base.connection.execute('select * from employees_groups')
133
+ if records_before.respond_to?(:count)
134
+ assert_equal records_before.count, records_after.count
135
+ elsif records_before.respond_to?(:row_count) # OCI8:Cursor for oracle adapter
136
+ assert_equal records_before.row_count, records_after.row_count
137
+ end
138
+ end
139
+
140
+ def test_delete_not_destroy_on_cpk
141
+ tariff = Tariff.where(tariff_id: 2).first
142
+ tariff.delete
143
+ refute(tariff.persisted?)
144
+ end
145
+
146
+ def test_delete_not_destroy_on_non_cpk
147
+ article = articles(:third)
148
+ article.delete
149
+ refute(article.persisted?)
150
+ end
151
+
152
+ def test_destroy_has_many_delete_all
153
+ # In this case the association is a has_many composite key with
154
+ # dependent set to :delete_all
155
+ product = Product.find(1)
156
+ assert_equal(2, product.product_tariffs.length)
157
+
158
+ # Get product_tariff length
159
+ product_tariff_size = ProductTariff.count
160
+
161
+ # Delete product - should delete 2 product tariffs
162
+ product.destroy
163
+
164
+ # Verify product_tariff are deleted
165
+ assert_equal(product_tariff_size - 2, ProductTariff.count)
166
+ end
167
+
168
+ def test_delete_cpk_association
169
+ product = Product.find(1)
170
+ assert_equal(2, product.product_tariffs.length)
171
+
172
+ product_tariff = product.product_tariffs.first
173
+ product.product_tariffs.delete(product_tariff)
174
+
175
+ product.reload
176
+ assert_equal(1, product.product_tariffs.length)
177
+ end
178
+
179
+ def test_delete_records_for_has_many_association_with_composite_primary_key
180
+ reference_type = ReferenceType.find(1)
181
+ codes_to_delete = reference_type.reference_codes[0..1]
182
+ assert_equal(3, reference_type.reference_codes.size, "Before deleting records reference_code count should be 3.")
183
+
184
+ reference_type.reference_codes.delete(codes_to_delete)
185
+ reference_type.reload
186
+ assert_equal(1, reference_type.reference_codes.size, "After deleting 2 records and a reload from DB reference_code count should be 1.")
187
+ end
188
+ end
data/test/test_exists.rb CHANGED
@@ -1,40 +1,40 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestExists < ActiveSupport::TestCase
4
- fixtures :articles, :capitols, :departments, :dorms
5
-
6
- def test_id
7
- assert(Dorm.exists?(1))
8
- refute(Dorm.exists?(-1))
9
- end
10
-
11
- def test_array
12
- assert(Article.exists?(['name = ?', 'Article One']))
13
- assert(!Article.exists?(['name = ?', 'Article -1']))
14
- end
15
-
16
- def test_hash
17
- assert(Article.exists?('name' => 'Article One'))
18
- assert(!Article.exists?('name' => 'Article -1'))
19
- end
20
-
21
- def test_cpk_id
22
- assert(Department.exists?(CompositePrimaryKeys::CompositeKeys.new([1,1])))
23
- assert(!Department.exists?(CompositePrimaryKeys::CompositeKeys.new([1,-1])))
24
- end
25
-
26
- def test_cpk_array_id
27
- assert(Department.exists?([1,1]))
28
- assert(!Department.exists?([1,-1]))
29
- end
30
-
31
- def test_cpk_array_condition
32
- assert(Department.exists?(['id = ? and location_id = ?', 1, 1]))
33
- assert(!Department.exists?(['id = ? and location_id = ?', 1, -1]))
34
- end
35
-
36
- def test_cpk_array_string_id
37
- assert(Capitol.exists?(['The Netherlands', 'Amsterdam']))
38
- assert(!Capitol.exists?(['The Netherlands', 'Paris']))
39
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestExists < ActiveSupport::TestCase
4
+ fixtures :articles, :capitols, :departments, :dorms
5
+
6
+ def test_id
7
+ assert(Dorm.exists?(1))
8
+ refute(Dorm.exists?(-1))
9
+ end
10
+
11
+ def test_array
12
+ assert(Article.exists?(['name = ?', 'Article One']))
13
+ assert(!Article.exists?(['name = ?', 'Article -1']))
14
+ end
15
+
16
+ def test_hash
17
+ assert(Article.exists?('name' => 'Article One'))
18
+ assert(!Article.exists?('name' => 'Article -1'))
19
+ end
20
+
21
+ def test_cpk_id
22
+ assert(Department.exists?(CompositePrimaryKeys::CompositeKeys.new([1,1])))
23
+ assert(!Department.exists?(CompositePrimaryKeys::CompositeKeys.new([1,-1])))
24
+ end
25
+
26
+ def test_cpk_array_id
27
+ assert(Department.exists?([1,1]))
28
+ assert(!Department.exists?([1,-1]))
29
+ end
30
+
31
+ def test_cpk_array_condition
32
+ assert(Department.exists?(['id = ? and location_id = ?', 1, 1]))
33
+ assert(!Department.exists?(['id = ? and location_id = ?', 1, -1]))
34
+ end
35
+
36
+ def test_cpk_array_string_id
37
+ assert(Capitol.exists?(['The Netherlands', 'Amsterdam']))
38
+ assert(!Capitol.exists?(['The Netherlands', 'Paris']))
39
+ end
40
40
  end