rom-sql 3.1.0 → 3.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +214 -101
- data/LICENSE +1 -1
- data/README.md +12 -54
- data/lib/rom-sql.rb +2 -0
- data/lib/rom/plugins/relation/sql/auto_restrictions.rb +2 -0
- data/lib/rom/plugins/relation/sql/instrumentation.rb +2 -0
- data/lib/rom/plugins/relation/sql/postgres/explain.rb +6 -7
- data/lib/rom/plugins/relation/sql/postgres/full_text_search.rb +53 -0
- data/lib/rom/plugins/relation/sql/postgres/streaming.rb +108 -0
- data/lib/rom/sql.rb +2 -0
- data/lib/rom/sql/associations.rb +2 -0
- data/lib/rom/sql/associations/core.rb +3 -1
- data/lib/rom/sql/associations/many_to_many.rb +3 -1
- data/lib/rom/sql/associations/many_to_one.rb +2 -0
- data/lib/rom/sql/associations/one_to_many.rb +2 -0
- data/lib/rom/sql/associations/one_to_one.rb +2 -0
- data/lib/rom/sql/associations/one_to_one_through.rb +2 -0
- data/lib/rom/sql/associations/self_ref.rb +2 -0
- data/lib/rom/sql/attribute.rb +26 -7
- data/lib/rom/sql/attribute_aliasing.rb +28 -0
- data/lib/rom/sql/commands.rb +2 -0
- data/lib/rom/sql/commands/create.rb +2 -0
- data/lib/rom/sql/commands/delete.rb +2 -0
- data/lib/rom/sql/commands/error_wrapper.rb +2 -0
- data/lib/rom/sql/commands/update.rb +2 -0
- data/lib/rom/sql/dsl.rb +11 -3
- data/lib/rom/sql/error.rb +2 -0
- data/lib/rom/sql/errors.rb +2 -0
- data/lib/rom/sql/extensions.rb +2 -0
- data/lib/rom/sql/extensions/active_support_notifications.rb +2 -0
- data/lib/rom/sql/extensions/mysql.rb +2 -0
- data/lib/rom/sql/extensions/mysql/type_builder.rb +2 -0
- data/lib/rom/sql/extensions/postgres.rb +3 -0
- data/lib/rom/sql/extensions/postgres/commands.rb +3 -1
- data/lib/rom/sql/extensions/postgres/type_builder.rb +6 -4
- data/lib/rom/sql/extensions/postgres/type_serializer.rb +2 -0
- data/lib/rom/sql/extensions/postgres/types.rb +2 -0
- data/lib/rom/sql/extensions/postgres/types/array.rb +6 -4
- data/lib/rom/sql/extensions/postgres/types/array_types.rb +3 -1
- data/lib/rom/sql/extensions/postgres/types/geometric.rb +2 -0
- data/lib/rom/sql/extensions/postgres/types/json.rb +13 -11
- data/lib/rom/sql/extensions/postgres/types/ltree.rb +25 -23
- data/lib/rom/sql/extensions/postgres/types/network.rb +2 -0
- data/lib/rom/sql/extensions/postgres/types/range.rb +2 -0
- data/lib/rom/sql/extensions/rails_log_subscriber.rb +2 -0
- data/lib/rom/sql/extensions/sqlite.rb +2 -0
- data/lib/rom/sql/extensions/sqlite/type_builder.rb +2 -0
- data/lib/rom/sql/extensions/sqlite/types.rb +2 -0
- data/lib/rom/sql/foreign_key.rb +3 -1
- data/lib/rom/sql/function.rb +14 -3
- data/lib/rom/sql/gateway.rb +6 -1
- data/lib/rom/sql/group_dsl.rb +2 -0
- data/lib/rom/sql/index.rb +2 -0
- data/lib/rom/sql/join_dsl.rb +2 -0
- data/lib/rom/sql/mapper_compiler.rb +2 -0
- data/lib/rom/sql/migration.rb +5 -3
- data/lib/rom/sql/migration/inline_runner.rb +2 -0
- data/lib/rom/sql/migration/migrator.rb +4 -2
- data/lib/rom/sql/migration/recorder.rb +2 -0
- data/lib/rom/sql/migration/runner.rb +4 -2
- data/lib/rom/sql/migration/schema_diff.rb +2 -0
- data/lib/rom/sql/migration/template.rb +2 -0
- data/lib/rom/sql/migration/writer.rb +12 -4
- data/lib/rom/sql/order_dsl.rb +2 -0
- data/lib/rom/sql/plugin/associates.rb +4 -2
- data/lib/rom/sql/plugin/nullify.rb +2 -0
- data/lib/rom/sql/plugin/pagination.rb +2 -0
- data/lib/rom/sql/plugins.rb +2 -0
- data/lib/rom/sql/projection_dsl.rb +3 -1
- data/lib/rom/sql/rake_task.rb +2 -0
- data/lib/rom/sql/relation.rb +3 -1
- data/lib/rom/sql/relation/reading.rb +6 -4
- data/lib/rom/sql/relation/writing.rb +2 -0
- data/lib/rom/sql/restriction_dsl.rb +9 -1
- data/lib/rom/sql/schema.rb +16 -2
- data/lib/rom/sql/schema/attributes_inferrer.rb +5 -3
- data/lib/rom/sql/schema/dsl.rb +3 -1
- data/lib/rom/sql/schema/index_dsl.rb +5 -2
- data/lib/rom/sql/schema/inferrer.rb +12 -8
- data/lib/rom/sql/schema/type_builder.rb +4 -2
- data/lib/rom/sql/spec/support.rb +5 -3
- data/lib/rom/sql/tasks/migration_tasks.rake +16 -11
- data/lib/rom/sql/transaction.rb +2 -0
- data/lib/rom/sql/type_dsl.rb +2 -0
- data/lib/rom/sql/type_extensions.rb +3 -1
- data/lib/rom/sql/type_serializer.rb +2 -0
- data/lib/rom/sql/types.rb +2 -0
- data/lib/rom/sql/version.rb +3 -1
- data/lib/rom/sql/wrap.rb +2 -0
- data/lib/rom/types/values.rb +2 -0
- metadata +25 -45
@@ -21,6 +21,34 @@ module ROM
|
|
21
21
|
end
|
22
22
|
alias as aliased
|
23
23
|
|
24
|
+
|
25
|
+
# Return true if this attribute is an aliased projection
|
26
|
+
#
|
27
|
+
# @example
|
28
|
+
# class Tasks < ROM::Relation[:memory]
|
29
|
+
# schema do
|
30
|
+
# attribute :user_id, Types::Integer, alias: :id
|
31
|
+
# attribute :name, Types::String
|
32
|
+
# end
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# Users.schema[:user_id].aliased?
|
36
|
+
# # => true
|
37
|
+
# Users.schema[:user_id].aliased_projection?
|
38
|
+
# # => false
|
39
|
+
#
|
40
|
+
# Users.schema[:user_id].qualified_projection.aliased?
|
41
|
+
# # => true
|
42
|
+
# Users.schema[:user_id].qualified_projection.aliased_projection?
|
43
|
+
# # => true
|
44
|
+
#
|
45
|
+
# @return [TrueClass,FalseClass]
|
46
|
+
#
|
47
|
+
# @api private
|
48
|
+
def aliased_projection?
|
49
|
+
self.meta[:sql_expr].is_a?(Sequel::SQL::AliasedExpression)
|
50
|
+
end
|
51
|
+
|
24
52
|
private
|
25
53
|
|
26
54
|
# @api private
|
data/lib/rom/sql/commands.rb
CHANGED
data/lib/rom/sql/dsl.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'concurrent/map'
|
2
4
|
require 'rom/support/inflector'
|
3
5
|
require 'rom/constants'
|
@@ -27,7 +29,13 @@ module ROM
|
|
27
29
|
|
28
30
|
# @api private
|
29
31
|
def call(&block)
|
30
|
-
|
32
|
+
arg, kwargs = select_relations(block.parameters)
|
33
|
+
|
34
|
+
if kwargs.nil?
|
35
|
+
result = instance_exec(arg, &block)
|
36
|
+
else
|
37
|
+
result = instance_exec(**kwargs, &block)
|
38
|
+
end
|
31
39
|
|
32
40
|
if result.is_a?(::Array)
|
33
41
|
result
|
@@ -82,9 +90,9 @@ module ROM
|
|
82
90
|
keys = parameters.select { |type, _| type == :keyreq }
|
83
91
|
|
84
92
|
if keys.empty?
|
85
|
-
relations
|
93
|
+
[relations, nil]
|
86
94
|
else
|
87
|
-
keys.each_with_object({}) { |(_, k), rs| rs[k] = relations[k] }
|
95
|
+
[nil, keys.each_with_object({}) { |(_, k), rs| rs[k] = relations[k] }]
|
88
96
|
end
|
89
97
|
end
|
90
98
|
end
|
data/lib/rom/sql/error.rb
CHANGED
data/lib/rom/sql/errors.rb
CHANGED
data/lib/rom/sql/extensions.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rom/sql/extensions/postgres/commands'
|
2
4
|
require 'rom/sql/extensions/postgres/types'
|
3
5
|
require 'rom/sql/extensions/postgres/type_builder'
|
4
6
|
require 'rom/sql/extensions/postgres/type_serializer'
|
5
7
|
require 'rom/plugins/relation/sql/postgres/explain'
|
8
|
+
require 'rom/plugins/relation/sql/postgres/full_text_search'
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rom/sql/commands/create'
|
2
4
|
require 'rom/sql/commands/update'
|
3
5
|
|
@@ -15,7 +17,7 @@ module ROM
|
|
15
17
|
#
|
16
18
|
# @api private
|
17
19
|
def returning_dataset
|
18
|
-
relation.dataset.returning(*relation.
|
20
|
+
relation.dataset.returning(*relation.schema.qualified_projection)
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
@@ -1,14 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ROM
|
2
4
|
module SQL
|
3
5
|
module Postgres
|
4
6
|
class TypeBuilder < Schema::TypeBuilder
|
5
7
|
defines :db_numeric_types, :db_type_mapping, :db_array_type_matcher
|
6
8
|
|
7
|
-
db_numeric_types %w
|
9
|
+
db_numeric_types %w[
|
8
10
|
smallint integer bigint
|
9
11
|
decimal numeric real
|
10
12
|
double\ precision serial bigserial
|
11
|
-
|
13
|
+
].to_set.freeze
|
12
14
|
|
13
15
|
db_type_mapping(
|
14
16
|
'uuid' => Types::UUID,
|
@@ -39,11 +41,11 @@ module ROM
|
|
39
41
|
|
40
42
|
db_array_type_matcher '[]'.freeze
|
41
43
|
|
42
|
-
def map_pk_type(type, db_type, options
|
44
|
+
def map_pk_type(type, db_type, **options)
|
43
45
|
if numeric?(type, db_type)
|
44
46
|
type = self.class.numeric_pk_type
|
45
47
|
else
|
46
|
-
type = map_type(type, db_type, options)
|
48
|
+
type = map_type(type, db_type, **options)
|
47
49
|
end
|
48
50
|
|
49
51
|
type.meta(primary_key: true)
|
@@ -1,6 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'sequel/core'
|
2
4
|
|
3
|
-
Sequel.extension(
|
5
|
+
Sequel.extension(:pg_array, :pg_array_ops)
|
4
6
|
|
5
7
|
require 'rom/sql/extensions/postgres/types/array_types'
|
6
8
|
|
@@ -120,7 +122,7 @@ module ROM
|
|
120
122
|
Attribute[type].meta(sql_expr: expr.pg_array[idx])
|
121
123
|
end
|
122
124
|
|
123
|
-
def any(
|
125
|
+
def any(_type, expr, value)
|
124
126
|
Attribute[SQL::Types::Bool].meta(sql_expr: { value => expr.pg_array.any })
|
125
127
|
end
|
126
128
|
|
@@ -128,7 +130,7 @@ module ROM
|
|
128
130
|
Attribute[SQL::Types::Bool].meta(sql_expr: expr.pg_array.contained_by(type[other]))
|
129
131
|
end
|
130
132
|
|
131
|
-
def length(
|
133
|
+
def length(_type, expr)
|
132
134
|
Attribute[SQL::Types::Integer].meta(sql_expr: expr.pg_array.length)
|
133
135
|
end
|
134
136
|
|
@@ -140,7 +142,7 @@ module ROM
|
|
140
142
|
Attribute[type].meta(sql_expr: expr.pg_array.remove(cast(type, value)))
|
141
143
|
end
|
142
144
|
|
143
|
-
def join(
|
145
|
+
def join(_type, expr, delimiter = '', null = nil)
|
144
146
|
Attribute[SQL::Types::String].meta(sql_expr: expr.pg_array.join(delimiter, null))
|
145
147
|
end
|
146
148
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rom/sql/type_extensions'
|
2
4
|
|
3
5
|
module ROM
|
@@ -52,7 +54,7 @@ module ROM
|
|
52
54
|
end
|
53
55
|
end
|
54
56
|
|
55
|
-
def build_read_type(
|
57
|
+
def build_read_type(_db_type, member_type)
|
56
58
|
if member_type && member_type.meta[:read]
|
57
59
|
base_read_type.of(member_type.meta[:read])
|
58
60
|
else
|
@@ -1,7 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'sequel/core'
|
2
4
|
require 'singleton'
|
3
5
|
|
4
|
-
Sequel.extension(
|
6
|
+
Sequel.extension(:pg_json, :pg_json_ops)
|
5
7
|
|
6
8
|
module ROM
|
7
9
|
module SQL
|
@@ -228,11 +230,11 @@ module ROM
|
|
228
230
|
end
|
229
231
|
end
|
230
232
|
|
231
|
-
def get(
|
233
|
+
def get(_type, expr, *path)
|
232
234
|
Attribute[json_type].meta(sql_expr: wrap(expr)[path_args(path)])
|
233
235
|
end
|
234
236
|
|
235
|
-
def get_text(
|
237
|
+
def get_text(_type, expr, *path)
|
236
238
|
Attribute[SQL::Types::String].meta(sql_expr: wrap(expr).get_text(path_args(path)))
|
237
239
|
end
|
238
240
|
|
@@ -240,7 +242,7 @@ module ROM
|
|
240
242
|
|
241
243
|
def path_args(path)
|
242
244
|
case path.size
|
243
|
-
when 0 then raise ArgumentError,
|
245
|
+
when 0 then raise ArgumentError, 'wrong number of arguments (given 0, expected 1+)'
|
244
246
|
when 1 then path[0]
|
245
247
|
else path
|
246
248
|
end
|
@@ -254,32 +256,32 @@ module ROM
|
|
254
256
|
TypeExtensions.register(JSONB) do
|
255
257
|
include JSONMethods[JSONB, :pg_jsonb.to_proc]
|
256
258
|
|
257
|
-
def contain(
|
259
|
+
def contain(_type, expr, value)
|
258
260
|
Attribute[SQL::Types::Bool].meta(sql_expr: wrap(expr).contains(value))
|
259
261
|
end
|
260
262
|
|
261
|
-
def contained_by(
|
263
|
+
def contained_by(_type, expr, value)
|
262
264
|
Attribute[SQL::Types::Bool].meta(sql_expr: wrap(expr).contained_by(value))
|
263
265
|
end
|
264
266
|
|
265
|
-
def has_key(
|
267
|
+
def has_key(_type, expr, key)
|
266
268
|
Attribute[SQL::Types::Bool].meta(sql_expr: wrap(expr).has_key?(key))
|
267
269
|
end
|
268
270
|
|
269
|
-
def has_any_key(
|
271
|
+
def has_any_key(_type, expr, *keys)
|
270
272
|
Attribute[SQL::Types::Bool].meta(sql_expr: wrap(expr).contain_any(keys))
|
271
273
|
end
|
272
274
|
|
273
|
-
def has_all_keys(
|
275
|
+
def has_all_keys(_type, expr, *keys)
|
274
276
|
Attribute[SQL::Types::Bool].meta(sql_expr: wrap(expr).contain_all(keys))
|
275
277
|
end
|
276
278
|
|
277
|
-
def merge(
|
279
|
+
def merge(_type, expr, value)
|
278
280
|
Attribute[JSONB].meta(sql_expr: wrap(expr).concat(value))
|
279
281
|
end
|
280
282
|
alias_method :+, :merge
|
281
283
|
|
282
|
-
def delete(
|
284
|
+
def delete(_type, expr, *path)
|
283
285
|
sql_expr = path.size == 1 ? wrap(expr) - path : wrap(expr).delete_path(path)
|
284
286
|
Attribute[JSONB].meta(sql_expr: sql_expr)
|
285
287
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rom/types/values'
|
2
4
|
|
3
5
|
module ROM
|
@@ -222,20 +224,20 @@ module ROM
|
|
222
224
|
#
|
223
225
|
# end
|
224
226
|
module LTreeMethods
|
225
|
-
ASCENDANT = [
|
226
|
-
FIND_ASCENDANT = [
|
227
|
-
DESCENDANT = [
|
228
|
-
FIND_DESCENDANT = [
|
229
|
-
MATCH_ANY = [
|
230
|
-
MATCH_ANY_LQUERY = [
|
231
|
-
MATCH_LTEXTQUERY = [
|
232
|
-
MATCH_ANY_LTEXTQUERY = [
|
227
|
+
ASCENDANT = ['(', ' @> ', ')'].freeze
|
228
|
+
FIND_ASCENDANT = ['(', ' ?@> ', ')'].freeze
|
229
|
+
DESCENDANT = ['(', ' <@ ', ')'].freeze
|
230
|
+
FIND_DESCENDANT = ['(', ' ?<@ ', ')'].freeze
|
231
|
+
MATCH_ANY = ['(', ' ? ', ')'].freeze
|
232
|
+
MATCH_ANY_LQUERY = ['(', ' ?~ ', ')'].freeze
|
233
|
+
MATCH_LTEXTQUERY = ['(', ' @ ', ')'].freeze
|
234
|
+
MATCH_ANY_LTEXTQUERY = ['(', ' ?@ ', ')'].freeze
|
233
235
|
|
234
|
-
def match(
|
236
|
+
def match(_type, expr, query)
|
235
237
|
Attribute[SQL::Types::Bool].meta(sql_expr: Sequel::SQL::BooleanExpression.new(:'~', expr, query))
|
236
238
|
end
|
237
239
|
|
238
|
-
def match_any(
|
240
|
+
def match_any(_type, expr, query)
|
239
241
|
array = build_array_query(query)
|
240
242
|
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(MATCH_ANY, expr, array))
|
241
243
|
end
|
@@ -259,31 +261,31 @@ module ROM
|
|
259
261
|
TypeExtensions.register(ROM::SQL::Types::PG::Array('ltree', LTree)) do
|
260
262
|
include LTreeMethods
|
261
263
|
|
262
|
-
def contain_any_ltextquery(
|
264
|
+
def contain_any_ltextquery(_type, expr, query)
|
263
265
|
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(LTreeMethods::MATCH_LTEXTQUERY, expr, query))
|
264
266
|
end
|
265
267
|
|
266
|
-
def contain_ancestor(
|
268
|
+
def contain_ancestor(_type, expr, query)
|
267
269
|
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(LTreeMethods::ASCENDANT, expr, query))
|
268
270
|
end
|
269
271
|
|
270
|
-
def contain_descendant(
|
272
|
+
def contain_descendant(_type, expr, query)
|
271
273
|
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(LTreeMethods::DESCENDANT, expr, query))
|
272
274
|
end
|
273
275
|
|
274
|
-
def find_ancestor(
|
276
|
+
def find_ancestor(_type, expr, query)
|
275
277
|
Attribute[LTree].meta(sql_expr: custom_operator_expr(LTreeMethods::FIND_ASCENDANT, expr, query))
|
276
278
|
end
|
277
279
|
|
278
|
-
def find_descendant(
|
280
|
+
def find_descendant(_type, expr, query)
|
279
281
|
Attribute[LTree].meta(sql_expr: custom_operator_expr(LTreeMethods::FIND_DESCENDANT, expr, query))
|
280
282
|
end
|
281
283
|
|
282
|
-
def match_any_lquery(
|
284
|
+
def match_any_lquery(_type, expr, query)
|
283
285
|
Attribute[LTree].meta(sql_expr: custom_operator_expr(LTreeMethods::MATCH_ANY_LQUERY, expr, query))
|
284
286
|
end
|
285
287
|
|
286
|
-
def match_any_ltextquery(
|
288
|
+
def match_any_ltextquery(_type, expr, query)
|
287
289
|
Attribute[LTree].meta(sql_expr: custom_operator_expr(LTreeMethods::MATCH_ANY_LTEXTQUERY, expr, query))
|
288
290
|
end
|
289
291
|
end
|
@@ -291,29 +293,29 @@ module ROM
|
|
291
293
|
TypeExtensions.register(LTree) do
|
292
294
|
include LTreeMethods
|
293
295
|
|
294
|
-
def match_ltextquery(
|
296
|
+
def match_ltextquery(_type, expr, query)
|
295
297
|
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(LTreeMethods::MATCH_LTEXTQUERY, expr, query))
|
296
298
|
end
|
297
299
|
|
298
|
-
def contain_descendant(
|
300
|
+
def contain_descendant(_type, expr, query)
|
299
301
|
array = build_array_query(query, 'ltree')
|
300
302
|
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(LTreeMethods::DESCENDANT, expr, array))
|
301
303
|
end
|
302
304
|
|
303
|
-
def descendant(
|
305
|
+
def descendant(_type, expr, query)
|
304
306
|
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(LTreeMethods::DESCENDANT, expr, query))
|
305
307
|
end
|
306
308
|
|
307
|
-
def contain_ascendant(
|
309
|
+
def contain_ascendant(_type, expr, query)
|
308
310
|
array = build_array_query(query, 'ltree')
|
309
311
|
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(LTreeMethods::ASCENDANT, expr, array))
|
310
312
|
end
|
311
313
|
|
312
|
-
def ascendant(
|
314
|
+
def ascendant(_type, expr, query)
|
313
315
|
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(LTreeMethods::ASCENDANT, expr, query))
|
314
316
|
end
|
315
317
|
|
316
|
-
def +(
|
318
|
+
def +(_type, expr, other)
|
317
319
|
other_value = case other
|
318
320
|
when ROM::Types::Values::TreePath
|
319
321
|
other
|