ar-ondemand 1.1.6 → 1.1.7
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 +8 -8
- data/Gemfile.lock +1 -1
- data/lib/ar-ondemand.rb +1 -0
- data/lib/ar-ondemand/fast_enumeration.rb +4 -0
- data/lib/ar-ondemand/for_enumeration_streaming.rb +37 -0
- data/lib/ar-ondemand/version.rb +1 -1
- data/spec/lib/for_enumeration_reading_spec.rb +4 -0
- data/spec/lib/for_enumeration_streaming_spec.rb +76 -0
- metadata +3 -1
checksums.yaml
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
!binary "U0hBMQ==":
|
|
3
3
|
metadata.gz: !binary |-
|
|
4
|
-
|
|
4
|
+
ZDlkODQyOThhNDU2OWIwOWIyYWE1MzAxNzBiZjQ3YzNjOWViOWRlYw==
|
|
5
5
|
data.tar.gz: !binary |-
|
|
6
|
-
|
|
6
|
+
OGVlODFkZjdmMzA3OGVmNjQwYzY3NzY4NjE2OTY3YzA2NDJkN2NlYQ==
|
|
7
7
|
SHA512:
|
|
8
8
|
metadata.gz: !binary |-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
MTA4NDJlZDljZmU5MTM3MDE0Njg5ZTg3YmYzNzEzMGY0MTI5YjA4ZjFjNDVi
|
|
10
|
+
ODBkNDg2YWI4NWI3N2I0NWMyNzgwZmJjMTYwYTVjM2Y1YmNiZGI3Yzc1YjI0
|
|
11
|
+
ZjQ4YjFhZjJmZWI4ODY4YzlmNjY2MjY1NjI2M2Q1OGNlZjQ0NDc=
|
|
12
12
|
data.tar.gz: !binary |-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
OWU1NWViMGY0MjA5YmFiOWIxN2ZjZjI3OWExOGJiYWY0OTgxODQwNmQ1Yjhh
|
|
14
|
+
Mzc1OGJiMzY0MDUzYjA1ZWQ4NGU4OThkZTQyOTQ5YmM4ZjMyYjU1NzNlYmMw
|
|
15
|
+
ZGMzNDhjNTYwYjZhY2VhNTE1ZTExNTdlZGM0ZDY4MzcyYWQxZTY=
|
data/Gemfile.lock
CHANGED
data/lib/ar-ondemand.rb
CHANGED
|
@@ -2,4 +2,5 @@ require_dependency 'ar-ondemand/on_demand'
|
|
|
2
2
|
require_dependency 'ar-ondemand/for_reading'
|
|
3
3
|
require_dependency 'ar-ondemand/for_streaming'
|
|
4
4
|
require_dependency 'ar-ondemand/for_enumeration_reading'
|
|
5
|
+
require_dependency 'ar-ondemand/for_enumeration_streaming'
|
|
5
6
|
require_dependency 'ar-ondemand/delete_all_by_pk'
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
require 'active_support/concern'
|
|
2
|
+
require 'ar-ondemand/fast_enumeration'
|
|
3
|
+
|
|
4
|
+
module ActiveRecord
|
|
5
|
+
module OnDemand
|
|
6
|
+
module EnumerationStreaming
|
|
7
|
+
extend ::ActiveSupport::Concern
|
|
8
|
+
|
|
9
|
+
module ClassMethods
|
|
10
|
+
def for_enumeration_streaming(options = {})
|
|
11
|
+
query_for_enumeration_streaming self, options
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
def query_for_enumeration_streaming(ar, options)
|
|
16
|
+
options[:batch_size] ||= 50_000
|
|
17
|
+
options[:id_column] ||= 'id'
|
|
18
|
+
::Enumerator.new do |eblock|
|
|
19
|
+
start_id = 0
|
|
20
|
+
loop do
|
|
21
|
+
batch = ar.where("#{options[:id_column]} > #{start_id}").order(options[:id_column]).limit(options[:batch_size]).for_enumeration_reading
|
|
22
|
+
break if batch.size == 0
|
|
23
|
+
batch.each do |r|
|
|
24
|
+
eblock << r
|
|
25
|
+
start_id = r.id
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
::ActiveRecord::Base.send :include, ::ActiveRecord::OnDemand::EnumerationStreaming
|
|
36
|
+
::ActiveRecord::Relation.send :include, ::ActiveRecord::OnDemand::EnumerationStreaming::ClassMethods
|
|
37
|
+
|
data/lib/ar-ondemand/version.rb
CHANGED
|
@@ -69,6 +69,10 @@ describe 'ForEnumerationReading' do
|
|
|
69
69
|
expect{cache.first[1].id}.to raise_error(RuntimeError)
|
|
70
70
|
end
|
|
71
71
|
|
|
72
|
+
it 'should return the correct size' do
|
|
73
|
+
expect(AuditRecord.where(customer_id: 1).for_enumeration_reading.size).to be 25
|
|
74
|
+
end
|
|
75
|
+
|
|
72
76
|
end
|
|
73
77
|
end
|
|
74
78
|
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'ar-ondemand'
|
|
3
|
+
|
|
4
|
+
describe 'ForEnumerationStreaming' do
|
|
5
|
+
context 'Testing' do
|
|
6
|
+
context 'Ensure Persistance Works' do
|
|
7
|
+
before(:each) do
|
|
8
|
+
create(:audit_record)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it 'should do persist' do
|
|
12
|
+
expect(AuditRecord.all.length).to be 1
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'should do foo' do
|
|
16
|
+
expect(AuditRecord.first.action).to eq 'create'
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
context 'Iterating' do
|
|
21
|
+
before(:each) do
|
|
22
|
+
(1..25).each do
|
|
23
|
+
create(:audit_record)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it 'should support iterating' do
|
|
28
|
+
total = 0
|
|
29
|
+
AuditRecord.where(customer_id: 1).for_enumeration_streaming.each do |r|
|
|
30
|
+
total += 1
|
|
31
|
+
end
|
|
32
|
+
expect(total).to be 25
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it 'should support iterating with small batch size' do
|
|
36
|
+
total = 0
|
|
37
|
+
AuditRecord.where(customer_id: 1).for_enumeration_streaming(batch_size: 1).each do |r|
|
|
38
|
+
total += 1
|
|
39
|
+
end
|
|
40
|
+
expect(total).to be 25
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
it 'should produce same results as regular iterating' do
|
|
46
|
+
records_a = Set.new
|
|
47
|
+
AuditRecord.where(customer_id: 1).for_enumeration_streaming(batch_size: 2).each do |r|
|
|
48
|
+
records_a.add r.id
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
records_b = Set.new
|
|
52
|
+
AuditRecord.where(customer_id: 1).each do |r|
|
|
53
|
+
records_b.add r.id
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
expect(records_a).to eq records_b
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it 'should not allow access outside each enumeration' do
|
|
60
|
+
obj = nil
|
|
61
|
+
AuditRecord.where(customer_id: 1).for_enumeration_streaming.each do |r|
|
|
62
|
+
obj = r
|
|
63
|
+
end
|
|
64
|
+
expect{obj.id}.to raise_error(RuntimeError)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it 'should not allow bad id column' do
|
|
68
|
+
expect {
|
|
69
|
+
AuditRecord.where(customer_id: 1).for_enumeration_streaming(id_column: 'foo').each do |r|
|
|
70
|
+
obj = r
|
|
71
|
+
end
|
|
72
|
+
}.to raise_error(ActiveRecord::StatementInvalid)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ar-ondemand
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.1.
|
|
4
|
+
version: 1.1.7
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Steve Frank
|
|
@@ -59,6 +59,7 @@ files:
|
|
|
59
59
|
- lib/ar-ondemand/delete_all_by_pk.rb
|
|
60
60
|
- lib/ar-ondemand/fast_enumeration.rb
|
|
61
61
|
- lib/ar-ondemand/for_enumeration_reading.rb
|
|
62
|
+
- lib/ar-ondemand/for_enumeration_streaming.rb
|
|
62
63
|
- lib/ar-ondemand/for_reading.rb
|
|
63
64
|
- lib/ar-ondemand/for_streaming.rb
|
|
64
65
|
- lib/ar-ondemand/on_demand.rb
|
|
@@ -74,6 +75,7 @@ files:
|
|
|
74
75
|
- spec/factories/widget.rb
|
|
75
76
|
- spec/lib/delete_all_by_pk_spec.rb
|
|
76
77
|
- spec/lib/for_enumeration_reading_spec.rb
|
|
78
|
+
- spec/lib/for_enumeration_streaming_spec.rb
|
|
77
79
|
- spec/lib/for_reading_spec.rb
|
|
78
80
|
- spec/lib/for_streaming_spec.rb
|
|
79
81
|
- spec/lib/on_demand_spec.rb
|