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.
- checksums.yaml +4 -4
- data/lib/activerecord_batch_update.rb +17 -16
- metadata +19 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 50b4507c159f1ec1b11cbfa30dce6453f649c982ba187005d07ea1dc23a9fe2e
|
4
|
+
data.tar.gz: 63fdc96640767eb839d7bf273f27f98a430b32bbb4867f6fa18388e201de0c65
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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 =
|
49
|
-
update_clause =
|
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 \"#{
|
54
|
-
"AS ( #{
|
54
|
+
"WITH \"#{batch_update_table.name}\" (#{keys.join(', ')})",
|
55
|
+
"AS ( #{batch_update_values_statement(slice, keys)} )",
|
55
56
|
update_clause,
|
56
|
-
"FROM \"#{
|
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
|
66
|
-
@
|
66
|
+
def batch_update_table
|
67
|
+
@batch_update_table ||= Arel::Table.new('batch_updates')
|
67
68
|
end
|
68
69
|
|
69
|
-
def
|
70
|
+
def batch_update_values_statement(items, cols)
|
70
71
|
first, *rest = items
|
71
72
|
|
72
73
|
rows = [
|
73
|
-
|
74
|
-
*rest.map {
|
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
|
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
|
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
|
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
|
-
|
104
|
+
batch_update_table[col]
|
104
105
|
]
|
105
106
|
end
|
106
107
|
)
|
107
108
|
end.to_sql
|
108
109
|
end
|
109
110
|
|
110
|
-
def
|
111
|
-
primary_keys.map { arel_table[_1].eq(
|
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:
|
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:
|
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.
|
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: []
|