torque-postgresql 2.0.0 → 2.0.5
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.
- 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
|