composite_primary_keys 12.0.8 → 13.0.1

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 (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_find.rb CHANGED
@@ -1,164 +1,170 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- # Testing the find action on composite ActiveRecords with two primary keys
4
- class TestFind < ActiveSupport::TestCase
5
- fixtures :capitols, :departments, :reference_types, :reference_codes,
6
- :suburbs, :employees
7
-
8
- def test_find_first
9
- ref_code = ReferenceCode.order('reference_type_id, reference_code').first
10
- assert_kind_of(ReferenceCode, ref_code)
11
- assert_equal([1,1], ref_code.id)
12
- end
13
-
14
- def test_find_last
15
- ref_code = ReferenceCode.order('reference_type_id, reference_code').last
16
- assert_kind_of(ReferenceCode, ref_code)
17
- assert_equal([2,2], ref_code.id)
18
- end
19
-
20
- def test_find_one
21
- ref_code = ReferenceCode.find([1,3])
22
- assert_not_nil(ref_code)
23
- assert_equal([1,3], ref_code.id)
24
- end
25
-
26
- def test_find_some
27
- ref_codes = ReferenceCode.find([1,3], [2,1])
28
- assert_kind_of(Array, ref_codes)
29
- assert_equal(2, ref_codes.length)
30
-
31
- ref_code = ref_codes[0]
32
- assert_equal([1,3], ref_code.id)
33
-
34
- ref_code = ref_codes[1]
35
- assert_equal([2,1], ref_code.id)
36
- end
37
-
38
- def test_find_with_strings_as_composite_keys
39
- capitol = Capitol.find(['The Netherlands', 'Amsterdam'])
40
- assert_kind_of(Capitol, capitol)
41
- assert_equal(['The Netherlands', 'Amsterdam'], capitol.id)
42
- end
43
-
44
- def test_find_with_strings_with_comma_as_composite_keys
45
- capitol = Capitol.create!(country: 'The USA', city: 'Washington, D.C.')
46
- assert_equal ['The USA', 'Washington, D.C.'], capitol.id
47
-
48
- assert_equal capitol, Capitol.find(['The USA', 'Washington, D.C.'])
49
- assert_equal capitol, Capitol.find(capitol.to_param)
50
- end
51
-
52
- def test_find_each
53
- room_assignments = []
54
- RoomAssignment.find_each(:batch_size => 2) do |assignment|
55
- room_assignments << assignment
56
- end
57
-
58
- assert_equal(RoomAssignment.count, room_assignments.uniq.length)
59
- end
60
-
61
- def test_find_each_with_scope
62
- scoped_departments = Department.where("id <> 3")
63
- scoped_departments.find_each(:batch_size => 2) do |department|
64
- assert department.id != 3
65
- end
66
- end
67
-
68
- def test_not_found
69
- error = assert_raise(::ActiveRecord::RecordNotFound) do
70
- ReferenceCode.find(['999', '999'])
71
- end
72
-
73
- expected = "Couldn't find all ReferenceCodes with 'reference_type_id,reference_code': (999, 999) (found 0 results, but was looking for 1)."
74
- assert_equal(with_quoted_identifiers(expected), error.message)
75
- end
76
-
77
- def test_find_with_invalid_ids
78
- assert_raise(::ActiveRecord::RecordNotFound) do
79
- Suburb.find([-1, -1])
80
- end
81
- end
82
-
83
- def test_find_with_no_ids
84
- assert_raise(::ActiveRecord::RecordNotFound) do
85
- Suburb.find
86
- end
87
- end
88
-
89
- def test_find_last_suburb
90
- suburb = Suburb.last
91
- assert_equal([2,2], suburb.id)
92
- end
93
-
94
- def test_find_last_suburb_with_order
95
- # Rails actually changes city_id DESC to city_id ASC
96
- suburb = Suburb.order('suburbs.city_id DESC').last
97
- assert_equal([1,1], suburb.id)
98
- end
99
-
100
- def test_find_in_batches
101
- Department.find_in_batches do |batch|
102
- assert_equal(Department.count, batch.size)
103
- end
104
- end
105
-
106
- def test_in_batches_enumerator
107
- enumerator = Department.in_batches
108
- enumerator.each do |batch|
109
- assert_equal(Department.count, batch.size)
110
- end
111
- end
112
-
113
- def test_in_batches_of_1
114
- num_found = 0
115
- Department.in_batches(of: 1) do |batch|
116
- batch.each do |dept|
117
- num_found += 1
118
- end
119
- end
120
- assert_equal(Department.count, num_found)
121
- end
122
-
123
- def test_find_by_one_association
124
- department = departments(:engineering)
125
- employees = Employee.where(:department => department)
126
- assert_equal(2, employees.to_a.count)
127
- end
128
-
129
- def test_find_by_all_associations
130
- departments = Department.all
131
- employees = Employee.where(:department => departments)
132
- assert_equal(5, employees.to_a.count)
133
- end
134
-
135
- def test_expand_all
136
- departments = Department.all
137
- employees = Employee.where(:department => departments)
138
- assert_equal(5, employees.count)
139
- end
140
-
141
- def test_find_one_with_params_id
142
- params_id = ReferenceCode.find([1,3]).to_param
143
- assert_equal params_id, "1,3"
144
-
145
- ref_code = ReferenceCode.find(params_id)
146
- assert_not_nil(ref_code)
147
- assert_equal([1,3], ref_code.id)
148
- end
149
-
150
- def test_find_some_with_array_of_params_id
151
- params_ids = ReferenceCode.find([1,3], [2,1]).map(&:to_param)
152
- assert_equal ["1,3", "2,1"], params_ids
153
-
154
- ref_codes = ReferenceCode.find(params_ids)
155
- assert_kind_of(Array, ref_codes)
156
- assert_equal(2, ref_codes.length)
157
-
158
- ref_code = ref_codes[0]
159
- assert_equal([1,3], ref_code.id)
160
-
161
- ref_code = ref_codes[1]
162
- assert_equal([2,1], ref_code.id)
163
- end
164
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ # Testing the find action on composite ActiveRecords with two primary keys
4
+ class TestFind < ActiveSupport::TestCase
5
+ fixtures :capitols, :departments, :reference_types, :reference_codes,
6
+ :suburbs, :employees
7
+
8
+ def test_find_first
9
+ ref_code = ReferenceCode.order('reference_type_id, reference_code').first
10
+ assert_kind_of(ReferenceCode, ref_code)
11
+ assert_equal([1,1], ref_code.id)
12
+ end
13
+
14
+ def test_find_last
15
+ ref_code = ReferenceCode.order('reference_type_id, reference_code').last
16
+ assert_kind_of(ReferenceCode, ref_code)
17
+ assert_equal([2,2], ref_code.id)
18
+ end
19
+
20
+ def test_find_one
21
+ ref_code = ReferenceCode.find([1,3])
22
+ assert_not_nil(ref_code)
23
+ assert_equal([1,3], ref_code.id)
24
+ end
25
+
26
+ def test_find_some
27
+ ref_codes = ReferenceCode.find([1,3], [2,1])
28
+ assert_kind_of(Array, ref_codes)
29
+ assert_equal(2, ref_codes.length)
30
+
31
+ ref_code = ref_codes[0]
32
+ assert_equal([1,3], ref_code.id)
33
+
34
+ ref_code = ref_codes[1]
35
+ assert_equal([2,1], ref_code.id)
36
+ end
37
+
38
+ def test_find_with_strings_as_composite_keys
39
+ capitol = Capitol.find(['The Netherlands', 'Amsterdam'])
40
+ assert_kind_of(Capitol, capitol)
41
+ assert_equal(['The Netherlands', 'Amsterdam'], capitol.id)
42
+ end
43
+
44
+ def test_find_with_strings_with_comma_as_composite_keys
45
+ capitol = Capitol.create!(country: 'The USA', city: 'Washington, D.C.')
46
+ assert_equal ['The USA', 'Washington, D.C.'], capitol.id
47
+
48
+ assert_equal capitol, Capitol.find(['The USA', 'Washington, D.C.'])
49
+ assert_equal capitol, Capitol.find(capitol.to_param)
50
+ end
51
+
52
+ def test_find_each
53
+ room_assignments = []
54
+ RoomAssignment.find_each(:batch_size => 2) do |assignment|
55
+ room_assignments << assignment
56
+ end
57
+
58
+ assert_equal(RoomAssignment.count, room_assignments.uniq.length)
59
+ end
60
+
61
+ def test_find_each_with_scope
62
+ scoped_departments = Department.where("id <> 3")
63
+ scoped_departments.find_each(:batch_size => 2) do |department|
64
+ assert department.id != 3
65
+ end
66
+ end
67
+
68
+ def test_not_found
69
+ error = assert_raise(::ActiveRecord::RecordNotFound) do
70
+ ReferenceCode.find(['999', '999'])
71
+ end
72
+
73
+ expected = "Couldn't find all ReferenceCodes with 'reference_type_id,reference_code': (999, 999) (found 0 results, but was looking for 1)."
74
+ assert_equal(with_quoted_identifiers(expected), error.message)
75
+ end
76
+
77
+ def test_find_with_invalid_ids
78
+ assert_raise(::ActiveRecord::RecordNotFound) do
79
+ Suburb.find([-1, -1])
80
+ end
81
+ end
82
+
83
+ def test_find_with_no_ids
84
+ assert_raise(::ActiveRecord::RecordNotFound) do
85
+ Suburb.find
86
+ end
87
+ end
88
+
89
+ def test_find_last_suburb
90
+ suburb = Suburb.last
91
+ assert_equal([2,2], suburb.id)
92
+ end
93
+
94
+ def test_find_last_suburb_with_order
95
+ # Rails actually changes city_id DESC to city_id ASC
96
+ suburb = Suburb.order('suburbs.city_id DESC').last
97
+ assert_equal([1,1], suburb.id)
98
+ end
99
+
100
+ def test_find_in_batches
101
+ Department.find_in_batches do |batch|
102
+ assert_equal(Department.count, batch.size)
103
+ end
104
+ end
105
+
106
+ def test_in_batches_enumerator
107
+ enumerator = Department.in_batches
108
+ enumerator.each do |batch|
109
+ assert_equal(Department.count, batch.size)
110
+ end
111
+ end
112
+
113
+ def test_in_batches_of_1
114
+ num_found = 0
115
+ Department.in_batches(of: 1) do |batch|
116
+ batch.each do |dept|
117
+ num_found += 1
118
+ end
119
+ end
120
+ assert_equal(Department.count, num_found)
121
+ end
122
+
123
+ def test_find_by_one_association
124
+ department = departments(:engineering)
125
+ employees = Employee.where(:department => department)
126
+ assert_equal(2, employees.to_a.count)
127
+ end
128
+
129
+ def test_find_by_all_associations
130
+ departments = Department.all
131
+ employees = Employee.where(:department => departments)
132
+ assert_equal(6, employees.to_a.count)
133
+ end
134
+
135
+ def test_find_by_some_associations
136
+ departments = Department.where(location_id: 1)
137
+ employees = Employee.where(:department => departments)
138
+ assert_equal(4, employees.to_a.count)
139
+ end
140
+
141
+ def test_expand_all
142
+ departments = Department.all
143
+ employees = Employee.where(:department => departments)
144
+ assert_equal(6, employees.count)
145
+ end
146
+
147
+ def test_find_one_with_params_id
148
+ params_id = ReferenceCode.find([1,3]).to_param
149
+ assert_equal params_id, "1,3"
150
+
151
+ ref_code = ReferenceCode.find(params_id)
152
+ assert_not_nil(ref_code)
153
+ assert_equal([1,3], ref_code.id)
154
+ end
155
+
156
+ def test_find_some_with_array_of_params_id
157
+ params_ids = ReferenceCode.find([1,3], [2,1]).map(&:to_param)
158
+ assert_equal ["1,3", "2,1"], params_ids
159
+
160
+ ref_codes = ReferenceCode.find(params_ids)
161
+ assert_kind_of(Array, ref_codes)
162
+ assert_equal(2, ref_codes.length)
163
+
164
+ ref_code = ref_codes[0]
165
+ assert_equal([1,3], ref_code.id)
166
+
167
+ ref_code = ref_codes[1]
168
+ assert_equal([2,1], ref_code.id)
169
+ end
170
+ end
data/test/test_ids.rb CHANGED
@@ -1,112 +1,112 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class ChildCpkTest < ReferenceCode
4
- end
5
-
6
- class TestIds < ActiveSupport::TestCase
7
- fixtures :reference_types, :reference_codes
8
-
9
- CLASSES = {
10
- :single => {
11
- :class => ReferenceType,
12
- :primary_keys => [:reference_type_id],
13
- },
14
- :dual => {
15
- :class => ReferenceCode,
16
- :primary_keys => [:reference_type_id, :reference_code],
17
- },
18
- :dual_strs => {
19
- :class => ReferenceCode,
20
- :primary_keys => ['reference_type_id', 'reference_code'],
21
- }
22
- }
23
-
24
- def setup
25
- self.class.classes = CLASSES
26
- end
27
-
28
- def test_id
29
- testing_with do
30
- assert_equal @first.id, @first.ids if composite?
31
- assert_kind_of(CompositePrimaryKeys::CompositeKeys, @first.id) if composite?
32
- end
33
- end
34
-
35
- def test_to_param
36
- testing_with do
37
- assert_equal '1,1', @first.to_param if composite?
38
- end
39
-
40
- capitol = Capitol.create!(country: 'The USA', city: 'Washington, D.C.')
41
- assert_equal 'The USA,Washington^2C D.C.', capitol.to_param
42
- end
43
-
44
- def test_ids_to_s
45
- testing_with do
46
- order = @klass.primary_key.is_a?(String) ? @klass.primary_key : @klass.primary_key.join(',')
47
- to_test = @klass.order(order)[0..1].map(&:id)
48
- assert_equal '(1,1),(1,2)', @klass.ids_to_s(to_test) if @key_test == :dual
49
- assert_equal '1,1;1,2', @klass.ids_to_s(to_test, ',', ';', '', '') if @key_test == :dual
50
- end
51
- end
52
-
53
- def test_set_ids_string
54
- testing_with do
55
- array = @primary_keys.collect {|key| 5}
56
- expected = composite? ? array.to_composite_keys : array.first
57
- @first.id = expected.to_s
58
- assert_equal expected, @first.id
59
- end
60
- end
61
-
62
- def test_set_ids_array
63
- testing_with do
64
- array = @primary_keys.collect {|key| 5}
65
- expected = composite? ? array.to_composite_keys : array.first
66
- @first.id = expected
67
- assert_equal expected, @first.id
68
- end
69
- end
70
-
71
- def test_set_ids_comp
72
- testing_with do
73
- array = @primary_keys.collect {|key| 5}
74
- expected = composite? ? array.to_composite_keys : array.first
75
- @first.id = expected
76
- assert_equal expected, @first.id
77
- end
78
- end
79
-
80
- def test_primary_keys
81
- testing_with do
82
- if composite?
83
- assert_not_nil @klass.primary_keys
84
- assert_equal @primary_keys.map {|key| key.to_s}, @klass.primary_keys
85
- assert_equal @klass.primary_keys, @klass.primary_key
86
- assert_kind_of(CompositePrimaryKeys::CompositeKeys, @klass.primary_keys)
87
- assert_equal @primary_keys.map {|key| key.to_sym}.join(','), @klass.primary_key.to_s
88
- else
89
- assert_not_nil @klass.primary_key
90
- assert_equal @primary_keys.first, @klass.primary_key.to_sym
91
- assert_equal @primary_keys.first.to_s, @klass.primary_key.to_s
92
- end
93
- end
94
- end
95
-
96
- def test_inherited_primary_keys
97
- assert_equal(["reference_type_id", "reference_code"], ChildCpkTest.primary_keys)
98
- end
99
-
100
- def test_inherited_ids
101
- cpk_test = ChildCpkTest.new
102
- assert_equal([nil, nil], cpk_test.id)
103
- end
104
-
105
- def test_assign_ids
106
- ref_code = ReferenceCode.new
107
- assert_equal([nil, nil], ref_code.id)
108
-
109
- ref_code.id = [2,1]
110
- assert_equal([2,1], ref_code.id)
111
- end
112
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class ChildCpkTest < ReferenceCode
4
+ end
5
+
6
+ class TestIds < ActiveSupport::TestCase
7
+ fixtures :reference_types, :reference_codes
8
+
9
+ CLASSES = {
10
+ :single => {
11
+ :class => ReferenceType,
12
+ :primary_keys => [:reference_type_id],
13
+ },
14
+ :dual => {
15
+ :class => ReferenceCode,
16
+ :primary_keys => [:reference_type_id, :reference_code],
17
+ },
18
+ :dual_strs => {
19
+ :class => ReferenceCode,
20
+ :primary_keys => ['reference_type_id', 'reference_code'],
21
+ }
22
+ }
23
+
24
+ def setup
25
+ self.class.classes = CLASSES
26
+ end
27
+
28
+ def test_id
29
+ testing_with do
30
+ assert_equal @first.id, @first.ids if composite?
31
+ assert_kind_of(CompositePrimaryKeys::CompositeKeys, @first.id) if composite?
32
+ end
33
+ end
34
+
35
+ def test_to_param
36
+ testing_with do
37
+ assert_equal '1,1', @first.to_param if composite?
38
+ end
39
+
40
+ capitol = Capitol.create!(country: 'The USA', city: 'Washington, D.C.')
41
+ assert_equal 'The USA,Washington^2C D.C.', capitol.to_param
42
+ end
43
+
44
+ def test_ids_to_s
45
+ testing_with do
46
+ order = @klass.primary_key.is_a?(String) ? @klass.primary_key : @klass.primary_key.join(',')
47
+ to_test = @klass.order(order)[0..1].map(&:id)
48
+ assert_equal '(1,1),(1,2)', @klass.ids_to_s(to_test) if @key_test == :dual
49
+ assert_equal '1,1;1,2', @klass.ids_to_s(to_test, ',', ';', '', '') if @key_test == :dual
50
+ end
51
+ end
52
+
53
+ def test_set_ids_string
54
+ testing_with do
55
+ array = @primary_keys.collect {|key| 5}
56
+ expected = composite? ? array.to_composite_keys : array.first
57
+ @first.id = expected.to_s
58
+ assert_equal expected, @first.id
59
+ end
60
+ end
61
+
62
+ def test_set_ids_array
63
+ testing_with do
64
+ array = @primary_keys.collect {|key| 5}
65
+ expected = composite? ? array.to_composite_keys : array.first
66
+ @first.id = expected
67
+ assert_equal expected, @first.id
68
+ end
69
+ end
70
+
71
+ def test_set_ids_comp
72
+ testing_with do
73
+ array = @primary_keys.collect {|key| 5}
74
+ expected = composite? ? array.to_composite_keys : array.first
75
+ @first.id = expected
76
+ assert_equal expected, @first.id
77
+ end
78
+ end
79
+
80
+ def test_primary_keys
81
+ testing_with do
82
+ if composite?
83
+ assert_not_nil @klass.primary_keys
84
+ assert_equal @primary_keys.map {|key| key.to_s}, @klass.primary_keys
85
+ assert_equal @klass.primary_keys, @klass.primary_key
86
+ assert_kind_of(CompositePrimaryKeys::CompositeKeys, @klass.primary_keys)
87
+ assert_equal @primary_keys.map {|key| key.to_sym}.join(','), @klass.primary_key.to_s
88
+ else
89
+ assert_not_nil @klass.primary_key
90
+ assert_equal @primary_keys.first, @klass.primary_key.to_sym
91
+ assert_equal @primary_keys.first.to_s, @klass.primary_key.to_s
92
+ end
93
+ end
94
+ end
95
+
96
+ def test_inherited_primary_keys
97
+ assert_equal(["reference_type_id", "reference_code"], ChildCpkTest.primary_keys)
98
+ end
99
+
100
+ def test_inherited_ids
101
+ cpk_test = ChildCpkTest.new
102
+ assert_equal([nil, nil], cpk_test.id)
103
+ end
104
+
105
+ def test_assign_ids
106
+ ref_code = ReferenceCode.new
107
+ assert_equal([nil, nil], ref_code.id)
108
+
109
+ ref_code.id = [2,1]
110
+ assert_equal([2,1], ref_code.id)
111
+ end
112
+ end