leanback 0.3.4 → 0.4.0
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.
- data/Changelog.rdoc +15 -0
- data/README.md +5 -1
- data/VERSION +1 -1
- data/leanback.gemspec +2 -2
- data/lib/leanback.rb +123 -0
- data/spec/admin_party/database_spec.rb +40 -0
- data/spec/no_admin_party/database_spec.rb +39 -1
- data/test/main.rb +28 -1
- metadata +3 -3
data/Changelog.rdoc
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
=0.4.0
|
2
|
+
June 9, 2013
|
3
|
+
* added ability to find documents by multiple keys
|
4
|
+
Example:
|
5
|
+
keys = {:gender => 'male',:age => '34'}
|
6
|
+
Couchdb.find_by_keys({:database => 'friends', :keys => keys})
|
7
|
+
This will return all documents in the friends database with gender = male and age = 34
|
8
|
+
* added the ability to count documents by multiple keys
|
9
|
+
Example:
|
10
|
+
keys = {:gender => 'male',:age => '40'}
|
11
|
+
count = Couchdb.count_by_keys({:database => 'friends', :keys => keys})
|
12
|
+
This will return the number of documents in the friends database with gender = male and age = 40.
|
13
|
+
See documentation for details.
|
14
|
+
|
15
|
+
|
1
16
|
=0.3.4
|
2
17
|
June 2, 2013
|
3
18
|
* added options for manipulating query results, the options available are limit, skip, descending, startkey, endkey
|
data/README.md
CHANGED
@@ -14,7 +14,7 @@ This project is still under development. Not complete by any means. I made this
|
|
14
14
|
Upgraded and tested on CouchDB 1.2.0. CouchDB 1.0.1 should still work fine.
|
15
15
|
|
16
16
|
##Changes
|
17
|
-
(https://github.com/obi-a/leanback/blob/master/Changelog.rdoc)
|
17
|
+
View the [Changelog](https://github.com/obi-a/leanback/blob/master/Changelog.rdoc)
|
18
18
|
|
19
19
|
##Usage
|
20
20
|
|
@@ -26,9 +26,13 @@ Upgraded and tested on CouchDB 1.2.0. CouchDB 1.0.1 should still work fine.
|
|
26
26
|
+ [Basic CouchDB Operations](http://www.whisperservers.com/leanback/basic-couchdb-operations/)
|
27
27
|
|
28
28
|
+ [Find Documents by Key](http://www.whisperservers.com/leanback/find-documents-by-key/)
|
29
|
+
|
30
|
+
+ [Find Document By Multiple Keys] (http://www.whisperservers.com/leanback/find-document-by-multiple-keys/)
|
29
31
|
|
30
32
|
+ [Count Documents by Key](http://www.whisperservers.com/leanback/count-documents-by-key/)
|
31
33
|
|
34
|
+
+ [Count Documents by Multiple Keys] (http://www.whisperservers.com/leanback/count-by-multiple-documents/)
|
35
|
+
|
32
36
|
+ Working with [CouchDB Views](http://www.whisperservers.com/leanback/design-documents-and-permanent-views/)
|
33
37
|
|
34
38
|
+ [Error Handling](http://www.whisperservers.com/leanback/error-handling/)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/leanback.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "leanback"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.4.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Obi Akubue"]
|
12
|
-
s.date = "2013-06-
|
12
|
+
s.date = "2013-06-09"
|
13
13
|
s.description = "lightweight Ruby interface to CouchDB"
|
14
14
|
s.email = "obioraakubue@yahoo.com"
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/leanback.rb
CHANGED
@@ -396,6 +396,62 @@ def self.add_finder(options,auth_session = "")
|
|
396
396
|
end
|
397
397
|
end
|
398
398
|
|
399
|
+
#add a multiple finder method to the database
|
400
|
+
#this creates a find by keys method
|
401
|
+
def self.add_multiple_finder(options,auth_session = "")
|
402
|
+
set_address
|
403
|
+
db_name = options[:database]
|
404
|
+
keys = options[:keys]
|
405
|
+
view_name = keys.join("_")
|
406
|
+
key = keys.join(",doc.")
|
407
|
+
condition = keys.join(" && doc.")
|
408
|
+
design_doc_name = view_name + '_keys_finder'
|
409
|
+
|
410
|
+
view = '{
|
411
|
+
"language" : "javascript",
|
412
|
+
"views" :{
|
413
|
+
"find_by_keys_'+view_name+'" : {
|
414
|
+
"map" : "function(doc){ if(doc.'+condition+') emit([doc.'+key+'],doc);}"
|
415
|
+
}
|
416
|
+
}
|
417
|
+
}'
|
418
|
+
|
419
|
+
begin
|
420
|
+
response = RestClient.put 'http://' + @address + ':' + @port + '/' + db_name + '/_design/' + design_doc_name, view, {:cookies => {"AuthSession" => auth_session}}
|
421
|
+
rescue => e
|
422
|
+
hash = Yajl::Parser.parse(e.response.to_s)
|
423
|
+
raise CouchdbException.new(hash), "CouchDB: Error - " + hash.values[0] + ". Reason - " + hash.values[1]
|
424
|
+
end
|
425
|
+
end
|
426
|
+
|
427
|
+
#add a multiple counter method to the database
|
428
|
+
#this creates a count by keys method
|
429
|
+
def self.add_multiple_counter(options,auth_session = "")
|
430
|
+
set_address
|
431
|
+
db_name = options[:database]
|
432
|
+
keys = options[:keys]
|
433
|
+
view_name = keys.join("_")
|
434
|
+
key = keys.join(",doc.")
|
435
|
+
condition = keys.join(" && doc.")
|
436
|
+
design_doc_name = view_name + '_keys_counter'
|
437
|
+
|
438
|
+
view = '{
|
439
|
+
"language" : "javascript",
|
440
|
+
"views" :{
|
441
|
+
"count_by_keys_'+view_name+'" : {
|
442
|
+
"map" : "function(doc){ if(doc.'+condition+') emit([doc.'+key+'],null);}", "reduce": "_count"
|
443
|
+
}
|
444
|
+
}
|
445
|
+
}'
|
446
|
+
|
447
|
+
begin
|
448
|
+
response = RestClient.put 'http://' + @address + ':' + @port + '/' + db_name + '/_design/' + design_doc_name, view, {:cookies => {"AuthSession" => auth_session}}
|
449
|
+
rescue => e
|
450
|
+
hash = Yajl::Parser.parse(e.response.to_s)
|
451
|
+
raise CouchdbException.new(hash), "CouchDB: Error - " + hash.values[0] + ". Reason - " + hash.values[1]
|
452
|
+
end
|
453
|
+
end
|
454
|
+
|
399
455
|
#add a counter method to the database
|
400
456
|
#this creates a count method that counts documents by key
|
401
457
|
def self.add_counter(options,auth_session = "")
|
@@ -443,6 +499,40 @@ def self.count(options,auth_session = "")
|
|
443
499
|
return count.to_i
|
444
500
|
end
|
445
501
|
|
502
|
+
#count by keys
|
503
|
+
#example:
|
504
|
+
#hash = {:firstname =>'john', :gender => 'male' }
|
505
|
+
#Couchdb.count_by_keys({:database => 'contacts', :keys => hash},auth_session)
|
506
|
+
def self.count_by_keys(options,auth_session = "", params = {})
|
507
|
+
set_address
|
508
|
+
db_name = options[:database]
|
509
|
+
keys = []
|
510
|
+
search_term = []
|
511
|
+
hash = options[:keys]
|
512
|
+
|
513
|
+
hash.each do |k,v|
|
514
|
+
keys << k
|
515
|
+
search_term << v
|
516
|
+
end
|
517
|
+
index = keys.join("_")
|
518
|
+
design_doc_name = index + '_keys_counter'
|
519
|
+
view_name = 'count_by_keys_' + index
|
520
|
+
params[:startkey] = search_term
|
521
|
+
params[:endkey] = search_term
|
522
|
+
|
523
|
+
begin
|
524
|
+
view = { :database => db_name, :design_doc => design_doc_name, :view => view_name}
|
525
|
+
docs = find view,auth_session,key=nil,params
|
526
|
+
rescue CouchdbException => e
|
527
|
+
#add a finder/index if one doesn't already exist in the database
|
528
|
+
#then find_by_keys
|
529
|
+
add_multiple_counter({:database => db_name, :keys => keys},auth_session)
|
530
|
+
docs = find view,auth_session,key=nil,params
|
531
|
+
end
|
532
|
+
count = docs[0]
|
533
|
+
return count.to_i
|
534
|
+
end
|
535
|
+
|
446
536
|
#find by key
|
447
537
|
def self.find_by(options,auth_session = "", params = {})
|
448
538
|
set_address
|
@@ -464,6 +554,39 @@ def self.find_by(options,auth_session = "", params = {})
|
|
464
554
|
return docs
|
465
555
|
end
|
466
556
|
|
557
|
+
#find by keys
|
558
|
+
#example:
|
559
|
+
#hash = {:firstname =>'john', :gender => 'male' }
|
560
|
+
#Couchdb.find_by_keys({:database => 'contacts', :keys => hash},auth_session)
|
561
|
+
def self.find_by_keys(options,auth_session = "", params = {})
|
562
|
+
set_address
|
563
|
+
db_name = options[:database]
|
564
|
+
keys = []
|
565
|
+
search_term = []
|
566
|
+
hash = options[:keys]
|
567
|
+
|
568
|
+
hash.each do |k,v|
|
569
|
+
keys << k
|
570
|
+
search_term << v
|
571
|
+
end
|
572
|
+
index = keys.join("_")
|
573
|
+
design_doc_name = index + '_keys_finder'
|
574
|
+
view_name = 'find_by_keys_' + index
|
575
|
+
params[:startkey] = search_term
|
576
|
+
params[:endkey] = search_term
|
577
|
+
|
578
|
+
begin
|
579
|
+
view = { :database => db_name, :design_doc => design_doc_name, :view => view_name}
|
580
|
+
docs = find view,auth_session,key=nil,params
|
581
|
+
rescue CouchdbException => e
|
582
|
+
#add a finder/index if one doesn't already exist in the database
|
583
|
+
#then find_by_keys
|
584
|
+
add_multiple_finder({:database => db_name, :keys => keys},auth_session)
|
585
|
+
docs = find view,auth_session,key=nil,params
|
586
|
+
end
|
587
|
+
return docs
|
588
|
+
end
|
589
|
+
|
467
590
|
#return a list of all docs in the database
|
468
591
|
def self.docs_from(database_name,auth_session = "")
|
469
592
|
set_address
|
@@ -64,6 +64,39 @@ it "find items by key" do
|
|
64
64
|
Couchdb.delete_doc({:database => 'friends', :doc_id => '_design/lastname_finder'})
|
65
65
|
end
|
66
66
|
|
67
|
+
it "should find items by multiple keys" do
|
68
|
+
keys = {:gender => 'male',:age => '34'}
|
69
|
+
docs = Couchdb.find_by_keys({:database => 'friends', :keys => keys})
|
70
|
+
d = docs[0]
|
71
|
+
d["age"].should == "34"
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should find items by multiple keys using a single key" do
|
75
|
+
keys = {:lastname => 'smith'}
|
76
|
+
docs = Couchdb.find_by_keys({:database => 'friends', :keys => keys})
|
77
|
+
d = docs[0]
|
78
|
+
d["lastname"].should == "smith"
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should find items by multiple keys" do
|
82
|
+
keys = {:gender => 'male',:age => '40'}
|
83
|
+
docs = Couchdb.find_by_keys({:database => 'friends', :keys => keys})
|
84
|
+
docs.should == []
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should count items by multiple keys" do
|
88
|
+
keys = {:gender => 'male',:age => '34'}
|
89
|
+
count = Couchdb.count_by_keys({:database => 'friends', :keys => keys})
|
90
|
+
count.should == 1
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should count items by multiple keys" do
|
94
|
+
keys = {:gender => 'male',:age => '40'}
|
95
|
+
count = Couchdb.count_by_keys({:database => 'friends', :keys => keys})
|
96
|
+
count.should == 0
|
97
|
+
end
|
98
|
+
|
99
|
+
|
67
100
|
it "should query a permanent view that doesn't exist and handle exception" do
|
68
101
|
begin
|
69
102
|
view = { :database => "friends", :design_doc => 'more_views', :view => 'get_user_email'}
|
@@ -205,6 +238,13 @@ it "should test finder options" do
|
|
205
238
|
data = {:firstname => 'sam', :gender =>'male', :age => '28', :salary => '97000'}
|
206
239
|
doc = {:database => 'fishes', :doc_id => 'sam', :data => data}
|
207
240
|
Couchdb.create_doc doc
|
241
|
+
|
242
|
+
|
243
|
+
keys = {:age =>'28', :gender => 'male'}
|
244
|
+
hash = Couchdb.find_by_keys({:database => 'fishes', :keys => keys},'', options = {:limit => 2, :skip => 1})
|
245
|
+
h = hash[0]
|
246
|
+
h["firstname"].should == "john"
|
247
|
+
hash.length.should == 2
|
208
248
|
|
209
249
|
#create the design doc to be queryed in the test
|
210
250
|
Couchdb.find_by({:database => 'fishes', :gender => 'male'})
|
@@ -70,6 +70,37 @@ it "find items by key" do
|
|
70
70
|
Couchdb.delete_doc({:database => 'contacts', :doc_id => '_design/lastname_finder'},@@auth_session)
|
71
71
|
end
|
72
72
|
|
73
|
+
it "should find items by multiple keys" do
|
74
|
+
keys = {:gender => 'male',:age => '34'}
|
75
|
+
docs = Couchdb.find_by_keys({:database => 'contacts', :keys => keys},@@auth_session)
|
76
|
+
d = docs[0]
|
77
|
+
d["age"].should == "34"
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should find items by multiple keys using a single key" do
|
81
|
+
keys = {:lastname => 'smith'}
|
82
|
+
docs = Couchdb.find_by_keys({:database => 'contacts', :keys => keys},@@auth_session)
|
83
|
+
d = docs[0]
|
84
|
+
d["lastname"].should == "smith"
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should find items by multiple keys" do
|
88
|
+
keys = {:gender => 'male',:age => '40'}
|
89
|
+
docs = Couchdb.find_by_keys({:database => 'contacts', :keys => keys},@@auth_session)
|
90
|
+
docs.should == []
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should count items by multiple keys" do
|
94
|
+
keys = {:gender => 'male',:age => '34'}
|
95
|
+
count = Couchdb.count_by_keys({:database => 'contacts', :keys => keys},@@auth_session)
|
96
|
+
count.should == 1
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should count items by multiple keys" do
|
100
|
+
keys = {:gender => 'male',:age => '40'}
|
101
|
+
count = Couchdb.count_by_keys({:database => 'contacts', :keys => keys},@@auth_session)
|
102
|
+
count.should == 0
|
103
|
+
end
|
73
104
|
|
74
105
|
|
75
106
|
|
@@ -213,6 +244,13 @@ it "should test finder options" do
|
|
213
244
|
data = {:firstname => 'sam', :gender =>'male', :age => '28', :salary => '97000'}
|
214
245
|
doc = {:database => 'fishes', :doc_id => 'sam', :data => data}
|
215
246
|
Couchdb.create_doc doc,@@auth_session
|
247
|
+
|
248
|
+
|
249
|
+
keys = {:age =>'28', :gender => 'male'}
|
250
|
+
hash = Couchdb.find_by_keys({:database => 'fishes', :keys => keys},@@auth_session, options = {:limit => 2, :skip => 1})
|
251
|
+
h = hash[0]
|
252
|
+
h["firstname"].should == "john"
|
253
|
+
hash.length.should == 2
|
216
254
|
|
217
255
|
#create the design doc to be queryed in the test
|
218
256
|
Couchdb.find_by({:database => 'fishes', :gender => 'male'},@@auth_session)
|
@@ -421,7 +459,7 @@ it "should switch to default bind address" do
|
|
421
459
|
data = {:section => "httpd",
|
422
460
|
:key => "port",
|
423
461
|
:value => "5984" }
|
424
|
-
|
462
|
+
Couchdb.set_config(data,@@auth_session)
|
425
463
|
|
426
464
|
#Couchdb.address = nil
|
427
465
|
#Couchdb.port = nil
|
data/test/main.rb
CHANGED
@@ -44,7 +44,7 @@ view = { :database => "zralph1369728249zeb1292e18b998352",
|
|
44
44
|
view = { :database => "monitors",
|
45
45
|
:design_doc => 'test_finder',
|
46
46
|
:view => 'find_by_test'}
|
47
|
-
hash = Couchdb.find view,auth_session,key=nil, options = {:startkey => ["1000","UP"], :endkey => ["6000","UP"]}
|
47
|
+
#hash = Couchdb.find view,auth_session,key=nil, options = {:startkey => ["1000","UP"], :endkey => ["6000","UP"]}
|
48
48
|
|
49
49
|
#hash = Couchdb.find view,auth_session,key=nil, options = {:startkey => ["3300","UP"],:descending => true}
|
50
50
|
|
@@ -54,6 +54,33 @@ hash = Couchdb.find view,auth_session,key=nil, options = {:startkey => ["1000","
|
|
54
54
|
|
55
55
|
#hash = Couchdb.find view,auth_session,key= '?keys=%5B%228800%22,%22UP%22%5D'
|
56
56
|
|
57
|
+
keys = {:tag =>'ralph', :via => 'ses' }
|
58
|
+
hash = Couchdb.find_by_keys({:database => 'monitors', :keys => keys},auth_session)
|
59
|
+
|
60
|
+
#keys = {:tag =>'ralph', :via => 'ses' }
|
61
|
+
#num = Couchdb.count_by_keys({:database => 'monitors', :keys => keys},auth_session)
|
62
|
+
|
63
|
+
#keys = {:tag =>'ralph', :via => 'ses', :every => '1m'}
|
64
|
+
#hash = Couchdb.find_by_keys({:database => 'monitors', :keys => keys},auth_session, options = {:limit => 1, :skip => 1})
|
65
|
+
|
66
|
+
#keys = {:tag =>'ralph', :via => 'ses', :every => '5m'}
|
67
|
+
#num = Couchdb.count_by_keys({:database => 'monitors', :keys => keys},auth_session)
|
68
|
+
|
69
|
+
#keys = {:tag => 'ralph'}
|
70
|
+
#hash = Couchdb.find_by_keys({:database => 'monitors', :keys => keys},auth_session)
|
71
|
+
|
72
|
+
#keys = {:tag => 'ralph'}
|
73
|
+
#num = Couchdb.count_by_keys({:database => 'monitors', :keys => keys},auth_session)
|
74
|
+
|
75
|
+
|
76
|
+
#Couchdb.add_multiple_finder({:database => "monitors", :keys => ["tag","via"]},auth_session)
|
77
|
+
|
78
|
+
#Couchdb.add_multiple_finder({:database => "monitors", :keys => ["tag","via","state"]},auth_session)
|
79
|
+
|
80
|
+
#Couchdb.add_multiple_finder({:database => "monitors", :keys => ["tag"]},auth_session)
|
81
|
+
|
82
|
+
#puts num.to_s
|
83
|
+
|
57
84
|
puts hash.inspect
|
58
85
|
|
59
86
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: leanback
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-06-
|
12
|
+
date: 2013-06-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-client
|
@@ -167,7 +167,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
167
167
|
version: '0'
|
168
168
|
segments:
|
169
169
|
- 0
|
170
|
-
hash:
|
170
|
+
hash: -3576361140829374907
|
171
171
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
172
172
|
none: false
|
173
173
|
requirements:
|