rom-sql 3.6.5 → 3.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -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 +5 -2
- 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 +9 -15
@@ -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,
|
@@ -67,10 +67,12 @@ module ROM
|
|
67
67
|
end
|
68
68
|
|
69
69
|
# @api private
|
70
|
+
#
|
71
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
70
72
|
def map_type(ruby_type, db_type, **kw)
|
71
73
|
type = self.class.ruby_type_mapping[ruby_type || guess_type(db_type)]
|
72
74
|
|
73
|
-
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')
|
74
76
|
map_decimal_type(db_type)
|
75
77
|
elsif db_type.is_a?(String) && db_type.include?('char') && kw[:max_length]
|
76
78
|
type.meta(limit: kw[:max_length])
|
@@ -78,6 +80,7 @@ module ROM
|
|
78
80
|
type
|
79
81
|
end
|
80
82
|
end
|
83
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
81
84
|
|
82
85
|
# @api private
|
83
86
|
def guess_type(db_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
|
|