couchrest_model 1.0.0 → 1.1.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -1
- data/Gemfile.lock +19 -20
- data/README.md +145 -20
- data/VERSION +1 -1
- data/couchrest_model.gemspec +2 -3
- data/history.txt +14 -0
- data/lib/couchrest/model/associations.rb +4 -4
- data/lib/couchrest/model/base.rb +5 -0
- data/lib/couchrest/model/callbacks.rb +1 -2
- data/lib/couchrest/model/collection.rb +1 -1
- data/lib/couchrest/model/designs/view.rb +486 -0
- data/lib/couchrest/model/designs.rb +81 -0
- data/lib/couchrest/model/document_queries.rb +1 -1
- data/lib/couchrest/model/persistence.rb +25 -16
- data/lib/couchrest/model/properties.rb +5 -1
- data/lib/couchrest/model/property.rb +2 -2
- data/lib/couchrest/model/proxyable.rb +152 -0
- data/lib/couchrest/model/typecast.rb +1 -1
- data/lib/couchrest/model/validations/casted_model.rb +3 -1
- data/lib/couchrest/model/validations/locale/en.yml +1 -1
- data/lib/couchrest/model/validations/uniqueness.rb +6 -7
- data/lib/couchrest/model/validations.rb +1 -0
- data/lib/couchrest/model/views.rb +11 -9
- data/lib/couchrest_model.rb +3 -0
- data/spec/couchrest/assocations_spec.rb +2 -2
- data/spec/couchrest/base_spec.rb +15 -1
- data/spec/couchrest/casted_model_spec.rb +30 -12
- data/spec/couchrest/class_proxy_spec.rb +2 -2
- data/spec/couchrest/collection_spec.rb +89 -0
- data/spec/couchrest/designs/view_spec.rb +766 -0
- data/spec/couchrest/designs_spec.rb +110 -0
- data/spec/couchrest/persistence_spec.rb +36 -7
- data/spec/couchrest/property_spec.rb +15 -0
- data/spec/couchrest/proxyable_spec.rb +329 -0
- data/spec/couchrest/{validations.rb → validations_spec.rb} +1 -3
- data/spec/couchrest/view_spec.rb +19 -91
- data/spec/fixtures/base.rb +8 -6
- data/spec/fixtures/more/article.rb +1 -1
- data/spec/fixtures/more/course.rb +4 -2
- metadata +21 -76
- data/lib/couchrest/model/view.rb +0 -190
data/spec/couchrest/view_spec.rb
CHANGED
@@ -27,6 +27,20 @@ describe "Model views" do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
end
|
30
|
+
|
31
|
+
describe "#has_view?" do
|
32
|
+
it "should check the design doc" do
|
33
|
+
Article.design_doc.should_receive(:has_view?).with(:test).and_return(true)
|
34
|
+
Article.has_view?(:test).should be_true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "#can_reduce_view?" do
|
39
|
+
it "should check if view has a reduce method" do
|
40
|
+
Article.design_doc.should_receive(:can_reduce_view?).with(:test).and_return(true)
|
41
|
+
Article.can_reduce_view?(:test).should be_true
|
42
|
+
end
|
43
|
+
end
|
30
44
|
end
|
31
45
|
|
32
46
|
describe "a model with simple views and a default param" do
|
@@ -184,6 +198,11 @@ describe "Model views" do
|
|
184
198
|
course.title.should eql('bbb')
|
185
199
|
end
|
186
200
|
|
201
|
+
it "should perform a search for first when reduce method present" do
|
202
|
+
course = Course.first_from_view('by_active')
|
203
|
+
course.should_not be_nil
|
204
|
+
end
|
205
|
+
|
187
206
|
end
|
188
207
|
|
189
208
|
describe "a ducktype view" do
|
@@ -374,96 +393,5 @@ describe "Model views" do
|
|
374
393
|
Article.design_doc["views"].keys.should include("by_updated_at")
|
375
394
|
end
|
376
395
|
end
|
377
|
-
|
378
|
-
describe "with a collection" do
|
379
|
-
before(:all) do
|
380
|
-
reset_test_db!
|
381
|
-
titles = ["very uniq one", "really interesting", "some fun",
|
382
|
-
"really awesome", "crazy bob", "this rocks", "super rad"]
|
383
|
-
titles.each_with_index do |title,i|
|
384
|
-
a = Article.new(:title => title, :date => Date.today)
|
385
|
-
a.save
|
386
|
-
end
|
387
|
-
|
388
|
-
titles = ["yesterday very uniq one", "yesterday really interesting", "yesterday some fun",
|
389
|
-
"yesterday really awesome", "yesterday crazy bob", "yesterday this rocks"]
|
390
|
-
titles.each_with_index do |title,i|
|
391
|
-
a = Article.new(:title => title, :date => Date.today - 1)
|
392
|
-
a.save
|
393
|
-
end
|
394
|
-
end
|
395
|
-
require 'date'
|
396
|
-
it "should return a proxy that looks like an array of 7 Article objects" do
|
397
|
-
articles = Article.by_date :key => Date.today
|
398
|
-
articles.class.should == Array
|
399
|
-
articles.size.should == 7
|
400
|
-
end
|
401
|
-
it "should get a subset of articles using paginate" do
|
402
|
-
articles = Article.by_date :key => Date.today
|
403
|
-
articles.paginate(:page => 1, :per_page => 3).size.should == 3
|
404
|
-
articles.paginate(:page => 2, :per_page => 3).size.should == 3
|
405
|
-
articles.paginate(:page => 3, :per_page => 3).size.should == 1
|
406
|
-
end
|
407
|
-
it "should get all articles, a few at a time, using paginated each" do
|
408
|
-
articles = Article.by_date :key => Date.today
|
409
|
-
articles.paginated_each(:per_page => 3) do |a|
|
410
|
-
a.should_not be_nil
|
411
|
-
end
|
412
|
-
end
|
413
|
-
it "should provide a class method to access the collection directly" do
|
414
|
-
articles = Article.collection_proxy_for('Article', 'by_date', :descending => true,
|
415
|
-
:key => Date.today, :include_docs => true)
|
416
|
-
articles.class.should == Array
|
417
|
-
articles.size.should == 7
|
418
|
-
end
|
419
|
-
it "should provide a class method for paginate" do
|
420
|
-
articles = Article.paginate(:design_doc => 'Article', :view_name => 'by_date',
|
421
|
-
:per_page => 3, :descending => true, :key => Date.today, :include_docs => true)
|
422
|
-
articles.size.should == 3
|
423
|
-
|
424
|
-
articles = Article.paginate(:design_doc => 'Article', :view_name => 'by_date',
|
425
|
-
:per_page => 3, :page => 2, :descending => true, :key => Date.today, :include_docs => true)
|
426
|
-
articles.size.should == 3
|
427
|
-
|
428
|
-
articles = Article.paginate(:design_doc => 'Article', :view_name => 'by_date',
|
429
|
-
:per_page => 3, :page => 3, :descending => true, :key => Date.today, :include_docs => true)
|
430
|
-
articles.size.should == 1
|
431
|
-
end
|
432
|
-
it "should provide a class method for paginated_each" do
|
433
|
-
options = { :design_doc => 'Article', :view_name => 'by_date',
|
434
|
-
:per_page => 3, :page => 1, :descending => true, :key => Date.today,
|
435
|
-
:include_docs => true }
|
436
|
-
Article.paginated_each(options) do |a|
|
437
|
-
a.should_not be_nil
|
438
|
-
end
|
439
|
-
end
|
440
|
-
it "should provide a class method to get a collection for a view" do
|
441
|
-
articles = Article.find_all_article_details(:key => Date.today)
|
442
|
-
articles.class.should == Array
|
443
|
-
articles.size.should == 7
|
444
|
-
end
|
445
|
-
it "should raise an exception if design_doc is not provided" do
|
446
|
-
lambda{Article.collection_proxy_for(nil, 'by_date')}.should raise_error
|
447
|
-
lambda{Article.paginate(:view_name => 'by_date')}.should raise_error
|
448
|
-
end
|
449
|
-
it "should raise an exception if view_name is not provided" do
|
450
|
-
lambda{Article.collection_proxy_for('Article', nil)}.should raise_error
|
451
|
-
lambda{Article.paginate(:design_doc => 'Article')}.should raise_error
|
452
|
-
end
|
453
|
-
it "should be able to span multiple keys" do
|
454
|
-
articles = Article.by_date :startkey => Date.today, :endkey => Date.today - 1
|
455
|
-
articles.paginate(:page => 1, :per_page => 3).size.should == 3
|
456
|
-
articles.paginate(:page => 2, :per_page => 3).size.should == 3
|
457
|
-
articles.paginate(:page => 3, :per_page => 3).size.should == 3
|
458
|
-
articles.paginate(:page => 4, :per_page => 3).size.should == 3
|
459
|
-
articles.paginate(:page => 5, :per_page => 3).size.should == 1
|
460
|
-
end
|
461
|
-
it "should pass database parameter to pager" do
|
462
|
-
proxy = mock(:proxy)
|
463
|
-
proxy.stub!(:paginate)
|
464
|
-
::CouchRest::Model::Collection::CollectionProxy.should_receive(:new).with('database', anything(), anything(), anything(), anything()).and_return(proxy)
|
465
|
-
Article.paginate(:design_doc => 'Article', :view_name => 'by_date', :database => 'database')
|
466
|
-
end
|
467
|
-
end
|
468
396
|
|
469
397
|
end
|
data/spec/fixtures/base.rb
CHANGED
@@ -20,20 +20,22 @@ end
|
|
20
20
|
class WithCallBacks < CouchRest::Model::Base
|
21
21
|
use_database TEST_SERVER.default_database
|
22
22
|
property :name
|
23
|
-
property :
|
24
|
-
property :
|
23
|
+
property :run_before_validation
|
24
|
+
property :run_after_validation
|
25
25
|
property :run_before_save
|
26
26
|
property :run_after_save
|
27
27
|
property :run_before_create
|
28
28
|
property :run_after_create
|
29
29
|
property :run_before_update
|
30
30
|
property :run_after_update
|
31
|
+
|
32
|
+
validates_presence_of :run_before_validation
|
31
33
|
|
32
|
-
|
33
|
-
object.
|
34
|
+
before_validation do |object|
|
35
|
+
object.run_before_validation = true
|
34
36
|
end
|
35
|
-
|
36
|
-
object.
|
37
|
+
after_validation do |object|
|
38
|
+
object.run_after_validation = true
|
37
39
|
end
|
38
40
|
before_save do |object|
|
39
41
|
object.run_before_save = true
|
@@ -13,13 +13,15 @@ class Course < CouchRest::Model::Base
|
|
13
13
|
property :hours, Integer
|
14
14
|
property :profit, BigDecimal
|
15
15
|
property :started_on, :type => Date
|
16
|
-
property :updated_at,
|
16
|
+
property :updated_at, DateTime
|
17
17
|
property :active, :type => TrueClass
|
18
18
|
property :very_active, :type => TrueClass
|
19
19
|
property :klass, :type => Class
|
20
|
-
|
20
|
+
|
21
21
|
view_by :title
|
22
22
|
view_by :title, :active
|
23
23
|
view_by :dept, :ducktype => true
|
24
24
|
|
25
|
+
view_by :active, :map => "function(d) { if (d['#{model_type_key}'] == 'Course' && d['active']) { emit(d['updated_at'], 1); }}", :reduce => "function(k,v,r) { return sum(v); }"
|
26
|
+
|
25
27
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: couchrest_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
4
|
+
prerelease: true
|
6
5
|
segments:
|
7
6
|
- 1
|
7
|
+
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- beta
|
10
|
+
version: 1.1.0.beta
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- J. Chris Anderson
|
@@ -19,7 +19,7 @@ autorequire:
|
|
19
19
|
bindir: bin
|
20
20
|
cert_chain: []
|
21
21
|
|
22
|
-
date: 2011-01-16 00:00:00
|
22
|
+
date: 2011-01-16 00:00:00 +01:00
|
23
23
|
default_executable:
|
24
24
|
dependencies:
|
25
25
|
- !ruby/object:Gem::Dependency
|
@@ -30,12 +30,11 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
hash: 21
|
34
33
|
segments:
|
35
34
|
- 1
|
36
35
|
- 0
|
37
|
-
-
|
38
|
-
version: 1.0.
|
36
|
+
- 2
|
37
|
+
version: 1.0.2
|
39
38
|
type: :runtime
|
40
39
|
version_requirements: *id001
|
41
40
|
- !ruby/object:Gem::Dependency
|
@@ -46,7 +45,6 @@ dependencies:
|
|
46
45
|
requirements:
|
47
46
|
- - ~>
|
48
47
|
- !ruby/object:Gem::Version
|
49
|
-
hash: 17
|
50
48
|
segments:
|
51
49
|
- 1
|
52
50
|
- 15
|
@@ -61,7 +59,6 @@ dependencies:
|
|
61
59
|
requirements:
|
62
60
|
- - ~>
|
63
61
|
- !ruby/object:Gem::Version
|
64
|
-
hash: 7
|
65
62
|
segments:
|
66
63
|
- 3
|
67
64
|
- 0
|
@@ -77,7 +74,6 @@ dependencies:
|
|
77
74
|
requirements:
|
78
75
|
- - ~>
|
79
76
|
- !ruby/object:Gem::Version
|
80
|
-
hash: 63
|
81
77
|
segments:
|
82
78
|
- 0
|
83
79
|
- 3
|
@@ -93,7 +89,6 @@ dependencies:
|
|
93
89
|
requirements:
|
94
90
|
- - ~>
|
95
91
|
- !ruby/object:Gem::Version
|
96
|
-
hash: 7
|
97
92
|
segments:
|
98
93
|
- 3
|
99
94
|
- 0
|
@@ -109,46 +104,28 @@ dependencies:
|
|
109
104
|
requirements:
|
110
105
|
- - ">="
|
111
106
|
- !ruby/object:Gem::Version
|
112
|
-
hash: 15
|
113
|
-
segments:
|
114
|
-
- 2
|
115
|
-
- 0
|
116
|
-
- 0
|
117
|
-
version: 2.0.0
|
118
|
-
type: :runtime
|
119
|
-
version_requirements: *id006
|
120
|
-
- !ruby/object:Gem::Dependency
|
121
|
-
name: rspec
|
122
|
-
prerelease: false
|
123
|
-
requirement: &id007 !ruby/object:Gem::Requirement
|
124
|
-
none: false
|
125
|
-
requirements:
|
126
|
-
- - ">="
|
127
|
-
- !ruby/object:Gem::Version
|
128
|
-
hash: 15
|
129
107
|
segments:
|
130
108
|
- 2
|
131
109
|
- 0
|
132
110
|
- 0
|
133
111
|
version: 2.0.0
|
134
112
|
type: :development
|
135
|
-
version_requirements: *
|
113
|
+
version_requirements: *id006
|
136
114
|
- !ruby/object:Gem::Dependency
|
137
115
|
name: rack-test
|
138
116
|
prerelease: false
|
139
|
-
requirement: &
|
117
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
140
118
|
none: false
|
141
119
|
requirements:
|
142
120
|
- - ">="
|
143
121
|
- !ruby/object:Gem::Version
|
144
|
-
hash: 5
|
145
122
|
segments:
|
146
123
|
- 0
|
147
124
|
- 5
|
148
125
|
- 7
|
149
126
|
version: 0.5.7
|
150
127
|
type: :development
|
151
|
-
version_requirements: *
|
128
|
+
version_requirements: *id007
|
152
129
|
description: CouchRest Model provides aditional features to the standard CouchRest Document class such as properties, view designs, associations, callbacks, typecasting and validations.
|
153
130
|
email: jchris@apache.org
|
154
131
|
executables: []
|
@@ -182,6 +159,8 @@ files:
|
|
182
159
|
- lib/couchrest/model/collection.rb
|
183
160
|
- lib/couchrest/model/configuration.rb
|
184
161
|
- lib/couchrest/model/design_doc.rb
|
162
|
+
- lib/couchrest/model/designs.rb
|
163
|
+
- lib/couchrest/model/designs/view.rb
|
185
164
|
- lib/couchrest/model/document_queries.rb
|
186
165
|
- lib/couchrest/model/errors.rb
|
187
166
|
- lib/couchrest/model/extended_attachments.rb
|
@@ -189,6 +168,7 @@ files:
|
|
189
168
|
- lib/couchrest/model/properties.rb
|
190
169
|
- lib/couchrest/model/property.rb
|
191
170
|
- lib/couchrest/model/property_protection.rb
|
171
|
+
- lib/couchrest/model/proxyable.rb
|
192
172
|
- lib/couchrest/model/support/couchrest.rb
|
193
173
|
- lib/couchrest/model/support/hash.rb
|
194
174
|
- lib/couchrest/model/typecast.rb
|
@@ -196,7 +176,6 @@ files:
|
|
196
176
|
- lib/couchrest/model/validations/casted_model.rb
|
197
177
|
- lib/couchrest/model/validations/locale/en.yml
|
198
178
|
- lib/couchrest/model/validations/uniqueness.rb
|
199
|
-
- lib/couchrest/model/view.rb
|
200
179
|
- lib/couchrest/model/views.rb
|
201
180
|
- lib/couchrest/railtie.rb
|
202
181
|
- lib/couchrest_model.rb
|
@@ -210,13 +189,17 @@ files:
|
|
210
189
|
- spec/couchrest/casted_model_spec.rb
|
211
190
|
- spec/couchrest/casted_spec.rb
|
212
191
|
- spec/couchrest/class_proxy_spec.rb
|
192
|
+
- spec/couchrest/collection_spec.rb
|
213
193
|
- spec/couchrest/configuration_spec.rb
|
194
|
+
- spec/couchrest/designs/view_spec.rb
|
195
|
+
- spec/couchrest/designs_spec.rb
|
214
196
|
- spec/couchrest/inherited_spec.rb
|
215
197
|
- spec/couchrest/persistence_spec.rb
|
216
198
|
- spec/couchrest/property_protection_spec.rb
|
217
199
|
- spec/couchrest/property_spec.rb
|
200
|
+
- spec/couchrest/proxyable_spec.rb
|
218
201
|
- spec/couchrest/subclass_spec.rb
|
219
|
-
- spec/couchrest/
|
202
|
+
- spec/couchrest/validations_spec.rb
|
220
203
|
- spec/couchrest/view_spec.rb
|
221
204
|
- spec/fixtures/attachments/README
|
222
205
|
- spec/fixtures/attachments/couchdb.png
|
@@ -255,7 +238,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
255
238
|
requirements:
|
256
239
|
- - ">="
|
257
240
|
- !ruby/object:Gem::Version
|
258
|
-
hash: 3
|
259
241
|
segments:
|
260
242
|
- 0
|
261
243
|
version: "0"
|
@@ -264,7 +246,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
264
246
|
requirements:
|
265
247
|
- - ">"
|
266
248
|
- !ruby/object:Gem::Version
|
267
|
-
hash: 25
|
268
249
|
segments:
|
269
250
|
- 1
|
270
251
|
- 3
|
@@ -273,45 +254,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
273
254
|
requirements: []
|
274
255
|
|
275
256
|
rubyforge_project:
|
276
|
-
rubygems_version: 1.
|
257
|
+
rubygems_version: 1.3.7
|
277
258
|
signing_key:
|
278
259
|
specification_version: 3
|
279
260
|
summary: Extends the CouchRest Document for advanced modelling.
|
280
|
-
test_files:
|
281
|
-
|
282
|
-
- spec/couchrest/attachment_spec.rb
|
283
|
-
- spec/couchrest/base_spec.rb
|
284
|
-
- spec/couchrest/casted_model_spec.rb
|
285
|
-
- spec/couchrest/casted_spec.rb
|
286
|
-
- spec/couchrest/class_proxy_spec.rb
|
287
|
-
- spec/couchrest/configuration_spec.rb
|
288
|
-
- spec/couchrest/inherited_spec.rb
|
289
|
-
- spec/couchrest/persistence_spec.rb
|
290
|
-
- spec/couchrest/property_protection_spec.rb
|
291
|
-
- spec/couchrest/property_spec.rb
|
292
|
-
- spec/couchrest/subclass_spec.rb
|
293
|
-
- spec/couchrest/validations.rb
|
294
|
-
- spec/couchrest/view_spec.rb
|
295
|
-
- spec/fixtures/attachments/README
|
296
|
-
- spec/fixtures/attachments/couchdb.png
|
297
|
-
- spec/fixtures/attachments/test.html
|
298
|
-
- spec/fixtures/base.rb
|
299
|
-
- spec/fixtures/more/article.rb
|
300
|
-
- spec/fixtures/more/card.rb
|
301
|
-
- spec/fixtures/more/cat.rb
|
302
|
-
- spec/fixtures/more/client.rb
|
303
|
-
- spec/fixtures/more/course.rb
|
304
|
-
- spec/fixtures/more/event.rb
|
305
|
-
- spec/fixtures/more/invoice.rb
|
306
|
-
- spec/fixtures/more/person.rb
|
307
|
-
- spec/fixtures/more/question.rb
|
308
|
-
- spec/fixtures/more/sale_entry.rb
|
309
|
-
- spec/fixtures/more/sale_invoice.rb
|
310
|
-
- spec/fixtures/more/service.rb
|
311
|
-
- spec/fixtures/more/user.rb
|
312
|
-
- spec/fixtures/views/lib.js
|
313
|
-
- spec/fixtures/views/test_view/lib.js
|
314
|
-
- spec/fixtures/views/test_view/only-map.js
|
315
|
-
- spec/fixtures/views/test_view/test-map.js
|
316
|
-
- spec/fixtures/views/test_view/test-reduce.js
|
317
|
-
- spec/spec_helper.rb
|
261
|
+
test_files: []
|
262
|
+
|
data/lib/couchrest/model/view.rb
DELETED
@@ -1,190 +0,0 @@
|
|
1
|
-
|
2
|
-
#### NOTE Work in progress! Not yet used!
|
3
|
-
|
4
|
-
module CouchRest
|
5
|
-
module Model
|
6
|
-
|
7
|
-
# A proxy class that allows view queries to be created using
|
8
|
-
# chained method calls. After each call a new instance of the method
|
9
|
-
# is created based on the original in a similar fashion to ruby's sequel
|
10
|
-
# library, or Rails 3's Arel.
|
11
|
-
#
|
12
|
-
# CouchDB views have inherent limitations, so joins and filters as used in
|
13
|
-
# a normal relational database are not possible. At least not yet!
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
class View
|
18
|
-
|
19
|
-
attr_accessor :query, :design, :database, :name
|
20
|
-
|
21
|
-
# Initialize a new View object. This method should not be called from outside CouchRest Model.
|
22
|
-
def initialize(parent, new_query = {}, name = nil)
|
23
|
-
if parent.is_a? Base
|
24
|
-
raise "Name must be provided for view to be initialized" if name.nil?
|
25
|
-
@name = name
|
26
|
-
@database = parent.database
|
27
|
-
@query = { :reduce => false }
|
28
|
-
elsif parent.is_a? View
|
29
|
-
@database = parent.database
|
30
|
-
@query = parent.query.dup
|
31
|
-
else
|
32
|
-
raise "View cannot be initialized without a parent Model or View"
|
33
|
-
end
|
34
|
-
@query.update(new_query)
|
35
|
-
super
|
36
|
-
end
|
37
|
-
|
38
|
-
|
39
|
-
# == View Execution Methods
|
40
|
-
#
|
41
|
-
# Send a request to the CouchDB database using the current query values.
|
42
|
-
|
43
|
-
# Inmediatly send a request to the database for all documents provided by the query.
|
44
|
-
#
|
45
|
-
def all(&block)
|
46
|
-
args = include_docs.query
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
# Inmediatly send a request for the first result of the dataset. This will override
|
51
|
-
# any limit set in the view previously.
|
52
|
-
def first(&block)
|
53
|
-
args = limit(1).include_docs.query
|
54
|
-
|
55
|
-
end
|
56
|
-
|
57
|
-
def info
|
58
|
-
|
59
|
-
end
|
60
|
-
|
61
|
-
def offset
|
62
|
-
|
63
|
-
end
|
64
|
-
|
65
|
-
def total_rows
|
66
|
-
|
67
|
-
end
|
68
|
-
|
69
|
-
def rows
|
70
|
-
|
71
|
-
end
|
72
|
-
|
73
|
-
|
74
|
-
# == View Filter Methods
|
75
|
-
#
|
76
|
-
# View filters return an copy of the view instance with the query
|
77
|
-
# modified appropriatly. Errors will be raised if the methods
|
78
|
-
# are combined in an incorrect fashion.
|
79
|
-
#
|
80
|
-
|
81
|
-
|
82
|
-
# Find all entries in the index whose key matches the value provided.
|
83
|
-
#
|
84
|
-
# Cannot be used when the +#startkey+ or +#endkey+ have been set.
|
85
|
-
def key(value)
|
86
|
-
raise "View#key cannot be used when startkey or endkey have been set" unless query[:startkey].nil? && query[:endkey].nil?
|
87
|
-
update_query(:key => value)
|
88
|
-
end
|
89
|
-
|
90
|
-
# Find all index keys that start with the value provided. May or may not be used in
|
91
|
-
# conjunction with the +endkey+ option.
|
92
|
-
#
|
93
|
-
# When the +#descending+ option is used (not the default), the start and end keys should
|
94
|
-
# be reversed.
|
95
|
-
#
|
96
|
-
# Cannot be used if the key has been set.
|
97
|
-
def startkey(value)
|
98
|
-
raise "View#startkey cannot be used when key has been set" unless query[:key].nil?
|
99
|
-
update_query(:startkey => value)
|
100
|
-
end
|
101
|
-
|
102
|
-
# The result set should start from the position of the provided document.
|
103
|
-
# The value may be provided as an object that responds to the +#id+ call
|
104
|
-
# or a string.
|
105
|
-
def startkey_doc(value)
|
106
|
-
update_query(:startkey_docid => value.is_a?(String) ? value : value.id
|
107
|
-
end
|
108
|
-
|
109
|
-
# The opposite of +#startkey+, finds all index entries whose key is before the value specified.
|
110
|
-
#
|
111
|
-
# See the +#startkey+ method for more details and the +#inclusive_end+ option.
|
112
|
-
def endkey(value)
|
113
|
-
raise "View#endkey cannot be used when key has been set" unless query[:key].nil?
|
114
|
-
update_query(:endkey => value)
|
115
|
-
end
|
116
|
-
|
117
|
-
# The result set should end at the position of the provided document.
|
118
|
-
# The value may be provided as an object that responds to the +#id+ call
|
119
|
-
# or a string.
|
120
|
-
def endkey_doc(value)
|
121
|
-
update_query(:endkey_docid => value.is_a?(String) ? value : value.id
|
122
|
-
end
|
123
|
-
|
124
|
-
|
125
|
-
# The results should be provided in descending order.
|
126
|
-
#
|
127
|
-
# Descending is false by default, this method will enable it and cannot be undone.
|
128
|
-
def descending
|
129
|
-
update_query(:descending => true)
|
130
|
-
end
|
131
|
-
|
132
|
-
# Limit the result set to the value supplied.
|
133
|
-
def limit(value)
|
134
|
-
update_query(:limit => value)
|
135
|
-
end
|
136
|
-
|
137
|
-
# Skip the number of entries in the index specified by value. This would be
|
138
|
-
# the equivilent of an offset in SQL.
|
139
|
-
#
|
140
|
-
# The CouchDB documentation states that the skip option should not be used
|
141
|
-
# with large data sets as it is inefficient. Use the +startkey_doc+ method
|
142
|
-
# instead to skip ranges efficiently.
|
143
|
-
def skip(value = 0)
|
144
|
-
update_query(:skip => value)
|
145
|
-
end
|
146
|
-
|
147
|
-
# Use the reduce function on the view. If none is available this method will fail.
|
148
|
-
def reduce
|
149
|
-
update_query(:reduce => true)
|
150
|
-
end
|
151
|
-
|
152
|
-
# Control whether the reduce function reduces to a set of distinct keys or to a single
|
153
|
-
# result row.
|
154
|
-
#
|
155
|
-
# By default the value is false, and can only be set when the view's +#reduce+ option
|
156
|
-
# has been set.
|
157
|
-
def group
|
158
|
-
raise "View#reduce must have been set before grouping is permitted" unless query[:reduce]
|
159
|
-
update_query(:group => true)
|
160
|
-
end
|
161
|
-
|
162
|
-
def group_level(value)
|
163
|
-
raise "View#reduce and View#group must have been set before group_level is called" unless query[:reduce] && query[:group]
|
164
|
-
update_query(:group_level => value.to_i)
|
165
|
-
end
|
166
|
-
|
167
|
-
|
168
|
-
protected
|
169
|
-
|
170
|
-
def update_query(new_query = {})
|
171
|
-
self.class.new(self, new_query)
|
172
|
-
end
|
173
|
-
|
174
|
-
# Used internally to ensure that docs are provided. Should not be used outside of
|
175
|
-
# the view class under normal circumstances.
|
176
|
-
def include_docs
|
177
|
-
raise "Documents cannot be returned from a view that is prepared for a reduce" if query[:reduce]
|
178
|
-
update_query(:include_docs => true)
|
179
|
-
end
|
180
|
-
|
181
|
-
|
182
|
-
def execute(&block)
|
183
|
-
|
184
|
-
|
185
|
-
end
|
186
|
-
|
187
|
-
|
188
|
-
end
|
189
|
-
end
|
190
|
-
end
|