activerecord-updateinbulk 0.3.0 → 0.3.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5b333b357426d210ed69dfa18de2f7f77ae8088e9fc47819198118f22f7647fc
4
- data.tar.gz: 96eb8a466eb413735de1e1ed4e80dbbc18402b356b5870d9b24b92826828b425
3
+ metadata.gz: c5130d637025d39db5e0eab8ecb59b22252decd67a56a089c7e1a749ac70385f
4
+ data.tar.gz: 44dbf800efb3d5b0e4d405864cf1ed0e2c3e87d461c10a72cf03513aa6878c5e
5
5
  SHA512:
6
- metadata.gz: 7a9ff7817a67baf305cd391c855e7607b7adc4c756abadf8d11bba119ad137bd378e83841e80dacaa0abe8265cd3c6d432f58faa4029608fe783c3ab410b7b14
7
- data.tar.gz: b71a70301fa255f1c52ae9472b6cce357b2d8f10313226398e74294af0a76179b04383d3d2c5fa52b82fa05dc5dd3581fe4da0330414c1394d8ab900dd4863e9
6
+ metadata.gz: 02f007dd0c1c2a9f46f48a414bbe352598c0b7a36793f71070e63e7160c4decc01db790c727f90882a40fc302a7b486608548908b8c4ad996d1b858ff998220f
7
+ data.tar.gz: a54913d72fe2bed929e7676e2cf09d39bd589519529eb7576f1833108f77984072645829b453333968a2d4eca90f455493260970ee8e937929e0a00ed46fdc4f
data/.yardopts ADDED
@@ -0,0 +1,8 @@
1
+ --quiet
2
+ lib/activerecord-updateinbulk/relation.rb
3
+ lib/activerecord-updateinbulk/adapters/abstract_adapter.rb
4
+ lib/activerecord-updateinbulk/arel/nodes/values_table.rb
5
+ lib/activerecord-updateinbulk/railtie.rb
6
+ lib/activerecord-updateinbulk/version.rb
7
+ -
8
+ README.md
@@ -21,7 +21,7 @@ module ActiveRecord::UpdateInBulk
21
21
  end
22
22
 
23
23
  # Whether VALUES table serialization must always include explicit column
24
- # aliases (because defaults are missing or not statically known).
24
+ # aliases because there are no default names. This is a mariadb quirk.
25
25
  def values_table_requires_aliasing?
26
26
  false
27
27
  end
@@ -44,10 +44,15 @@ module ActiveRecord::UpdateInBulk
44
44
  # possibly modified in place.
45
45
  #
46
46
  # The default implementation does no explicit type casting.
47
- def typecast_values_table(values_table, _columns)
47
+ def typecast_values_table(values_table, columns)
48
48
  values_table
49
49
  end
50
50
  end
51
51
  end
52
52
 
53
53
  ActiveRecord::ConnectionAdapters::AbstractAdapter.include(ActiveRecord::UpdateInBulk::AbstractAdapter)
54
+
55
+ # @!parse
56
+ # class ActiveRecord::ConnectionAdapters::AbstractAdapter
57
+ # include ActiveRecord::UpdateInBulk::AbstractAdapter
58
+ # end
@@ -3,7 +3,7 @@
3
3
  require "active_record/connection_adapters/abstract_mysql_adapter"
4
4
 
5
5
  module ActiveRecord::UpdateInBulk
6
- module AbstractMysqlAdapter
6
+ module AbstractMysqlAdapter # :nodoc: all
7
7
  def supports_values_tables?
8
8
  mariadb? ? database_version >= "10.3.3" : database_version >= "8.0.19"
9
9
  end
@@ -3,7 +3,7 @@
3
3
  require "active_record/connection_adapters/postgresql_adapter"
4
4
 
5
5
  module ActiveRecord::UpdateInBulk
6
- module PostgreSQLAdapter
6
+ module PostgreSQLAdapter # :nodoc: all
7
7
  SAFE_TYPES_FOR_VALUES_TABLE = [:integer, :string, :text, :boolean].freeze
8
8
 
9
9
 
@@ -3,7 +3,7 @@
3
3
  require "active_record/connection_adapters/sqlite3_adapter"
4
4
 
5
5
  module ActiveRecord::UpdateInBulk
6
- module SQLite3Adapter
6
+ module SQLite3Adapter # :nodoc: all
7
7
  end
8
8
  end
9
9
 
@@ -1,10 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Arel::Nodes
4
- # Represents a SQL VALUES table constructor as an Arel node.
5
- # Mirrors Arel::Table behavior by requiring a name at construction time.
6
- # Column names are also required because adapter defaults vary; obtain
7
- # defaults through <tt>connection.values_table_default_column_names(width)</tt>.
4
+ # Represents the +VALUES+ table constructor as an Arel node.
5
+ # Mirrors +Arel::Table+ behavior by requiring a name at construction time.
6
+ # Column names are also required because adapter defaults vary; prefer using the
7
+ # default names from <tt>connection.values_table_default_column_names(width)</tt>
8
+ # to keep the generated query simple.
9
+ #
10
+ # This is a private class that may be used by typecasting logic in custom adapters.
8
11
  #
9
12
  class ValuesTable < Arel::Nodes::Node
10
13
  attr_reader :name, :width, :rows, :columns
@@ -35,7 +38,9 @@ module Arel::Nodes
35
38
  Arel::Nodes::TableAlias.new(grouping(self), table)
36
39
  end
37
40
 
38
- delegate :to_cte, to: :alias
41
+ def to_cte
42
+ self.alias.to_cte
43
+ end
39
44
 
40
45
  def hash
41
46
  [@name, @rows, @columns].hash
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecord::UpdateInBulk
4
- module SelectManager # :nodoc:
4
+ module SelectManager # :nodoc: all
5
5
  def alias(name) # :nodoc:
6
6
  Arel::Nodes::TableAlias.new(self, name)
7
7
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecord::UpdateInBulk
4
- module ToSql
4
+ module ToSql # :nodoc: all
5
5
  def visit_Arel_Nodes_ValuesTable(o, collector)
6
6
  row_prefix = @connection.values_table_row_prefix
7
7
 
@@ -19,15 +19,15 @@ module ActiveRecord
19
19
  require_adapter connection_pool.db_config.adapter
20
20
  end
21
21
 
22
- def self.register_formula(name, &formula)
22
+ def self.register_formula(name, &formula) # :nodoc:
23
23
  Builder.register_formula(name, &formula)
24
24
  end
25
25
 
26
- def self.unregister_formula(name)
26
+ def self.unregister_formula(name) # :nodoc:
27
27
  Builder.unregister_formula(name)
28
28
  end
29
29
 
30
- def self.registered_formula?(name)
30
+ def self.registered_formula?(name) # :nodoc:
31
31
  Builder.registered_formula?(name)
32
32
  end
33
33
  end
@@ -43,7 +43,7 @@ require "activerecord-updateinbulk/querying"
43
43
  require "activerecord-updateinbulk/adapters/abstract_adapter"
44
44
 
45
45
  module ActiveRecord::UpdateInBulk
46
- module ConnectionHandler # :nodoc:
46
+ module ConnectionHandler # :nodoc: all
47
47
  def establish_connection(*args, **kwargs, &block) # :nodoc:
48
48
  pool = super(*args, **kwargs, &block)
49
49
  ActiveRecord::UpdateInBulk.load_from_connection_pool pool
@@ -3,7 +3,7 @@
3
3
  require "active_support/core_ext/enumerable"
4
4
 
5
5
  module ActiveRecord::UpdateInBulk
6
- class Builder # :nodoc:
6
+ class Builder # :nodoc: all
7
7
  SAFE_COMPARISON_TYPES = [:boolean, :string, :text, :integer, :float, :decimal].freeze
8
8
 
9
9
  class << self
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecord::UpdateInBulk
4
- module Querying # :nodoc:
4
+ module Querying # :nodoc: all
5
5
  def update_in_bulk(...) # :nodoc:
6
6
  all.update_in_bulk(...)
7
7
  end
@@ -15,16 +15,15 @@ module ActiveRecord
15
15
  # Rails.application.config.active_record_update_in_bulk.ignore_scope_order = true
16
16
  #
17
17
  # [config.active_record_update_in_bulk.values_table_alias]
18
- # Optional string alias to use for the generated VALUES table.
19
- # Defaults to <tt>"t"</tt>.
18
+ # Table alias for the generated +VALUES+ table. Defaults to <tt>"t"</tt>.
20
19
  #
21
20
  # [config.active_record_update_in_bulk.ignore_scope_order]
22
- # Whether <tt>Relation#update_in_bulk</tt> should ignore any ORDER BY scope
23
- # on the input relation. Necessary for invoking the method on scope-ordered
24
- # associations, or models with a default scope that includes an order.
21
+ # Whether <tt>Relation#update_in_bulk</tt> should ignore any +ORDER BY+ scope
22
+ # on the input relation. Necessary for invoking the method casually on scope
23
+ # ordered associations, or models with a default scope that includes an order.
25
24
  #
26
- # * <tt>true</tt> (default): ORDER BY scopes are stripped.
27
- # * <tt>false</tt>: ordered relations raise NotImplementedError.
25
+ # * <tt>true</tt> (default): +ORDER BY+ clause is stripped.
26
+ # * <tt>false</tt>: ordered relations raise +NotImplementedError+.
28
27
  class Railtie < Rails::Railtie
29
28
  config.active_record_update_in_bulk = ActiveSupport::OrderedOptions.new
30
29
  config.active_record_update_in_bulk.ignore_scope_order = true
@@ -3,14 +3,14 @@
3
3
  module ActiveRecord::UpdateInBulk
4
4
  module Relation
5
5
  # Updates multiple groups of records in the current relation using a single
6
- # SQL UPDATE statement. This does not instantiate models and does not
6
+ # SQL +UPDATE+ statement. This does not instantiate models and does not
7
7
  # trigger Active Record callbacks or validations. However, values passed
8
8
  # through still use Active Record's normal type casting and serialization.
9
9
  # Returns the number of rows affected.
10
10
  #
11
- # Three equivalent input formats are supported:
11
+ # Three equivalent input formats are supported for convenience:
12
12
  #
13
- # *Indexed format* — a hash mapping primary keys to attribute updates:
13
+ # <b>Indexed format</b> — a hash mapping primary keys to attribute updates:
14
14
  #
15
15
  # Book.update_in_bulk({
16
16
  # 1 => { title: "Agile", price: 10.0 },
@@ -24,7 +24,7 @@ module ActiveRecord::UpdateInBulk
24
24
  # ["AA100", "12B"] => { passenger: "Bob" }
25
25
  # })
26
26
  #
27
- # *Paired format* — an array of <tt>[conditions, assigns]</tt> pairs.
27
+ # <b>Paired format</b> — an array of <tt>[conditions, assigns]</tt> pairs.
28
28
  # Conditions do not need to be primary keys; they may reference any columns in
29
29
  # the target table. All pairs must specify the same set of condition
30
30
  # columns:
@@ -34,7 +34,7 @@ module ActiveRecord::UpdateInBulk
34
34
  # [{ department: "Engineering" }, { bonus: 500 }]
35
35
  # ])
36
36
  #
37
- # *Separated format* — parallel arrays of conditions and assigns:
37
+ # <b>Separated format</b> — parallel arrays of conditions and assigns:
38
38
  #
39
39
  # Employee.update_in_bulk(
40
40
  # [1, 2, { id: 3 }],
@@ -90,6 +90,12 @@ module ActiveRecord::UpdateInBulk
90
90
  # 2 => { department: "Sales" }
91
91
  # })
92
92
  #
93
+ # ==== Restrictions
94
+ #
95
+ # This method does not support relations with <tt>offset</tt>, <tt>limit</tt>,
96
+ # <tt>group</tt>, or <tt>having</tt> clauses. An <tt>order</tt> clause is supported
97
+ # by default <b>by being stripped</b> to keep the method usable on ordered associations.
98
+ #
93
99
  def update_in_bulk(updates, values = nil, record_timestamps: nil, formulas: nil)
94
100
  unless limit_value.nil? && offset_value.nil? && group_values.empty? && having_clause.empty?
95
101
  raise NotImplementedError, "No support to update relations with offset, limit, group, or having clauses"
@@ -137,3 +143,8 @@ module ActiveRecord::UpdateInBulk
137
143
  end
138
144
 
139
145
  ActiveRecord::Relation.prepend(ActiveRecord::UpdateInBulk::Relation)
146
+
147
+ # @!parse
148
+ # class ActiveRecord::Relation
149
+ # include ActiveRecord::UpdateInBulk::Relation
150
+ # end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module ActiveRecord
4
4
  module UpdateInBulk
5
- VERSION = "0.3.0"
5
+ VERSION = "0.3.1"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-updateinbulk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bruno Carvalho
@@ -31,6 +31,7 @@ executables: []
31
31
  extensions: []
32
32
  extra_rdoc_files: []
33
33
  files:
34
+ - ".yardopts"
34
35
  - LICENSE
35
36
  - README.md
36
37
  - lib/activerecord-updateinbulk.rb