jchris-couchrest 0.8.1 → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/pager.rb +33 -0
- data/spec/database_spec.rb +3 -5
- data/spec/pager_spec.rb +33 -0
- data/spec/spec_helper.rb +1 -1
- metadata +1 -1
data/lib/pager.rb
CHANGED
@@ -16,6 +16,13 @@ module Enumerable
|
|
16
16
|
grouped
|
17
17
|
end
|
18
18
|
end unless [].respond_to?(:group_by)
|
19
|
+
|
20
|
+
def group_by_fast
|
21
|
+
inject({}) do |grouped, element|
|
22
|
+
(grouped[yield(element)] ||= []) << element
|
23
|
+
grouped
|
24
|
+
end
|
25
|
+
end
|
19
26
|
end
|
20
27
|
|
21
28
|
class CouchRest
|
@@ -25,6 +32,21 @@ class CouchRest
|
|
25
32
|
@db = db
|
26
33
|
end
|
27
34
|
|
35
|
+
def all_docs(count=100, &block)
|
36
|
+
startkey = nil
|
37
|
+
oldend = nil
|
38
|
+
|
39
|
+
while docrows = request_all_docs(count+1, startkey)
|
40
|
+
startkey = docrows.last['key']
|
41
|
+
docrows.pop if docrows.length > count
|
42
|
+
if oldend == startkey
|
43
|
+
break
|
44
|
+
end
|
45
|
+
yield(docrows)
|
46
|
+
oldend = startkey
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
28
50
|
def key_reduce(view, count, firstkey = nil, lastkey = nil, &block)
|
29
51
|
# start with no keys
|
30
52
|
startkey = firstkey
|
@@ -74,6 +96,17 @@ class CouchRest
|
|
74
96
|
end
|
75
97
|
end
|
76
98
|
|
99
|
+
private
|
100
|
+
|
101
|
+
def request_all_docs count, startkey = nil
|
102
|
+
opts = {}
|
103
|
+
opts[:count] = count if count
|
104
|
+
opts[:startkey] = startkey if startkey
|
105
|
+
results = @db.documents(opts)
|
106
|
+
rows = results['rows']
|
107
|
+
rows unless rows.length == 0
|
108
|
+
end
|
109
|
+
|
77
110
|
def request_view view, count = nil, startkey = nil, endkey = nil
|
78
111
|
opts = {}
|
79
112
|
opts[:count] = count if count
|
data/spec/database_spec.rb
CHANGED
@@ -4,14 +4,12 @@ describe CouchRest::Database do
|
|
4
4
|
before(:each) do
|
5
5
|
@cr = CouchRest.new(COUCHHOST)
|
6
6
|
begin
|
7
|
-
@db = @cr.
|
7
|
+
@db = @cr.database(TESTDB)
|
8
|
+
@db.delete!
|
8
9
|
rescue RestClient::Request::RequestFailed
|
9
10
|
end
|
10
|
-
end
|
11
|
-
|
12
|
-
after(:each) do
|
13
11
|
begin
|
14
|
-
@db.
|
12
|
+
@db = @cr.create_db(TESTDB)
|
15
13
|
rescue RestClient::Request::RequestFailed
|
16
14
|
end
|
17
15
|
end
|
data/spec/pager_spec.rb
CHANGED
@@ -25,6 +25,39 @@ describe CouchRest::Pager do
|
|
25
25
|
@pager.db.should == @db
|
26
26
|
end
|
27
27
|
|
28
|
+
describe "paging all docs" do
|
29
|
+
before(:all) do
|
30
|
+
@docs = []
|
31
|
+
100.times do |i|
|
32
|
+
@docs << ({:number => (i % 10)})
|
33
|
+
end
|
34
|
+
@db.bulk_save(@docs)
|
35
|
+
end
|
36
|
+
it "should yield total_docs / count times" do
|
37
|
+
n = 0
|
38
|
+
@pager.all_docs(10) do |doc|
|
39
|
+
n += 1
|
40
|
+
end
|
41
|
+
n.should == 10
|
42
|
+
end
|
43
|
+
it "should yield each docrow group without duplicate docs" do
|
44
|
+
docids = {}
|
45
|
+
@pager.all_docs(10) do |docrows|
|
46
|
+
docrows.each do |row|
|
47
|
+
docids[row['id']].should be_nil
|
48
|
+
docids[row['id']] = true
|
49
|
+
end
|
50
|
+
end
|
51
|
+
docids.keys.length.should == 100
|
52
|
+
end
|
53
|
+
it "should yield each docrow group" do
|
54
|
+
@pager.all_docs(10) do |docrows|
|
55
|
+
doc = @db.get(docrows[0]['id'])
|
56
|
+
doc['number'].class.should == Fixnum
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
28
61
|
describe "Pager with a view and docs" do
|
29
62
|
before(:all) do
|
30
63
|
@docs = []
|
data/spec/spec_helper.rb
CHANGED