caster 0.9.3 → 0.9.4

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.
Files changed (3) hide show
  1. data/lib/caster.rb +3 -2
  2. data/lib/caster/execution.rb +40 -7
  3. metadata +4 -4
@@ -13,7 +13,8 @@ module Caster
13
13
  :database => nil,
14
14
  :id_prefix => 'caster',
15
15
  :type => 'caster_metadoc'
16
- }
16
+ },
17
+ :batch_size => 2000,
17
18
  }
18
19
 
19
20
  @valid_config_keys = @config.keys
@@ -48,4 +49,4 @@ module Caster
48
49
  def self.log
49
50
  @logger
50
51
  end
51
- end
52
+ end
@@ -47,19 +47,51 @@ module Caster
47
47
 
48
48
  def from scope, query = {}
49
49
  if scope.scan('/').length == 1
50
- return Reference.new @db, scope, query
50
+ Reference.new @db, scope, query
51
51
  else
52
52
  database_name, view = scope.split('/', 2)
53
53
  db = CouchRest.database "http://#{Caster.config[:host]}:#{Caster.config[:port]}/#{database_name}"
54
- return Reference.new db, view, query
54
+ Reference.new db, view, query
55
55
  end
56
56
  end
57
57
 
58
58
  def execute
59
59
  Caster.log.info "executing query on '#{@db.name}' over '#{@view}' with params #{@query.inspect}"
60
- rdocs = @db.view(@view, @query)['rows']
60
+
61
+ limit = @query['limit'] || 1.0/0.0
62
+ if Caster.config[:batch_size] == nil or limit < Caster.config[:batch_size]
63
+ execute_batch @db.view(@view, @query)['rows']
64
+ return
65
+ end
66
+
67
+ @query['limit'] = Caster.config[:batch_size] + 1
68
+ saved_docs = 0
69
+ while saved_docs < limit do
70
+ docs = @db.view(@view, @query)['rows']
71
+ return if docs.length == 0
72
+
73
+ @query['startkey_docid'] = docs.last['id']
74
+ @query['startkey'] = docs.last['key']
75
+
76
+ if docs.length <= Caster.config[:batch_size]
77
+ execute_batch docs
78
+ return
79
+ elsif saved_docs + docs.length - 1 > limit
80
+ execute_batch docs.slice(0, limit - saved_docs)
81
+ return
82
+ else
83
+ docs.pop
84
+ execute_batch docs
85
+ saved_docs += docs.length
86
+ end
87
+ end
88
+ end
89
+
90
+ private
91
+ def execute_batch docs
61
92
  db_docs_map = Hash.new { |k, v| k[v] = [] }
62
- rdocs.each do |rdoc|
93
+
94
+ docs.each do |rdoc|
63
95
  doc = rdoc.has_key?('doc')? rdoc['doc'] : rdoc['value']
64
96
 
65
97
  @operations = []
@@ -68,9 +100,10 @@ module Caster
68
100
  db_docs_map[op.db_handle] << op.transformation.execute(doc)
69
101
  end
70
102
  end
71
- db_docs_map.each do |db, docs|
72
- db.bulk_save docs
103
+ db_docs_map.each do |db, db_docs|
104
+ db.bulk_save db_docs
73
105
  end
74
106
  end
107
+
75
108
  end
76
- end
109
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caster
3
3
  version: !ruby/object:Gem::Version
4
- hash: 61
4
+ hash: 51
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
- - 3
10
- version: 0.9.3
9
+ - 4
10
+ version: 0.9.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Manohar Akula
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2013-01-10 00:00:00 Z
18
+ date: 2013-01-13 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: couchrest