def key_reduce(view, limit=2000, firstkey = nil, lastkey = nil, &block)
startkey = firstkey
keepgoing = true
while keepgoing && viewrows = request_view(view, limit, startkey)
startkey = viewrows.first['key']
endkey = viewrows.last['key']
if (startkey == endkey)
viewrows = @db.view(view, :key => startkey)['rows']
lastdocid = viewrows.last['id']
fornextloop = @db.view(view, :startkey => startkey, :startkey_docid => lastdocid, :limit => 2)['rows']
newendkey = fornextloop.last['key']
if (newendkey == endkey)
keepgoing = false
else
startkey = newendkey
end
rows = viewrows
else
rows = []
for r in viewrows
if (lastkey && r['key'] == lastkey)
keepgoing = false
break
end
break if (r['key'] == endkey)
rows << r
end
startkey = endkey
end
key = :begin
values = []
rows.each do |r|
if key != r['key']
yield(key, values) if key != :begin
key = r['key']
values = []
end
values << r['value']
end
yield(key, values)
end
end