composite_primary_keys 14.0.3 → 14.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +49 -0
  3. data/README.rdoc +182 -182
  4. data/Rakefile +1 -1
  5. data/lib/composite_primary_keys/associations/association.rb +2 -2
  6. data/lib/composite_primary_keys/associations/association_scope.rb +1 -1
  7. data/lib/composite_primary_keys/associations/collection_association.rb +10 -3
  8. data/lib/composite_primary_keys/associations/has_many_through_association.rb +19 -0
  9. data/lib/composite_primary_keys/associations/preloader/association.rb +52 -68
  10. data/lib/composite_primary_keys/autosave_association.rb +1 -1
  11. data/lib/composite_primary_keys/composite_arrays.rb +2 -0
  12. data/lib/composite_primary_keys/composite_predicates.rb +121 -71
  13. data/lib/composite_primary_keys/connection_adapters/abstract/database_statements.rb +1 -2
  14. data/lib/composite_primary_keys/nested_attributes.rb +2 -2
  15. data/lib/composite_primary_keys/persistence.rb +96 -96
  16. data/lib/composite_primary_keys/relation/calculations.rb +110 -110
  17. data/lib/composite_primary_keys/relation/query_methods.rb +14 -16
  18. data/lib/composite_primary_keys/relation.rb +4 -2
  19. data/lib/composite_primary_keys/validations/uniqueness.rb +10 -2
  20. data/lib/composite_primary_keys/version.rb +1 -1
  21. data/lib/composite_primary_keys.rb +117 -119
  22. data/scripts/console.rb +2 -2
  23. data/tasks/databases/trilogy.rake +23 -0
  24. data/test/abstract_unit.rb +124 -118
  25. data/test/connections/databases.ci.yml +10 -0
  26. data/test/fixtures/admin.rb +4 -0
  27. data/test/fixtures/comments.yml +6 -0
  28. data/test/fixtures/db_definitions/db2-create-tables.sql +34 -0
  29. data/test/fixtures/db_definitions/db2-drop-tables.sql +7 -1
  30. data/test/fixtures/db_definitions/mysql.sql +23 -0
  31. data/test/fixtures/db_definitions/oracle.drop.sql +4 -0
  32. data/test/fixtures/db_definitions/oracle.sql +21 -0
  33. data/test/fixtures/db_definitions/postgresql.sql +23 -0
  34. data/test/fixtures/db_definitions/sqlite.sql +21 -0
  35. data/test/fixtures/db_definitions/sqlserver.sql +23 -0
  36. data/test/fixtures/department.rb +20 -16
  37. data/test/fixtures/moderator.rb +4 -0
  38. data/test/fixtures/room.rb +4 -1
  39. data/test/fixtures/room_assignment.rb +6 -2
  40. data/test/fixtures/staff_room.rb +6 -0
  41. data/test/fixtures/staff_room_key.rb +6 -0
  42. data/test/fixtures/user.rb +3 -0
  43. data/test/fixtures/user_with_polymorphic_name.rb +9 -0
  44. data/test/test_associations.rb +403 -372
  45. data/test/test_composite_arrays.rb +6 -0
  46. data/test/test_create.rb +219 -218
  47. data/test/test_has_one_through.rb +30 -0
  48. data/test/test_nested_attributes.rb +23 -0
  49. data/test/test_polymorphic.rb +6 -0
  50. data/test/test_predicates.rb +130 -60
  51. metadata +13 -6
  52. data/lib/composite_primary_keys/associations/through_association.rb +0 -24
@@ -1,60 +1,130 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestPredicates < ActiveSupport::TestCase
4
- fixtures :departments
5
-
6
- include CompositePrimaryKeys::Predicates
7
-
8
- def test_or
9
- dep = Department.arel_table
10
-
11
- predicates = Array.new
12
-
13
- 3.times do |i|
14
- predicates << dep[:id].eq(i)
15
- end
16
-
17
- connection = ActiveRecord::Base.connection
18
- quoted = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('id')}"
19
- expected = "(#{quoted} = 0 OR #{quoted} = 1 OR #{quoted} = 2)"
20
-
21
- pred = cpk_or_predicate(predicates)
22
- assert_equal(with_quoted_identifiers(expected), pred.to_sql)
23
- end
24
-
25
- def test_or_with_many_values
26
- dep = Arel::Table.new(:departments)
27
-
28
- predicates = Array.new
29
-
30
- number_of_predicates = 3000 # This should really be big
31
- number_of_predicates.times do |i|
32
- predicates << dep[:id].eq(i)
33
- end
34
-
35
- connection = ActiveRecord::Base.connection
36
- quoted = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('id')}"
37
- expected_ungrouped = ((0...number_of_predicates).map { |i| "#{quoted} = #{i}" }).join(' OR ')
38
- expected = "(#{expected_ungrouped})"
39
-
40
- pred = cpk_or_predicate(predicates)
41
- assert_equal(with_quoted_identifiers(expected), pred.to_sql)
42
- end
43
-
44
- def test_and
45
- dep = Department.arel_table
46
-
47
- predicates = Array.new
48
-
49
- 3.times do |i|
50
- predicates << dep[:id].eq(i)
51
- end
52
-
53
- connection = ActiveRecord::Base.connection
54
- quoted = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('id')}"
55
- expected = "#{quoted} = 0 AND #{quoted} = 1 AND #{quoted} = 2"
56
-
57
- pred = cpk_and_predicate(predicates)
58
- assert_equal(with_quoted_identifiers(expected), pred.to_sql)
59
- end
60
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestPredicates < ActiveSupport::TestCase
4
+ fixtures :departments
5
+
6
+ include CompositePrimaryKeys::Predicates
7
+
8
+ def test_or
9
+ dep = Department.arel_table
10
+
11
+ predicates = Array.new
12
+
13
+ 3.times do |i|
14
+ predicates << dep[:id].eq(i)
15
+ end
16
+
17
+ connection = ActiveRecord::Base.connection
18
+ quoted = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('id')}"
19
+ expected = "(#{quoted} = 0 OR #{quoted} = 1 OR #{quoted} = 2)"
20
+
21
+ pred = cpk_or_predicate(predicates)
22
+ assert_equal(with_quoted_identifiers(expected), pred.to_sql)
23
+ end
24
+
25
+ def test_or_with_many_values
26
+ dep = Arel::Table.new(:departments)
27
+
28
+ predicates = Array.new
29
+
30
+ number_of_predicates = 3000 # This should really be big
31
+ number_of_predicates.times do |i|
32
+ predicates << dep[:id].eq(i)
33
+ end
34
+
35
+ connection = ActiveRecord::Base.connection
36
+ quoted = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('id')}"
37
+ expected_ungrouped = ((0...number_of_predicates).map { |i| "#{quoted} = #{i}" }).join(' OR ')
38
+ expected = "(#{expected_ungrouped})"
39
+
40
+ pred = cpk_or_predicate(predicates)
41
+ assert_equal(with_quoted_identifiers(expected), pred.to_sql)
42
+ end
43
+
44
+ def test_and
45
+ dep = Department.arel_table
46
+
47
+ predicates = Array.new
48
+
49
+ 3.times do |i|
50
+ predicates << dep[:id].eq(i)
51
+ end
52
+
53
+ connection = ActiveRecord::Base.connection
54
+ quoted = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('id')}"
55
+ expected = "#{quoted} = 0 AND #{quoted} = 1 AND #{quoted} = 2"
56
+
57
+ pred = cpk_and_predicate(predicates)
58
+ assert_equal(with_quoted_identifiers(expected), pred.to_sql)
59
+ end
60
+
61
+ def test_in
62
+ dep = Department.arel_table
63
+
64
+ primary_keys = [[1, 1], [1, 2]]
65
+
66
+ connection = ActiveRecord::Base.connection
67
+ quoted_id_column = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('id')}"
68
+ quoted_location_id_column = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('location_id')}"
69
+ expected = "#{quoted_id_column} = 1 AND #{quoted_location_id_column} IN (1, 2)"
70
+
71
+ pred = cpk_in_predicate(dep, [:id, :location_id], primary_keys)
72
+ assert_equal(with_quoted_identifiers(expected), pred.to_sql)
73
+ end
74
+
75
+ def test_in_with_low_cardinality_second_key_part
76
+ dep = Department.arel_table
77
+
78
+ primary_keys = [[1, 1], [2, 1]]
79
+
80
+ connection = ActiveRecord::Base.connection
81
+ quoted_id_column = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('id')}"
82
+ quoted_location_id_column = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('location_id')}"
83
+ expected = "#{quoted_location_id_column} = 1 AND #{quoted_id_column} IN (1, 2)"
84
+
85
+ pred = cpk_in_predicate(dep, [:id, :location_id], primary_keys)
86
+ assert_equal(with_quoted_identifiers(expected), pred.to_sql)
87
+ end
88
+
89
+ def test_in_with_nil_primary_key_part
90
+ dep = Department.arel_table
91
+
92
+ primary_keys = [[nil, 1], [nil, 2]]
93
+
94
+ connection = ActiveRecord::Base.connection
95
+ quoted_id_column = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('id')}"
96
+ quoted_location_id_column = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('location_id')}"
97
+ expected = "#{quoted_id_column} IS NULL AND #{quoted_location_id_column} IN (1, 2)"
98
+
99
+ pred = cpk_in_predicate(dep, [:id, :location_id], primary_keys)
100
+ assert_equal(with_quoted_identifiers(expected), pred.to_sql)
101
+ end
102
+
103
+ def test_in_with_nil_secondary_key_part
104
+ dep = Department.arel_table
105
+
106
+ primary_keys = [[1, 1], [1, nil]]
107
+
108
+ connection = ActiveRecord::Base.connection
109
+ quoted_id_column = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('id')}"
110
+ quoted_location_id_column = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('location_id')}"
111
+ expected = "#{quoted_id_column} = 1 AND (#{quoted_location_id_column} IN (1) OR #{quoted_location_id_column} IS NULL)"
112
+
113
+ pred = cpk_in_predicate(dep, [:id, :location_id], primary_keys)
114
+ assert_equal(with_quoted_identifiers(expected), pred.to_sql)
115
+ end
116
+
117
+ def test_in_with_multiple_primary_key_parts
118
+ dep = Department.arel_table
119
+
120
+ primary_keys = [[1, 1], [1, 2], [2, 3], [2, 4]]
121
+
122
+ connection = ActiveRecord::Base.connection
123
+ quoted_id_column = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('id')}"
124
+ quoted_location_id_column = "#{connection.quote_table_name('departments')}.#{connection.quote_column_name('location_id')}"
125
+ expected = "(#{quoted_id_column} = 1 AND #{quoted_location_id_column} IN (1, 2) OR #{quoted_id_column} = 2 AND #{quoted_location_id_column} IN (3, 4))"
126
+
127
+ pred = cpk_in_predicate(dep, [:id, :location_id], primary_keys)
128
+ assert_equal(with_quoted_identifiers(expected), pred.to_sql)
129
+ end
130
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: composite_primary_keys
3
3
  version: !ruby/object:Gem::Version
4
- version: 14.0.3
4
+ version: 14.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Charlie Savage
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-09 00:00:00.000000000 Z
11
+ date: 2023-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 7.0.0
19
+ version: 7.0.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 7.0.0
26
+ version: 7.0.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -59,7 +59,6 @@ files:
59
59
  - lib/composite_primary_keys/associations/has_many_through_association.rb
60
60
  - lib/composite_primary_keys/associations/join_association.rb
61
61
  - lib/composite_primary_keys/associations/preloader/association.rb
62
- - lib/composite_primary_keys/associations/through_association.rb
63
62
  - lib/composite_primary_keys/attribute_methods.rb
64
63
  - lib/composite_primary_keys/attribute_methods/primary_key.rb
65
64
  - lib/composite_primary_keys/attribute_methods/read.rb
@@ -99,6 +98,7 @@ files:
99
98
  - tasks/databases/postgresql.rake
100
99
  - tasks/databases/sqlite.rake
101
100
  - tasks/databases/sqlserver.rake
101
+ - tasks/databases/trilogy.rake
102
102
  - tasks/website.rake
103
103
  - test/README_tests.rdoc
104
104
  - test/abstract_unit.rb
@@ -106,6 +106,7 @@ files:
106
106
  - test/connections/databases.ci.yml
107
107
  - test/connections/databases.example.yml
108
108
  - test/connections/databases.yml
109
+ - test/fixtures/admin.rb
109
110
  - test/fixtures/article.rb
110
111
  - test/fixtures/articles.yml
111
112
  - test/fixtures/capitol.rb
@@ -132,6 +133,7 @@ files:
132
133
  - test/fixtures/membership_status.rb
133
134
  - test/fixtures/membership_statuses.yml
134
135
  - test/fixtures/memberships.yml
136
+ - test/fixtures/moderator.rb
135
137
  - test/fixtures/product.rb
136
138
  - test/fixtures/product_tariff.rb
137
139
  - test/fixtures/product_tariffs.yml
@@ -154,6 +156,8 @@ files:
154
156
  - test/fixtures/room_attribute_assignments.yml
155
157
  - test/fixtures/room_attributes.yml
156
158
  - test/fixtures/rooms.yml
159
+ - test/fixtures/staff_room.rb
160
+ - test/fixtures/staff_room_key.rb
157
161
  - test/fixtures/street.rb
158
162
  - test/fixtures/streets.yml
159
163
  - test/fixtures/student.rb
@@ -165,6 +169,7 @@ files:
165
169
  - test/fixtures/topic_sources.yml
166
170
  - test/fixtures/topics.yml
167
171
  - test/fixtures/user.rb
172
+ - test/fixtures/user_with_polymorphic_name.rb
168
173
  - test/fixtures/users.yml
169
174
  - test/plugins/pagination.rb
170
175
  - test/plugins/pagination_helper.rb
@@ -183,6 +188,7 @@ files:
183
188
  - test/test_exists.rb
184
189
  - test/test_find.rb
185
190
  - test/test_habtm.rb
191
+ - test/test_has_one_through.rb
186
192
  - test/test_ids.rb
187
193
  - test/test_miscellaneous.rb
188
194
  - test/test_nested_attributes.rb
@@ -216,7 +222,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
216
222
  - !ruby/object:Gem::Version
217
223
  version: '0'
218
224
  requirements: []
219
- rubygems_version: 3.3.4
225
+ rubygems_version: 3.4.21
220
226
  signing_key:
221
227
  specification_version: 4
222
228
  summary: Composite key support for ActiveRecord
@@ -238,6 +244,7 @@ test_files:
238
244
  - test/test_exists.rb
239
245
  - test/test_find.rb
240
246
  - test/test_habtm.rb
247
+ - test/test_has_one_through.rb
241
248
  - test/test_ids.rb
242
249
  - test/test_miscellaneous.rb
243
250
  - test/test_nested_attributes.rb
@@ -1,24 +0,0 @@
1
- module ActiveRecord
2
- module Associations
3
- module ThroughAssociation
4
- alias :original_construct_join_attributes :construct_join_attributes
5
-
6
- def construct_join_attributes(*records)
7
- # CPK
8
- if !self.source_reflection.polymorphic? && source_reflection.klass.composite?
9
- ensure_mutable
10
-
11
- ids = records.map do |record|
12
- source_reflection.association_primary_key(reflection.klass).map do |key|
13
- record.send(key)
14
- end
15
- end
16
-
17
- cpk_in_predicate(through_association.scope.klass.arel_table, source_reflection.foreign_key, ids)
18
- else
19
- original_construct_join_attributes(*records)
20
- end
21
- end
22
- end
23
- end
24
- end