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.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +214 -101
  3. data/LICENSE +1 -1
  4. data/README.md +12 -54
  5. data/lib/rom-sql.rb +2 -0
  6. data/lib/rom/plugins/relation/sql/auto_restrictions.rb +2 -0
  7. data/lib/rom/plugins/relation/sql/instrumentation.rb +2 -0
  8. data/lib/rom/plugins/relation/sql/postgres/explain.rb +6 -7
  9. data/lib/rom/plugins/relation/sql/postgres/full_text_search.rb +53 -0
  10. data/lib/rom/plugins/relation/sql/postgres/streaming.rb +108 -0
  11. data/lib/rom/sql.rb +2 -0
  12. data/lib/rom/sql/associations.rb +2 -0
  13. data/lib/rom/sql/associations/core.rb +3 -1
  14. data/lib/rom/sql/associations/many_to_many.rb +3 -1
  15. data/lib/rom/sql/associations/many_to_one.rb +2 -0
  16. data/lib/rom/sql/associations/one_to_many.rb +2 -0
  17. data/lib/rom/sql/associations/one_to_one.rb +2 -0
  18. data/lib/rom/sql/associations/one_to_one_through.rb +2 -0
  19. data/lib/rom/sql/associations/self_ref.rb +2 -0
  20. data/lib/rom/sql/attribute.rb +26 -7
  21. data/lib/rom/sql/attribute_aliasing.rb +28 -0
  22. data/lib/rom/sql/commands.rb +2 -0
  23. data/lib/rom/sql/commands/create.rb +2 -0
  24. data/lib/rom/sql/commands/delete.rb +2 -0
  25. data/lib/rom/sql/commands/error_wrapper.rb +2 -0
  26. data/lib/rom/sql/commands/update.rb +2 -0
  27. data/lib/rom/sql/dsl.rb +11 -3
  28. data/lib/rom/sql/error.rb +2 -0
  29. data/lib/rom/sql/errors.rb +2 -0
  30. data/lib/rom/sql/extensions.rb +2 -0
  31. data/lib/rom/sql/extensions/active_support_notifications.rb +2 -0
  32. data/lib/rom/sql/extensions/mysql.rb +2 -0
  33. data/lib/rom/sql/extensions/mysql/type_builder.rb +2 -0
  34. data/lib/rom/sql/extensions/postgres.rb +3 -0
  35. data/lib/rom/sql/extensions/postgres/commands.rb +3 -1
  36. data/lib/rom/sql/extensions/postgres/type_builder.rb +6 -4
  37. data/lib/rom/sql/extensions/postgres/type_serializer.rb +2 -0
  38. data/lib/rom/sql/extensions/postgres/types.rb +2 -0
  39. data/lib/rom/sql/extensions/postgres/types/array.rb +6 -4
  40. data/lib/rom/sql/extensions/postgres/types/array_types.rb +3 -1
  41. data/lib/rom/sql/extensions/postgres/types/geometric.rb +2 -0
  42. data/lib/rom/sql/extensions/postgres/types/json.rb +13 -11
  43. data/lib/rom/sql/extensions/postgres/types/ltree.rb +25 -23
  44. data/lib/rom/sql/extensions/postgres/types/network.rb +2 -0
  45. data/lib/rom/sql/extensions/postgres/types/range.rb +2 -0
  46. data/lib/rom/sql/extensions/rails_log_subscriber.rb +2 -0
  47. data/lib/rom/sql/extensions/sqlite.rb +2 -0
  48. data/lib/rom/sql/extensions/sqlite/type_builder.rb +2 -0
  49. data/lib/rom/sql/extensions/sqlite/types.rb +2 -0
  50. data/lib/rom/sql/foreign_key.rb +3 -1
  51. data/lib/rom/sql/function.rb +14 -3
  52. data/lib/rom/sql/gateway.rb +6 -1
  53. data/lib/rom/sql/group_dsl.rb +2 -0
  54. data/lib/rom/sql/index.rb +2 -0
  55. data/lib/rom/sql/join_dsl.rb +2 -0
  56. data/lib/rom/sql/mapper_compiler.rb +2 -0
  57. data/lib/rom/sql/migration.rb +5 -3
  58. data/lib/rom/sql/migration/inline_runner.rb +2 -0
  59. data/lib/rom/sql/migration/migrator.rb +4 -2
  60. data/lib/rom/sql/migration/recorder.rb +2 -0
  61. data/lib/rom/sql/migration/runner.rb +4 -2
  62. data/lib/rom/sql/migration/schema_diff.rb +2 -0
  63. data/lib/rom/sql/migration/template.rb +2 -0
  64. data/lib/rom/sql/migration/writer.rb +12 -4
  65. data/lib/rom/sql/order_dsl.rb +2 -0
  66. data/lib/rom/sql/plugin/associates.rb +4 -2
  67. data/lib/rom/sql/plugin/nullify.rb +2 -0
  68. data/lib/rom/sql/plugin/pagination.rb +2 -0
  69. data/lib/rom/sql/plugins.rb +2 -0
  70. data/lib/rom/sql/projection_dsl.rb +3 -1
  71. data/lib/rom/sql/rake_task.rb +2 -0
  72. data/lib/rom/sql/relation.rb +3 -1
  73. data/lib/rom/sql/relation/reading.rb +6 -4
  74. data/lib/rom/sql/relation/writing.rb +2 -0
  75. data/lib/rom/sql/restriction_dsl.rb +9 -1
  76. data/lib/rom/sql/schema.rb +16 -2
  77. data/lib/rom/sql/schema/attributes_inferrer.rb +5 -3
  78. data/lib/rom/sql/schema/dsl.rb +3 -1
  79. data/lib/rom/sql/schema/index_dsl.rb +5 -2
  80. data/lib/rom/sql/schema/inferrer.rb +12 -8
  81. data/lib/rom/sql/schema/type_builder.rb +4 -2
  82. data/lib/rom/sql/spec/support.rb +5 -3
  83. data/lib/rom/sql/tasks/migration_tasks.rake +16 -11
  84. data/lib/rom/sql/transaction.rb +2 -0
  85. data/lib/rom/sql/type_dsl.rb +2 -0
  86. data/lib/rom/sql/type_extensions.rb +3 -1
  87. data/lib/rom/sql/type_serializer.rb +2 -0
  88. data/lib/rom/sql/types.rb +2 -0
  89. data/lib/rom/sql/version.rb +3 -1
  90. data/lib/rom/sql/wrap.rb +2 -0
  91. data/lib/rom/types/values.rb +2 -0
  92. 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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rom/commands'
2
4
 
3
5
  require 'rom/sql/commands/create'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rom/sql/commands/error_wrapper'
2
4
 
3
5
  module ROM
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rom/sql/commands/error_wrapper'
2
4
 
3
5
  module ROM
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ROM
2
4
  module SQL
3
5
  module Commands
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rom/sql/commands/error_wrapper'
2
4
 
3
5
  module ROM
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
- result = instance_exec(select_relations(block.parameters), &block)
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ROM
2
4
  module SQL
3
5
  class Error < StandardError
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'sequel/deprecated'
2
4
  require 'sequel/exceptions'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'dry/core/extensions'
2
4
 
3
5
  module ROM
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'sequel/database/logging'
2
4
  require 'active_support/notifications'
3
5
 
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rom/sql/extensions/mysql/type_builder'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rom/sql/schema/attributes_inferrer'
2
4
 
3
5
  module ROM
@@ -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.qualified_columns)
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
- ).to_set.freeze
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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ROM
2
4
  module SQL
3
5
  module Postgres
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'sequel/core'
2
4
 
3
5
  require 'rom/sql/type_extensions'
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'sequel/core'
2
4
 
3
- Sequel.extension(*%i(pg_array pg_array_ops))
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(type, expr, value)
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(type, expr)
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(type, expr, delimiter = '', null = nil)
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(db_type, member_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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ROM
2
4
  module SQL
3
5
  module Postgres
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'sequel/core'
2
4
  require 'singleton'
3
5
 
4
- Sequel.extension(*%i(pg_json pg_json_ops))
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(type, expr, *path)
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(type, expr, *path)
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, "wrong number of arguments (given 0, expected 1+)"
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(type, expr, value)
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(type, expr, value)
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(type, expr, 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(type, expr, *keys)
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(type, expr, *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(type, expr, value)
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(type, expr, *path)
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 = ["(".freeze, " @> ".freeze, ")".freeze].freeze
226
- FIND_ASCENDANT = ["(".freeze, " ?@> ".freeze, ")".freeze].freeze
227
- DESCENDANT = ["(".freeze, " <@ ".freeze, ")".freeze].freeze
228
- FIND_DESCENDANT = ["(".freeze, " ?<@ ".freeze, ")".freeze].freeze
229
- MATCH_ANY = ["(".freeze, " ? ".freeze, ")".freeze].freeze
230
- MATCH_ANY_LQUERY = ["(".freeze, " ?~ ".freeze, ")".freeze].freeze
231
- MATCH_LTEXTQUERY = ["(".freeze, " @ ".freeze, ")".freeze].freeze
232
- MATCH_ANY_LTEXTQUERY = ["(".freeze, " ?@ ".freeze, ")".freeze].freeze
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(type, expr, query)
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(type, expr, query)
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(type, expr, query)
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(type, expr, query)
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(type, expr, query)
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(type, expr, query)
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(type, expr, query)
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(type, expr, query)
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(type, expr, query)
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(type, expr, query)
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(type, expr, query)
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(type, expr, query)
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(type, expr, query)
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(type, expr, query)
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 +(type, expr, other)
318
+ def +(_type, expr, other)
317
319
  other_value = case other
318
320
  when ROM::Types::Values::TreePath
319
321
  other