activerecord_batch_update 0.0.3 → 1.0.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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/activerecord_batch_update.rb +17 -16
  3. metadata +19 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 614292d3e09e070b8d7aff48134d8cee8104dc9f00e96e9deb33b0195bf04858
4
- data.tar.gz: 2c4f608cea0f5ae569c76df93c3f3aafed9bc0911c13253d7a2cb02b9c24332d
3
+ metadata.gz: 50b4507c159f1ec1b11cbfa30dce6453f649c982ba187005d07ea1dc23a9fe2e
4
+ data.tar.gz: 63fdc96640767eb839d7bf273f27f98a430b32bbb4867f6fa18388e201de0c65
5
5
  SHA512:
6
- metadata.gz: d5be0abbf08a712b5b5a138b15e37928b9b50c138851651877ac56837f18b884e82b226eaa1c96c1dd1198c8c017bd665c3ac57b6c7e78ecbbfb70f8d0f22443
7
- data.tar.gz: ba349d81455f2908dbcddff5da11c4016b8660e13af081dcdfd4cfd55043c35b73b22bd6e221f95638eb6a23e45a6042ae310e8b38de85f7d73e20bf9a677ea8
6
+ metadata.gz: 7b09b57b5b1d88a255bd6378bcfbd17b8ab6ccd6f9fc7cee424512d0fb6681042cd81abf1008d2d173c246613799ef921db8c41d0e64b3b0c85abf8ef7867b50
7
+ data.tar.gz: c07da811c67f422f180e57af83cf9bd98373c31b794ca16284c1b3fb095cce86076251d5c944ea3237a52802df1851e9d5881c18ff4a4c08cd9b479eedcc9c4c
@@ -35,6 +35,7 @@ module ActiveRecordBatchUpdate
35
35
  end
36
36
 
37
37
  connection.clear_query_cache if connection.query_cache_enabled
38
+ entries.each { _1.clear_attribute_changes(columns) }
38
39
 
39
40
  updated_count
40
41
  end
@@ -45,15 +46,15 @@ module ActiveRecordBatchUpdate
45
46
  entries.map(&:stringify_keys).group_by { _1.keys.sort! }.sort.flat_map do |(keys, items)|
46
47
  next [] if keys.empty?
47
48
 
48
- where_clause = where_statement(update_on)
49
- update_clause = update_statement(keys - update_on)
49
+ where_clause = batch_update_where_statement(update_on)
50
+ update_clause = batch_update_statement(keys - update_on)
50
51
 
51
52
  items.each_slice(batch_size).map do |slice|
52
53
  [
53
- "WITH \"#{cte_table.name}\" (#{keys.join(', ')})",
54
- "AS ( #{values_statement(slice, keys)} )",
54
+ "WITH \"#{batch_update_table.name}\" (#{keys.join(', ')})",
55
+ "AS ( #{batch_update_values_statement(slice, keys)} )",
55
56
  update_clause,
56
- "FROM \"#{cte_table.name}\"",
57
+ "FROM \"#{batch_update_table.name}\"",
57
58
  "WHERE #{where_clause}"
58
59
  ].join(' ')
59
60
  end
@@ -62,22 +63,22 @@ module ActiveRecordBatchUpdate
62
63
 
63
64
  private
64
65
 
65
- def cte_table
66
- @cte_table ||= Arel::Table.new('batch_updates')
66
+ def batch_update_table
67
+ @batch_update_table ||= Arel::Table.new('batch_updates')
67
68
  end
68
69
 
69
- def values_statement(items, cols)
70
+ def batch_update_values_statement(items, cols)
70
71
  first, *rest = items
71
72
 
72
73
  rows = [
73
- values_list_casted_item(first, cols),
74
- *rest.map { values_list_other_item(_1, cols) }
74
+ batch_update_casted_item(first, cols),
75
+ *rest.map { batch_update_quoted_item(_1, cols) }
75
76
  ]
76
77
 
77
78
  "VALUES #{rows.map { "(#{_1.map(&:to_sql).join(', ')})" }.join(', ')}"
78
79
  end
79
80
 
80
- def values_list_casted_item(item, cols)
81
+ def batch_update_casted_item(item, cols)
81
82
  cols.map do |col|
82
83
  Arel::Nodes::NamedFunction.new(
83
84
  'CAST',
@@ -88,27 +89,27 @@ module ActiveRecordBatchUpdate
88
89
  end
89
90
  end
90
91
 
91
- def values_list_other_item(item, cols)
92
+ def batch_update_quoted_item(item, cols)
92
93
  cols.map do |col|
93
94
  Arel::Nodes.build_quoted(item[col], arel_table[col])
94
95
  end
95
96
  end
96
97
 
97
- def update_statement(cols)
98
+ def batch_update_statement(cols)
98
99
  Arel::UpdateManager.new(arel_table).tap do |um|
99
100
  um.set(
100
101
  cols.map do |col|
101
102
  [
102
103
  arel_table[col],
103
- cte_table[col]
104
+ batch_update_table[col]
104
105
  ]
105
106
  end
106
107
  )
107
108
  end.to_sql
108
109
  end
109
110
 
110
- def where_statement(primary_keys)
111
- primary_keys.map { arel_table[_1].eq(cte_table[_1]) }.reduce(:and).to_sql
111
+ def batch_update_where_statement(primary_keys)
112
+ primary_keys.map { arel_table[_1].eq(batch_update_table[_1]) }.reduce(:and).to_sql
112
113
  end
113
114
  end
114
115
  end
metadata CHANGED
@@ -1,43 +1,54 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord_batch_update
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Quentin de Metz
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-10-19 00:00:00.000000000 Z
10
+ date: 2025-06-03 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: activerecord
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
- - - "~>"
16
+ - - ">="
18
17
  - !ruby/object:Gem::Version
19
18
  version: '7.0'
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '8.1'
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
23
25
  requirements:
24
- - - "~>"
26
+ - - ">="
25
27
  - !ruby/object:Gem::Version
26
28
  version: '7.0'
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '8.1'
27
32
  - !ruby/object:Gem::Dependency
28
33
  name: activesupport
29
34
  requirement: !ruby/object:Gem::Requirement
30
35
  requirements:
31
- - - "~>"
36
+ - - ">="
32
37
  - !ruby/object:Gem::Version
33
38
  version: '7.0'
39
+ - - "<"
40
+ - !ruby/object:Gem::Version
41
+ version: '8.1'
34
42
  type: :runtime
35
43
  prerelease: false
36
44
  version_requirements: !ruby/object:Gem::Requirement
37
45
  requirements:
38
- - - "~>"
46
+ - - ">="
39
47
  - !ruby/object:Gem::Version
40
48
  version: '7.0'
49
+ - - "<"
50
+ - !ruby/object:Gem::Version
51
+ version: '8.1'
41
52
  description: ''
42
53
  email: quentin@pennylane.com
43
54
  executables: []
@@ -50,7 +61,6 @@ licenses:
50
61
  - MIT
51
62
  metadata:
52
63
  rubygems_mfa_required: 'true'
53
- post_install_message:
54
64
  rdoc_options: []
55
65
  require_paths:
56
66
  - lib
@@ -65,8 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
75
  - !ruby/object:Gem::Version
66
76
  version: '0'
67
77
  requirements: []
68
- rubygems_version: 3.5.11
69
- signing_key:
78
+ rubygems_version: 3.6.2
70
79
  specification_version: 4
71
80
  summary: Update multiple records with different values in a small number of queries
72
81
  test_files: []