rom-sql 3.1.0 → 3.3.3
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 +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
|