bulk_dependency_eraser 1.3.3 → 1.4.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: bb8d638145b6ff810e2cb3deb79c11a134b9df5e6abdc25755a166d92158c583
4
- data.tar.gz: 0f7525a93ddb69db0b0fdb1243973c2a1db1db1d33051fa3fe49e1aaefdb538d
3
+ metadata.gz: 5258d3b15269fb6bd51a5f89f949983a3cf48862cc83f26a8f189bbc11e2ae84
4
+ data.tar.gz: dbab67950500c1037266232592915a3c27f0b54102619092be465ded4a53024d
5
5
  SHA512:
6
- metadata.gz: 8841e5385fdd92b2d1c14315d849df28a4d8af00a7d8f151a4e04767fd27a9b1cd1653d269912a23385520cb7eb18f8e4b483ab74c7f9a0a5249048fbb81f20b
7
- data.tar.gz: c0701a14385970abc0ac5ec0025215a11c5818d391d2bcbef89c36e47c8f7a7919a6dbded77521efdb60108bdb88266ef21268e743265399d58c9a7c4044f648
6
+ metadata.gz: 351634d20e814264885ddd4746e2fbaa7a8d27c4ab78fda5d3690e21697de51d1fd51c75d2b749e6f9a4727f79e6fa43d571617364df1e44870a55aeb0e88166
7
+ data.tar.gz: e8e477e1d5139bd4ac38cb3d4e4371b06688b5dc5e000d8a6a6077cc300ec998916cdd754c00d87ea1efd0b0a179479c60491450467cfc8eefbb6b0bda391690
@@ -1,6 +1,22 @@
1
1
  module BulkDependencyEraser
2
2
  class Base
3
- DEFAULT_OPTS = {}.freeze
3
+ # Default Custom Scope for all classes, no effect.
4
+ DEFAULT_SCOPE_WRAPPER = ->(query) { nil }
5
+ # Default Custom Scope for mapped-by-name classes, no effect.
6
+ DEFAULT_KLASS_MAPPED_SCOPE_WRAPPER = ->(query) { query }
7
+
8
+ DEFAULT_OPTS = {
9
+ # Applied to all queries. Useful for taking advantage of specific indexes
10
+ # - not indexed by klass name. Proc would handle the logic for that.
11
+ # - 3rd, and lowest, priority of scopes
12
+ # - accepts rails query as parameter
13
+ # - return nil if no applicable scope.
14
+ proc_scopes: self::DEFAULT_SCOPE_WRAPPER,
15
+ # Applied to all queries. Useful for taking advantage of specific indexes
16
+ # - 2nd highest priority of scopes
17
+ proc_scopes_per_class_name: {},
18
+ }.freeze
19
+
4
20
 
5
21
  # Default Database wrapper, no effect.
6
22
  DEFAULT_DB_WRAPPER = ->(block) { block.call }
@@ -21,6 +37,21 @@ module BulkDependencyEraser
21
37
 
22
38
  protected
23
39
 
40
+ def custom_scope_for_klass_name(klass)
41
+ if opts_c.proc_scopes_per_class_name.key?(klass.name)
42
+ opts_c.proc_scopes_per_class_name[klass.name]
43
+ else
44
+ # See if non-class-mapped proc returns a value
45
+ non_class_name_mapped_query = opts_c.proc_scopes.call(klass.where({})) # convert klass to query
46
+ if !non_class_name_mapped_query.nil?
47
+ return opts_c.proc_scopes
48
+ else
49
+ # No custom wrapper, return non-effect default
50
+ return self.class::DEFAULT_KLASS_MAPPED_SCOPE_WRAPPER
51
+ end
52
+ end
53
+ end
54
+
24
55
  # Create options container
25
56
  def options_container
26
57
  Struct.new(
@@ -20,6 +20,18 @@ 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
+ # - not indexed by klass name. Proc would handle the logic for that.
25
+ # - 3rd, and lowest, priority of scopes
26
+ # - accepts rails query as parameter
27
+ # - return nil if no applicable scope.
28
+ proc_scopes: self::DEFAULT_SCOPE_WRAPPER,
29
+ # Applied to all queries. Useful for taking advantage of specific indexes
30
+ # - 2nd highest priority of scopes
31
+ proc_scopes_per_class_name: {},
32
+ # Applied to reading queries
33
+ # - 1st priority of scopes
34
+ reading_proc_scopes_per_class_name: {},
23
35
  }.freeze
24
36
 
25
37
  DEFAULT_DB_WRAPPER = ->(block) do
@@ -151,10 +163,20 @@ module BulkDependencyEraser
151
163
  attr_reader :table_names_to_parsed_klass_names
152
164
  attr_reader :ignore_table_name_and_dependencies, :ignore_klass_name_and_dependencies
153
165
 
166
+ def custom_scope_for_klass_name(klass)
167
+ if opts_c.reading_proc_scopes_per_class_name.key?(klass.name)
168
+ opts_c.reading_proc_scopes_per_class_name[klass.name]
169
+ else
170
+ super(klass)
171
+ end
172
+ end
173
+
154
174
  def pluck_from_query query, column = :id
155
175
  # ordering shouldn't matter in these queries, and would slow it down
156
176
  # - we're ignoring default_scope ordering, but assoc-defined ordering would still take effect
157
177
  query = query.reorder('')
178
+ query = custom_scope_for_klass_name(query.klass).call(query)
179
+
158
180
  query_ids = []
159
181
  read_from_db do
160
182
  # If the query has a limit, then we don't want to clobber with batching.
@@ -617,6 +639,8 @@ module BulkDependencyEraser
617
639
  return
618
640
  end
619
641
 
642
+ query = custom_scope_for_klass_name(query.klass).call(query)
643
+
620
644
  foreign_ids_by_type = read_from_db do
621
645
  if batching_disabled? || !query.where({}).limit_value.nil?
622
646
  # query without batching
@@ -12,6 +12,18 @@ 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
+ # - not indexed by klass name. Proc would handle the logic for that.
17
+ # - 3rd, and lowest, priority of scopes
18
+ # - accepts rails query as parameter
19
+ # - return nil if no applicable scope.
20
+ proc_scopes: self::DEFAULT_SCOPE_WRAPPER,
21
+ # Applied to all queries. Useful for taking advantage of specific indexes
22
+ # - 2nd highest priority of scopes
23
+ proc_scopes_per_class_name: {},
24
+ # Applied to deletion queries
25
+ # - 1st priority of scopes
26
+ deletion_proc_scopes_per_class_name: {},
15
27
  }.freeze
16
28
 
17
29
  DEFAULT_DB_WRAPPER = ->(block) do
@@ -65,6 +77,14 @@ module BulkDependencyEraser
65
77
 
66
78
  attr_reader :class_names_and_ids
67
79
 
80
+ def custom_scope_for_klass_name(klass)
81
+ if opts_c.deletion_proc_scopes_per_class_name.key?(klass.name)
82
+ opts_c.deletion_proc_scopes_per_class_name[klass.name]
83
+ else
84
+ super(klass)
85
+ end
86
+ end
87
+
68
88
  def batch_size
69
89
  opts_c.delete_batch_size || opts_c.batch_size
70
90
  end
@@ -75,16 +95,19 @@ module BulkDependencyEraser
75
95
 
76
96
  def delete_by_klass_and_ids klass, ids
77
97
  puts "Deleting #{klass.name}'s IDs: #{ids}" if opts_c.verbose
98
+ query = klass.unscoped
99
+ query = custom_scope_for_klass_name(klass).call(query)
100
+
78
101
  if batching_disabled?
79
102
  puts "Deleting without batching" if opts_c.verbose
80
103
  delete_in_db do
81
- klass.unscoped.where(id: ids).delete_all
104
+ query.where(id: ids).delete_all
82
105
  end
83
106
  else
84
107
  puts "Deleting with batching" if opts_c.verbose
85
108
  ids.each_slice(batch_size) do |ids_subset|
86
109
  delete_in_db do
87
- klass.unscoped.where(id: ids_subset).delete_all
110
+ query.where(id: ids_subset).delete_all
88
111
  end
89
112
  end
90
113
  end
@@ -14,6 +14,18 @@ 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
+ # - not indexed by klass name. Proc would handle the logic for that.
19
+ # - 3rd, and lowest, priority of scopes
20
+ # - accepts rails query as parameter
21
+ # - return nil if no applicable scope.
22
+ proc_scopes: self::DEFAULT_SCOPE_WRAPPER,
23
+ # Applied to all queries. Useful for taking advantage of specific indexes
24
+ # - 2nd highest priority of scopes
25
+ proc_scopes_per_class_name: {},
26
+ # Applied to nullification queries
27
+ # - 1st priority of scopes
28
+ nullification_proc_scopes_per_class_name: {},
17
29
  }.freeze
18
30
 
19
31
  DEFAULT_DB_WRAPPER = ->(block) do
@@ -123,6 +135,14 @@ module BulkDependencyEraser
123
135
 
124
136
  attr_reader :class_names_columns_and_ids
125
137
 
138
+ def custom_scope_for_klass_name(klass)
139
+ if opts_c.nullification_proc_scopes_per_class_name.key?(klass.name)
140
+ opts_c.nullification_proc_scopes_per_class_name[klass.name]
141
+ else
142
+ super(klass)
143
+ end
144
+ end
145
+
126
146
  def batch_size
127
147
  opts_c.nullify_batch_size || opts_c.batch_size
128
148
  end
@@ -132,8 +152,10 @@ module BulkDependencyEraser
132
152
  end
133
153
 
134
154
  def nullify_by_klass_column_and_ids klass, columns, ids
135
- nullify_columns = {}
155
+ query = klass.unscoped
156
+ query = custom_scope_for_klass_name(klass).call(query)
136
157
 
158
+ nullify_columns = {}
137
159
  # supporting nullification of groups of columns simultaneously
138
160
  if columns.is_a?(Array)
139
161
  columns.each do |column|
@@ -145,12 +167,12 @@ module BulkDependencyEraser
145
167
 
146
168
  if batching_disabled?
147
169
  nullify_in_db do
148
- klass.unscoped.where(id: ids).update_all(nullify_columns)
170
+ query.where(id: ids).update_all(nullify_columns)
149
171
  end
150
172
  else
151
173
  ids.each_slice(batch_size) do |ids_subset|
152
174
  nullify_in_db do
153
- klass.unscoped.where(id: ids_subset).update_all(nullify_columns)
175
+ query.where(id: ids_subset).update_all(nullify_columns)
154
176
  end
155
177
  end
156
178
  end
@@ -1,3 +1,3 @@
1
1
  module BulkDependencyEraser
2
- VERSION = "1.3.3".freeze
2
+ VERSION = "1.4.1".freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bulk_dependency_eraser
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.3
4
+ version: 1.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - benjamin.dana.software.dev@gmail.com