activerecord_batch_update 0.0.3 → 1.0.0

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 +16 -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: dcf20f842e7dfc9b43a0d026225099ab0332bb03d94e42bd7faec9f4505f7715
4
+ data.tar.gz: c3c5234ba1c171e87e1558c5bf4d5c821b2b032dc6bb8aba2172b351a60551d3
5
5
  SHA512:
6
- metadata.gz: d5be0abbf08a712b5b5a138b15e37928b9b50c138851651877ac56837f18b884e82b226eaa1c96c1dd1198c8c017bd665c3ac57b6c7e78ecbbfb70f8d0f22443
7
- data.tar.gz: ba349d81455f2908dbcddff5da11c4016b8660e13af081dcdfd4cfd55043c35b73b22bd6e221f95638eb6a23e45a6042ae310e8b38de85f7d73e20bf9a677ea8
6
+ metadata.gz: 563402469cc327e356eb9362d09a96ae4113e8711705d91bf5569f7e2d39c665d803eb6e08917c3f438f980f4f6d1cada4c35c503df8d9abc3df8db42a9b1e75
7
+ data.tar.gz: '08ed5a413379ccd70329d1616e5098279282b2f6a062005c29165e1a83f8eac1f2917466004e4e14a07235eb70e7c69b38e0b9fc1193391365a89e2380b3306c'
@@ -45,15 +45,15 @@ module ActiveRecordBatchUpdate
45
45
  entries.map(&:stringify_keys).group_by { _1.keys.sort! }.sort.flat_map do |(keys, items)|
46
46
  next [] if keys.empty?
47
47
 
48
- where_clause = where_statement(update_on)
49
- update_clause = update_statement(keys - update_on)
48
+ where_clause = batch_update_where_statement(update_on)
49
+ update_clause = batch_update_statement(keys - update_on)
50
50
 
51
51
  items.each_slice(batch_size).map do |slice|
52
52
  [
53
- "WITH \"#{cte_table.name}\" (#{keys.join(', ')})",
54
- "AS ( #{values_statement(slice, keys)} )",
53
+ "WITH \"#{batch_update_table.name}\" (#{keys.join(', ')})",
54
+ "AS ( #{batch_update_values_statement(slice, keys)} )",
55
55
  update_clause,
56
- "FROM \"#{cte_table.name}\"",
56
+ "FROM \"#{batch_update_table.name}\"",
57
57
  "WHERE #{where_clause}"
58
58
  ].join(' ')
59
59
  end
@@ -62,22 +62,22 @@ module ActiveRecordBatchUpdate
62
62
 
63
63
  private
64
64
 
65
- def cte_table
66
- @cte_table ||= Arel::Table.new('batch_updates')
65
+ def batch_update_table
66
+ @batch_update_table ||= Arel::Table.new('batch_updates')
67
67
  end
68
68
 
69
- def values_statement(items, cols)
69
+ def batch_update_values_statement(items, cols)
70
70
  first, *rest = items
71
71
 
72
72
  rows = [
73
- values_list_casted_item(first, cols),
74
- *rest.map { values_list_other_item(_1, cols) }
73
+ batch_update_casted_item(first, cols),
74
+ *rest.map { batch_update_quoted_item(_1, cols) }
75
75
  ]
76
76
 
77
77
  "VALUES #{rows.map { "(#{_1.map(&:to_sql).join(', ')})" }.join(', ')}"
78
78
  end
79
79
 
80
- def values_list_casted_item(item, cols)
80
+ def batch_update_casted_item(item, cols)
81
81
  cols.map do |col|
82
82
  Arel::Nodes::NamedFunction.new(
83
83
  'CAST',
@@ -88,27 +88,27 @@ module ActiveRecordBatchUpdate
88
88
  end
89
89
  end
90
90
 
91
- def values_list_other_item(item, cols)
91
+ def batch_update_quoted_item(item, cols)
92
92
  cols.map do |col|
93
93
  Arel::Nodes.build_quoted(item[col], arel_table[col])
94
94
  end
95
95
  end
96
96
 
97
- def update_statement(cols)
97
+ def batch_update_statement(cols)
98
98
  Arel::UpdateManager.new(arel_table).tap do |um|
99
99
  um.set(
100
100
  cols.map do |col|
101
101
  [
102
102
  arel_table[col],
103
- cte_table[col]
103
+ batch_update_table[col]
104
104
  ]
105
105
  end
106
106
  )
107
107
  end.to_sql
108
108
  end
109
109
 
110
- def where_statement(primary_keys)
111
- primary_keys.map { arel_table[_1].eq(cte_table[_1]) }.reduce(:and).to_sql
110
+ def batch_update_where_statement(primary_keys)
111
+ primary_keys.map { arel_table[_1].eq(batch_update_table[_1]) }.reduce(:and).to_sql
112
112
  end
113
113
  end
114
114
  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.0
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-03-25 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: []