caster 0.9.3 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
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