counter_culture 1.8.1 → 1.8.2

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
  SHA1:
3
- metadata.gz: 5495ff50331ad38e5543733232a54d77605f5b68
4
- data.tar.gz: 87bbafc46cee9282a6e809f9aa912357db60722d
3
+ metadata.gz: b21a580a6873b3d63ccddaf37e9ab42da83665d8
4
+ data.tar.gz: eb40b01c09c04572acae15638170a54a18ceea70
5
5
  SHA512:
6
- metadata.gz: 5f776a977831ea9aae705529c3010ee60d4e253b63d77c8aa808c6d907207c60ab30e386d62ed1778b9b8e05ecd8015f2cd3a55a2820ddcfe6833c913c740e4b
7
- data.tar.gz: b5a9c5f30dff001b9fb50d0d723a14a77395243a7b628d76be3187cf4657ddc192f47bb55a13b735439a5a9b9c57fec0114b9ffd8a276796be4b502b9687ee4a
6
+ metadata.gz: 1415bf5f64587fd1fb7b6c0ab3903b4a6f0da32f7d9570c3b35d11cd4b33c0b8059fb91cd80547c270362872028fdf720b8c87d402928e77e2179059e18916cc
7
+ data.tar.gz: 0b729a1911b0a38d9acc9ad9f02f22895b1e92a7b1af39f1dd3010c5ec5705ae7eea248b7c07ab236eca255ef277626caaecdb48b5d85deec33e753c82d6cd60
data/CHANGELOG.md CHANGED
@@ -1,4 +1,9 @@
1
- ## 1.8.1 (September 5, 2018)
1
+ ## 1.8.2 (September 27, 2017)
2
+
3
+ Bugfixes:
4
+ - Actually use `batch_size` parameter in `counter_culture_fix_counts` (#200)
5
+
6
+ ## 1.8.1 (September 5, 2017)
2
7
 
3
8
  Improvements:
4
9
  - Use ActiveRecord version, not Rails version, in `Reconciler`, makeing it possible to use `counter_culture_fix_counts` without Rails
data/README.md CHANGED
@@ -14,7 +14,7 @@ Tested against Ruby 2.2.5 and 2.3.1 and against the latest patch releases of Rai
14
14
  Add counter_culture to your Gemfile:
15
15
 
16
16
  ```ruby
17
- gem 'counter_culture', '~> 1.0'
17
+ gem 'counter_culture', '~> 1.8'
18
18
  ```
19
19
 
20
20
  Then run `bundle install`
@@ -234,13 +234,13 @@ You will sometimes want to populate counter-cache values from primary data. This
234
234
  Product.counter_culture_fix_counts
235
235
  # will automatically fix counts for all counter caches defined on Product
236
236
 
237
- Product.counter_culture_fix_counts except: :category
237
+ Product.counter_culture_fix_counts exclude: :category
238
238
  # will automatically fix counts for all counter caches defined on Product, except for the :category relation
239
239
 
240
240
  Product.counter_culture_fix_counts only: :category
241
241
  # will automatically fix counts only on the :category relation on Product
242
242
 
243
- # :except and :only also accept arrays of one level relations
243
+ # :exclude and :only also accept arrays of one level relations
244
244
  # if you want to fix counts on a more than one level relation you need to use convention below:
245
245
 
246
246
  Product.counter_culture_fix_counts only: [[:subcategory, :category]]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.8.1
1
+ 1.8.2
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: counter_culture 1.8.1 ruby lib
5
+ # stub: counter_culture 1.8.2 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "counter_culture"
9
- s.version = "1.8.1"
9
+ s.version = "1.8.2"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Magnus von Koeller"]
14
- s.date = "2017-09-05"
14
+ s.date = "2017-09-27"
15
15
  s.description = "counter_culture provides turbo-charged counter caches that are kept up-to-date not just on create and destroy, that support multiple levels of indirection through relationships, allow dynamic column names and that avoid deadlocks by updating in the after_commit callback."
16
16
  s.email = "magnus@vonkoeller.de"
17
17
  s.extra_rdoc_files = [
@@ -63,7 +63,7 @@ module CounterCulture
63
63
  next if options[:exclude] && options[:exclude].include?(counter.relation)
64
64
  next if options[:only] && !options[:only].include?(counter.relation)
65
65
 
66
- reconciler = CounterCulture::Reconciler.new(counter, options.slice(:skip_unsupported))
66
+ reconciler = CounterCulture::Reconciler.new(counter, options.slice(:skip_unsupported, :batch_size))
67
67
  reconciler.reconcile!
68
68
  reconciler.changes
69
69
  end.compact
@@ -99,23 +99,27 @@ module CounterCulture
99
99
 
100
100
  counts_query.group(full_primary_key(relation_class)).find_in_batches(batch_size: batch_size) do |records|
101
101
  # now iterate over all the models and see whether their counts are right
102
- ActiveRecord::Base.transaction do
103
- records.each do |record|
104
- count = record.read_attribute('count') || 0
105
- next if record.read_attribute(column_name) == count
106
-
107
- track_change(record, column_name, count)
108
-
109
- # use update_all because it's faster and because a fixed counter-cache shouldn't update the timestamp
110
- relation_class.where(relation_class.primary_key => record.send(relation_class.primary_key)).update_all(column_name => count)
111
- end
112
- end
102
+ update_count_for_batch(column_name, records)
113
103
  end
114
104
  end
115
105
  end
116
106
 
117
107
  private
118
108
 
109
+ def update_count_for_batch(column_name, records)
110
+ ActiveRecord::Base.transaction do
111
+ records.each do |record|
112
+ count = record.read_attribute('count') || 0
113
+ next if record.read_attribute(column_name) == count
114
+
115
+ track_change(record, column_name, count)
116
+
117
+ # use update_all because it's faster and because a fixed counter-cache shouldn't update the timestamp
118
+ relation_class.where(relation_class.primary_key => record.send(relation_class.primary_key)).update_all(column_name => count)
119
+ end
120
+ end
121
+ end
122
+
119
123
  # keep track of what we fixed, e.g. for a notification email
120
124
  def track_change(record, column_name, count)
121
125
  @changes_holder << {
@@ -34,7 +34,6 @@ describe "CounterCulture" do
34
34
  DatabaseCleaner.clean
35
35
  end
36
36
 
37
-
38
37
  it "should use relation foreign_key correctly" do
39
38
  post = AnotherPost.new
40
39
  comment = post.comments.build
@@ -1276,6 +1275,21 @@ describe "CounterCulture" do
1276
1275
  A_FEW = CI_TEST_RUN ? 50: 10
1277
1276
  A_BATCH = CI_TEST_RUN ? 100: 10
1278
1277
 
1278
+ it "should support batch processing" do
1279
+ # first, clean up
1280
+ SimpleDependent.delete_all
1281
+ SimpleMain.delete_all
1282
+
1283
+ expect_any_instance_of(CounterCulture::Reconciler::Reconciliation).to receive(:update_count_for_batch).exactly(MANY/A_BATCH).times
1284
+
1285
+ MANY.times do |i|
1286
+ main = SimpleMain.create
1287
+ 3.times { main.simple_dependents.create }
1288
+ end
1289
+
1290
+ SimpleDependent.counter_culture_fix_counts :batch_size => A_BATCH
1291
+ end
1292
+
1279
1293
  it "should correctly fix the counter caches with thousands of records" do
1280
1294
  # first, clean up
1281
1295
  SimpleDependent.delete_all
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: counter_culture
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.1
4
+ version: 1.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Magnus von Koeller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-05 00:00:00.000000000 Z
11
+ date: 2017-09-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: after_commit_action