torque-postgresql 2.0.3 → 2.0.4
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/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 +3 -1
- 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 +5 -1
- data/lib/torque/postgresql/associations/association_scope.rb +2 -0
- data/lib/torque/postgresql/associations/belongs_to_many_association.rb +3 -0
- 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 +29 -1
- data/lib/torque/postgresql/attributes/builder.rb +2 -0
- 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/autosave_association.rb +9 -3
- 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 +2 -0
- 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/enum_set_spec.rb +1 -1
- data/spec/tests/has_many_spec.rb +1 -1
- data/spec/tests/table_inheritance_spec.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f108bfb672743d7edd701b77eb102aa6f9164b4981e1f366d2354d9e8cf3360b
|
4
|
+
data.tar.gz: 60d7208f0798acbde69aee78fca7a92d4824c75dcecc44acd16dcf59568f0e04
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a463f94c5a09f74bbb2ba57fe9fb2f7fe649f243c239f7709180c29988f2b5424bffec68d0ec1d2c4ae8ad1191d6156e96dd00c2a66a2a473e02411c563e21f
|
7
|
+
data.tar.gz: 1568915cd13e2b93b77a702cfd346326aa9e07605aac3deca0f3dacbe82b24762a84f3007a4dffc493888c94802724defbfc01037d0bad984e3735783a790f35
|
@@ -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|
|
@@ -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
|
@@ -19,12 +21,14 @@ module Torque
|
|
19
21
|
add_id = owner[reflection.active_record_primary_key]
|
20
22
|
record_fk = reflection.foreign_key
|
21
23
|
|
22
|
-
|
24
|
+
list = record[record_fk] ||= []
|
25
|
+
list.push(add_id) unless list.include?(add_id)
|
23
26
|
end
|
24
27
|
|
25
28
|
end
|
26
29
|
|
27
30
|
::ActiveRecord::Associations::Association.prepend(Association)
|
31
|
+
::ActiveRecord::Associations::HasManyAssociation.prepend(Association)
|
28
32
|
end
|
29
33
|
end
|
30
34
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Torque
|
2
4
|
module PostgreSQL
|
3
5
|
module Associations
|
@@ -38,11 +40,37 @@ module Torque
|
|
38
40
|
end
|
39
41
|
end
|
40
42
|
|
43
|
+
if PostgreSQL::AR610
|
44
|
+
# This is how Rails 6.1 now load the records
|
45
|
+
def load_records
|
46
|
+
return super unless connected_through_array?
|
47
|
+
|
48
|
+
@records_by_owner = {}.compare_by_identity
|
49
|
+
raw_records = owner_keys.empty? ? [] : records_for(owner_keys)
|
50
|
+
|
51
|
+
@preloaded_records = raw_records.select do |record|
|
52
|
+
assignments = false
|
53
|
+
|
54
|
+
ids = convert_key(record[association_key_name])
|
55
|
+
owners_by_key.values_at(*ids).flat_map do |owner|
|
56
|
+
entries = (@records_by_owner[owner] ||= [])
|
57
|
+
|
58
|
+
if reflection.collection? || entries.empty?
|
59
|
+
entries << record
|
60
|
+
assignments = true
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
assignments
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
41
69
|
# Build correctly the constraint condition in order to get the
|
42
70
|
# associated ids
|
43
71
|
def records_for(ids, &block)
|
44
72
|
return super unless connected_through_array?
|
45
|
-
condition = scope.
|
73
|
+
condition = scope.arel_table[association_key_name]
|
46
74
|
condition = reflection.build_id_constraint(condition, ids.flatten.uniq)
|
47
75
|
scope.where(condition).load(&block)
|
48
76
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Torque
|
2
4
|
module PostgreSQL
|
3
5
|
module Attributes
|
@@ -153,12 +155,12 @@ module Torque
|
|
153
155
|
cast_type = subtype.name.chomp('[]')
|
154
156
|
klass_module.module_eval <<-RUBY, __FILE__, __LINE__ + 1
|
155
157
|
def has_#{attribute.pluralize}(*values) # def has_roles(*values)
|
156
|
-
attr =
|
158
|
+
attr = arel_table['#{attribute}'] # attr = arel_table['role']
|
157
159
|
where(attr.contains(::Arel.array(values, cast: '#{cast_type}'))) # where(attr.contains(::Arel.array(values, cast: 'roles')))
|
158
160
|
end # end
|
159
161
|
|
160
162
|
def has_any_#{attribute.pluralize}(*values) # def has_roles(*values)
|
161
|
-
attr =
|
163
|
+
attr = arel_table['#{attribute}'] # attr = arel_table['role']
|
162
164
|
where(attr.overlaps(::Arel.array(values, cast: '#{cast_type}'))) # where(attr.overlaps(::Arel.array(values, cast: 'roles')))
|
163
165
|
end # end
|
164
166
|
RUBY
|
@@ -184,7 +186,7 @@ module Torque
|
|
184
186
|
values_methods.each do |key, (scope, ask, bang, val)|
|
185
187
|
klass_content += <<-RUBY
|
186
188
|
def #{scope} # def admin
|
187
|
-
attr =
|
189
|
+
attr = arel_table['#{attribute}'] # attr = arel_table['role']
|
188
190
|
where(::#{enum_klass}.scope(attr, '#{val}')) # where(Enum::Roles.scope(attr, 'admin'))
|
189
191
|
end # end
|
190
192
|
RUBY
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Torque
|
2
4
|
module PostgreSQL
|
3
5
|
module Attributes
|
@@ -202,7 +204,7 @@ module Torque
|
|
202
204
|
end
|
203
205
|
|
204
206
|
def arel_attribute
|
205
|
-
@arel_attribute ||= "
|
207
|
+
@arel_attribute ||= "arel_table[#{attribute.inspect}]"
|
206
208
|
end
|
207
209
|
|
208
210
|
def arel_default_sql
|
@@ -245,7 +247,7 @@ module Torque
|
|
245
247
|
def arel_real_start_at
|
246
248
|
return arel_start_at unless threshold.present?
|
247
249
|
@arel_real_start_at ||= begin
|
248
|
-
result = "(#{arel_start_at} - #{arel_threshold_value})"
|
250
|
+
result = +"(#{arel_start_at} - #{arel_threshold_value})"
|
249
251
|
result << '.cast(:date)' if type.eql?(:daterange)
|
250
252
|
result
|
251
253
|
end
|
@@ -255,7 +257,7 @@ module Torque
|
|
255
257
|
def arel_real_finish_at
|
256
258
|
return arel_finish_at unless threshold.present?
|
257
259
|
@arel_real_finish_at ||= begin
|
258
|
-
result = "(#{arel_finish_at} + #{arel_threshold_value})"
|
260
|
+
result = +"(#{arel_finish_at} + #{arel_threshold_value})"
|
259
261
|
result << '.cast(:date)' if type.eql?(:daterange)
|
260
262
|
result
|
261
263
|
end
|
@@ -276,7 +278,7 @@ module Torque
|
|
276
278
|
|
277
279
|
# Create an arel named function
|
278
280
|
def arel_named_function(name, *args)
|
279
|
-
result = "::Arel::Nodes::NamedFunction.new(#{name.to_s.inspect}"
|
281
|
+
result = +"::Arel::Nodes::NamedFunction.new(#{name.to_s.inspect}"
|
280
282
|
result << ', [' << args.join(', ') << ']' if args.present?
|
281
283
|
result << ')'
|
282
284
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Torque
|
2
4
|
module PostgreSQL
|
3
5
|
module Attributes
|
@@ -31,11 +33,6 @@ module Torque
|
|
31
33
|
end
|
32
34
|
end
|
33
35
|
|
34
|
-
# You can specify the connection name for each enum
|
35
|
-
def connection_specification_name
|
36
|
-
return self == Enum ? 'primary' : superclass.connection_specification_name
|
37
|
-
end
|
38
|
-
|
39
36
|
# Overpass new so blank values return only nil
|
40
37
|
def new(value)
|
41
38
|
return Lazy.new(self, LAZY_VALUE) if value.blank?
|
@@ -45,9 +42,7 @@ module Torque
|
|
45
42
|
# Load the list of values in a lazy way
|
46
43
|
def values
|
47
44
|
@values ||= self == Enum ? nil : begin
|
48
|
-
|
49
|
-
conn = connection(conn_name)
|
50
|
-
conn.enum_values(type_name).freeze
|
45
|
+
connection.enum_values(type_name).freeze
|
51
46
|
end
|
52
47
|
end
|
53
48
|
|
@@ -110,8 +105,8 @@ module Torque
|
|
110
105
|
end
|
111
106
|
|
112
107
|
# Get a connection based on its name
|
113
|
-
def connection
|
114
|
-
ActiveRecord::Base.
|
108
|
+
def connection
|
109
|
+
::ActiveRecord::Base.connection
|
115
110
|
end
|
116
111
|
|
117
112
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Torque
|
2
4
|
module PostgreSQL
|
3
5
|
module AutosaveAssociation
|
@@ -8,9 +10,13 @@ module Torque
|
|
8
10
|
save_method = :"autosave_associated_records_for_#{reflection.name}"
|
9
11
|
define_non_cyclic_method(save_method) { save_belongs_to_many_array(reflection) }
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
-
|
13
|
+
if PostgreSQL::AR610
|
14
|
+
around_save(:around_save_collection_association)
|
15
|
+
else
|
16
|
+
before_save(:before_save_collection_association)
|
17
|
+
after_save(:after_save_collection_association) if ::ActiveRecord::Base
|
18
|
+
.instance_methods.include?(:after_save_collection_association)
|
19
|
+
end
|
14
20
|
|
15
21
|
before_create(save_method)
|
16
22
|
before_update(save_method)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Torque
|
2
4
|
module PostgreSQL
|
3
5
|
module Coder
|
@@ -8,7 +10,7 @@ module Torque
|
|
8
10
|
class << self
|
9
11
|
|
10
12
|
NEED_QUOTE_FOR = /[\\"(){}, \t\n\r\v\f]/m
|
11
|
-
DELIMITER = ','
|
13
|
+
DELIMITER = ','
|
12
14
|
|
13
15
|
# This method replace the +read_array+ method from PG gem
|
14
16
|
# See https://github.com/ged/ruby-pg/blob/master/ext/pg_text_decoder.c#L177
|
@@ -32,7 +34,7 @@ module Torque
|
|
32
34
|
quoted = 0
|
33
35
|
escaped = false
|
34
36
|
result = []
|
35
|
-
part =
|
37
|
+
part = String.new
|
36
38
|
|
37
39
|
# Always start getting the non-collection character, the second char
|
38
40
|
stream.getc if stream.pos == 0
|
@@ -59,7 +61,7 @@ module Torque
|
|
59
61
|
|
60
62
|
escaped = false
|
61
63
|
quoted = 0
|
62
|
-
part =
|
64
|
+
part = String.new
|
63
65
|
|
64
66
|
when c == '"'
|
65
67
|
quoted = 1
|
@@ -1,7 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Torque
|
2
4
|
module PostgreSQL
|
3
5
|
include ActiveSupport::Configurable
|
4
6
|
|
7
|
+
# Stores a version check for compatibility purposes
|
8
|
+
AR610 = (ActiveRecord.gem_version >= Gem::Version.new('6.1.0'))
|
9
|
+
|
5
10
|
# Use the same logger as the Active Record one
|
6
11
|
def self.logger
|
7
12
|
ActiveRecord::Base.logger
|
@@ -1,11 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Torque
|
2
4
|
module PostgreSQL
|
3
5
|
module Reflection
|
4
6
|
module AbstractReflection
|
5
7
|
AREL_ATTR = ::Arel::Attributes::Attribute
|
6
8
|
|
7
|
-
ARR_NO_CAST = 'bigint'
|
8
|
-
ARR_CAST = 'bigint[]'
|
9
|
+
ARR_NO_CAST = 'bigint'
|
10
|
+
ARR_CAST = 'bigint[]'
|
9
11
|
|
10
12
|
# Check if the foreign key actually exists
|
11
13
|
def connected_through_array?
|
@@ -68,11 +70,18 @@ module Torque
|
|
68
70
|
klass_attr.overlaps(source_attr)
|
69
71
|
end
|
70
72
|
|
73
|
+
if PostgreSQL::AR610
|
74
|
+
# TODO: Deprecate this method
|
75
|
+
def join_keys
|
76
|
+
OpenStruct.new(key: join_primary_key, foreign_key: join_foreign_key)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
71
80
|
private
|
72
81
|
|
73
82
|
def build_id_constraint_between(table, foreign_table)
|
74
|
-
klass_attr = table[
|
75
|
-
source_attr = foreign_table[
|
83
|
+
klass_attr = table[join_primary_key]
|
84
|
+
source_attr = foreign_table[join_foreign_key]
|
76
85
|
|
77
86
|
build_id_constraint(klass_attr, source_attr)
|
78
87
|
end
|
@@ -117,7 +126,6 @@ module Torque
|
|
117
126
|
valid_inverse_reflection?(reflection)
|
118
127
|
end
|
119
128
|
end
|
120
|
-
|
121
129
|
end
|
122
130
|
|
123
131
|
::ActiveRecord::Reflection::AbstractReflection.prepend(AbstractReflection)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'relation/distinct_on'
|
2
4
|
require_relative 'relation/auxiliary_statement'
|
3
5
|
require_relative 'relation/inheritance'
|
@@ -48,12 +50,12 @@ module Torque
|
|
48
50
|
when String
|
49
51
|
::Arel.sql(klass.send(:sanitize_sql, item.to_s))
|
50
52
|
when Symbol
|
51
|
-
base ? base.
|
53
|
+
base ? base.arel_table[item] : klass.arel_table[item]
|
52
54
|
when Array
|
53
55
|
resolve_column(item, base)
|
54
56
|
when Hash
|
55
57
|
raise ArgumentError, 'Unsupported Hash for attributes on third level' if base
|
56
|
-
item.map { |key, other_list| resolve_column(
|
58
|
+
item.map { |key, other_list| resolve_column(other_list, key) }
|
57
59
|
else
|
58
60
|
raise ArgumentError, "Unsupported argument type: #{value} (#{value.class})"
|
59
61
|
end
|
@@ -65,8 +67,8 @@ module Torque
|
|
65
67
|
return unless relation
|
66
68
|
|
67
69
|
table = predicate_builder.send(:table)
|
68
|
-
if table.associated_with?(relation)
|
69
|
-
table.associated_table(relation).send(:klass)
|
70
|
+
if table.associated_with?(relation.to_s)
|
71
|
+
table.associated_table(relation.to_s).send(:klass)
|
70
72
|
else
|
71
73
|
raise ArgumentError, "Relation for #{relation} not found on #{klass}"
|
72
74
|
end
|
@@ -138,14 +140,16 @@ module Torque
|
|
138
140
|
ActiveRecord::QueryMethods::VALID_UNSCOPING_VALUES += %i[cast_records itself_only
|
139
141
|
distinct_on auxiliary_statements]
|
140
142
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
143
|
+
unless AR610
|
144
|
+
Relation::SINGLE_VALUE_METHODS.each do |value|
|
145
|
+
ActiveRecord::QueryMethods::DEFAULT_VALUES[value] = nil \
|
146
|
+
if ActiveRecord::QueryMethods::DEFAULT_VALUES[value].nil?
|
147
|
+
end
|
145
148
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
+
Relation::MULTI_VALUE_METHODS.each do |value|
|
150
|
+
ActiveRecord::QueryMethods::DEFAULT_VALUES[value] ||= \
|
151
|
+
ActiveRecord::QueryMethods::FROZEN_EMPTY_ARRAY
|
152
|
+
end
|
149
153
|
end
|
150
154
|
|
151
155
|
$VERBOSE = warn_level
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Torque
|
2
4
|
module PostgreSQL
|
3
5
|
module Relation
|
@@ -34,7 +36,10 @@ module Torque
|
|
34
36
|
# attributes as well
|
35
37
|
def bound_attributes
|
36
38
|
visitor = ::Arel::Visitors::PostgreSQL.new(ActiveRecord::Base.connection)
|
37
|
-
visitor.accept(self.arel.ast, ::Arel::Collectors::
|
39
|
+
visitor.accept(self.arel.ast, ::Arel::Collectors::Composite.new(
|
40
|
+
::Arel::Collectors::SQLString.new,
|
41
|
+
::Arel::Collectors::Bind.new,
|
42
|
+
)).value.last
|
38
43
|
end
|
39
44
|
|
40
45
|
private
|
data/spec/schema.rb
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
# It's strongly recommended that you check this file into your version control system.
|
12
12
|
|
13
13
|
begin
|
14
|
-
version =
|
14
|
+
version = 62
|
15
15
|
|
16
16
|
raise SystemExit if ActiveRecord::Migrator.current_version == version
|
17
17
|
ActiveRecord::Schema.define(version: version) do
|
@@ -83,7 +83,7 @@ begin
|
|
83
83
|
create_table "courses", force: :cascade do |t|
|
84
84
|
t.string "title", null: false
|
85
85
|
t.interval "duration"
|
86
|
-
t.enum "types", subtype: :types, array: true
|
86
|
+
t.enum "types", subtype: :types, array: true
|
87
87
|
t.datetime "created_at", null: false
|
88
88
|
t.datetime "updated_at", null: false
|
89
89
|
end
|
data/spec/tests/arel_spec.rb
CHANGED
@@ -25,7 +25,9 @@ RSpec.describe 'Arel' do
|
|
25
25
|
klass_name = operator.to_s.camelize
|
26
26
|
|
27
27
|
context "##{operator}" do
|
28
|
-
let(:instance)
|
28
|
+
let(:instance) do
|
29
|
+
attribute.public_send(operator, value.is_a?(Array) ? ::Arel.array(value) : value)
|
30
|
+
end
|
29
31
|
|
30
32
|
context 'for attribute' do
|
31
33
|
let(:klass) { ::Arel::Nodes.const_get(klass_name) }
|
data/spec/tests/enum_set_spec.rb
CHANGED
@@ -48,7 +48,7 @@ RSpec.describe 'Enum' do
|
|
48
48
|
expect(dump_io.string).to match checker
|
49
49
|
end
|
50
50
|
|
51
|
-
|
51
|
+
xit 'can have a default value as an array of symbols' do
|
52
52
|
dump_io = StringIO.new
|
53
53
|
checker = /t\.enum +"types", +default: \[:A, :B\], +array: true, +subtype: :types/
|
54
54
|
ActiveRecord::SchemaDumper.dump(connection, dump_io)
|
data/spec/tests/has_many_spec.rb
CHANGED
@@ -5,7 +5,7 @@ RSpec.describe 'HasMany' do
|
|
5
5
|
let(:builder) { ActiveRecord::Associations::Builder::HasMany }
|
6
6
|
|
7
7
|
it 'adds the array option' do
|
8
|
-
expect(builder.send(:valid_options,
|
8
|
+
expect(builder.send(:valid_options, {})).to include(:array)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -66,7 +66,7 @@ RSpec.describe 'TableInheritance' do
|
|
66
66
|
|
67
67
|
it 'allows empty-body create table operation' do
|
68
68
|
sql = connection.create_table(:activity_posts, inherits: :activities)
|
69
|
-
result =
|
69
|
+
result = "CREATE TABLE \"activity_posts\" ()"
|
70
70
|
result << ' INHERITS ( "activities" )'
|
71
71
|
expect(sql).to eql(result)
|
72
72
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: torque-postgresql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carlos Silva
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -333,8 +333,10 @@ test_files:
|
|
333
333
|
- spec/factories/videos.rb
|
334
334
|
- spec/tests/geometric_builder_spec.rb
|
335
335
|
- spec/tests/range_spec.rb
|
336
|
+
- spec/tests/table_inheritance_spec.rb
|
336
337
|
- spec/tests/enum_spec.rb
|
337
338
|
- spec/tests/auxiliary_statement_spec.rb
|
339
|
+
- spec/tests/enum_set_spec.rb
|
338
340
|
- spec/tests/coder_spec.rb
|
339
341
|
- spec/tests/collector_spec.rb
|
340
342
|
- spec/tests/distinct_on_spec.rb
|
@@ -342,12 +344,10 @@ test_files:
|
|
342
344
|
- spec/tests/lazy_spec.rb
|
343
345
|
- spec/tests/quoting_spec.rb
|
344
346
|
- spec/tests/relation_spec.rb
|
345
|
-
- spec/tests/arel_spec.rb
|
346
|
-
- spec/tests/enum_set_spec.rb
|
347
347
|
- spec/tests/belongs_to_many_spec.rb
|
348
|
-
- spec/tests/has_many_spec.rb
|
349
348
|
- spec/tests/period_spec.rb
|
350
|
-
- spec/tests/
|
349
|
+
- spec/tests/arel_spec.rb
|
350
|
+
- spec/tests/has_many_spec.rb
|
351
351
|
- spec/mocks/cache_query.rb
|
352
352
|
- spec/mocks/create_table.rb
|
353
353
|
- spec/en.yml
|