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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/README.md +1 -2
  4. data/lib/rom/plugins/relation/sql/auto_restrictions.rb +4 -1
  5. data/lib/rom/plugins/relation/sql/instrumentation.rb +6 -2
  6. data/lib/rom/plugins/relation/sql/postgres/explain.rb +1 -1
  7. data/lib/rom/plugins/relation/sql/postgres/full_text_search.rb +31 -12
  8. data/lib/rom/plugins/relation/sql/postgres/streaming.rb +6 -6
  9. data/lib/rom/sql/associations/many_to_many.rb +6 -3
  10. data/lib/rom/sql/associations/many_to_one.rb +3 -0
  11. data/lib/rom/sql/attribute.rb +22 -8
  12. data/lib/rom/sql/attribute_aliasing.rb +7 -6
  13. data/lib/rom/sql/commands/create.rb +4 -3
  14. data/lib/rom/sql/commands/update.rb +4 -3
  15. data/lib/rom/sql/dsl.rb +3 -1
  16. data/lib/rom/sql/extensions/active_support_notifications.rb +1 -1
  17. data/lib/rom/sql/extensions/postgres/type_builder.rb +7 -7
  18. data/lib/rom/sql/extensions/postgres/type_serializer.rb +2 -2
  19. data/lib/rom/sql/extensions/postgres/types/geometric.rb +12 -12
  20. data/lib/rom/sql/extensions/postgres/types/json.rb +9 -3
  21. data/lib/rom/sql/extensions/postgres/types/ltree.rb +106 -36
  22. data/lib/rom/sql/extensions/postgres/types/range.rb +18 -18
  23. data/lib/rom/sql/extensions/rails_log_subscriber.rb +4 -4
  24. data/lib/rom/sql/function.rb +37 -18
  25. data/lib/rom/sql/gateway.rb +8 -7
  26. data/lib/rom/sql/group_dsl.rb +7 -2
  27. data/lib/rom/sql/migration/inline_runner.rb +8 -2
  28. data/lib/rom/sql/migration/migrator.rb +5 -5
  29. data/lib/rom/sql/migration/recorder.rb +10 -4
  30. data/lib/rom/sql/migration/runner.rb +5 -4
  31. data/lib/rom/sql/migration/schema_diff.rb +15 -10
  32. data/lib/rom/sql/migration/writer.rb +8 -8
  33. data/lib/rom/sql/migration.rb +5 -5
  34. data/lib/rom/sql/order_dsl.rb +6 -2
  35. data/lib/rom/sql/plugin/associates.rb +21 -7
  36. data/lib/rom/sql/plugin/pagination.rb +2 -2
  37. data/lib/rom/sql/projection_dsl.rb +1 -1
  38. data/lib/rom/sql/relation/reading.rb +83 -71
  39. data/lib/rom/sql/relation/writing.rb +19 -13
  40. data/lib/rom/sql/relation.rb +74 -28
  41. data/lib/rom/sql/restriction_dsl.rb +6 -2
  42. data/lib/rom/sql/schema/attributes_inferrer.rb +2 -2
  43. data/lib/rom/sql/schema/dsl.rb +2 -2
  44. data/lib/rom/sql/schema/index_dsl.rb +5 -6
  45. data/lib/rom/sql/schema/inferrer.rb +23 -19
  46. data/lib/rom/sql/schema/type_builder.rb +5 -2
  47. data/lib/rom/sql/schema.rb +10 -10
  48. data/lib/rom/sql/tasks/migration_tasks.rake +4 -5
  49. data/lib/rom/sql/transaction.rb +1 -0
  50. data/lib/rom/sql/type_dsl.rb +7 -3
  51. data/lib/rom/sql/type_extensions.rb +4 -4
  52. data/lib/rom/sql/type_serializer.rb +2 -2
  53. data/lib/rom/sql/types.rb +2 -2
  54. data/lib/rom/sql/version.rb +1 -1
  55. data/lib/rom/types/values.rb +2 -4
  56. metadata +9 -15
@@ -13,7 +13,7 @@ module ROM
13
13
 
14
14
  def call(changes)
15
15
  changes.each { |diff| apply_schema(diff) }
16
- changes.each { |diff| apply_constraints(diff) }
16
+ changes.each { |diff| apply_constraints(diff) } # rubocop:disable Style/CombinableLoops
17
17
 
18
18
  self
19
19
  end
@@ -54,6 +54,7 @@ module ROM
54
54
  end
55
55
  end
56
56
 
57
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
57
58
  def alter_table(diff)
58
59
  return if diff.meta?
59
60
 
@@ -68,9 +69,8 @@ module ROM
68
69
  when SchemaDiff::AttributeChanged
69
70
  if attribute.type_changed?
70
71
  from, to = attribute.current.unwrap, attribute.target.unwrap
71
- raise UnsupportedConversion.new(
72
- "Don't know how to convert #{from.inspect} to #{to.inspect}"
73
- )
72
+ raise UnsupportedConversion,
73
+ "Don't know how to convert #{from.inspect} to #{to.inspect}"
74
74
  end
75
75
 
76
76
  if attribute.nullability_changed?
@@ -94,6 +94,7 @@ module ROM
94
94
  end
95
95
  end
96
96
  end
97
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
97
98
 
98
99
  def alter_foreign_keys(diff, foreign_key_changes)
99
100
  return if foreign_key_changes.empty?
@@ -46,7 +46,6 @@ module ROM
46
46
  end
47
47
 
48
48
  class TableAltered < TableDiff
49
-
50
49
  option :attribute_changes, default: -> { EMPTY_ARRAY }
51
50
 
52
51
  option :index_changes, default: -> { EMPTY_ARRAY }
@@ -133,20 +132,22 @@ module ROM
133
132
  end
134
133
 
135
134
  class IndexAdded < IndexDiff
135
+ # rubocop:disable Metrics/AbcSize
136
136
  def options
137
137
  options = {}
138
- options[:name] = index.name if !index.name.nil?
138
+ options[:name] = index.name unless index.name.nil?
139
139
  options[:unique] = true if index.unique?
140
- options[:type] = index.type if !index.type.nil?
141
- options[:where] = index.predicate if !index.predicate.nil?
140
+ options[:type] = index.type unless index.type.nil?
141
+ options[:where] = index.predicate unless index.predicate.nil?
142
142
  options
143
143
  end
144
+ # rubocop:enable Metrics/AbcSize
144
145
  end
145
146
 
146
147
  class IndexRemoved < IndexDiff
147
148
  def options
148
149
  options = {}
149
- options[:name] = index.name if !index.name.nil?
150
+ options[:name] = index.name unless index.name.nil?
150
151
  options
151
152
  end
152
153
  end
@@ -177,6 +178,7 @@ module ROM
177
178
  class ForeignKeyRemoved < ForeignKeyDiff
178
179
  end
179
180
 
181
+ # rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/MethodLength
180
182
  def call(current, target)
181
183
  if current.empty?
182
184
  TableCreated.new(
@@ -203,21 +205,23 @@ module ROM
203
205
  end
204
206
  end
205
207
  end
208
+ # rubocop:enable Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/MethodLength
206
209
 
210
+ # rubocop:disable Style/MultilineBlockChain
207
211
  def compare_attributes(current, target)
208
212
  changed_attributes = target.select { |name, attr|
209
213
  current.key?(name) && !attributes_equal?(current[name], attr)
210
- }.map { |name, target_attr|
211
- [name, [target_attr, current[name]]]
212
- }.to_h
213
- added_attributes = target.select { |name, _| !current.key?(name) }
214
- removed_attributes = current.select { |name, _| !target.key?(name) }
214
+ }.to_h { |name, target_attr| [name, [target_attr, current[name]]] }
215
+ added_attributes = target.reject { |name, _| current.key?(name) }
216
+ removed_attributes = current.reject { |name, _| target.key?(name) }
215
217
 
216
218
  map_attributes(removed_attributes, AttributeRemoved) +
217
219
  map_attributes(added_attributes, AttributeAdded) +
218
220
  map_attributes(changed_attributes, AttributeChanged)
219
221
  end
222
+ # rubocop:enable Style/MultilineBlockChain
220
223
 
224
+ # rubocop:disable Metrics/AbcSize
221
225
  def compare_indexes(current, target)
222
226
  added_indexes = target.indexes.reject { |idx|
223
227
  current.indexes.any? { |curr_idx| curr_idx.attributes == idx.attributes }
@@ -229,6 +233,7 @@ module ROM
229
233
  removed_indexes.map { |idx| IndexRemoved.new(idx) } +
230
234
  added_indexes.map { |idx| IndexAdded.new(idx) }
231
235
  end
236
+ # rubocop:enable Metrics/AbcSize
232
237
 
233
238
  def compare_foreign_key_constraints(current, target)
234
239
  target_fks = target.foreign_keys
@@ -7,8 +7,8 @@ module ROM
7
7
  module Migration
8
8
  # @api private
9
9
  class Writer
10
- MIGRATION_BEGIN = "ROM::SQL.migration do\n change do".freeze
11
- MIGRATION_END = "\n end\nend\n".freeze
10
+ MIGRATION_BEGIN = "ROM::SQL.migration do\n change do"
11
+ MIGRATION_END = "\n end\nend\n"
12
12
 
13
13
  attr_reader :yield_migration
14
14
 
@@ -36,11 +36,11 @@ module ROM
36
36
  buffer << indent << op.to_s << ' '
37
37
  write_arguments(buffer, args)
38
38
 
39
- if !nested.empty?
40
- buffer << ' do'
41
- write(nested, buffer, indent + ' ')
42
- buffer << indent << 'end'
43
- end
39
+ next if nested.empty?
40
+
41
+ buffer << ' do'
42
+ write(nested, buffer, "#{indent} ")
43
+ buffer << indent << 'end'
44
44
  end
45
45
  end
46
46
 
@@ -61,7 +61,7 @@ module ROM
61
61
  create_or_alter, args = op
62
62
  table_name = args[0]
63
63
 
64
- "#{create_or_alter.to_s.sub('_table', '')}_#{table_name}"
64
+ "#{create_or_alter.to_s.sub("_table", "")}_#{table_name}"
65
65
  end
66
66
  end
67
67
  end
@@ -54,12 +54,12 @@ module ROM
54
54
  # @param [Symbol] gateway The gateway name, :default by default
55
55
  #
56
56
  # @api public
57
- def migration(*args, &block)
57
+ def migration(*args, &)
58
58
  if args.any?
59
59
  container, gateway, * = args
60
- with_gateway(container.gateways[gateway || :default]) { migration(&block) }
60
+ with_gateway(container.gateways[gateway || :default]) { migration(&) }
61
61
  else
62
- current_gateway.migration(&block)
62
+ current_gateway.migration(&)
63
63
  end
64
64
  end
65
65
 
@@ -121,8 +121,8 @@ module ROM
121
121
  # @see ROM::SQL.migration
122
122
  #
123
123
  # @api public
124
- def migration(&block)
125
- migrator.migration(&block)
124
+ def migration(&)
125
+ migrator.migration(&)
126
126
  end
127
127
 
128
128
  # Run migrations
@@ -8,12 +8,16 @@ module ROM
8
8
  class OrderDSL < DSL
9
9
  private
10
10
 
11
+ def respond_to_missing?(_meth, _include_private = false)
12
+ true
13
+ end
14
+
11
15
  # @api private
12
- def method_missing(meth, *args, &block)
16
+ def method_missing(meth, ...)
13
17
  if schema.key?(meth)
14
18
  schema[meth]
15
19
  else
16
- ::Sequel::VIRTUAL_ROW.__send__(meth.to_s.upcase, *args, &block)
20
+ ::Sequel::VIRTUAL_ROW.__send__(meth.to_s.upcase, ...)
17
21
  end
18
22
  end
19
23
  end
@@ -10,7 +10,11 @@ module ROM
10
10
  # @api private
11
11
  module Associates
12
12
  class AssociateOptions
13
- attr_reader :name, :assoc, :opts
13
+ attr_reader :name
14
+
15
+ attr_reader :assoc
16
+
17
+ attr_reader :opts
14
18
 
15
19
  # @api private
16
20
  def initialize(name, relation, opts)
@@ -37,7 +41,7 @@ module ROM
37
41
 
38
42
  defines :associations
39
43
 
40
- associations Hash.new
44
+ associations({})
41
45
 
42
46
  option :associations, default: -> { self.class.associations }
43
47
  option :configured_associations, default: -> { EMPTY_ARRAY }
@@ -57,16 +61,17 @@ module ROM
57
61
 
58
62
  associate_options = command.associations.map { |(name, opts)|
59
63
  next if configured_assocs.include?(name)
64
+
60
65
  AssociateOptions.new(name, relation, opts)
61
66
  }.compact
62
67
 
63
68
  before_hooks = associate_options.reject(&:after?).map(&:to_hash)
64
69
  after_hooks = associate_options.select(&:after?).map(&:to_hash)
65
70
 
66
- command.
67
- with(configured_associations: configured_assocs + associate_options.map(&:name)).
68
- before(*before_hooks).
69
- after(*after_hooks)
71
+ command
72
+ .with(configured_associations: configured_assocs + associate_options.map(&:name))
73
+ .before(*before_hooks)
74
+ .after(*after_hooks)
70
75
  end
71
76
 
72
77
  # Set command to associate tuples with a parent tuple using provided keys
@@ -109,7 +114,15 @@ module ROM
109
114
  # @return [Array<Hash>]
110
115
  #
111
116
  # @api public
112
- def associate(tuples, curried_parent = nil, assoc:, keys:, parent: curried_parent)
117
+ #
118
+ # rubocop:disable Metrics/PerceivedComplexity, Metrics/AbcSize
119
+ def associate(
120
+ tuples,
121
+ curried_parent = nil,
122
+ assoc:,
123
+ keys:, # rubocop:disable Lint/UnusedMethodArgument
124
+ parent: curried_parent
125
+ )
113
126
  result_type = result
114
127
 
115
128
  output_tuples =
@@ -137,6 +150,7 @@ module ROM
137
150
 
138
151
  result_type == :one ? output_tuples[0] : output_tuples
139
152
  end
153
+ # rubocop:enable Metrics/PerceivedComplexity, Metrics/AbcSize
140
154
 
141
155
  # Return a new command with the provided association
142
156
  #
@@ -53,7 +53,7 @@ module ROM
53
53
  # @api public
54
54
  def prev_page
55
55
  num = current_page - 1
56
- num if num > 0
56
+ num if num.positive?
57
57
  end
58
58
 
59
59
  # Return total number of tuples
@@ -100,7 +100,7 @@ module ROM
100
100
  per_page = per_page.to_i
101
101
 
102
102
  self.class.new(
103
- dataset.offset((current_page-1)*per_page).limit(per_page),
103
+ dataset.offset((current_page - 1) * per_page).limit(per_page),
104
104
  current_page: current_page, per_page: per_page
105
105
  )
106
106
  end
@@ -49,7 +49,7 @@ module ROM
49
49
  private
50
50
 
51
51
  # @api private
52
- def method_missing(meth, *args, &block)
52
+ def method_missing(meth, *args, &)
53
53
  if schema.key?(meth)
54
54
  schema[meth]
55
55
  else
@@ -9,20 +9,22 @@ module ROM
9
9
  # Query API for SQL::Relation
10
10
  #
11
11
  # @api public
12
+ #
13
+ # rubocop:disable Metrics/ModuleLength
12
14
  module Reading
13
15
  # Row-level lock modes
14
- ROW_LOCK_MODES = Hash.new({ update: "FOR UPDATE" }).update(
16
+ ROW_LOCK_MODES = Hash.new({ update: 'FOR UPDATE' }).update(
15
17
  # https://www.postgresql.org/docs/current/static/sql-select.html#SQL-FOR-UPDATE-SHARE
16
18
  postgres: {
17
- update: 'FOR UPDATE'.freeze,
18
- no_key_update: 'FOR NO KEY UPDATE'.freeze,
19
- share: 'FOR SHARE'.freeze,
20
- key_share: 'FOR KEY SHARE'.freeze
19
+ update: 'FOR UPDATE',
20
+ no_key_update: 'FOR NO KEY UPDATE',
21
+ share: 'FOR SHARE',
22
+ key_share: 'FOR KEY SHARE'
21
23
  },
22
24
  # https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html
23
25
  mysql: {
24
- update: 'FOR UPDATE'.freeze,
25
- share: 'LOCK IN SHARE MODE'.freeze
26
+ update: 'FOR UPDATE',
27
+ share: 'LOCK IN SHARE MODE'
26
28
  }
27
29
  ).freeze
28
30
 
@@ -140,11 +142,11 @@ module ROM
140
142
  # from tuples
141
143
  #
142
144
  # @api public
143
- def map(key = nil, &block)
145
+ def map(key = nil, &)
144
146
  if key
145
- dataset.map(key, &block)
147
+ dataset.map(key, &)
146
148
  else
147
- dataset.map(&block)
149
+ dataset.map(&)
148
150
  end
149
151
  end
150
152
 
@@ -235,8 +237,8 @@ module ROM
235
237
  # @return [Relation]
236
238
  #
237
239
  # @api public
238
- def select(*args, &block)
239
- schema.project(*args, &block).(self)
240
+ def select(...)
241
+ schema.project(...).(self)
240
242
  end
241
243
  alias_method :project, :select
242
244
 
@@ -247,8 +249,8 @@ module ROM
247
249
  # @return [Relation]
248
250
  #
249
251
  # @api public
250
- def select_append(*args, &block)
251
- schema.merge(schema.canonical.project(*args, &block)).(self)
252
+ def select_append(...)
253
+ schema.merge(schema.canonical.project(...)).(self)
252
254
  end
253
255
 
254
256
  # Returns a copy of the relation with a SQL DISTINCT clause.
@@ -271,8 +273,8 @@ module ROM
271
273
  # @return [Relation]
272
274
  #
273
275
  # @api public
274
- def distinct(*args, &block)
275
- new(dataset.__send__(__method__, *args, &block))
276
+ def distinct(...)
277
+ new(dataset.__send__(__method__, ...))
276
278
  end
277
279
 
278
280
  # Returns a result of SQL SUM clause.
@@ -359,9 +361,9 @@ module ROM
359
361
  # @return [Relation]
360
362
  #
361
363
  # @api public
362
- def where(*args, &block)
363
- if block
364
- where(*args).where(schema.canonical.restriction(&block))
364
+ def where(*args, &)
365
+ if block_given?
366
+ where(*args).where(schema.canonical.restriction(&))
365
367
  elsif args.size == 1 && args[0].is_a?(Hash)
366
368
  new(dataset.where(coerce_conditions(args[0])))
367
369
  elsif !args.empty?
@@ -381,8 +383,8 @@ module ROM
381
383
  # @return [Relation]
382
384
  #
383
385
  # @api public
384
- def exclude(*args, &block)
385
- new(dataset.__send__(__method__, *args, &block))
386
+ def exclude(...)
387
+ new(dataset.__send__(__method__, ...))
386
388
  end
387
389
 
388
390
  # Restrict a relation to match grouping criteria
@@ -418,9 +420,9 @@ module ROM
418
420
  # @return [Relation]
419
421
  #
420
422
  # @api public
421
- def having(*args, &block)
422
- if block
423
- new(dataset.having(*args, *schema.canonical.restriction(&block)))
423
+ def having(*args, &)
424
+ if block_given?
425
+ new(dataset.having(*args, *schema.canonical.restriction(&)))
424
426
  else
425
427
  new(dataset.__send__(__method__, *args))
426
428
  end
@@ -473,11 +475,11 @@ module ROM
473
475
  # @return [Relation]
474
476
  #
475
477
  # @api public
476
- def order(*args, &block)
477
- if block
478
- new(dataset.order(*args, *schema.canonical.order(&block)))
478
+ def order(*args, &)
479
+ if block_given?
480
+ new(dataset.order(*args, *schema.canonical.order(&)))
479
481
  else
480
- new(dataset.__send__(__method__, *args, &block))
482
+ new(dataset.__send__(__method__, *args, &))
481
483
  end
482
484
  end
483
485
 
@@ -501,8 +503,8 @@ module ROM
501
503
  # @return [Relation]
502
504
  #
503
505
  # @api public
504
- def reverse(*args, &block)
505
- new(dataset.__send__(__method__, *args, &block))
506
+ def reverse(...)
507
+ new(dataset.__send__(__method__, ...))
506
508
  end
507
509
 
508
510
  # Limit a relation to a specific number of tuples
@@ -590,8 +592,8 @@ module ROM
590
592
  # @return [Relation]
591
593
  #
592
594
  # @api public
593
- def join(*args, &block)
594
- __join__(__method__, *args, &block)
595
+ def join(...)
596
+ __join__(__method__, ...)
595
597
  end
596
598
  alias_method :inner_join, :join
597
599
 
@@ -640,8 +642,8 @@ module ROM
640
642
  # @return [Relation]
641
643
  #
642
644
  # @api public
643
- def left_join(*args, &block)
644
- __join__(__method__, *args, &block)
645
+ def left_join(...)
646
+ __join__(__method__, ...)
645
647
  end
646
648
 
647
649
  # Join with another relation using RIGHT JOIN
@@ -689,8 +691,8 @@ module ROM
689
691
  # @return [Relation]
690
692
  #
691
693
  # @api public
692
- def right_join(*args, &block)
693
- __join__(__method__, *args, &block)
694
+ def right_join(...)
695
+ __join__(__method__, ...)
694
696
  end
695
697
 
696
698
  # Group by specific columns
@@ -722,12 +724,12 @@ module ROM
722
724
  # @return [Relation]
723
725
  #
724
726
  # @api public
725
- def group(*args, &block)
726
- if block
727
- if args.size > 0
728
- group(*args).group_append(&block)
727
+ def group(*args, &)
728
+ if block_given?
729
+ if args.size.positive?
730
+ group(*args).group_append(&)
729
731
  else
730
- new(dataset.__send__(__method__, *schema.canonical.group(&block)))
732
+ new(dataset.__send__(__method__, *schema.canonical.group(&)))
731
733
  end
732
734
  else
733
735
  new(dataset.__send__(__method__, *schema.canonical.project(*args)))
@@ -761,12 +763,12 @@ module ROM
761
763
  # @return [Relation]
762
764
  #
763
765
  # @api public
764
- def group_append(*args, &block)
765
- if block
766
- if args.size > 0
767
- group_append(*args).group_append(&block)
766
+ def group_append(*args, &)
767
+ if block_given?
768
+ if args.size.positive?
769
+ group_append(*args).group_append(&)
768
770
  else
769
- new(dataset.group_append(*schema.canonical.group(&block)))
771
+ new(dataset.group_append(*schema.canonical.group(&)))
770
772
  end
771
773
  else
772
774
  new(dataset.group_append(*args))
@@ -784,8 +786,8 @@ module ROM
784
786
  # @return [Relation]
785
787
  #
786
788
  # @api public
787
- def group_and_count(*args, &block)
788
- new(dataset.__send__(__method__, *args, &block))
789
+ def group_and_count(...)
790
+ new(dataset.__send__(__method__, ...))
789
791
  end
790
792
 
791
793
  # Select and group by specific columns
@@ -799,8 +801,8 @@ module ROM
799
801
  # @return [Relation]
800
802
  #
801
803
  # @api public
802
- def select_group(*args, &block)
803
- new_schema = schema.project(*args, &block)
804
+ def select_group(...)
805
+ new_schema = schema.project(...)
804
806
  new_schema.(self).group(*new_schema)
805
807
  end
806
808
 
@@ -813,14 +815,17 @@ module ROM
813
815
  # @param [Relation] relation Another relation
814
816
  #
815
817
  # @param [Hash] options Options for union
816
- # @option options [Symbol] :alias Use the given value as the #from_self alias
817
- # @option options [TrueClass, FalseClass] :all Set to true to use UNION ALL instead of UNION, so duplicate rows can occur
818
- # @option options [TrueClass, FalseClass] :from_self Set to false to not wrap the returned dataset in a #from_self, use with care.
818
+ # @option options [Symbol] :alias
819
+ # Use the given value as the #from_self alias
820
+ # @option options [true, false] :all
821
+ # Set to true to use UNION ALL instead of UNION, so duplicate rows can occur
822
+ # @option options [true, false] :from_self
823
+ # Set to false to not wrap the returned dataset in a #from_self, use with care.
819
824
  #
820
825
  # @returRelation]
821
826
  #
822
827
  # @api public
823
- def union(relation, options = EMPTY_HASH, &block)
828
+ def union(relation, options = EMPTY_HASH, &)
824
829
  # We use the original relation name here if both relations have the
825
830
  # same name. This makes it so if the user at some point references
826
831
  # the relation directly by name later on things won't break in
@@ -830,7 +835,7 @@ module ROM
830
835
  opts = { alias: alias_name.to_sym, **options }
831
836
 
832
837
  new_schema = schema.qualified(opts[:alias])
833
- new_schema.(new(dataset.__send__(__method__, relation.dataset, opts, &block)))
838
+ new_schema.(new(dataset.__send__(__method__, relation.dataset, opts, &)))
834
839
  end
835
840
 
836
841
  # Checks whether a relation has at least one tuple
@@ -848,8 +853,8 @@ module ROM
848
853
  # @return [TrueClass, FalseClass]
849
854
  #
850
855
  # @api public
851
- def exist?(*args, &block)
852
- !where(*args, &block).limit(1).count.zero?
856
+ def exist?(...)
857
+ !where(...).limit(1).count.zero?
853
858
  end
854
859
 
855
860
  # Return if a restricted relation has 0 tuples
@@ -905,12 +910,12 @@ module ROM
905
910
  # @yieldparam relation [Array]
906
911
  #
907
912
  # @api public
908
- def lock(**options, &block)
913
+ def lock(**options, &)
909
914
  clause = lock_clause(**options)
910
915
 
911
- if block
916
+ if block_given?
912
917
  transaction do
913
- block.call(dataset.lock_style(clause).to_a)
918
+ yield(dataset.lock_style(clause).to_a)
914
919
  end
915
920
  else
916
921
  new(dataset.lock_style(clause))
@@ -1050,7 +1055,7 @@ module ROM
1050
1055
  stmt << ' OF ' << Array(of).join(', ') if of
1051
1056
 
1052
1057
  if skip_locked
1053
- raise ArgumentError, 'SKIP LOCKED cannot be used with (NO)WAIT clause' if !wait.nil?
1058
+ raise ArgumentError, 'SKIP LOCKED cannot be used with (NO)WAIT clause' unless wait.nil?
1054
1059
 
1055
1060
  stmt << ' SKIP LOCKED'
1056
1061
  else
@@ -1068,6 +1073,8 @@ module ROM
1068
1073
  # Apply input types to condition values
1069
1074
  #
1070
1075
  # @api private
1076
+ #
1077
+ # rubocop:disable Metrics/AbcSize
1071
1078
  def coerce_conditions(conditions)
1072
1079
  conditions.each_with_object({}) { |(k, v), h|
1073
1080
  if k.is_a?(Symbol) && schema.canonical.key?(k)
@@ -1080,25 +1087,28 @@ module ROM
1080
1087
  end
1081
1088
  }
1082
1089
  end
1090
+ # rubocop:enable Metrics/AbcSize
1083
1091
 
1084
1092
  # Common join method used by other join methods
1085
1093
  #
1086
1094
  # @api private
1087
- def __join__(type, other, join_cond = EMPTY_HASH, opts = EMPTY_HASH, &block)
1095
+ #
1096
+ # rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/MethodLength, Metrics/CyclomaticComplexity
1097
+ def __join__(type, other, join_cond = EMPTY_HASH, opts = EMPTY_HASH, &)
1088
1098
  if other.is_a?(Symbol) || other.is_a?(ROM::Relation::Name)
1089
- if join_cond.equal?(EMPTY_HASH) && !block
1099
+ if join_cond.equal?(EMPTY_HASH) && !block_given?
1090
1100
  assoc = associations[other]
1091
1101
  assoc.join(type, self)
1092
- elsif block
1093
- __join__(type, other, JoinDSL.new(schema).(&block), opts)
1102
+ elsif block_given?
1103
+ __join__(type, other, JoinDSL.new(schema).(&), opts)
1094
1104
  else
1095
- new(dataset.__send__(type, other.to_sym, join_cond, opts, &block))
1105
+ new(dataset.__send__(type, other.to_sym, join_cond, opts, &))
1096
1106
  end
1097
- elsif other.is_a?(Sequel::SQL::AliasedExpression)
1098
- new(dataset.__send__(type, other, join_cond, opts, &block))
1107
+ elsif other.is_a?(::Sequel::SQL::AliasedExpression)
1108
+ new(dataset.__send__(type, other, join_cond, opts, &))
1099
1109
  elsif other.respond_to?(:name) && other.name.is_a?(Relation::Name)
1100
- if block
1101
- join_cond = JoinDSL.new(schema).(&block)
1110
+ if block_given?
1111
+ join_cond = JoinDSL.new(schema).(&)
1102
1112
 
1103
1113
  if other.name.aliaz
1104
1114
  join_opts = { table_alias: other.name.aliaz }
@@ -1111,10 +1121,12 @@ module ROM
1111
1121
  associations[other.name.key].join(type, self, other)
1112
1122
  end
1113
1123
  else
1114
- raise ArgumentError, "+other+ must be either a symbol or a relation, #{other.class} given"
1124
+ raise ArgumentError,
1125
+ "+other+ must be either a symbol or a relation, #{other.class} given"
1115
1126
  end
1116
1127
  end
1117
1128
  end
1129
+ # rubocop:enable Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/ModuleLength
1118
1130
  end
1119
1131
  end
1120
1132
  end