composite_primary_keys 8.1.1 → 8.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.rdoc +4 -1
- data/lib/composite_primary_keys.rb +5 -1
- data/lib/composite_primary_keys/arel/visitors/to_sql.rb +24 -0
- data/lib/composite_primary_keys/associations/association_scope.rb +32 -58
- data/lib/composite_primary_keys/associations/join_dependency/join_association.rb +22 -22
- data/lib/composite_primary_keys/associations/preloader/association.rb +12 -6
- data/lib/composite_primary_keys/associations/preloader/belongs_to.rb +19 -19
- data/lib/composite_primary_keys/attribute_methods/primary_key.rb +1 -2
- data/lib/composite_primary_keys/attribute_methods/read.rb +2 -2
- data/lib/composite_primary_keys/attribute_methods/write.rb +1 -1
- data/lib/composite_primary_keys/composite_predicates.rb +55 -50
- data/lib/composite_primary_keys/composite_relation.rb +48 -48
- data/lib/composite_primary_keys/connection_adapters/abstract/connection_specification_changes.rb +2 -2
- data/lib/composite_primary_keys/connection_adapters/postgresql_adapter.rb +19 -46
- data/lib/composite_primary_keys/connection_adapters/sqlserver_adapter.rb +8 -4
- data/lib/composite_primary_keys/fixtures.rb +26 -22
- data/lib/composite_primary_keys/locking/optimistic.rb +54 -55
- data/lib/composite_primary_keys/relation.rb +15 -8
- data/lib/composite_primary_keys/relation/batches.rb +23 -19
- data/lib/composite_primary_keys/relation/calculations.rb +4 -2
- data/lib/composite_primary_keys/relation/finder_methods.rb +33 -27
- data/lib/composite_primary_keys/relation/predicate_builder.rb +18 -3
- data/lib/composite_primary_keys/relation/query_methods.rb +41 -41
- data/lib/composite_primary_keys/sanitization.rb +7 -5
- data/lib/composite_primary_keys/validations/uniqueness.rb +20 -16
- data/lib/composite_primary_keys/version.rb +1 -1
- data/tasks/databases/oracle.rake +27 -25
- data/tasks/databases/oracle_enhanced.rake +27 -0
- data/test/connections/databases.ci.yml +15 -15
- data/test/connections/native_oracle/connection.rb +11 -11
- data/test/connections/native_oracle_enhanced/connection.rb +16 -16
- data/test/fixtures/comment.rb +7 -7
- data/test/fixtures/db_definitions/db2-create-tables.sql +126 -126
- data/test/fixtures/db_definitions/db2-drop-tables.sql +18 -18
- data/test/fixtures/db_definitions/oracle.drop.sql +48 -45
- data/test/fixtures/db_definitions/oracle.sql +236 -223
- data/test/fixtures/dorm.rb +2 -2
- data/test/fixtures/membership.rb +6 -6
- data/test/fixtures/membership_statuses.yml +16 -16
- data/test/fixtures/memberships.yml +10 -10
- data/test/fixtures/product_tariffs.yml +14 -14
- data/test/fixtures/reference_code.rb +7 -7
- data/test/fixtures/restaurants_suburb.rb +2 -2
- data/test/fixtures/suburb.rb +5 -5
- data/test/fixtures/topic.rb +5 -5
- data/test/fixtures/topic_source.rb +6 -6
- data/test/fixtures/topic_sources.yml +3 -3
- data/test/fixtures/topics.yml +8 -8
- data/test/fixtures/users.yml +10 -10
- data/test/test_attribute_methods.rb +63 -63
- data/test/test_calculations.rb +42 -37
- data/test/test_callbacks.rb +99 -99
- data/test/test_delete.rb +28 -21
- data/test/test_delete_all.rb +5 -4
- data/test/test_dumpable.rb +15 -15
- data/test/test_nested_attributes.rb +124 -124
- data/test/test_optimistic.rb +18 -18
- data/test/test_polymorphic.rb +1 -1
- data/test/test_predicates.rb +40 -40
- data/test/test_santiago.rb +23 -23
- data/test/test_suite.rb +34 -34
- data/test/test_touch.rb +23 -23
- data/test/test_update.rb +71 -71
- metadata +9 -8
- data/lib/composite_primary_keys/model_schema.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce98265078e9df3388a619400153228e3d060120
|
4
|
+
data.tar.gz: 02bfe6e56836f6a5c6f6e73ca8bcc1af3502a729
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 47e1b2d9385bdc3222d316989aad9c876d218cc985cbf4a11cfa66cf4de0fe67a466891242b8f2b38af96e1a0e2a6d34da7176ff2ca55b5445c2c43c94a46fe5
|
7
|
+
data.tar.gz: e7c96de2cb63e3512f511b9d46a81df2154fe05d4ed7547d65ea101e691f90f484df3f9d8da3aaa269ba5a0054ebac48e92738064d51e5d1e39fb41df9189f69
|
data/History.rdoc
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
== 8.1.2 (2015-12-13)
|
2
|
+
|
3
|
+
* Fix failing tests
|
4
|
+
|
1
5
|
== 8.1.1 (2015-08-04)
|
2
6
|
|
3
7
|
* Updates to make Travis CI green (Laust Rud Jacobsen)
|
@@ -8,7 +12,6 @@
|
|
8
12
|
* Remove call to verify_active_connections! which was removed from AR 4.1 (Steve Pletcher)
|
9
13
|
* Aligned the establish connection paramater handling to be similar to latest version of rails (Harish Shetty)
|
10
14
|
|
11
|
-
|
12
15
|
== 8.1.0 (2014-03-23)
|
13
16
|
|
14
17
|
* ActiveRecord 4.2.1 support (Charlie Savage)
|
@@ -30,6 +30,9 @@ unless defined?(ActiveRecord)
|
|
30
30
|
require 'active_record'
|
31
31
|
end
|
32
32
|
|
33
|
+
# Arel files we override
|
34
|
+
require 'arel/visitors/to_sql'
|
35
|
+
|
33
36
|
# AR files we override
|
34
37
|
require 'active_record/counter_cache'
|
35
38
|
require 'active_record/fixtures'
|
@@ -68,13 +71,14 @@ require 'active_record/relation/query_methods'
|
|
68
71
|
require 'active_record/validations/uniqueness'
|
69
72
|
|
70
73
|
# CPK files
|
74
|
+
require 'composite_primary_keys/arel/visitors/to_sql'
|
75
|
+
|
71
76
|
require 'composite_primary_keys/persistence'
|
72
77
|
require 'composite_primary_keys/base'
|
73
78
|
require 'composite_primary_keys/core'
|
74
79
|
require 'composite_primary_keys/composite_arrays'
|
75
80
|
require 'composite_primary_keys/composite_predicates'
|
76
81
|
require 'composite_primary_keys/fixtures'
|
77
|
-
require 'composite_primary_keys/model_schema'
|
78
82
|
require 'composite_primary_keys/relation'
|
79
83
|
require 'composite_primary_keys/sanitization'
|
80
84
|
require 'composite_primary_keys/attribute_set/builder'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Arel
|
2
|
+
module Visitors
|
3
|
+
class ToSql
|
4
|
+
def visit_Arel_Nodes_In o, collector
|
5
|
+
if Array === o.right && o.right.empty?
|
6
|
+
collector << '1=0'
|
7
|
+
else
|
8
|
+
# CPK
|
9
|
+
# collector = visit o.left, collector
|
10
|
+
if o.left.name.is_a?(Array)
|
11
|
+
collector << "("
|
12
|
+
collector = visit(o.left, collector)
|
13
|
+
collector << ")"
|
14
|
+
else
|
15
|
+
collector = visit o.left, collector
|
16
|
+
end
|
17
|
+
|
18
|
+
collector << " IN ("
|
19
|
+
visit(o.right, collector) << ")"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -1,72 +1,46 @@
|
|
1
1
|
module ActiveRecord
|
2
2
|
module Associations
|
3
3
|
class AssociationScope
|
4
|
-
def add_constraints(scope, owner, assoc_klass, refl, tracker)
|
5
|
-
chain = refl.chain
|
6
|
-
scope_chain = refl.scope_chain
|
7
4
|
|
8
|
-
|
5
|
+
def next_chain_scope(scope, table, reflection, tracker, assoc_klass, foreign_table, next_reflection)
|
6
|
+
join_keys = reflection.join_keys(assoc_klass)
|
7
|
+
key = join_keys.key
|
8
|
+
foreign_key = join_keys.foreign_key
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
# CPK
|
11
|
+
# constraint = table[key].eq(foreign_table[foreign_key])
|
12
|
+
constraint = cpk_join_predicate(table, key, foreign_table, foreign_key)
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
# CPK - TODO add back in tracker support
|
19
|
-
if key.kind_of?(Array) || foreign_key.kind_of?(Array)
|
20
|
-
predicate = cpk_join_predicate(table, key, owner, foreign_key)
|
21
|
-
scope = scope.where(predicate)
|
22
|
-
else
|
23
|
-
bind_val = bind scope, table.table_name, key.to_s, owner[foreign_key], tracker
|
24
|
-
scope = scope.where(table[key].eq(bind_val))
|
25
|
-
end
|
26
|
-
|
27
|
-
|
28
|
-
if reflection.type
|
29
|
-
value = owner.class.base_class.name
|
30
|
-
bind_val = bind scope, table.table_name, reflection.type, value, tracker
|
31
|
-
scope = scope.where(table[reflection.type].eq(bind_val))
|
32
|
-
end
|
33
|
-
else
|
34
|
-
# CPK
|
35
|
-
#constraint = table[key].eq(foreign_table[foreign_key])
|
36
|
-
constraint = cpk_join_predicate(table, key, foreign_table, foreign_key)
|
37
|
-
|
38
|
-
if reflection.type
|
39
|
-
value = chain[i + 1].klass.base_class.name
|
40
|
-
bind_val = bind scope, table.table_name, reflection.type, value, tracker
|
41
|
-
scope = scope.where(table[reflection.type].eq(bind_val))
|
42
|
-
end
|
43
|
-
|
44
|
-
scope = scope.joins(join(foreign_table, constraint))
|
45
|
-
end
|
46
|
-
|
47
|
-
is_first_chain = i == 0
|
48
|
-
klass = is_first_chain ? assoc_klass : reflection.klass
|
14
|
+
if reflection.type
|
15
|
+
value = next_reflection.klass.base_class.name
|
16
|
+
bind_val = bind scope, table.table_name, reflection.type, value, tracker
|
17
|
+
scope = scope.where(table[reflection.type].eq(bind_val))
|
18
|
+
end
|
49
19
|
|
50
|
-
|
51
|
-
|
52
|
-
scope_chain[i].each do |scope_chain_item|
|
53
|
-
item = eval_scope(klass, scope_chain_item, owner)
|
20
|
+
scope.joins(join(foreign_table, constraint))
|
21
|
+
end
|
54
22
|
|
55
|
-
|
56
|
-
|
57
|
-
|
23
|
+
def last_chain_scope(scope, table, reflection, owner, tracker, assoc_klass)
|
24
|
+
join_keys = reflection.join_keys(assoc_klass)
|
25
|
+
key = join_keys.key
|
26
|
+
foreign_key = join_keys.foreign_key
|
27
|
+
|
28
|
+
if key.kind_of?(Array) || foreign_key.kind_of?(Array)
|
29
|
+
predicate = cpk_join_predicate(table, key, owner, foreign_key)
|
30
|
+
scope = scope.where(predicate)
|
31
|
+
else
|
32
|
+
bind_val = bind scope, table.table_name, key.to_s, owner[foreign_key], tracker
|
33
|
+
scope = scope.where(table[key].eq(bind_val))
|
34
|
+
end
|
58
35
|
|
59
|
-
|
60
|
-
|
61
|
-
|
36
|
+
if reflection.type
|
37
|
+
value = owner.class.base_class.name
|
38
|
+
bind_val = bind scope, table.table_name, reflection.type, value, tracker
|
62
39
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
end
|
40
|
+
scope.where(table[reflection.type].eq(bind_val))
|
41
|
+
else
|
42
|
+
scope
|
67
43
|
end
|
68
|
-
|
69
|
-
scope
|
70
44
|
end
|
71
45
|
end
|
72
46
|
end
|
@@ -1,22 +1,22 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module Associations
|
3
|
-
class JoinDependency
|
4
|
-
class JoinAssociation
|
5
|
-
def build_constraint(klass, table, key, foreign_table, foreign_key)
|
6
|
-
# CPK
|
7
|
-
# constraint = table[key].eq(foreign_table[foreign_key])
|
8
|
-
constraint = cpk_join_predicate(table, key, foreign_table, foreign_key)
|
9
|
-
|
10
|
-
if klass.finder_needs_type_condition?
|
11
|
-
constraint = table.create_and([
|
12
|
-
constraint,
|
13
|
-
klass.send(:type_condition, table)
|
14
|
-
])
|
15
|
-
end
|
16
|
-
|
17
|
-
constraint
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
1
|
+
module ActiveRecord
|
2
|
+
module Associations
|
3
|
+
class JoinDependency
|
4
|
+
class JoinAssociation
|
5
|
+
def build_constraint(klass, table, key, foreign_table, foreign_key)
|
6
|
+
# CPK
|
7
|
+
# constraint = table[key].eq(foreign_table[foreign_key])
|
8
|
+
constraint = cpk_join_predicate(table, key, foreign_table, foreign_key)
|
9
|
+
|
10
|
+
if klass.finder_needs_type_condition?
|
11
|
+
constraint = table.create_and([
|
12
|
+
constraint,
|
13
|
+
klass.send(:type_condition, table)
|
14
|
+
])
|
15
|
+
end
|
16
|
+
|
17
|
+
constraint
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -54,13 +54,19 @@ module ActiveRecord
|
|
54
54
|
records_for(slice)
|
55
55
|
}
|
56
56
|
|
57
|
+
# CPK
|
58
|
+
# @preloaded_records.map { |record|
|
59
|
+
# key = record[association_key_name]
|
60
|
+
# key = key.to_s if key_conversion_required?
|
61
|
+
#
|
62
|
+
# [record, key]
|
63
|
+
# }
|
57
64
|
@preloaded_records.map { |record|
|
58
|
-
|
59
|
-
#[record, record[association_key_name]]
|
60
|
-
owner_key = Array(association_key_name).map do |key_name|
|
65
|
+
key = Array(association_key_name).map do |key_name|
|
61
66
|
record[key_name]
|
62
67
|
end.join(CompositePrimaryKeys::ID_SEP)
|
63
|
-
|
68
|
+
|
69
|
+
[record, key]
|
64
70
|
}
|
65
71
|
end
|
66
72
|
|
@@ -69,7 +75,7 @@ module ActiveRecord
|
|
69
75
|
owners.group_by do |owner|
|
70
76
|
# CPK
|
71
77
|
# owner[owner_key_name].to_s
|
72
|
-
|
78
|
+
Array(owner_key_name).map do |key_name|
|
73
79
|
owner[key_name]
|
74
80
|
end.join(CompositePrimaryKeys::ID_SEP)
|
75
81
|
end
|
@@ -77,7 +83,7 @@ module ActiveRecord
|
|
77
83
|
owners.group_by do |owner|
|
78
84
|
# CPK
|
79
85
|
# owner[owner_key_name]
|
80
|
-
|
86
|
+
Array(owner_key_name).map do |key_name|
|
81
87
|
owner[key_name]
|
82
88
|
end.join(CompositePrimaryKeys::ID_SEP)
|
83
89
|
end
|
@@ -1,19 +1,19 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module Associations
|
3
|
-
class Preloader
|
4
|
-
class BelongsTo
|
5
|
-
def query_scope(ids)
|
6
|
-
# CPK
|
7
|
-
# scope.where(association_key.in(ids))
|
8
|
-
|
9
|
-
if association_key_name.is_a?(Array)
|
10
|
-
predicate = cpk_in_predicate(table, association_key_name, ids)
|
11
|
-
scope.where(predicate)
|
12
|
-
else
|
13
|
-
scope.where(association_key.in(ids))
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
1
|
+
module ActiveRecord
|
2
|
+
module Associations
|
3
|
+
class Preloader
|
4
|
+
class BelongsTo
|
5
|
+
def query_scope(ids)
|
6
|
+
# CPK
|
7
|
+
# scope.where(association_key.in(ids))
|
8
|
+
|
9
|
+
if association_key_name.is_a?(Array)
|
10
|
+
predicate = cpk_in_predicate(table, association_key_name, ids)
|
11
|
+
scope.where(predicate)
|
12
|
+
else
|
13
|
+
scope.where(association_key.in(ids))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -5,8 +5,7 @@ module ActiveRecord
|
|
5
5
|
def id_was
|
6
6
|
sync_with_transaction_state
|
7
7
|
# CPK
|
8
|
-
#attribute_was(self.class.primary_key)
|
9
|
-
|
8
|
+
# attribute_was(self.class.primary_key)
|
10
9
|
if self.composite?
|
11
10
|
self.class.primary_keys.map do |key_attr|
|
12
11
|
attribute_changed?(key_attr) ? changed_attributes[key_attr] : self.ids_hash[key_attr]
|
@@ -7,7 +7,7 @@ module ActiveRecord
|
|
7
7
|
_read_attribute(attr_name, &block)
|
8
8
|
else
|
9
9
|
name = attr_name.to_s
|
10
|
-
name = self.class.primary_key if name == 'id'
|
10
|
+
name = self.class.primary_key if name == 'id'.freeze
|
11
11
|
_read_attribute(name, &block)
|
12
12
|
end
|
13
13
|
end
|
@@ -22,4 +22,4 @@ module ActiveRecord
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
25
|
-
end
|
25
|
+
end
|
@@ -1,51 +1,56 @@
|
|
1
|
-
module CompositePrimaryKeys
|
2
|
-
module Predicates
|
3
|
-
def cpk_and_predicate(predicates)
|
4
|
-
if predicates.length == 1
|
5
|
-
predicates.first
|
6
|
-
else
|
7
|
-
Arel::Nodes::And.new(predicates)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def cpk_or_predicate(predicates)
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
1
|
+
module CompositePrimaryKeys
|
2
|
+
module Predicates
|
3
|
+
def cpk_and_predicate(predicates)
|
4
|
+
if predicates.length == 1
|
5
|
+
predicates.first
|
6
|
+
else
|
7
|
+
Arel::Nodes::And.new(predicates)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def cpk_or_predicate(predicates)
|
12
|
+
if predicates.length <= 1
|
13
|
+
predicates.first
|
14
|
+
else
|
15
|
+
predicates_copy = predicates.dup
|
16
|
+
predicate = predicates_copy.shift
|
17
|
+
|
18
|
+
or_predicate = predicates_copy.inject(predicate) do |mem, predicate|
|
19
|
+
::Arel::Nodes::Or.new(mem, predicate)
|
20
|
+
end
|
21
|
+
::Arel::Nodes::Grouping.new(or_predicate)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def cpk_id_predicate(table, keys, values)
|
26
|
+
eq_predicates = keys.zip(values).map do |key, value|
|
27
|
+
table[key].eq(value)
|
28
|
+
end
|
29
|
+
cpk_and_predicate(eq_predicates)
|
30
|
+
end
|
31
|
+
|
32
|
+
def cpk_join_predicate(table1, key1, table2, key2)
|
33
|
+
key1_fields = Array(key1).map {|key| table1[key]}
|
34
|
+
key2_fields = Array(key2).map {|key| table2[key]}
|
35
|
+
|
36
|
+
eq_predicates = key1_fields.zip(key2_fields).map do |key_field1, key_field2|
|
37
|
+
key_field1.eq(key_field2)
|
38
|
+
end
|
39
|
+
cpk_and_predicate(eq_predicates)
|
40
|
+
end
|
41
|
+
|
42
|
+
def cpk_in_predicate(table, primary_keys, ids)
|
43
|
+
and_predicates = ids.map do |id|
|
44
|
+
cpk_id_predicate(table, primary_keys, id)
|
45
|
+
end
|
46
|
+
cpk_or_predicate(and_predicates)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
ActiveRecord::Associations::AssociationScope.send(:include, CompositePrimaryKeys::Predicates)
|
52
|
+
ActiveRecord::Associations::JoinDependency::JoinAssociation.send(:include, CompositePrimaryKeys::Predicates)
|
53
|
+
ActiveRecord::Associations::Preloader::Association.send(:include, CompositePrimaryKeys::Predicates)
|
54
|
+
ActiveRecord::Associations::HasManyThroughAssociation.send(:include, CompositePrimaryKeys::Predicates)
|
55
|
+
ActiveRecord::Relation.send(:include, CompositePrimaryKeys::Predicates)
|
51
56
|
ActiveRecord::PredicateBuilder.send(:extend, CompositePrimaryKeys::Predicates)
|