rom-sql 3.6.4 → 4.0.0.alpha1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -48
- data/LICENSE +1 -1
- data/README.md +1 -1
- data/lib/rom/plugins/relation/sql/auto_restrictions.rb +11 -10
- data/lib/rom/plugins/relation/sql/default_views.rb +75 -0
- data/lib/rom/plugins/relation/sql/instrumentation.rb +8 -13
- data/lib/rom/plugins/relation/sql/postgres/explain.rb +4 -4
- data/lib/rom/plugins/relation/sql/postgres/full_text_search.rb +18 -16
- data/lib/rom/plugins/relation/sql/postgres/streaming.rb +12 -9
- data/lib/rom/sql/associations/many_to_many.rb +7 -7
- data/lib/rom/sql/associations/many_to_one.rb +3 -3
- data/lib/rom/sql/associations/one_to_many.rb +3 -3
- data/lib/rom/sql/associations/one_to_one.rb +1 -1
- data/lib/rom/sql/associations/one_to_one_through.rb +1 -1
- data/lib/rom/sql/associations/self_ref.rb +1 -1
- data/lib/rom/sql/associations.rb +5 -5
- data/lib/rom/sql/attribute.rb +9 -9
- data/lib/rom/sql/attribute_aliasing.rb +2 -3
- data/lib/rom/sql/commands/create.rb +5 -4
- data/lib/rom/sql/commands/delete.rb +2 -2
- data/lib/rom/sql/commands/update.rb +5 -4
- data/lib/rom/sql/commands.rb +4 -4
- data/lib/rom/sql/dsl.rb +3 -3
- data/lib/rom/sql/errors.rb +3 -3
- data/lib/rom/sql/extensions/active_support_notifications.rb +4 -4
- data/lib/rom/sql/extensions/mysql/type_builder.rb +5 -5
- data/lib/rom/sql/extensions/mysql.rb +1 -1
- data/lib/rom/sql/extensions/postgres/commands.rb +13 -31
- data/lib/rom/sql/extensions/postgres/type_builder.rb +28 -31
- data/lib/rom/sql/extensions/postgres/type_serializer.rb +24 -25
- data/lib/rom/sql/extensions/postgres/types/array.rb +4 -4
- data/lib/rom/sql/extensions/postgres/types/array_types.rb +1 -1
- data/lib/rom/sql/extensions/postgres/types/geometric.rb +27 -27
- data/lib/rom/sql/extensions/postgres/types/json.rb +9 -9
- data/lib/rom/sql/extensions/postgres/types/ltree.rb +61 -34
- data/lib/rom/sql/extensions/postgres/types/network.rb +4 -17
- data/lib/rom/sql/extensions/postgres/types/range.rb +25 -25
- data/lib/rom/sql/extensions/postgres/types.rb +14 -14
- data/lib/rom/sql/extensions/postgres.rb +6 -6
- data/lib/rom/sql/extensions/rails_log_subscriber.rb +6 -21
- data/lib/rom/sql/extensions/sqlite/types.rb +1 -1
- data/lib/rom/sql/extensions/sqlite.rb +2 -2
- data/lib/rom/sql/extensions.rb +6 -6
- data/lib/rom/sql/foreign_key.rb +3 -1
- data/lib/rom/sql/function.rb +18 -22
- data/lib/rom/sql/gateway.rb +44 -17
- data/lib/rom/sql/group_dsl.rb +1 -1
- data/lib/rom/sql/index.rb +2 -0
- data/lib/rom/sql/join_dsl.rb +1 -1
- data/lib/rom/sql/mapper_compiler.rb +2 -2
- data/lib/rom/sql/migration/migrator.rb +11 -11
- data/lib/rom/sql/migration/runner.rb +3 -3
- data/lib/rom/sql/migration/schema_diff.rb +7 -8
- data/lib/rom/sql/migration/writer.rb +12 -12
- data/lib/rom/sql/migration.rb +4 -8
- data/lib/rom/sql/order_dsl.rb +1 -1
- data/lib/rom/sql/plugin/associates.rb +49 -11
- data/lib/rom/sql/plugin/pagination.rb +5 -3
- data/lib/rom/sql/plugin/schema_indexes.rb +35 -0
- data/lib/rom/sql/plugins.rb +9 -6
- data/lib/rom/sql/projection_dsl.rb +4 -4
- data/lib/rom/sql/rake_task.rb +2 -2
- data/lib/rom/sql/relation/reading.rb +34 -27
- data/lib/rom/sql/relation/writing.rb +11 -10
- data/lib/rom/sql/relation.rb +57 -89
- data/lib/rom/sql/restriction_dsl.rb +2 -2
- data/lib/rom/sql/schema/attributes_inferrer.rb +3 -3
- data/lib/rom/sql/schema/dsl.rb +4 -2
- data/lib/rom/sql/schema/index_dsl.rb +3 -5
- data/lib/rom/sql/schema/inferrer.rb +25 -23
- data/lib/rom/sql/schema/type_builder.rb +2 -2
- data/lib/rom/sql/schema.rb +9 -21
- data/lib/rom/sql/spec/support.rb +5 -5
- data/lib/rom/sql/tasks/migration_tasks.rake +13 -21
- data/lib/rom/sql/transaction.rb +4 -2
- data/lib/rom/sql/type_extensions.rb +3 -1
- data/lib/rom/sql/type_serializer.rb +10 -10
- data/lib/rom/sql/types.rb +4 -4
- data/lib/rom/sql/version.rb +1 -1
- data/lib/rom/sql/wrap.rb +1 -1
- data/lib/rom/sql.rb +13 -12
- data/lib/rom/types/values.rb +2 -2
- data/lib/rom-sql.rb +1 -1
- metadata +13 -17
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "rom/types/values"
|
4
4
|
|
5
5
|
module ROM
|
6
6
|
module SQL
|
@@ -9,11 +9,9 @@ module ROM
|
|
9
9
|
module Types
|
10
10
|
# @see https://www.postgresql.org/docs/current/static/ltree.html
|
11
11
|
|
12
|
-
LTree = Type(
|
12
|
+
LTree = Type("ltree") do
|
13
13
|
SQL::Types.define(ROM::Types::Values::TreePath) do
|
14
|
-
input
|
15
|
-
label_path.to_s
|
16
|
-
end
|
14
|
+
input(&:to_s)
|
17
15
|
|
18
16
|
output do |label_path|
|
19
17
|
ROM::Types::Values::TreePath.new(label_path.to_s) if label_path
|
@@ -122,8 +120,14 @@ module ROM
|
|
122
120
|
# # Translates to ||
|
123
121
|
# #
|
124
122
|
# # @example
|
125
|
-
# # people.select {
|
126
|
-
# #
|
123
|
+
# # people.select {
|
124
|
+
# # (ltree_tags + ROM::Types::Values::TreePath.new('Moscu')).as(:ltree_tags)
|
125
|
+
# # }.where { name.is('Jade Doe') }
|
126
|
+
# #
|
127
|
+
# # people.select {
|
128
|
+
# # (ltree_tags + 'Moscu').as(:ltree_tags)
|
129
|
+
# # }
|
130
|
+
# # .where { name.is('Jade Doe') }
|
127
131
|
# #
|
128
132
|
# # @param [LTree, String] keys
|
129
133
|
# #
|
@@ -224,17 +228,18 @@ module ROM
|
|
224
228
|
#
|
225
229
|
# end
|
226
230
|
module LTreeMethods
|
227
|
-
ASCENDANT = [
|
228
|
-
FIND_ASCENDANT = [
|
229
|
-
DESCENDANT = [
|
230
|
-
FIND_DESCENDANT = [
|
231
|
-
MATCH_ANY = [
|
232
|
-
MATCH_ANY_LQUERY = [
|
233
|
-
MATCH_LTEXTQUERY = [
|
234
|
-
MATCH_ANY_LTEXTQUERY = [
|
231
|
+
ASCENDANT = ["(", " @> ", ")"].freeze
|
232
|
+
FIND_ASCENDANT = ["(", " ?@> ", ")"].freeze
|
233
|
+
DESCENDANT = ["(", " <@ ", ")"].freeze
|
234
|
+
FIND_DESCENDANT = ["(", " ?<@ ", ")"].freeze
|
235
|
+
MATCH_ANY = ["(", " ? ", ")"].freeze
|
236
|
+
MATCH_ANY_LQUERY = ["(", " ?~ ", ")"].freeze
|
237
|
+
MATCH_LTEXTQUERY = ["(", " @ ", ")"].freeze
|
238
|
+
MATCH_ANY_LTEXTQUERY = ["(", " ?@ ", ")"].freeze
|
235
239
|
|
236
240
|
def match(_type, expr, query)
|
237
|
-
Attribute[SQL::Types::Bool].meta(sql_expr: Sequel::SQL::BooleanExpression.new(
|
241
|
+
Attribute[SQL::Types::Bool].meta(sql_expr: Sequel::SQL::BooleanExpression.new(:~,
|
242
|
+
expr, query))
|
238
243
|
end
|
239
244
|
|
240
245
|
def match_any(_type, expr, query)
|
@@ -248,45 +253,56 @@ module ROM
|
|
248
253
|
Sequel::SQL::PlaceholderLiteralString.new(string, [expr, query])
|
249
254
|
end
|
250
255
|
|
251
|
-
def build_array_query(query, array_type =
|
256
|
+
def build_array_query(query, array_type = "lquery")
|
252
257
|
case query
|
253
258
|
when ::Array
|
254
259
|
ROM::SQL::Types::PG::Array(array_type)[query]
|
255
260
|
when ::String
|
256
|
-
ROM::SQL::Types::PG::Array(array_type)[query.split(
|
261
|
+
ROM::SQL::Types::PG::Array(array_type)[query.split(",")]
|
257
262
|
end
|
258
263
|
end
|
259
264
|
end
|
260
265
|
|
261
|
-
TypeExtensions.register(ROM::SQL::Types::PG::Array(
|
266
|
+
TypeExtensions.register(ROM::SQL::Types::PG::Array("ltree", LTree)) do
|
262
267
|
include LTreeMethods
|
263
268
|
|
264
269
|
def contain_any_ltextquery(_type, expr, query)
|
265
|
-
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(
|
270
|
+
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(
|
271
|
+
LTreeMethods::MATCH_LTEXTQUERY, expr, query
|
272
|
+
))
|
266
273
|
end
|
267
274
|
|
268
275
|
def contain_ancestor(_type, expr, query)
|
269
|
-
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(
|
276
|
+
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(
|
277
|
+
LTreeMethods::ASCENDANT, expr, query
|
278
|
+
))
|
270
279
|
end
|
271
280
|
|
272
281
|
def contain_descendant(_type, expr, query)
|
273
|
-
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(
|
282
|
+
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(
|
283
|
+
LTreeMethods::DESCENDANT, expr, query
|
284
|
+
))
|
274
285
|
end
|
275
286
|
|
276
287
|
def find_ancestor(_type, expr, query)
|
277
|
-
Attribute[LTree].meta(sql_expr: custom_operator_expr(LTreeMethods::FIND_ASCENDANT,
|
288
|
+
Attribute[LTree].meta(sql_expr: custom_operator_expr(LTreeMethods::FIND_ASCENDANT,
|
289
|
+
expr, query))
|
278
290
|
end
|
279
291
|
|
280
292
|
def find_descendant(_type, expr, query)
|
281
|
-
Attribute[LTree].meta(sql_expr: custom_operator_expr(LTreeMethods::FIND_DESCENDANT,
|
293
|
+
Attribute[LTree].meta(sql_expr: custom_operator_expr(LTreeMethods::FIND_DESCENDANT,
|
294
|
+
expr, query))
|
282
295
|
end
|
283
296
|
|
284
297
|
def match_any_lquery(_type, expr, query)
|
285
|
-
Attribute[LTree].meta(sql_expr: custom_operator_expr(LTreeMethods::MATCH_ANY_LQUERY,
|
298
|
+
Attribute[LTree].meta(sql_expr: custom_operator_expr(LTreeMethods::MATCH_ANY_LQUERY,
|
299
|
+
expr, query))
|
286
300
|
end
|
287
301
|
|
288
302
|
def match_any_ltextquery(_type, expr, query)
|
289
|
-
Attribute[LTree].meta(sql_expr: custom_operator_expr(
|
303
|
+
Attribute[LTree].meta(sql_expr: custom_operator_expr(
|
304
|
+
LTreeMethods::MATCH_ANY_LTEXTQUERY, expr, query
|
305
|
+
))
|
290
306
|
end
|
291
307
|
end
|
292
308
|
|
@@ -294,25 +310,35 @@ module ROM
|
|
294
310
|
include LTreeMethods
|
295
311
|
|
296
312
|
def match_ltextquery(_type, expr, query)
|
297
|
-
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(
|
313
|
+
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(
|
314
|
+
LTreeMethods::MATCH_LTEXTQUERY, expr, query
|
315
|
+
))
|
298
316
|
end
|
299
317
|
|
300
318
|
def contain_descendant(_type, expr, query)
|
301
|
-
array = build_array_query(query,
|
302
|
-
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(
|
319
|
+
array = build_array_query(query, "ltree")
|
320
|
+
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(
|
321
|
+
LTreeMethods::DESCENDANT, expr, array
|
322
|
+
))
|
303
323
|
end
|
304
324
|
|
305
325
|
def descendant(_type, expr, query)
|
306
|
-
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(
|
326
|
+
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(
|
327
|
+
LTreeMethods::DESCENDANT, expr, query
|
328
|
+
))
|
307
329
|
end
|
308
330
|
|
309
331
|
def contain_ascendant(_type, expr, query)
|
310
|
-
array = build_array_query(query,
|
311
|
-
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(
|
332
|
+
array = build_array_query(query, "ltree")
|
333
|
+
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(
|
334
|
+
LTreeMethods::ASCENDANT, expr, array
|
335
|
+
))
|
312
336
|
end
|
313
337
|
|
314
338
|
def ascendant(_type, expr, query)
|
315
|
-
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(
|
339
|
+
Attribute[SQL::Types::Bool].meta(sql_expr: custom_operator_expr(
|
340
|
+
LTreeMethods::ASCENDANT, expr, query
|
341
|
+
))
|
316
342
|
end
|
317
343
|
|
318
344
|
def +(_type, expr, other)
|
@@ -322,7 +348,8 @@ module ROM
|
|
322
348
|
else
|
323
349
|
ROM::Types::Values::TreePath.new(other)
|
324
350
|
end
|
325
|
-
Attribute[LTree].meta(sql_expr: Sequel::SQL::StringExpression.new(:
|
351
|
+
Attribute[LTree].meta(sql_expr: Sequel::SQL::StringExpression.new(:"||", expr,
|
352
|
+
other_value.to_s))
|
326
353
|
end
|
327
354
|
end
|
328
355
|
end
|
@@ -1,28 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "ipaddr"
|
4
4
|
|
5
5
|
module ROM
|
6
6
|
module SQL
|
7
7
|
module Postgres
|
8
8
|
module Types
|
9
|
-
IPAddress = Type(
|
10
|
-
read = SQL::Types.Constructor(IPAddr) { |ip|
|
9
|
+
IPAddress = Type("inet") do
|
10
|
+
read = SQL::Types.Constructor(IPAddr) { |ip| IPAddr.new(ip.to_s) }
|
11
11
|
|
12
|
-
SQL::Types.Constructor(
|
13
|
-
end
|
14
|
-
|
15
|
-
IPNetwork = Type('cidr') do
|
16
|
-
read = SQL::Types.Constructor(IPAddr) do |ip|
|
17
|
-
case ip
|
18
|
-
when ::IPAddr
|
19
|
-
ip
|
20
|
-
when String
|
21
|
-
::IPAddr.new(ip)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
SQL::Types.Constructor(::IPAddr) { |ip| "#{ip}/#{ip.prefix}" }.meta(read: read)
|
12
|
+
SQL::Types.Constructor(IPAddr, &:to_s).meta(read: read)
|
26
13
|
end
|
27
14
|
end
|
28
15
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "sequel/core"
|
4
4
|
|
5
5
|
Sequel.extension(:pg_range, :pg_range_ops)
|
6
6
|
|
@@ -9,10 +9,10 @@ module ROM
|
|
9
9
|
module Postgres
|
10
10
|
module Values
|
11
11
|
Range = ::Struct.new(:lower, :upper, :bounds) do
|
12
|
-
PAREN_LEFT =
|
13
|
-
PAREN_RIGHT =
|
12
|
+
PAREN_LEFT = "("
|
13
|
+
PAREN_RIGHT = ")"
|
14
14
|
|
15
|
-
def initialize(lower, upper, bounds = :
|
15
|
+
def initialize(lower, upper, bounds = :"[)")
|
16
16
|
super
|
17
17
|
end
|
18
18
|
|
@@ -33,22 +33,22 @@ module ROM
|
|
33
33
|
|
34
34
|
@range_parsers = {
|
35
35
|
int4range: Sequel::Postgres::PGRange::Parser.new(
|
36
|
-
|
36
|
+
"int4range", SQL::Types::Coercible::Integer
|
37
37
|
),
|
38
38
|
int8range: Sequel::Postgres::PGRange::Parser.new(
|
39
|
-
|
39
|
+
"int8range", SQL::Types::Coercible::Integer
|
40
40
|
),
|
41
|
-
numrange:
|
42
|
-
|
41
|
+
numrange: Sequel::Postgres::PGRange::Parser.new(
|
42
|
+
"numrange", SQL::Types::Coercible::Integer
|
43
43
|
),
|
44
|
-
tsrange:
|
45
|
-
|
44
|
+
tsrange: Sequel::Postgres::PGRange::Parser.new(
|
45
|
+
"tsrange", ::Time.method(:parse)
|
46
46
|
),
|
47
47
|
tstzrange: Sequel::Postgres::PGRange::Parser.new(
|
48
|
-
|
48
|
+
"tstzrange", ::Time.method(:parse)
|
49
49
|
),
|
50
50
|
daterange: Sequel::Postgres::PGRange::Parser.new(
|
51
|
-
|
51
|
+
"daterange", ::Date.method(:parse)
|
52
52
|
)
|
53
53
|
}.freeze
|
54
54
|
|
@@ -58,7 +58,7 @@ module ROM
|
|
58
58
|
pg_range =
|
59
59
|
if value.is_a?(Sequel::Postgres::PGRange)
|
60
60
|
value
|
61
|
-
elsif value
|
61
|
+
elsif value.respond_to?(:to_s)
|
62
62
|
@range_parsers[name].(value.to_s)
|
63
63
|
else
|
64
64
|
value
|
@@ -67,9 +67,9 @@ module ROM
|
|
67
67
|
Values::Range.new(
|
68
68
|
pg_range.begin,
|
69
69
|
pg_range.end,
|
70
|
-
[pg_range.exclude_begin? ? :
|
71
|
-
pg_range.exclude_end? ? :
|
72
|
-
.join(
|
70
|
+
[pg_range.exclude_begin? ? :"(" : :"[",
|
71
|
+
pg_range.exclude_end? ? :")" : :"]"]
|
72
|
+
.join("").to_sym
|
73
73
|
)
|
74
74
|
end
|
75
75
|
end
|
@@ -78,23 +78,23 @@ module ROM
|
|
78
78
|
def self.range(name, read_type)
|
79
79
|
Type(name) do
|
80
80
|
type = SQL::Types.Nominal(Values::Range).constructor do |range|
|
81
|
-
format(
|
82
|
-
range.exclude_begin? ? :
|
81
|
+
format("%s%s,%s%s",
|
82
|
+
range.exclude_begin? ? :"(" : :"[",
|
83
83
|
range.lower,
|
84
84
|
range.upper,
|
85
|
-
range.exclude_end? ? :
|
85
|
+
range.exclude_end? ? :")" : :"]")
|
86
86
|
end
|
87
87
|
|
88
88
|
type.meta(read: read_type)
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
92
|
-
Int4Range = range(
|
93
|
-
Int8Range = range(
|
94
|
-
NumRange = range(
|
95
|
-
TsRange = range(
|
96
|
-
TsTzRange = range(
|
97
|
-
DateRange = range(
|
92
|
+
Int4Range = range("int4range", range_read_type(:int4range))
|
93
|
+
Int8Range = range("int8range", range_read_type(:int8range))
|
94
|
+
NumRange = range("numrange", range_read_type(:numrange))
|
95
|
+
TsRange = range("tsrange", range_read_type(:tsrange))
|
96
|
+
TsTzRange = range("tstzrange", range_read_type(:tstzrange))
|
97
|
+
DateRange = range("daterange", range_read_type(:daterange))
|
98
98
|
|
99
99
|
module RangeOperators
|
100
100
|
def contain(_type, expr, value)
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "sequel/core"
|
4
4
|
|
5
|
-
require
|
5
|
+
require "rom/sql/type_extensions"
|
6
6
|
|
7
7
|
Sequel.extension(:pg_hstore)
|
8
8
|
|
@@ -11,25 +11,25 @@ module ROM
|
|
11
11
|
module Postgres
|
12
12
|
module Types
|
13
13
|
def self.Type(name, type = yield)
|
14
|
-
type.meta(db_type: name, database:
|
14
|
+
type.meta(db_type: name, database: "postgres")
|
15
15
|
end
|
16
16
|
|
17
|
-
UUID = Type(
|
17
|
+
UUID = Type("uuid", SQL::Types::String)
|
18
18
|
|
19
|
-
HStore = Type(
|
19
|
+
HStore = Type("hstore") do
|
20
20
|
read = SQL::Types.Constructor(Hash, &:to_hash)
|
21
21
|
|
22
22
|
SQL::Types.Constructor(Hash, &Sequel.method(:hstore))
|
23
23
|
.meta(read: read)
|
24
24
|
end
|
25
25
|
|
26
|
-
Bytea = Type(
|
26
|
+
Bytea = Type("bytea") do
|
27
27
|
SQL::Types.Constructor(Sequel::SQL::Blob, &Sequel::SQL::Blob.method(:new))
|
28
28
|
end
|
29
29
|
|
30
|
-
Money = Type(
|
30
|
+
Money = Type("money", SQL::Types::Decimal)
|
31
31
|
|
32
|
-
XML = Type(
|
32
|
+
XML = Type("xml", SQL::Types::String)
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -39,9 +39,9 @@ module ROM
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
require
|
43
|
-
require
|
44
|
-
require
|
45
|
-
require
|
46
|
-
require
|
47
|
-
require
|
42
|
+
require "rom/sql/extensions/postgres/types/array"
|
43
|
+
require "rom/sql/extensions/postgres/types/json"
|
44
|
+
require "rom/sql/extensions/postgres/types/geometric"
|
45
|
+
require "rom/sql/extensions/postgres/types/network"
|
46
|
+
require "rom/sql/extensions/postgres/types/range"
|
47
|
+
require "rom/sql/extensions/postgres/types/ltree"
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
3
|
+
require "rom/sql/extensions/postgres/commands"
|
4
|
+
require "rom/sql/extensions/postgres/types"
|
5
|
+
require "rom/sql/extensions/postgres/type_builder"
|
6
|
+
require "rom/sql/extensions/postgres/type_serializer"
|
7
|
+
require "rom/plugins/relation/sql/postgres/explain"
|
8
|
+
require "rom/plugins/relation/sql/postgres/full_text_search"
|
@@ -1,39 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "active_support/log_subscriber"
|
4
4
|
|
5
5
|
module ROM
|
6
6
|
module SQL
|
7
7
|
class RailsLogSubscriber < ActiveSupport::LogSubscriber
|
8
|
-
as_version =
|
9
|
-
begin
|
10
|
-
require "active_support/gem_version"
|
11
|
-
ActiveSupport.gem_version
|
12
|
-
rescue LoadError
|
13
|
-
nil
|
14
|
-
end
|
15
|
-
|
16
|
-
COLOR_OPTION =
|
17
|
-
if as_version && as_version >= Gem::Version.new("7.2")
|
18
|
-
{color: true}
|
19
|
-
else
|
20
|
-
true
|
21
|
-
end
|
22
|
-
|
23
8
|
def sql(event)
|
24
9
|
return unless logger.debug?
|
25
10
|
|
26
11
|
payload = event.payload
|
27
12
|
|
28
|
-
name = format(
|
29
|
-
sql = payload[:sql].squeeze(
|
13
|
+
name = format("%s (%.1fms)", payload[:name], event.duration)
|
14
|
+
sql = payload[:sql].squeeze(" ")
|
30
15
|
binds = payload[:binds].to_a.inspect if payload[:binds]
|
31
16
|
|
32
17
|
if odd?
|
33
|
-
name = color(name, :cyan,
|
34
|
-
sql = color(sql, nil,
|
18
|
+
name = color(name, :cyan, true)
|
19
|
+
sql = color(sql, nil, true)
|
35
20
|
else
|
36
|
-
name = color(name, :magenta,
|
21
|
+
name = color(name, :magenta, true)
|
37
22
|
end
|
38
23
|
|
39
24
|
debug " #{name} #{sql} #{binds}"
|
data/lib/rom/sql/extensions.rb
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dry/core/extensions"
|
4
4
|
|
5
5
|
module ROM
|
6
6
|
module SQL
|
7
7
|
extend Dry::Core::Extensions
|
8
8
|
|
9
9
|
register_extension(:postgres) do
|
10
|
-
require
|
10
|
+
require "rom/sql/extensions/postgres"
|
11
11
|
end
|
12
12
|
|
13
13
|
register_extension(:mysql) do
|
14
|
-
require
|
14
|
+
require "rom/sql/extensions/mysql"
|
15
15
|
end
|
16
16
|
|
17
17
|
register_extension(:sqlite) do
|
18
|
-
require
|
18
|
+
require "rom/sql/extensions/sqlite"
|
19
19
|
end
|
20
20
|
|
21
21
|
register_extension(:active_support_notifications) do
|
22
|
-
require
|
22
|
+
require "rom/sql/extensions/active_support_notifications"
|
23
23
|
end
|
24
24
|
|
25
25
|
register_extension(:rails_log_subscriber) do
|
26
|
-
require
|
26
|
+
require "rom/sql/extensions/rails_log_subscriber"
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
data/lib/rom/sql/foreign_key.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "dry/core/equalizer"
|
4
|
+
|
3
5
|
module ROM
|
4
6
|
module SQL
|
5
7
|
# @api private
|
@@ -11,7 +13,7 @@ module ROM
|
|
11
13
|
|
12
14
|
param :attributes
|
13
15
|
|
14
|
-
param :parent_table, type: Dry::Types[
|
16
|
+
param :parent_table, type: Dry::Types["strict.symbol"]
|
15
17
|
|
16
18
|
option :parent_keys, default: -> { DEFAULT_PARENT_KEYS }
|
17
19
|
end
|
data/lib/rom/sql/function.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "rom/attribute"
|
4
|
+
require "rom/sql/attribute_wrapping"
|
5
5
|
|
6
6
|
module ROM
|
7
7
|
module SQL
|
@@ -15,14 +15,14 @@ module ROM
|
|
15
15
|
# @api private
|
16
16
|
def frame_limit(value)
|
17
17
|
case value
|
18
|
-
when :current then
|
19
|
-
when :start then
|
20
|
-
when :end then
|
18
|
+
when :current then "CURRENT ROW"
|
19
|
+
when :start then "UNBOUNDED PRECEDING"
|
20
|
+
when :end then "UNBOUNDED FOLLOWING"
|
21
21
|
else
|
22
|
-
if value
|
23
|
-
"#{
|
22
|
+
if value.positive?
|
23
|
+
"#{value} FOLLOWING"
|
24
24
|
else
|
25
|
-
"#{
|
25
|
+
"#{value.abs} PRECEDING"
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -32,15 +32,16 @@ module ROM
|
|
32
32
|
|
33
33
|
# @api private
|
34
34
|
WINDOW_FRAMES = Hash.new do |cache, frame|
|
35
|
-
type = frame.key?(:rows) ?
|
35
|
+
type = frame.key?(:rows) ? "ROWS" : "RANGE"
|
36
36
|
bounds = frame[:rows] || frame[:range]
|
37
|
-
cache[frame] =
|
37
|
+
cache[frame] =
|
38
|
+
"#{type} BETWEEN #{frame_limit(bounds[0])} AND #{frame_limit(bounds[1])}"
|
38
39
|
end
|
39
40
|
|
40
41
|
WINDOW_FRAMES[nil] = nil
|
41
|
-
WINDOW_FRAMES[:all] = WINDOW_FRAMES[rows: [
|
42
|
-
WINDOW_FRAMES[:rows] = WINDOW_FRAMES[rows: [
|
43
|
-
WINDOW_FRAMES[range: :current] = WINDOW_FRAMES[range: [
|
42
|
+
WINDOW_FRAMES[:all] = WINDOW_FRAMES[rows: %i[start end]]
|
43
|
+
WINDOW_FRAMES[:rows] = WINDOW_FRAMES[rows: %i[start current]]
|
44
|
+
WINDOW_FRAMES[range: :current] = WINDOW_FRAMES[range: %i[current current]]
|
44
45
|
|
45
46
|
# Return a new attribute with an alias
|
46
47
|
#
|
@@ -89,12 +90,7 @@ module ROM
|
|
89
90
|
|
90
91
|
# @api private
|
91
92
|
def new(&block)
|
92
|
-
|
93
|
-
when ::Sequel::SQL::Function
|
94
|
-
meta(func: ::Sequel::SQL::Function.new!(func.name, func.args.map(&block), func.opts))
|
95
|
-
else
|
96
|
-
meta(func: func)
|
97
|
-
end
|
93
|
+
meta(func: ::Sequel::SQL::Function.new!(func.name, func.args.map(&block), func.opts))
|
98
94
|
end
|
99
95
|
|
100
96
|
# @see Attribute#qualified?
|
@@ -109,7 +105,7 @@ module ROM
|
|
109
105
|
# @api public
|
110
106
|
def is(other)
|
111
107
|
::ROM::SQL::Attribute[::ROM::SQL::Types::Bool].meta(
|
112
|
-
sql_expr: ::Sequel::SQL::BooleanExpression.new(:
|
108
|
+
sql_expr: ::Sequel::SQL::BooleanExpression.new(:"=", func, other)
|
113
109
|
)
|
114
110
|
end
|
115
111
|
|
@@ -190,7 +186,7 @@ module ROM
|
|
190
186
|
def case(mapping)
|
191
187
|
mapping = mapping.dup
|
192
188
|
otherwise = mapping.delete(:else) do
|
193
|
-
raise ArgumentError,
|
189
|
+
raise ArgumentError, "provide the default case using the :else keyword"
|
194
190
|
end
|
195
191
|
|
196
192
|
Attribute[type].meta(sql_expr: ::Sequel.case(mapping, otherwise))
|
@@ -214,7 +210,7 @@ module ROM
|
|
214
210
|
def filter(condition = Undefined, &block)
|
215
211
|
if block
|
216
212
|
conditions = schema.restriction(&block)
|
217
|
-
conditions
|
213
|
+
conditions &= condition unless condition.equal?(Undefined)
|
218
214
|
else
|
219
215
|
conditions = condition
|
220
216
|
end
|