bulk_dependency_eraser 1.3.2 → 1.4.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.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c8e832cdb51105145cc3a1ba8487d32dab71b32d5a9f25808c84026d3f82b25
|
4
|
+
data.tar.gz: 556c96e6eb0a2b98aca3afbaf03ce8aad41012b793a7a45bccd4f2f459e1aaa5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b23c1429318d5c56850d7fa615956f083929751b58a72a2e584d2470feff430b4c374691cd2e436beb5890619c7d1c533d64a1fa9cd1b6aa3df7776f6c73387
|
7
|
+
data.tar.gz: 06e3bebaf98dd80af62ca714a3c8edd92548873ac84b88569d344cad64709444464197c1e2ec7febc7c74a5c981e234677b5accfb29e4936ca1a1ec06acb44d1
|
@@ -1,6 +1,12 @@
|
|
1
1
|
module BulkDependencyEraser
|
2
2
|
class Base
|
3
|
-
DEFAULT_OPTS = {
|
3
|
+
DEFAULT_OPTS = {
|
4
|
+
# Applied to all queries. Useful for taking advantage of specific indexes
|
5
|
+
proc_scopes_per_class_name: {},
|
6
|
+
}.freeze
|
7
|
+
|
8
|
+
# Default Custom Scope for all classes, no effect.
|
9
|
+
DEFAULT_SCOPE_WRAPPER = ->(query) { query }
|
4
10
|
|
5
11
|
# Default Database wrapper, no effect.
|
6
12
|
DEFAULT_DB_WRAPPER = ->(block) { block.call }
|
@@ -21,6 +27,15 @@ module BulkDependencyEraser
|
|
21
27
|
|
22
28
|
protected
|
23
29
|
|
30
|
+
def custom_scope_for_klass_name(klass_name)
|
31
|
+
if opts_c.proc_scopes_per_class_name.key?(klass_name)
|
32
|
+
opts_c.proc_scopes_per_class_name[klass_name]
|
33
|
+
else
|
34
|
+
# No custom wrapper, return non-effect default
|
35
|
+
DEFAULT_SCOPE_WRAPPER
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
24
39
|
# Create options container
|
25
40
|
def options_container
|
26
41
|
Struct.new(
|
@@ -20,6 +20,10 @@ module BulkDependencyEraser
|
|
20
20
|
read_batch_size: nil,
|
21
21
|
# A specific read batching disable option
|
22
22
|
disable_read_batching: nil,
|
23
|
+
# Applied to all queries. Useful for taking advantage of specific indexes
|
24
|
+
proc_scopes_per_class_name: {},
|
25
|
+
# Applied to deletion queries
|
26
|
+
reading_proc_scopes_per_class_name: {},
|
23
27
|
}.freeze
|
24
28
|
|
25
29
|
DEFAULT_DB_WRAPPER = ->(block) do
|
@@ -151,10 +155,20 @@ module BulkDependencyEraser
|
|
151
155
|
attr_reader :table_names_to_parsed_klass_names
|
152
156
|
attr_reader :ignore_table_name_and_dependencies, :ignore_klass_name_and_dependencies
|
153
157
|
|
158
|
+
def custom_scope_for_klass_name(klass_name)
|
159
|
+
if opts_c.reading_proc_scopes_per_class_name.key?(klass_name)
|
160
|
+
opts_c.reading_proc_scopes_per_class_name[klass_name]
|
161
|
+
else
|
162
|
+
super(klass_name)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
154
166
|
def pluck_from_query query, column = :id
|
155
167
|
# ordering shouldn't matter in these queries, and would slow it down
|
156
168
|
# - we're ignoring default_scope ordering, but assoc-defined ordering would still take effect
|
157
169
|
query = query.reorder('')
|
170
|
+
query = custom_scope_for_klass_name(query.klass.name).call(query)
|
171
|
+
|
158
172
|
query_ids = []
|
159
173
|
read_from_db do
|
160
174
|
# If the query has a limit, then we don't want to clobber with batching.
|
@@ -427,11 +441,8 @@ module BulkDependencyEraser
|
|
427
441
|
assoc_query = assoc_query.where(specified_foreign_key.to_sym => query_ids)
|
428
442
|
end
|
429
443
|
|
430
|
-
#
|
431
|
-
|
432
|
-
# if opts[:limit]
|
433
|
-
# assoc_query = assoc_query.limit(opts[:limit])
|
434
|
-
# end
|
444
|
+
# remove any ordering or limits imposed on the association queries from the association definitions
|
445
|
+
assoc_query = assoc_query.reorder('').unscope(:limit)
|
435
446
|
|
436
447
|
if type == :delete
|
437
448
|
# Recursively call 'deletion_query_parser' on association query, to delete any if the assoc's dependencies
|
@@ -554,6 +565,9 @@ module BulkDependencyEraser
|
|
554
565
|
specified_primary_key.to_sym => foreign_keys
|
555
566
|
)
|
556
567
|
|
568
|
+
# remove any ordering or limits imposed on the association queries from the association definitions
|
569
|
+
assoc_query = assoc_query.reorder('').unscope(:limit)
|
570
|
+
|
557
571
|
if type == :delete
|
558
572
|
# Recursively call 'deletion_query_parser' on association query, to delete any if the assoc's dependencies
|
559
573
|
deletion_query_parser(assoc_query, parent_class)
|
@@ -572,6 +586,7 @@ module BulkDependencyEraser
|
|
572
586
|
# This method will replicate association_parser, but instantiate and iterate in batches
|
573
587
|
def association_parser_belongs_to_instantiation(parent_class, query, query_ids, association_name, type)
|
574
588
|
# pending
|
589
|
+
raise "Invalid State! Not ready to instantiate!"
|
575
590
|
end
|
576
591
|
|
577
592
|
# In this case, it's like a `belongs_to :polymorphicable, polymorphic: true, dependent: :destroy` use-case
|
@@ -616,6 +631,8 @@ module BulkDependencyEraser
|
|
616
631
|
return
|
617
632
|
end
|
618
633
|
|
634
|
+
query = custom_scope_for_klass_name(query.klass.name).call(query)
|
635
|
+
|
619
636
|
foreign_ids_by_type = read_from_db do
|
620
637
|
if batching_disabled? || !query.where({}).limit_value.nil?
|
621
638
|
# query without batching
|
@@ -12,6 +12,10 @@ module BulkDependencyEraser
|
|
12
12
|
delete_batch_size: nil,
|
13
13
|
# A specific batching size for this class, overrides the batch_size
|
14
14
|
disable_delete_batching: nil,
|
15
|
+
# Applied to all queries. Useful for taking advantage of specific indexes
|
16
|
+
proc_scopes_per_class_name: {},
|
17
|
+
# Applied to deletion queries
|
18
|
+
deletion_proc_scopes_per_class_name: {},
|
15
19
|
}.freeze
|
16
20
|
|
17
21
|
DEFAULT_DB_WRAPPER = ->(block) do
|
@@ -65,6 +69,14 @@ module BulkDependencyEraser
|
|
65
69
|
|
66
70
|
attr_reader :class_names_and_ids
|
67
71
|
|
72
|
+
def custom_scope_for_klass_name(klass_name)
|
73
|
+
if opts_c.deletion_proc_scopes_per_class_name.key?(klass_name)
|
74
|
+
opts_c.deletion_proc_scopes_per_class_name[klass_name]
|
75
|
+
else
|
76
|
+
super(klass_name)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
68
80
|
def batch_size
|
69
81
|
opts_c.delete_batch_size || opts_c.batch_size
|
70
82
|
end
|
@@ -75,16 +87,19 @@ module BulkDependencyEraser
|
|
75
87
|
|
76
88
|
def delete_by_klass_and_ids klass, ids
|
77
89
|
puts "Deleting #{klass.name}'s IDs: #{ids}" if opts_c.verbose
|
90
|
+
query = klass.unscoped
|
91
|
+
query = custom_scope_for_klass_name(klass.name).call(query)
|
92
|
+
|
78
93
|
if batching_disabled?
|
79
94
|
puts "Deleting without batching" if opts_c.verbose
|
80
95
|
delete_in_db do
|
81
|
-
|
96
|
+
query.where(id: ids).delete_all
|
82
97
|
end
|
83
98
|
else
|
84
99
|
puts "Deleting with batching" if opts_c.verbose
|
85
100
|
ids.each_slice(batch_size) do |ids_subset|
|
86
101
|
delete_in_db do
|
87
|
-
|
102
|
+
query.where(id: ids_subset).delete_all
|
88
103
|
end
|
89
104
|
end
|
90
105
|
end
|
@@ -14,6 +14,10 @@ module BulkDependencyEraser
|
|
14
14
|
nullify_batch_size: nil,
|
15
15
|
# A specific batching size for this class, overrides the batch_size
|
16
16
|
disable_nullify_batching: nil,
|
17
|
+
# Applied to all queries. Useful for taking advantage of specific indexes
|
18
|
+
proc_scopes_per_class_name: {},
|
19
|
+
# Applied to deletion queries
|
20
|
+
nullification_proc_scopes_per_class_name: {},
|
17
21
|
}.freeze
|
18
22
|
|
19
23
|
DEFAULT_DB_WRAPPER = ->(block) do
|
@@ -123,6 +127,14 @@ module BulkDependencyEraser
|
|
123
127
|
|
124
128
|
attr_reader :class_names_columns_and_ids
|
125
129
|
|
130
|
+
def custom_scope_for_klass_name(klass_name)
|
131
|
+
if opts_c.nullification_proc_scopes_per_class_name.key?(klass_name)
|
132
|
+
opts_c.nullification_proc_scopes_per_class_name[klass_name]
|
133
|
+
else
|
134
|
+
super(klass_name)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
126
138
|
def batch_size
|
127
139
|
opts_c.nullify_batch_size || opts_c.batch_size
|
128
140
|
end
|
@@ -132,8 +144,10 @@ module BulkDependencyEraser
|
|
132
144
|
end
|
133
145
|
|
134
146
|
def nullify_by_klass_column_and_ids klass, columns, ids
|
135
|
-
|
147
|
+
query = klass.unscoped
|
148
|
+
query = custom_scope_for_klass_name(klass.name).call(query)
|
136
149
|
|
150
|
+
nullify_columns = {}
|
137
151
|
# supporting nullification of groups of columns simultaneously
|
138
152
|
if columns.is_a?(Array)
|
139
153
|
columns.each do |column|
|
@@ -145,12 +159,12 @@ module BulkDependencyEraser
|
|
145
159
|
|
146
160
|
if batching_disabled?
|
147
161
|
nullify_in_db do
|
148
|
-
|
162
|
+
query.where(id: ids).update_all(nullify_columns)
|
149
163
|
end
|
150
164
|
else
|
151
165
|
ids.each_slice(batch_size) do |ids_subset|
|
152
166
|
nullify_in_db do
|
153
|
-
|
167
|
+
query.where(id: ids_subset).update_all(nullify_columns)
|
154
168
|
end
|
155
169
|
end
|
156
170
|
end
|