rom-sql 3.6.4 → 3.7.0
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/CHANGELOG.md +17 -0
- data/README.md +1 -2
- data/lib/rom/plugins/relation/sql/auto_restrictions.rb +4 -1
- data/lib/rom/plugins/relation/sql/instrumentation.rb +6 -2
- data/lib/rom/plugins/relation/sql/postgres/explain.rb +1 -1
- data/lib/rom/plugins/relation/sql/postgres/full_text_search.rb +31 -12
- data/lib/rom/plugins/relation/sql/postgres/streaming.rb +6 -6
- data/lib/rom/sql/associations/many_to_many.rb +6 -3
- data/lib/rom/sql/associations/many_to_one.rb +3 -0
- data/lib/rom/sql/attribute.rb +22 -8
- data/lib/rom/sql/attribute_aliasing.rb +7 -6
- data/lib/rom/sql/commands/create.rb +4 -3
- data/lib/rom/sql/commands/update.rb +4 -3
- data/lib/rom/sql/dsl.rb +3 -1
- data/lib/rom/sql/extensions/active_support_notifications.rb +1 -1
- data/lib/rom/sql/extensions/postgres/type_builder.rb +7 -7
- data/lib/rom/sql/extensions/postgres/type_serializer.rb +2 -2
- data/lib/rom/sql/extensions/postgres/types/geometric.rb +12 -12
- data/lib/rom/sql/extensions/postgres/types/json.rb +9 -3
- data/lib/rom/sql/extensions/postgres/types/ltree.rb +106 -36
- data/lib/rom/sql/extensions/postgres/types/range.rb +18 -18
- data/lib/rom/sql/extensions/rails_log_subscriber.rb +4 -4
- data/lib/rom/sql/function.rb +37 -18
- data/lib/rom/sql/gateway.rb +8 -7
- data/lib/rom/sql/group_dsl.rb +7 -2
- data/lib/rom/sql/migration/inline_runner.rb +8 -2
- data/lib/rom/sql/migration/migrator.rb +5 -5
- data/lib/rom/sql/migration/recorder.rb +10 -4
- data/lib/rom/sql/migration/runner.rb +5 -4
- data/lib/rom/sql/migration/schema_diff.rb +15 -10
- data/lib/rom/sql/migration/writer.rb +8 -8
- data/lib/rom/sql/migration.rb +5 -5
- data/lib/rom/sql/order_dsl.rb +6 -2
- data/lib/rom/sql/plugin/associates.rb +21 -7
- data/lib/rom/sql/plugin/pagination.rb +2 -2
- data/lib/rom/sql/projection_dsl.rb +1 -1
- data/lib/rom/sql/relation/reading.rb +83 -71
- data/lib/rom/sql/relation/writing.rb +19 -13
- data/lib/rom/sql/relation.rb +74 -28
- data/lib/rom/sql/restriction_dsl.rb +6 -2
- data/lib/rom/sql/schema/attributes_inferrer.rb +2 -2
- data/lib/rom/sql/schema/dsl.rb +2 -2
- data/lib/rom/sql/schema/index_dsl.rb +5 -6
- data/lib/rom/sql/schema/inferrer.rb +23 -19
- data/lib/rom/sql/schema/type_builder.rb +19 -3
- data/lib/rom/sql/schema.rb +10 -10
- data/lib/rom/sql/tasks/migration_tasks.rake +4 -5
- data/lib/rom/sql/transaction.rb +1 -0
- data/lib/rom/sql/type_dsl.rb +7 -3
- data/lib/rom/sql/type_extensions.rb +4 -4
- data/lib/rom/sql/type_serializer.rb +2 -2
- data/lib/rom/sql/types.rb +2 -2
- data/lib/rom/sql/version.rb +1 -1
- data/lib/rom/types/values.rb +2 -4
- metadata +10 -19
@@ -16,7 +16,7 @@ module ROM
|
|
16
16
|
# @return [Integer] Number of affected rows
|
17
17
|
#
|
18
18
|
# @api public
|
19
|
-
def upsert(*args, &
|
19
|
+
def upsert(*args, &)
|
20
20
|
if args.size > 1 && args[-1].is_a?(Hash)
|
21
21
|
*values, opts = args
|
22
22
|
else
|
@@ -24,7 +24,7 @@ module ROM
|
|
24
24
|
opts = EMPTY_HASH
|
25
25
|
end
|
26
26
|
|
27
|
-
dataset.insert_conflict(opts).insert(*values, &
|
27
|
+
dataset.insert_conflict(opts).insert(*values, &)
|
28
28
|
end
|
29
29
|
|
30
30
|
# Insert tuple into relation
|
@@ -37,8 +37,8 @@ module ROM
|
|
37
37
|
# @return [Hash] Inserted tuple
|
38
38
|
#
|
39
39
|
# @api public
|
40
|
-
def insert(
|
41
|
-
dataset.insert(
|
40
|
+
def insert(...)
|
41
|
+
dataset.insert(...)
|
42
42
|
end
|
43
43
|
|
44
44
|
# Multi insert tuples into relation
|
@@ -51,8 +51,8 @@ module ROM
|
|
51
51
|
# @return [Array<String>] A list of executed SQL statements
|
52
52
|
#
|
53
53
|
# @api public
|
54
|
-
def multi_insert(
|
55
|
-
dataset.multi_insert(
|
54
|
+
def multi_insert(...)
|
55
|
+
dataset.multi_insert(...)
|
56
56
|
end
|
57
57
|
|
58
58
|
# Update tuples in the relation
|
@@ -64,8 +64,8 @@ module ROM
|
|
64
64
|
# @return [Integer] Number of updated rows
|
65
65
|
#
|
66
66
|
# @api public
|
67
|
-
def update(
|
68
|
-
dataset.update(
|
67
|
+
def update(...)
|
68
|
+
dataset.update(...)
|
69
69
|
end
|
70
70
|
|
71
71
|
# Delete tuples from the relation
|
@@ -78,8 +78,8 @@ module ROM
|
|
78
78
|
# @return [Integer] Number of deleted tuples
|
79
79
|
#
|
80
80
|
# @api public
|
81
|
-
def delete(
|
82
|
-
dataset.delete(
|
81
|
+
def delete(...)
|
82
|
+
dataset.delete(...)
|
83
83
|
end
|
84
84
|
|
85
85
|
# Insert tuples from other relation
|
@@ -113,13 +113,19 @@ module ROM
|
|
113
113
|
#
|
114
114
|
# @api public
|
115
115
|
def import(other, options = EMPTY_HASH)
|
116
|
+
columns = other.schema.map { |a| a.alias || a.name }
|
117
|
+
|
116
118
|
if other.gateway.eql?(gateway)
|
117
|
-
columns = other.schema.map { |a| a.alias || a.name }
|
118
119
|
dataset.import(columns, other.dataset, options)
|
119
120
|
else
|
120
|
-
columns = other.schema.map { |a| a.alias || a.name }
|
121
121
|
keys = columns.map(&:to_sym)
|
122
|
-
dataset.import(
|
122
|
+
dataset.import(
|
123
|
+
columns,
|
124
|
+
other.to_a.map { |record|
|
125
|
+
record.to_h.values_at(*keys)
|
126
|
+
},
|
127
|
+
options
|
128
|
+
)
|
123
129
|
end
|
124
130
|
end
|
125
131
|
end
|
data/lib/rom/sql/relation.rb
CHANGED
@@ -37,7 +37,9 @@ module ROM
|
|
37
37
|
table = opts[:from].first
|
38
38
|
|
39
39
|
if db.table_exists?(table)
|
40
|
-
select(*schema.qualified_projection).order(
|
40
|
+
select(*schema.qualified_projection).order(
|
41
|
+
*schema.project(*schema.primary_key_names).qualified
|
42
|
+
)
|
41
43
|
else
|
42
44
|
self
|
43
45
|
end
|
@@ -49,10 +51,13 @@ module ROM
|
|
49
51
|
end
|
50
52
|
|
51
53
|
# @api private
|
54
|
+
#
|
55
|
+
# rubocop:disable Metrics/MethodLength
|
52
56
|
def self.define_default_views!
|
53
57
|
undef_method :by_pk if method_defined?(:by_pk)
|
54
58
|
|
55
59
|
if schema.primary_key.size > 1
|
60
|
+
pks = schema.primary_key
|
56
61
|
# @!method by_pk(val1, val2)
|
57
62
|
# Return a relation restricted by its composite primary key
|
58
63
|
#
|
@@ -61,10 +66,13 @@ module ROM
|
|
61
66
|
# @return [SQL::Relation]
|
62
67
|
#
|
63
68
|
# @api public
|
64
|
-
class_eval
|
65
|
-
def by_pk(#{
|
66
|
-
|
67
|
-
|
69
|
+
class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
70
|
+
def by_pk(#{pks.map(&:name).join(", ")}) # def by_pk(val1, val2)
|
71
|
+
s = schema.canonical # s = schema.canonical
|
72
|
+
where( # where(
|
73
|
+
#{pks.map { "s[:#{_1.name}] => #{_1.name}" }.join(", ")} # s[:val1] => val1, s[:val2] => val2
|
74
|
+
) # )
|
75
|
+
end # end
|
68
76
|
RUBY
|
69
77
|
else
|
70
78
|
# @!method by_pk(pk)
|
@@ -75,18 +83,20 @@ module ROM
|
|
75
83
|
# @return [SQL::Relation]
|
76
84
|
#
|
77
85
|
# @api public
|
78
|
-
class_eval
|
79
|
-
def by_pk(pk)
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
86
|
+
class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
87
|
+
def by_pk(pk) # def by_pk(pk)
|
88
|
+
s = schema.canonical # s = schema.canonical
|
89
|
+
if primary_key.nil? # if primary_key.nil?
|
90
|
+
raise MissingPrimaryKeyError.new( # raise MissingPrimaryKeyError.new(
|
91
|
+
"Missing primary key for :\#{schema.name}" # "Missing primary key for :#{schema.name}"
|
92
|
+
) # )
|
93
|
+
end # end
|
94
|
+
where(s[s.primary_key_name].qualified => pk) # where(s[s.primary_key_name].qualified => pk)
|
95
|
+
end # end
|
87
96
|
RUBY
|
88
97
|
end
|
89
98
|
end
|
99
|
+
# rubocop:enable Metrics/MethodLength
|
90
100
|
|
91
101
|
# @api private
|
92
102
|
def self.associations
|
@@ -121,26 +131,62 @@ module ROM
|
|
121
131
|
# Open a database transaction
|
122
132
|
#
|
123
133
|
# @param [Hash] opts
|
124
|
-
# @option opts [Boolean] :auto_savepoint
|
125
|
-
#
|
126
|
-
#
|
127
|
-
# @option opts [
|
128
|
-
#
|
129
|
-
#
|
130
|
-
#
|
131
|
-
#
|
132
|
-
# @option opts [
|
133
|
-
#
|
134
|
-
#
|
135
|
-
#
|
134
|
+
# @option opts [Boolean] :auto_savepoint
|
135
|
+
# Automatically use a savepoint for Database#transaction
|
136
|
+
# calls inside this transaction block.
|
137
|
+
# @option opts [Symbol] :isolation
|
138
|
+
# The transaction isolation level to use for this transaction,
|
139
|
+
# should be :uncommitted, :committed, :repeatable, or :serializable,
|
140
|
+
# used if given and the database/adapter supports customizable
|
141
|
+
# transaction isolation levels.
|
142
|
+
# @option opts [Integer] :num_retries
|
143
|
+
# The number of times to retry if the :retry_on option is used.
|
144
|
+
# The default is 5 times. Can be set to nil to retry indefinitely,
|
145
|
+
# but that is not recommended.
|
146
|
+
# @option opts [Proc] :before_retry
|
147
|
+
# Proc to execute before rertrying if the :retry_on option is used.
|
148
|
+
# Called with two arguments: the number of retry attempts (counting the
|
149
|
+
# current one) and the error the last attempt failed with.
|
150
|
+
# @option opts [String] :prepare
|
151
|
+
# A string to use as the transaction identifier for a prepared transaction
|
152
|
+
# (two-phase commit), if the database/adapter supports prepared transactions.
|
153
|
+
# @option opts [Class] :retry_on
|
154
|
+
# An exception class or array of exception classes for which to automatically
|
155
|
+
# retry the transaction. Can only be set if not inside an existing transaction.
|
156
|
+
# Note that this should not be used unless the entire transaction block is
|
157
|
+
# idempotent, as otherwise it can cause non-idempotent behavior to execute
|
158
|
+
# multiple times.
|
159
|
+
# @option opts [Symbol] :rollback
|
160
|
+
# Can be set to :reraise to reraise any Sequel::Rollback
|
161
|
+
# exceptions raised, or :always to always rollback even if no
|
162
|
+
# exceptions occur (useful for testing).
|
163
|
+
# @option opts [Symbol] :server
|
164
|
+
# The server to use for the transaction. Set to :default, :read_only,
|
165
|
+
# or whatever symbol you used in the connect string when naming
|
166
|
+
# your servers.
|
167
|
+
# @option opts [Boolean] :savepoint
|
168
|
+
# Whether to create a new savepoint for this transaction, only
|
169
|
+
# respected if the database/adapter supports savepoints. By default
|
170
|
+
# Sequel will reuse an existing transaction, so if you want to use a
|
171
|
+
# savepoint you must use this option. If the surrounding transaction
|
172
|
+
# uses :auto_savepoint, you can set this to false to not use a savepoint.
|
173
|
+
# If the value given for this option is :only, it will only create a
|
174
|
+
# savepoint if it is inside a transacation.
|
175
|
+
# @option opts [Boolean] :deferrable
|
176
|
+
# If present, set to DEFERRABLE if true or NOT DEFERRABLE if false.
|
177
|
+
# @option opts [Boolean] :read_only
|
178
|
+
# **PG only** If present, set to READ ONLY if true or READ WRITE if false.
|
179
|
+
# @option opts [Symbol] :synchronous
|
180
|
+
# **PG only** If non-nil, set synchronous_commit appropriately.
|
181
|
+
# Valid values true, :on, false, :off, :local, and :remote_write.
|
136
182
|
#
|
137
183
|
# @yield [t] Transaction
|
138
184
|
#
|
139
185
|
# @return [Mixed]
|
140
186
|
#
|
141
187
|
# @api public
|
142
|
-
def transaction(opts = EMPTY_HASH, &
|
143
|
-
Transaction.new(dataset.db).run(opts, &
|
188
|
+
def transaction(opts = EMPTY_HASH, &)
|
189
|
+
Transaction.new(dataset.db).run(opts, &)
|
144
190
|
end
|
145
191
|
|
146
192
|
# Return raw column names
|
@@ -19,8 +19,12 @@ module ROM
|
|
19
19
|
|
20
20
|
private
|
21
21
|
|
22
|
+
def respond_to_missing?(_meth, _include_private = false)
|
23
|
+
true
|
24
|
+
end
|
25
|
+
|
22
26
|
# @api private
|
23
|
-
def method_missing(meth,
|
27
|
+
def method_missing(meth, ...)
|
24
28
|
if schema.key?(meth)
|
25
29
|
schema[meth]
|
26
30
|
else
|
@@ -29,7 +33,7 @@ module ROM
|
|
29
33
|
if type
|
30
34
|
::ROM::SQL::Function.new(type).meta(schema: schema)
|
31
35
|
else
|
32
|
-
::Sequel::VIRTUAL_ROW.__send__(meth,
|
36
|
+
::Sequel::VIRTUAL_ROW.__send__(meth, ...)
|
33
37
|
end
|
34
38
|
end
|
35
39
|
end
|
@@ -12,7 +12,7 @@ module ROM
|
|
12
12
|
|
13
13
|
defines :type_builders
|
14
14
|
|
15
|
-
CONSTRAINT_DB_TYPE = 'add_constraint'
|
15
|
+
CONSTRAINT_DB_TYPE = 'add_constraint'
|
16
16
|
|
17
17
|
option :type_builder
|
18
18
|
|
@@ -30,7 +30,7 @@ module ROM
|
|
30
30
|
attr_class.new(type.meta(source: schema.name), name: name) if type
|
31
31
|
end.compact
|
32
32
|
|
33
|
-
missing = columns.map(&:first) - inferred.map
|
33
|
+
missing = columns.map(&:first) - inferred.map(&:name)
|
34
34
|
|
35
35
|
[inferred, missing]
|
36
36
|
end
|
data/lib/rom/sql/schema/dsl.rb
CHANGED
@@ -6,7 +6,7 @@ module ROM
|
|
6
6
|
module SQL
|
7
7
|
class Schema < ROM::Schema
|
8
8
|
# @api public
|
9
|
-
class IndexDSL
|
9
|
+
class IndexDSL
|
10
10
|
extend Initializer
|
11
11
|
|
12
12
|
option :attr_class
|
@@ -14,14 +14,13 @@ module ROM
|
|
14
14
|
attr_reader :registry
|
15
15
|
|
16
16
|
# @api private
|
17
|
-
def initialize(*, &
|
17
|
+
def initialize(*, **, &)
|
18
18
|
super
|
19
19
|
|
20
20
|
@registry = []
|
21
21
|
|
22
|
-
instance_exec(&
|
22
|
+
instance_exec(&)
|
23
23
|
end
|
24
|
-
ruby2_keywords(:initialize) if respond_to?(:ruby2_keywords, true)
|
25
24
|
|
26
25
|
# @api public
|
27
26
|
def index(*attributes, **options)
|
@@ -34,9 +33,9 @@ module ROM
|
|
34
33
|
attr_class.new(attr[:type], **(attr[:options] || {})).meta(source: schema_name)
|
35
34
|
end
|
36
35
|
|
37
|
-
registry.
|
36
|
+
registry.to_set do |attr_names, options|
|
38
37
|
build_index(attributes, attr_names, options)
|
39
|
-
|
38
|
+
end
|
40
39
|
end
|
41
40
|
|
42
41
|
private
|
@@ -38,8 +38,8 @@ module ROM
|
|
38
38
|
else
|
39
39
|
infer_from_attributes(gateway, schema, **super)
|
40
40
|
end
|
41
|
-
rescue Sequel::Error =>
|
42
|
-
on_error(schema.name,
|
41
|
+
rescue Sequel::Error => e
|
42
|
+
on_error(schema.name, e)
|
43
43
|
{ **FALLBACK_SCHEMA, indexes: schema.indexes }
|
44
44
|
end
|
45
45
|
|
@@ -49,10 +49,14 @@ module ROM
|
|
49
49
|
indexes = indexes_from_database(gateway, schema, idx)
|
50
50
|
foreign_keys = foreign_keys_from_database(gateway, schema, idx)
|
51
51
|
|
52
|
-
{
|
53
|
-
|
52
|
+
{
|
53
|
+
**rest,
|
54
|
+
attributes: attributes.map { |attr|
|
55
|
+
mark_fk(mark_indexed(attr, indexes), foreign_keys)
|
56
|
+
},
|
54
57
|
foreign_keys: foreign_keys,
|
55
|
-
indexes: indexes
|
58
|
+
indexes: indexes
|
59
|
+
}
|
56
60
|
end
|
57
61
|
|
58
62
|
# @api private
|
@@ -60,10 +64,12 @@ module ROM
|
|
60
64
|
indexes = schema.indexes | indexes_from_attributes(attributes)
|
61
65
|
foreign_keys = foreign_keys_from_attributes(attributes)
|
62
66
|
|
63
|
-
{
|
67
|
+
{
|
68
|
+
**rest,
|
64
69
|
attributes: attributes.map { |attr| mark_indexed(attr, indexes) },
|
65
70
|
foreign_keys: foreign_keys,
|
66
|
-
indexes: indexes
|
71
|
+
indexes: indexes
|
72
|
+
}
|
67
73
|
end
|
68
74
|
|
69
75
|
# @api private
|
@@ -71,12 +77,12 @@ module ROM
|
|
71
77
|
if gateway.connection.respond_to?(:indexes)
|
72
78
|
dataset = schema.name.dataset
|
73
79
|
|
74
|
-
gateway.connection.indexes(dataset).
|
80
|
+
gateway.connection.indexes(dataset).to_set do |index_name, definition|
|
75
81
|
columns, unique = definition.values_at(:columns, :unique)
|
76
82
|
attrs = columns.map { |name| attributes[name] }
|
77
83
|
|
78
84
|
SQL::Index.new(attrs, name: index_name, unique: unique)
|
79
|
-
|
85
|
+
end
|
80
86
|
else
|
81
87
|
EMPTY_SET
|
82
88
|
end
|
@@ -86,28 +92,26 @@ module ROM
|
|
86
92
|
def foreign_keys_from_database(gateway, schema, attributes)
|
87
93
|
dataset = schema.name.dataset
|
88
94
|
|
89
|
-
gateway.connection.foreign_key_list(dataset).
|
95
|
+
gateway.connection.foreign_key_list(dataset).to_set do |definition|
|
90
96
|
columns, table, key = definition.values_at(:columns, :table, :key)
|
91
97
|
attrs = columns.map { |name| attributes[name] }
|
92
98
|
|
93
99
|
SQL::ForeignKey.new(attrs, table, parent_keys: key)
|
94
|
-
|
100
|
+
end
|
95
101
|
end
|
96
102
|
|
97
103
|
# @api private
|
98
104
|
def indexes_from_attributes(attributes)
|
99
|
-
attributes
|
100
|
-
select(&:indexed?)
|
101
|
-
|
102
|
-
to_set
|
105
|
+
attributes
|
106
|
+
.select(&:indexed?)
|
107
|
+
.to_set { |attr| SQL::Index.new([attr.unwrap]) }
|
103
108
|
end
|
104
109
|
|
105
110
|
# @api private
|
106
111
|
def foreign_keys_from_attributes(attributes)
|
107
|
-
attributes
|
108
|
-
select(&:foreign_key?)
|
109
|
-
|
110
|
-
to_set
|
112
|
+
attributes
|
113
|
+
.select(&:foreign_key?)
|
114
|
+
.to_set { |attr| SQL::ForeignKey.new([attr.unwrap], attr.target) }
|
111
115
|
end
|
112
116
|
|
113
117
|
# @api private
|
@@ -21,7 +21,7 @@ module ROM
|
|
21
21
|
|
22
22
|
defines :ruby_type_mapping, :numeric_pk_type
|
23
23
|
|
24
|
-
DECIMAL_REGEX = /(?:decimal|numeric)\((\d+)(?:,\s*(\d+))?\)
|
24
|
+
DECIMAL_REGEX = /(?:decimal|numeric)\((\d+)(?:,\s*(\d+))?\)/
|
25
25
|
|
26
26
|
ruby_type_mapping(
|
27
27
|
integer: Types::Integer,
|
@@ -37,6 +37,10 @@ module ROM
|
|
37
37
|
|
38
38
|
numeric_pk_type Types::Serial
|
39
39
|
|
40
|
+
TYPE_GUESSES = {
|
41
|
+
/datetime\((\d+)\)/ => :datetime
|
42
|
+
}.freeze
|
43
|
+
|
40
44
|
def call(primary_key:, db_type:, type:, allow_null:, **rest)
|
41
45
|
if primary_key
|
42
46
|
map_pk_type(type, db_type, **rest)
|
@@ -63,10 +67,12 @@ module ROM
|
|
63
67
|
end
|
64
68
|
|
65
69
|
# @api private
|
70
|
+
#
|
71
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
66
72
|
def map_type(ruby_type, db_type, **kw)
|
67
|
-
type = self.class.ruby_type_mapping[ruby_type]
|
73
|
+
type = self.class.ruby_type_mapping[ruby_type || guess_type(db_type)]
|
68
74
|
|
69
|
-
if db_type.is_a?(String) && db_type.include?('numeric') || db_type.include?('decimal')
|
75
|
+
if (db_type.is_a?(String) && db_type.include?('numeric')) || db_type.include?('decimal')
|
70
76
|
map_decimal_type(db_type)
|
71
77
|
elsif db_type.is_a?(String) && db_type.include?('char') && kw[:max_length]
|
72
78
|
type.meta(limit: kw[:max_length])
|
@@ -74,6 +80,16 @@ module ROM
|
|
74
80
|
type
|
75
81
|
end
|
76
82
|
end
|
83
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
84
|
+
|
85
|
+
# @api private
|
86
|
+
def guess_type(db_type)
|
87
|
+
TYPE_GUESSES.find do |regex, type|
|
88
|
+
if db_type.is_a?(String) && db_type.match(regex)
|
89
|
+
break type
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
77
93
|
|
78
94
|
# @api private
|
79
95
|
def map_decimal_type(type)
|
data/lib/rom/sql/schema.rb
CHANGED
@@ -32,8 +32,8 @@ module ROM
|
|
32
32
|
# @return [Mixed] Result of the block call
|
33
33
|
#
|
34
34
|
# @api public
|
35
|
-
def restriction(&
|
36
|
-
RestrictionDSL.new(self).call(&
|
35
|
+
def restriction(&)
|
36
|
+
RestrictionDSL.new(self).call(&)
|
37
37
|
end
|
38
38
|
|
39
39
|
# Open Order DSL for setting ORDER clause in queries
|
@@ -43,8 +43,8 @@ module ROM
|
|
43
43
|
# @return [Mixed] Result of the block call
|
44
44
|
#
|
45
45
|
# @api public
|
46
|
-
def order(&
|
47
|
-
OrderDSL.new(self).call(&
|
46
|
+
def order(&)
|
47
|
+
OrderDSL.new(self).call(&)
|
48
48
|
end
|
49
49
|
|
50
50
|
# Open Group DSL for setting GROUP BY clause in queries
|
@@ -54,8 +54,8 @@ module ROM
|
|
54
54
|
# @return [Mixed] Result of the block call
|
55
55
|
#
|
56
56
|
# @api public
|
57
|
-
def group(&
|
58
|
-
GroupDSL.new(self).call(&
|
57
|
+
def group(&)
|
58
|
+
GroupDSL.new(self).call(&)
|
59
59
|
end
|
60
60
|
|
61
61
|
# Return a new schema with attributes marked as qualified
|
@@ -87,9 +87,9 @@ module ROM
|
|
87
87
|
# @return [Schema] A new schema with projected attributes
|
88
88
|
#
|
89
89
|
# @api public
|
90
|
-
def project(*names, &
|
91
|
-
if
|
92
|
-
super(*(names + ProjectionDSL.new(self).(&
|
90
|
+
def project(*names, &)
|
91
|
+
if block_given?
|
92
|
+
super(*(names + ProjectionDSL.new(self).(&)))
|
93
93
|
else
|
94
94
|
super
|
95
95
|
end
|
@@ -141,7 +141,7 @@ module ROM
|
|
141
141
|
#
|
142
142
|
# @api public
|
143
143
|
def call(relation)
|
144
|
-
relation.new(relation.dataset.select(*
|
144
|
+
relation.new(relation.dataset.select(*qualified_projection), schema: self)
|
145
145
|
end
|
146
146
|
|
147
147
|
# Return an empty schema
|
@@ -13,8 +13,8 @@ module ROM
|
|
13
13
|
gateway.run_migrations(migration_options.merge(options))
|
14
14
|
end
|
15
15
|
|
16
|
-
def create_migration(
|
17
|
-
gateway.migrator.create_file(
|
16
|
+
def create_migration(...)
|
17
|
+
gateway.migrator.create_file(...)
|
18
18
|
end
|
19
19
|
|
20
20
|
# Global environment used for running migrations. You normally
|
@@ -24,8 +24,7 @@ module ROM
|
|
24
24
|
# @api public
|
25
25
|
attr_accessor :env
|
26
26
|
|
27
|
-
|
28
|
-
# Migration options, which are passed to `ROM::SQL::RakeSupport.run_migrations`. You can
|
27
|
+
# Migration options, which are passed to `ROM::SQL::RakeSupport.run_migrations`. You can
|
29
28
|
# set them in the `db:setup` task with `ROM::SQL::RakeSupport.migration_options = { ... }`
|
30
29
|
#
|
31
30
|
# @api public
|
@@ -84,7 +83,7 @@ namespace :db do
|
|
84
83
|
end
|
85
84
|
|
86
85
|
desc 'Create a migration (parameters: NAME, VERSION)'
|
87
|
-
task :create_migration, [
|
86
|
+
task :create_migration, %i[name version] => :rom_configuration do |_, args|
|
88
87
|
name, version = args.values_at(:name, :version)
|
89
88
|
|
90
89
|
if name.nil?
|
data/lib/rom/sql/transaction.rb
CHANGED
data/lib/rom/sql/type_dsl.rb
CHANGED
@@ -6,7 +6,11 @@ module ROM
|
|
6
6
|
#
|
7
7
|
# @api public
|
8
8
|
class TypeDSL
|
9
|
-
attr_reader :definition
|
9
|
+
attr_reader :definition
|
10
|
+
|
11
|
+
attr_reader :input_constructor
|
12
|
+
|
13
|
+
attr_reader :output_constructor
|
10
14
|
|
11
15
|
# @api private
|
12
16
|
def initialize(value_type)
|
@@ -18,8 +22,8 @@ module ROM
|
|
18
22
|
end
|
19
23
|
|
20
24
|
# @api private
|
21
|
-
def call(&
|
22
|
-
instance_exec(&
|
25
|
+
def call(&)
|
26
|
+
instance_exec(&)
|
23
27
|
|
24
28
|
definition.constructor(input_constructor)
|
25
29
|
.meta(read: definition.constructor(output_constructor))
|
@@ -30,13 +30,13 @@ module ROM
|
|
30
30
|
# @param [Dry::Types::Type] type Type
|
31
31
|
#
|
32
32
|
# @api public
|
33
|
-
def register(type, &
|
33
|
+
def register(type, &)
|
34
34
|
extensions = @types[type.meta[:database]]
|
35
35
|
db_type = type.meta[:db_type]
|
36
36
|
|
37
|
-
mod = Module.new(&
|
38
|
-
ctx = Object.new.extend(mod)
|
39
|
-
functions = mod.public_instance_methods.
|
37
|
+
mod = ::Module.new(&)
|
38
|
+
ctx = ::Object.new.extend(mod)
|
39
|
+
functions = mod.public_instance_methods.to_h { |m| [m, ctx.method(m)] }
|
40
40
|
extensions[db_type] = (extensions[db_type] || {}).merge(functions)
|
41
41
|
end
|
42
42
|
end
|
@@ -29,7 +29,7 @@ module ROM
|
|
29
29
|
Types::Date => 'date',
|
30
30
|
Types::Bool => 'boolean',
|
31
31
|
Types::Decimal => 'numeric',
|
32
|
-
Types::Float => 'float'
|
32
|
+
Types::Float => 'float'
|
33
33
|
)
|
34
34
|
|
35
35
|
def call(type)
|
@@ -40,7 +40,7 @@ module ROM
|
|
40
40
|
self.class.mapping.fetch(type.with(meta: meta)) {
|
41
41
|
if block_given?
|
42
42
|
yield(type)
|
43
|
-
end or raise "Cannot serialize #{
|
43
|
+
end or raise "Cannot serialize #{type}"
|
44
44
|
}
|
45
45
|
end
|
46
46
|
end
|
data/lib/rom/sql/types.rb
CHANGED
@@ -37,8 +37,8 @@ module ROM
|
|
37
37
|
# @return [Dry::Types::Nominal]
|
38
38
|
#
|
39
39
|
# @api public
|
40
|
-
def self.define(value_type, &
|
41
|
-
TypeDSL.new(value_type).call(&
|
40
|
+
def self.define(value_type, &)
|
41
|
+
TypeDSL.new(value_type).call(&)
|
42
42
|
end
|
43
43
|
|
44
44
|
Serial = Integer.meta(primary_key: true)
|
data/lib/rom/sql/version.rb
CHANGED
data/lib/rom/types/values.rb
CHANGED
@@ -5,11 +5,9 @@ require 'rom/sql/types'
|
|
5
5
|
module ROM
|
6
6
|
module Types
|
7
7
|
module Values
|
8
|
-
class TreePath < ::Struct.new(:value, :separator)
|
9
|
-
DEFAULT_SEPARATOR = '.'.freeze
|
10
|
-
|
8
|
+
class TreePath < ::Struct.new(:value, :separator) # rubocop:disable Style/StructInheritance
|
11
9
|
# @api public
|
12
|
-
def self.new(value, separator =
|
10
|
+
def self.new(value, separator = '.')
|
13
11
|
super
|
14
12
|
end
|
15
13
|
|