torque-postgresql 2.0.0 → 2.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/torque/postgresql.rb +0 -1
- data/lib/torque/postgresql/adapter.rb +7 -0
- data/lib/torque/postgresql/adapter/database_statements.rb +2 -0
- data/lib/torque/postgresql/adapter/oid.rb +3 -1
- data/lib/torque/postgresql/adapter/oid/box.rb +2 -0
- data/lib/torque/postgresql/adapter/oid/circle.rb +2 -0
- data/lib/torque/postgresql/adapter/oid/enum.rb +2 -0
- data/lib/torque/postgresql/adapter/oid/enum_set.rb +2 -0
- data/lib/torque/postgresql/adapter/oid/interval.rb +2 -0
- data/lib/torque/postgresql/adapter/oid/line.rb +2 -0
- data/lib/torque/postgresql/adapter/oid/range.rb +2 -0
- data/lib/torque/postgresql/adapter/oid/segment.rb +2 -0
- data/lib/torque/postgresql/adapter/quoting.rb +2 -0
- data/lib/torque/postgresql/adapter/schema_creation.rb +8 -1
- data/lib/torque/postgresql/adapter/schema_definitions.rb +2 -0
- data/lib/torque/postgresql/adapter/schema_dumper.rb +23 -18
- data/lib/torque/postgresql/adapter/schema_statements.rb +2 -0
- data/lib/torque/postgresql/arel/infix_operation.rb +5 -1
- data/lib/torque/postgresql/arel/join_source.rb +2 -0
- data/lib/torque/postgresql/arel/nodes.rb +2 -0
- data/lib/torque/postgresql/arel/operations.rb +2 -0
- data/lib/torque/postgresql/arel/select_manager.rb +2 -0
- data/lib/torque/postgresql/arel/visitors.rb +6 -3
- data/lib/torque/postgresql/associations/association.rb +9 -1
- data/lib/torque/postgresql/associations/association_scope.rb +2 -0
- data/lib/torque/postgresql/associations/belongs_to_many_association.rb +17 -10
- data/lib/torque/postgresql/associations/builder/belongs_to_many.rb +2 -0
- data/lib/torque/postgresql/associations/builder/has_many.rb +2 -0
- data/lib/torque/postgresql/associations/preloader/association.rb +30 -1
- data/lib/torque/postgresql/attributes/builder.rb +3 -1
- data/lib/torque/postgresql/attributes/builder/enum.rb +5 -3
- data/lib/torque/postgresql/attributes/builder/period.rb +6 -4
- data/lib/torque/postgresql/attributes/enum.rb +5 -10
- data/lib/torque/postgresql/attributes/enum_set.rb +2 -0
- data/lib/torque/postgresql/attributes/lazy.rb +3 -1
- data/lib/torque/postgresql/attributes/period.rb +2 -0
- data/lib/torque/postgresql/auxiliary_statement.rb +2 -0
- data/lib/torque/postgresql/auxiliary_statement/settings.rb +2 -0
- data/lib/torque/postgresql/base.rb +2 -0
- data/lib/torque/postgresql/coder.rb +5 -3
- data/lib/torque/postgresql/collector.rb +2 -0
- data/lib/torque/postgresql/config.rb +5 -0
- data/lib/torque/postgresql/geometry_builder.rb +2 -0
- data/lib/torque/postgresql/i18n.rb +2 -0
- data/lib/torque/postgresql/inheritance.rb +2 -0
- data/lib/torque/postgresql/migration/command_recorder.rb +2 -0
- data/lib/torque/postgresql/railtie.rb +2 -0
- data/lib/torque/postgresql/reflection.rb +2 -0
- data/lib/torque/postgresql/reflection/abstract_reflection.rb +13 -5
- data/lib/torque/postgresql/reflection/association_reflection.rb +2 -0
- data/lib/torque/postgresql/reflection/belongs_to_many_reflection.rb +18 -4
- data/lib/torque/postgresql/reflection/has_many_reflection.rb +2 -0
- data/lib/torque/postgresql/reflection/runtime_reflection.rb +2 -0
- data/lib/torque/postgresql/reflection/through_reflection.rb +2 -0
- data/lib/torque/postgresql/relation.rb +15 -11
- data/lib/torque/postgresql/relation/auxiliary_statement.rb +6 -1
- data/lib/torque/postgresql/relation/distinct_on.rb +2 -0
- data/lib/torque/postgresql/relation/inheritance.rb +2 -0
- data/lib/torque/postgresql/relation/merger.rb +2 -0
- data/lib/torque/postgresql/schema_cache.rb +2 -0
- data/lib/torque/postgresql/version.rb +3 -1
- data/spec/schema.rb +2 -2
- data/spec/tests/arel_spec.rb +3 -1
- data/spec/tests/belongs_to_many_spec.rb +6 -0
- data/spec/tests/enum_set_spec.rb +1 -1
- data/spec/tests/enum_spec.rb +7 -0
- data/spec/tests/has_many_spec.rb +11 -1
- data/spec/tests/table_inheritance_spec.rb +14 -1
- metadata +9 -10
- data/lib/torque/postgresql/autosave_association.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe8259f8bb0f4c8c67c32919ec2bc2ca448c5372857670ed5fbd4d932e3160d6
|
4
|
+
data.tar.gz: 3786a17977e0d4ffd81c1521c9e469fd411b6d15b413866941adc911beb8c2dd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f35b0eb94b260cc5c5c9d08a47dcba841d9044c9acc52d30b0ad13b1e0a6ecbe2ef10ca940828870fbf5f04b387827b9c56db43523e0585f77f950a72e368b51
|
7
|
+
data.tar.gz: a3b899a4c7a26f9ff9a6a9af7f0d41a6ed193e96a76d96ae17a2423eb0b4bc6ea59138684cd324a28ccfad7374528c1cb72d4ae89a0ad710ce66655d3e355e50
|
data/lib/torque/postgresql.rb
CHANGED
@@ -18,7 +18,6 @@ require 'torque/postgresql/arel'
|
|
18
18
|
require 'torque/postgresql/adapter'
|
19
19
|
require 'torque/postgresql/associations'
|
20
20
|
require 'torque/postgresql/attributes'
|
21
|
-
require 'torque/postgresql/autosave_association'
|
22
21
|
require 'torque/postgresql/auxiliary_statement'
|
23
22
|
require 'torque/postgresql/base'
|
24
23
|
require 'torque/postgresql/inheritance'
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'adapter/database_statements'
|
2
4
|
require_relative 'adapter/oid'
|
3
5
|
require_relative 'adapter/quoting'
|
@@ -19,6 +21,11 @@ module Torque
|
|
19
21
|
select_value('SELECT version()').match(/#{Adapter::ADAPTER_NAME} ([\d\.]+)/)[1]
|
20
22
|
)
|
21
23
|
end
|
24
|
+
|
25
|
+
# Add `inherits` to the list of extracted table options
|
26
|
+
def extract_table_options!(options)
|
27
|
+
super.merge(options.extract!(:inherits))
|
28
|
+
end
|
22
29
|
end
|
23
30
|
|
24
31
|
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend Adapter
|
@@ -17,9 +17,11 @@ module Torque
|
|
17
17
|
ActiveRecord::Type.register(:circle, OID::Circle, adapter: :postgresql)
|
18
18
|
ActiveRecord::Type.register(:enum, OID::Enum, adapter: :postgresql)
|
19
19
|
ActiveRecord::Type.register(:enum_set, OID::EnumSet, adapter: :postgresql)
|
20
|
-
ActiveRecord::Type.register(:interval, OID::Interval, adapter: :postgresql)
|
21
20
|
ActiveRecord::Type.register(:line, OID::Line, adapter: :postgresql)
|
22
21
|
ActiveRecord::Type.register(:segment, OID::Segment, adapter: :postgresql)
|
22
|
+
|
23
|
+
ActiveRecord::Type.register(:interval, OID::Interval, adapter: :postgresql) \
|
24
|
+
unless PostgreSQL::AR610
|
23
25
|
end
|
24
26
|
end
|
25
27
|
end
|
@@ -24,10 +24,17 @@ module Torque
|
|
24
24
|
end)
|
25
25
|
end
|
26
26
|
|
27
|
+
if respond_to?(:supports_check_constraints?) && supports_check_constraints?
|
28
|
+
statements.concat(o.check_constraints.map do |expression, options|
|
29
|
+
check_constraint_in_create(o.name, expression, options)
|
30
|
+
end)
|
31
|
+
end
|
32
|
+
|
27
33
|
create_sql << "(#{statements.join(', ')})" \
|
28
34
|
if statements.present? || o.inherits.present?
|
29
35
|
|
30
|
-
|
36
|
+
options = PostgreSQL::AR610 ? o : table_options(o)
|
37
|
+
add_table_options!(create_sql, options)
|
31
38
|
|
32
39
|
if o.inherits.present?
|
33
40
|
tables = o.inherits.map(&method(:quote_table_name))
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Torque
|
2
4
|
module PostgreSQL
|
3
5
|
module Adapter
|
@@ -39,7 +41,7 @@ module Torque
|
|
39
41
|
|
40
42
|
def tables(stream) # :nodoc:
|
41
43
|
inherited_tables = @connection.inherited_tables
|
42
|
-
sorted_tables = @connection.
|
44
|
+
sorted_tables = @connection.tables.sort - @connection.views
|
43
45
|
|
44
46
|
stream.puts " # These are the common tables managed"
|
45
47
|
(sorted_tables - inherited_tables.keys).each do |table_name|
|
@@ -49,30 +51,33 @@ module Torque
|
|
49
51
|
if inherited_tables.present?
|
50
52
|
stream.puts " # These are tables that has inheritance"
|
51
53
|
inherited_tables.each do |table_name, inherits|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
54
|
+
next if ignored?(table_name)
|
55
|
+
|
56
|
+
sub_stream = StringIO.new
|
57
|
+
table(table_name, sub_stream)
|
58
|
+
|
59
|
+
# Add the inherits setting
|
60
|
+
sub_stream.rewind
|
61
|
+
inherits.map!(&:to_sym)
|
62
|
+
inherits = inherits.first if inherits.size === 1
|
63
|
+
inherits = ", inherits: #{inherits.inspect} do |t|"
|
64
|
+
table_dump = sub_stream.read.gsub(/ do \|t\|$/, inherits)
|
65
|
+
|
66
|
+
# Ensure bodyless definitions
|
67
|
+
table_dump.gsub!(/do \|t\|\n end/, '')
|
68
|
+
stream.print table_dump
|
67
69
|
end
|
68
70
|
end
|
69
71
|
|
70
|
-
#
|
72
|
+
# Dump foreign keys at the end to make sure all dependent tables exist.
|
71
73
|
if @connection.supports_foreign_keys?
|
72
74
|
sorted_tables.each do |tbl|
|
73
75
|
foreign_keys(tbl, stream) unless ignored?(tbl)
|
74
76
|
end
|
75
77
|
end
|
78
|
+
|
79
|
+
# Scenic integration
|
80
|
+
views(stream) if defined?(::Scenic)
|
76
81
|
end
|
77
82
|
|
78
83
|
# Dump user defined types like enum
|
@@ -81,7 +86,7 @@ module Torque
|
|
81
86
|
return unless types.any?
|
82
87
|
|
83
88
|
stream.puts " # These are user-defined types used on this database"
|
84
|
-
types.each { |name, type| send(type.to_sym, name, stream) }
|
89
|
+
types.sort_by(&:first).each { |(name, type)| send(type.to_sym, name, stream) }
|
85
90
|
stream.puts
|
86
91
|
rescue => e
|
87
92
|
stream.puts "# Could not dump user-defined types because of following #{e.class}"
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Torque
|
2
4
|
module PostgreSQL
|
3
5
|
module Arel
|
@@ -22,6 +24,8 @@ module Torque
|
|
22
24
|
}.freeze
|
23
25
|
|
24
26
|
INFLIX_OPERATION.each do |operator_name, operator|
|
27
|
+
next if nodes.const_defined?(operator_name)
|
28
|
+
|
25
29
|
klass = Class.new(inflix)
|
26
30
|
klass.send(:define_method, :initialize) { |*args| super(operator, *args) }
|
27
31
|
|
@@ -31,7 +35,7 @@ module Torque
|
|
31
35
|
# Don't worry about quoting here, if the right side is something that
|
32
36
|
# doesn't need quoting, it will leave it as it is
|
33
37
|
Math.send(:define_method, operator_name.underscore) do |other|
|
34
|
-
klass.new(self,
|
38
|
+
klass.new(self, other)
|
35
39
|
end
|
36
40
|
end
|
37
41
|
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Torque
|
2
4
|
module PostgreSQL
|
3
5
|
module Arel
|
4
6
|
module Visitors
|
5
7
|
# Enclose select manager with parenthesis
|
6
8
|
# :TODO: Remove when checking the new version of Arel
|
7
|
-
def visit_Arel_SelectManager
|
9
|
+
def visit_Arel_SelectManager(o, collector)
|
8
10
|
collector << '('
|
9
11
|
visit(o.ast, collector) << ')'
|
10
12
|
end
|
@@ -23,8 +25,9 @@ module Torque
|
|
23
25
|
|
24
26
|
# Allow quoted arrays to get here
|
25
27
|
def visit_Arel_Nodes_Casted(o, collector)
|
26
|
-
|
27
|
-
|
28
|
+
value = o.respond_to?(:val) ? o.val : o.value
|
29
|
+
return super unless value.is_a?(::Enumerable)
|
30
|
+
quote_array(value, collector)
|
28
31
|
end
|
29
32
|
|
30
33
|
## TORQUE VISITORS
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Torque
|
2
4
|
module PostgreSQL
|
3
5
|
module Associations
|
@@ -11,6 +13,10 @@ module Torque
|
|
11
13
|
@inversed = self.target.present?
|
12
14
|
end
|
13
15
|
|
16
|
+
def skip_statement_cache?(*)
|
17
|
+
super || reflection.connected_through_array?
|
18
|
+
end
|
19
|
+
|
14
20
|
private
|
15
21
|
|
16
22
|
def set_owner_attributes(record)
|
@@ -19,12 +25,14 @@ module Torque
|
|
19
25
|
add_id = owner[reflection.active_record_primary_key]
|
20
26
|
record_fk = reflection.foreign_key
|
21
27
|
|
22
|
-
|
28
|
+
list = record[record_fk] ||= []
|
29
|
+
list.push(add_id) unless list.include?(add_id)
|
23
30
|
end
|
24
31
|
|
25
32
|
end
|
26
33
|
|
27
34
|
::ActiveRecord::Associations::Association.prepend(Association)
|
35
|
+
::ActiveRecord::Associations::HasManyAssociation.prepend(Association)
|
28
36
|
end
|
29
37
|
end
|
30
38
|
end
|
@@ -1,4 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_record/associations/collection_association'
|
4
|
+
|
2
5
|
# FIXME: build, create
|
3
6
|
module Torque
|
4
7
|
module PostgreSQL
|
@@ -28,11 +31,11 @@ module Torque
|
|
28
31
|
end
|
29
32
|
|
30
33
|
def ids_reader
|
31
|
-
owner[
|
34
|
+
owner[source_attr]
|
32
35
|
end
|
33
36
|
|
34
37
|
def ids_writer(new_ids)
|
35
|
-
column =
|
38
|
+
column = source_attr
|
36
39
|
command = owner.persisted? ? :update_column : :write_attribute
|
37
40
|
owner.public_send(command, column, new_ids.presence)
|
38
41
|
@association_scope = nil
|
@@ -41,8 +44,8 @@ module Torque
|
|
41
44
|
def insert_record(record, *)
|
42
45
|
super
|
43
46
|
|
44
|
-
attribute = (ids_reader || owner[
|
45
|
-
attribute.push(record[
|
47
|
+
attribute = (ids_reader || owner[source_attr] = [])
|
48
|
+
attribute.push(record[klass_attr])
|
46
49
|
record
|
47
50
|
end
|
48
51
|
|
@@ -51,8 +54,8 @@ module Torque
|
|
51
54
|
end
|
52
55
|
|
53
56
|
def include?(record)
|
54
|
-
list = owner[
|
55
|
-
ids_reader && ids_reader.include?(record[
|
57
|
+
list = owner[source_attr]
|
58
|
+
ids_reader && ids_reader.include?(record[klass_attr])
|
56
59
|
end
|
57
60
|
|
58
61
|
private
|
@@ -66,7 +69,7 @@ module Torque
|
|
66
69
|
# When the idea is to nulligy the association, then just set the owner
|
67
70
|
# +primary_key+ as empty
|
68
71
|
def delete_count(method, scope, ids = nil)
|
69
|
-
ids ||= scope.pluck(
|
72
|
+
ids ||= scope.pluck(klass_attr)
|
70
73
|
scope.delete_all if method == :delete_all
|
71
74
|
remove_stash_records(ids)
|
72
75
|
end
|
@@ -77,13 +80,13 @@ module Torque
|
|
77
80
|
|
78
81
|
# Deletes the records according to the <tt>:dependent</tt> option.
|
79
82
|
def delete_records(records, method)
|
80
|
-
ids = Array.wrap(records).each_with_object(
|
83
|
+
ids = Array.wrap(records).each_with_object(klass_attr).map(&:[])
|
81
84
|
|
82
85
|
if method == :destroy
|
83
86
|
records.each(&:destroy!)
|
84
87
|
remove_stash_records(ids)
|
85
88
|
else
|
86
|
-
scope = self.scope.where(
|
89
|
+
scope = self.scope.where(klass_attr => records)
|
87
90
|
delete_count(method, scope, ids)
|
88
91
|
end
|
89
92
|
end
|
@@ -99,10 +102,14 @@ module Torque
|
|
99
102
|
ids_writer(ids_reader - Array.wrap(ids))
|
100
103
|
end
|
101
104
|
|
102
|
-
def
|
105
|
+
def source_attr
|
103
106
|
reflection.foreign_key
|
104
107
|
end
|
105
108
|
|
109
|
+
def klass_attr
|
110
|
+
reflection.active_record_primary_key
|
111
|
+
end
|
112
|
+
|
106
113
|
def difference(a, b)
|
107
114
|
a - b
|
108
115
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Torque
|
2
4
|
module PostgreSQL
|
3
5
|
module Associations
|
@@ -33,16 +35,43 @@ module Torque
|
|
33
35
|
ids.each { |id| records[id].concat(Array.wrap(record)) }
|
34
36
|
end
|
35
37
|
|
38
|
+
records.default_proc = nil
|
36
39
|
owners.each do |owner|
|
37
40
|
associate_records_to_owner(owner, records[owner[owner_key_name]] || [])
|
38
41
|
end
|
39
42
|
end
|
40
43
|
|
44
|
+
if PostgreSQL::AR610
|
45
|
+
# This is how Rails 6.1 now load the records
|
46
|
+
def load_records
|
47
|
+
return super unless connected_through_array?
|
48
|
+
|
49
|
+
@records_by_owner = {}.compare_by_identity
|
50
|
+
raw_records = owner_keys.empty? ? [] : records_for(owner_keys)
|
51
|
+
|
52
|
+
@preloaded_records = raw_records.select do |record|
|
53
|
+
assignments = false
|
54
|
+
|
55
|
+
ids = convert_key(record[association_key_name])
|
56
|
+
owners_by_key.values_at(*ids).flat_map do |owner|
|
57
|
+
entries = (@records_by_owner[owner] ||= [])
|
58
|
+
|
59
|
+
if reflection.collection? || entries.empty?
|
60
|
+
entries << record
|
61
|
+
assignments = true
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
assignments
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
41
70
|
# Build correctly the constraint condition in order to get the
|
42
71
|
# associated ids
|
43
72
|
def records_for(ids, &block)
|
44
73
|
return super unless connected_through_array?
|
45
|
-
condition = scope.
|
74
|
+
condition = scope.arel_table[association_key_name]
|
46
75
|
condition = reflection.build_id_constraint(condition, ids.flatten.uniq)
|
47
76
|
scope.where(condition).load(&block)
|
48
77
|
end
|