couchbase-jruby-client 0.1.0-java → 0.1.5-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.jrubyrc +722 -0
- data/.ruby-version +1 -1
- data/README.md +12 -90
- data/couchbase-jruby-client.gemspec +6 -6
- data/lib/couchbase/async.rb +18 -0
- data/lib/couchbase/bucket.rb +90 -180
- data/lib/couchbase/constants.rb +17 -0
- data/lib/couchbase/design_doc.rb +83 -0
- data/lib/couchbase/error.rb +31 -0
- data/lib/couchbase/operations/arithmetic.rb +17 -0
- data/lib/couchbase/operations/delete.rb +17 -0
- data/lib/couchbase/operations/design_docs.rb +99 -0
- data/lib/couchbase/operations/get.rb +73 -67
- data/lib/couchbase/operations/stats.rb +28 -1
- data/lib/couchbase/operations/store.rb +114 -97
- data/lib/couchbase/operations/touch.rb +49 -19
- data/lib/couchbase/operations/unlock.rb +209 -0
- data/lib/couchbase/operations/utils.rb +22 -10
- data/lib/couchbase/operations.rb +21 -0
- data/lib/couchbase/query.rb +92 -0
- data/lib/couchbase/result.rb +18 -1
- data/lib/couchbase/transcoder.rb +36 -42
- data/lib/couchbase/version.rb +18 -1
- data/lib/couchbase/view.rb +30 -172
- data/lib/couchbase/view_row.rb +38 -98
- data/lib/couchbase.rb +74 -72
- data/test/profile/.jrubyrc +722 -0
- data/test/profile/Gemfile +5 -5
- data/test/profile/benchmark.rb +106 -124
- data/test/profile/profile.rb +59 -0
- data/test/setup.rb +10 -145
- data/test/test_arithmetic.rb +54 -77
- data/test/test_async.rb +74 -102
- data/test/test_bucket.rb +74 -60
- data/test/test_cas.rb +10 -23
- data/test/test_couchbase.rb +11 -3
- data/test/test_delete.rb +41 -43
- data/test/test_design_docs.rb +62 -0
- data/test/test_errors.rb +9 -18
- data/test/test_format.rb +21 -31
- data/test/test_get.rb +107 -151
- data/test/test_query.rb +23 -0
- data/test/test_stats.rb +9 -24
- data/test/test_store.rb +52 -65
- data/test/test_timer.rb +4 -12
- data/test/test_touch.rb +26 -33
- data/test/test_unlock.rb +47 -78
- data/test/test_utils.rb +2 -11
- data/test/test_version.rb +5 -14
- data/test/test_view.rb +87 -0
- metadata +27 -14
- data/lib/couchbase/jruby/couchbase_client.rb +0 -22
- data/lib/couchbase/jruby/future.rb +0 -8
data/lib/couchbase/operations.rb
CHANGED
@@ -1,9 +1,28 @@
|
|
1
|
+
# Author:: Mike Evans <mike@urlgonomics.com>
|
2
|
+
# Copyright:: 2013 Urlgonomics LLC.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
1
18
|
require 'couchbase/operations/touch'
|
2
19
|
require 'couchbase/operations/store'
|
3
20
|
require 'couchbase/operations/get'
|
4
21
|
require 'couchbase/operations/delete'
|
22
|
+
require 'couchbase/operations/unlock'
|
5
23
|
require 'couchbase/operations/arithmetic'
|
6
24
|
require 'couchbase/operations/stats'
|
25
|
+
require 'couchbase/operations/design_docs'
|
7
26
|
require 'couchbase/operations/utils'
|
8
27
|
|
9
28
|
module Couchbase
|
@@ -14,8 +33,10 @@ module Couchbase
|
|
14
33
|
klass.send(:include, Get)
|
15
34
|
klass.send(:include, Touch)
|
16
35
|
klass.send(:include, Delete)
|
36
|
+
klass.send(:include, Unlock)
|
17
37
|
klass.send(:include, Arithmetic)
|
18
38
|
klass.send(:include, Stats)
|
39
|
+
klass.send(:include, DesignDocs)
|
19
40
|
klass.send(:include, Utils)
|
20
41
|
end
|
21
42
|
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# Author:: Mike Evans <mike@urlgonomics.com>
|
2
|
+
# Copyright:: 2013 Urlgonomics LLC.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
|
19
|
+
module Couchbase
|
20
|
+
class Query
|
21
|
+
|
22
|
+
java_import com.couchbase.client.protocol.views.Stale
|
23
|
+
|
24
|
+
METHOD_MAPPING = {
|
25
|
+
:include_docs => :setIncludeDocs,
|
26
|
+
:descending => :setDescending,
|
27
|
+
:key => :setKey,
|
28
|
+
:keys => :setKeys,
|
29
|
+
:start_key => :setRangeStart,
|
30
|
+
:startkey => :setRangeStart,
|
31
|
+
:startkey_docid => :setStartkeyDocID,
|
32
|
+
:endkey => :setRangeEnd,
|
33
|
+
:endkey_docid => :setEndkeyDocID,
|
34
|
+
:inclusive_end => :setInclusiveEnd,
|
35
|
+
:limit => :setLimit,
|
36
|
+
:skip => :setSkip,
|
37
|
+
:reduce => :setReduce,
|
38
|
+
:group => :setGroup,
|
39
|
+
:group_level => :setGroupLevel,
|
40
|
+
:connection_timeout => nil
|
41
|
+
}.freeze
|
42
|
+
|
43
|
+
def initialize(params)
|
44
|
+
@params = params
|
45
|
+
end
|
46
|
+
|
47
|
+
def generate
|
48
|
+
query = Java::ComCouchbaseClientProtocolViews::Query.new
|
49
|
+
|
50
|
+
stale = @params.delete(:stale)
|
51
|
+
if !stale.nil?
|
52
|
+
case stale
|
53
|
+
when :after_update
|
54
|
+
query.setStale(Stale::UPDATE_AFTER)
|
55
|
+
when :ok
|
56
|
+
query.setStale(Stale::OK)
|
57
|
+
when false
|
58
|
+
query.setStale(Stale::FALSE)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
@params.each_pair do |meth, val|
|
63
|
+
if METHOD_MAPPING.key?(meth)
|
64
|
+
if java_meth = METHOD_MAPPING[meth]
|
65
|
+
query.send(java_meth, val)
|
66
|
+
end
|
67
|
+
else
|
68
|
+
fail ArgumentError, "Query does not support #{meth}"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
# @option params [true, false] :quiet (true) Do not raise error if
|
74
|
+
# associated document not found in the memory. If the parameter +true+
|
75
|
+
# will use +nil+ value instead.
|
76
|
+
# @option params [String, Symbol] :on_error (:continue) Sets the
|
77
|
+
# response in the event of an error. Supported values:
|
78
|
+
# :continue:: Continue to generate view information in the event of an
|
79
|
+
# error, including the error information in the view
|
80
|
+
# response stream.
|
81
|
+
# :stop:: Stop immediately when an error condition occurs. No
|
82
|
+
# further view information will be returned.
|
83
|
+
# @option params [Fixnum] :connection_timeout (75000) Timeout before the
|
84
|
+
# view request is dropped (milliseconds)
|
85
|
+
|
86
|
+
|
87
|
+
# @option params [Hash] :body
|
88
|
+
query
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
data/lib/couchbase/result.rb
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
# Author:: Mike Evans <mike@urlgonomics.com>
|
2
|
+
# Copyright:: 2013 Urlgonomics LLC.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
1
18
|
module Couchbase
|
2
19
|
class Result
|
3
20
|
|
@@ -27,7 +44,7 @@ module Couchbase
|
|
27
44
|
end
|
28
45
|
|
29
46
|
def value
|
30
|
-
@
|
47
|
+
@future.get
|
31
48
|
rescue MultiJson::LoadError
|
32
49
|
nil
|
33
50
|
end
|
data/lib/couchbase/transcoder.rb
CHANGED
@@ -21,60 +21,54 @@ module Couchbase
|
|
21
21
|
|
22
22
|
module Transcoder
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
# MultiJson.load(blob)
|
41
|
-
# when Bucket::FMT_MARSHAL
|
42
|
-
# ::Marshal.load(blob)
|
43
|
-
# when Bucket::FMT_PLAIN
|
44
|
-
# blob
|
45
|
-
# else
|
46
|
-
# raise ArgumentError, "unexpected flags (0x%02x)" % flags
|
47
|
-
# end
|
48
|
-
# end
|
49
|
-
# end
|
50
|
-
|
51
|
-
module Document
|
52
|
-
def self.dump(obj)
|
53
|
-
MultiJson.dump(obj)
|
24
|
+
class Base < Java::NetSpyMemcachedTranscoders::SerializingTranscoder
|
25
|
+
end
|
26
|
+
|
27
|
+
class Document < Base
|
28
|
+
|
29
|
+
def decode(d)
|
30
|
+
decoded = super
|
31
|
+
data = if decoded.respond_to?(:to_str)
|
32
|
+
decoded
|
33
|
+
else
|
34
|
+
decoded.getData.to_s
|
35
|
+
end
|
36
|
+
|
37
|
+
MultiJson.load(data)
|
38
|
+
rescue MultiJson::LoadError
|
39
|
+
::Marshal.load(data)
|
54
40
|
end
|
55
41
|
|
56
|
-
def
|
57
|
-
MultiJson.
|
42
|
+
def encode(o)
|
43
|
+
super MultiJson.dump(o)
|
44
|
+
rescue ArgumentError => e
|
45
|
+
ex = Couchbase::Error::ValueFormat.new
|
46
|
+
ex.inner_exception = e
|
47
|
+
fail ex
|
58
48
|
end
|
59
49
|
end
|
60
50
|
|
61
|
-
|
62
|
-
|
63
|
-
|
51
|
+
class Marshal < Base
|
52
|
+
|
53
|
+
def decode(d)
|
54
|
+
::Marshal.load super.getData.to_s
|
64
55
|
end
|
65
56
|
|
66
|
-
def
|
67
|
-
::Marshal.
|
57
|
+
def encode(o)
|
58
|
+
super ::Marshal.dump(o)
|
68
59
|
end
|
69
60
|
end
|
70
61
|
|
71
|
-
|
72
|
-
|
73
|
-
|
62
|
+
class Plain < Base
|
63
|
+
|
64
|
+
def decode(d)
|
65
|
+
super
|
74
66
|
end
|
75
67
|
|
76
|
-
def
|
77
|
-
|
68
|
+
def encode(o)
|
69
|
+
super(o.to_str)
|
70
|
+
rescue NoMethodError
|
71
|
+
raise Couchbase::Error::ValueFormat
|
78
72
|
end
|
79
73
|
end
|
80
74
|
|
data/lib/couchbase/version.rb
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
# Author:: Mike Evans <mike@urlgonomics.com>
|
2
|
+
# Copyright:: 2013 Urlgonomics LLC.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
1
18
|
module Couchbase
|
2
|
-
VERSION = '0.1.
|
19
|
+
VERSION = '0.1.5'
|
3
20
|
end
|
data/lib/couchbase/view.rb
CHANGED
@@ -63,6 +63,7 @@ module Couchbase
|
|
63
63
|
#
|
64
64
|
# @see http://www.couchbase.com/docs/couchbase-manual-2.0/couchbase-views.html
|
65
65
|
class View
|
66
|
+
|
66
67
|
include Enumerable
|
67
68
|
include Constants
|
68
69
|
|
@@ -71,83 +72,7 @@ module Couchbase
|
|
71
72
|
alias total_entries total_rows
|
72
73
|
end
|
73
74
|
|
74
|
-
|
75
|
-
include Constants
|
76
|
-
EMPTY = []
|
77
|
-
|
78
|
-
def initialize(wrapper_class, bucket, include_docs, quiet, block)
|
79
|
-
@wrapper_class = wrapper_class
|
80
|
-
@bucket = bucket
|
81
|
-
@block = block
|
82
|
-
@quiet = quiet
|
83
|
-
@include_docs = include_docs
|
84
|
-
@queue = []
|
85
|
-
@first = @shift = 0
|
86
|
-
@completed = false
|
87
|
-
end
|
88
|
-
|
89
|
-
# Register object in the emitter.
|
90
|
-
def push(obj)
|
91
|
-
if @include_docs
|
92
|
-
@queue << obj
|
93
|
-
@bucket.get(obj[S_ID], :extended => true, :quiet => @quiet) do |res|
|
94
|
-
obj[S_DOC] = {
|
95
|
-
S_VALUE => res.value,
|
96
|
-
S_META => {
|
97
|
-
S_ID => obj[S_ID],
|
98
|
-
S_FLAGS => res.flags,
|
99
|
-
S_CAS => res.cas
|
100
|
-
}
|
101
|
-
}
|
102
|
-
check_for_ready_documents
|
103
|
-
end
|
104
|
-
else
|
105
|
-
old_obj = @queue.shift
|
106
|
-
@queue << obj
|
107
|
-
block_call(old_obj) if old_obj
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def complete!
|
112
|
-
if @include_docs
|
113
|
-
@completed = true
|
114
|
-
check_for_ready_documents
|
115
|
-
elsif !@queue.empty?
|
116
|
-
obj = @queue.shift
|
117
|
-
obj[S_IS_LAST] = true
|
118
|
-
block_call obj
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
private
|
123
|
-
|
124
|
-
def block_call(obj)
|
125
|
-
@block.call @wrapper_class.wrap(@bucket, obj)
|
126
|
-
end
|
127
|
-
|
128
|
-
def check_for_ready_documents
|
129
|
-
shift = @shift
|
130
|
-
queue = @queue
|
131
|
-
save_last = @completed ? 0 : 1
|
132
|
-
while @first < queue.size + shift - save_last
|
133
|
-
obj = queue[@first - shift]
|
134
|
-
break unless obj[S_DOC]
|
135
|
-
queue[@first - shift] = nil
|
136
|
-
@first += 1
|
137
|
-
if @completed && @first == queue.size + shift
|
138
|
-
obj[S_IS_LAST] = true
|
139
|
-
end
|
140
|
-
block_call obj
|
141
|
-
end
|
142
|
-
if @first - shift > queue.size / 2
|
143
|
-
queue[0, @first - shift] = EMPTY
|
144
|
-
@shift = @first
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
end
|
149
|
-
|
150
|
-
attr_reader :params
|
75
|
+
attr_reader :params, :design_doc, :name
|
151
76
|
|
152
77
|
# Set up view endpoint and optional params
|
153
78
|
#
|
@@ -160,10 +85,11 @@ module Couchbase
|
|
160
85
|
# {View#fetch}
|
161
86
|
#
|
162
87
|
def initialize(bucket, endpoint, params = {})
|
163
|
-
@bucket
|
88
|
+
@bucket = bucket
|
164
89
|
@endpoint = endpoint
|
165
|
-
@
|
90
|
+
@design_doc, @name = parse_endpoint(endpoint)
|
166
91
|
@wrapper_class = params.delete(:wrapper_class) || ViewRow
|
92
|
+
@params = { connection_timeout: 75_000 }.merge(params)
|
167
93
|
unless @wrapper_class.respond_to?(:wrap)
|
168
94
|
raise ArgumentError, "wrapper class should reposond to :wrap, check the options"
|
169
95
|
end
|
@@ -197,7 +123,7 @@ module Couchbase
|
|
197
123
|
#
|
198
124
|
def each(params = {})
|
199
125
|
return enum_for(:each, params) unless block_given?
|
200
|
-
fetch(params) {|doc| yield(doc)}
|
126
|
+
fetch(params) { |doc| yield(doc) }
|
201
127
|
end
|
202
128
|
|
203
129
|
def first(params = {})
|
@@ -357,25 +283,30 @@ module Couchbase
|
|
357
283
|
# doc.recent_posts_with_comments(:start_key => [post_id, 0],
|
358
284
|
# :end_key => [post_id, 1],
|
359
285
|
# :include_docs => true)
|
360
|
-
def fetch(params = {}
|
286
|
+
def fetch(params = {})
|
361
287
|
params = @params.merge(params)
|
362
|
-
|
363
|
-
quiet = params.delete(:quiet){ true }
|
288
|
+
# quiet = params.fetch(:quiet, true)
|
364
289
|
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
options.update(:body => body, :method => params.delete(:method) || :post)
|
369
|
-
end
|
370
|
-
path = Utils.build_query(@endpoint, params)
|
371
|
-
request = @bucket.make_http_request(path, options)
|
290
|
+
view = @bucket.client.getView(@design_doc, @name)
|
291
|
+
|
292
|
+
query = Query.new(params)
|
372
293
|
|
373
|
-
|
374
|
-
|
375
|
-
|
294
|
+
request = @bucket.client.query(view, query.generate)
|
295
|
+
|
296
|
+
if block_given?
|
297
|
+
block = Proc.new
|
298
|
+
request.each do |data|
|
299
|
+
doc = @wrapper_class.wrap(@bucket, data)
|
300
|
+
block.call(doc)
|
376
301
|
end
|
302
|
+
nil
|
377
303
|
else
|
378
|
-
|
304
|
+
docs = request.to_a.map { |data|
|
305
|
+
@wrapper_class.wrap(@bucket, data)
|
306
|
+
}
|
307
|
+
docs = ArrayWithTotalRows.new(docs)
|
308
|
+
docs.total_rows = request.size
|
309
|
+
docs
|
379
310
|
end
|
380
311
|
end
|
381
312
|
|
@@ -421,86 +352,13 @@ module Couchbase
|
|
421
352
|
end
|
422
353
|
end
|
423
354
|
|
424
|
-
def
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
request.on_body do |chunk|
|
430
|
-
if chunk.success?
|
431
|
-
parser << chunk.value if chunk.value
|
432
|
-
helper.complete! if chunk.completed?
|
433
|
-
else
|
434
|
-
send_error("http_error", chunk.error)
|
435
|
-
end
|
436
|
-
end
|
437
|
-
|
438
|
-
parser.on_object do |path, obj|
|
439
|
-
case path
|
440
|
-
when "/errors/"
|
441
|
-
from, reason = obj["from"], obj["reason"]
|
442
|
-
send_error(from, reason)
|
443
|
-
else
|
444
|
-
helper.push(obj)
|
445
|
-
end
|
446
|
-
end
|
447
|
-
|
448
|
-
request.perform
|
449
|
-
nil
|
450
|
-
end
|
451
|
-
|
452
|
-
def fetch_sync(request, include_docs, quiet, block)
|
453
|
-
res = []
|
454
|
-
filter = ["/rows/", "/errors/"]
|
455
|
-
unless block
|
456
|
-
filter << "/total_rows"
|
457
|
-
docs = ArrayWithTotalRows.new
|
458
|
-
end
|
459
|
-
parser = YAJI::Parser.new(:filter => filter, :with_path => true)
|
460
|
-
last_chunk = nil
|
461
|
-
|
462
|
-
request.on_body do |chunk|
|
463
|
-
last_chunk = chunk
|
464
|
-
res << chunk.value if chunk.success?
|
465
|
-
end
|
466
|
-
|
467
|
-
parser.on_object do |path, obj|
|
468
|
-
case path
|
469
|
-
when "/total_rows"
|
470
|
-
# if total_rows key present, save it and take next object
|
471
|
-
docs.total_rows = obj
|
472
|
-
when "/errors/"
|
473
|
-
from, reason = obj["from"], obj["reason"]
|
474
|
-
send_error(from, reason)
|
475
|
-
else
|
476
|
-
if include_docs
|
477
|
-
val, flags, cas = @bucket.get(obj[S_ID], :extended => true, :quiet => quiet)
|
478
|
-
obj[S_DOC] = {
|
479
|
-
S_VALUE => val,
|
480
|
-
S_META => {
|
481
|
-
S_ID => obj[S_ID],
|
482
|
-
S_FLAGS => flags,
|
483
|
-
S_CAS => cas
|
484
|
-
}
|
485
|
-
}
|
486
|
-
end
|
487
|
-
doc = @wrapper_class.wrap(@bucket, obj)
|
488
|
-
block ? block.call(doc) : docs << doc
|
489
|
-
end
|
490
|
-
end
|
491
|
-
|
492
|
-
request.continue
|
493
|
-
|
494
|
-
if last_chunk.success?
|
495
|
-
while value = res.shift
|
496
|
-
parser << value
|
497
|
-
end
|
355
|
+
def parse_endpoint(endpoint)
|
356
|
+
parts = endpoint.split('/')
|
357
|
+
if endpoint =~ /^_design/
|
358
|
+
[parts[1], parts[3]]
|
498
359
|
else
|
499
|
-
|
360
|
+
[parts[0], parts[2]]
|
500
361
|
end
|
501
|
-
|
502
|
-
# return nil for call with block
|
503
|
-
docs
|
504
362
|
end
|
505
363
|
end
|
506
364
|
end
|
data/lib/couchbase/view_row.rb
CHANGED
@@ -16,6 +16,31 @@
|
|
16
16
|
#
|
17
17
|
|
18
18
|
module Couchbase
|
19
|
+
|
20
|
+
java_import com.couchbase.client.protocol.views.ViewRowNoDocs
|
21
|
+
java_import com.couchbase.client.protocol.views.ViewRowWithDocs
|
22
|
+
java_import com.couchbase.client.protocol.views.ViewRowReduced
|
23
|
+
java_import com.couchbase.client.protocol.views.SpatialViewRowNoDocs
|
24
|
+
java_import com.couchbase.client.protocol.views.SpatialViewRowWithDocs
|
25
|
+
|
26
|
+
module Java::ComCouchbaseClientProtocolViews::ViewRow
|
27
|
+
|
28
|
+
def doc
|
29
|
+
{
|
30
|
+
'meta' => nil,
|
31
|
+
'value' => document
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def [](key)
|
36
|
+
if respond_to?(key)
|
37
|
+
send(key)
|
38
|
+
else
|
39
|
+
fail NoMethodError, "ViewRow##{key} isn't defined."
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
19
44
|
# This class encapsulates structured JSON document
|
20
45
|
#
|
21
46
|
# @since 1.2.0
|
@@ -24,6 +49,7 @@ module Couchbase
|
|
24
49
|
#
|
25
50
|
# @see http://www.couchbase.com/docs/couchbase-manual-2.0/couchbase-views-datastore.html
|
26
51
|
class ViewRow
|
52
|
+
|
27
53
|
include Constants
|
28
54
|
|
29
55
|
# Undefine as much methods as we can to free names for views
|
@@ -95,15 +121,19 @@ module Couchbase
|
|
95
121
|
# representation
|
96
122
|
def initialize(bucket, data)
|
97
123
|
@bucket = bucket
|
98
|
-
@data
|
99
|
-
@key
|
100
|
-
@value
|
101
|
-
|
102
|
-
|
103
|
-
|
124
|
+
@data = data
|
125
|
+
@key = data.key
|
126
|
+
@value = data.value
|
127
|
+
@id = data.id
|
128
|
+
@last = false
|
129
|
+
|
130
|
+
case data
|
131
|
+
when ViewRowWithDocs, SpatialViewRowWithDocs
|
132
|
+
@doc = data.document
|
133
|
+
when SpatialViewRowNoDocs, SpatialViewRowWithDocs
|
134
|
+
@geometry = data.geometry
|
135
|
+
@bbox = data.bbox
|
104
136
|
end
|
105
|
-
@id = data[S_ID] || @meta && @meta[S_ID]
|
106
|
-
@last = data.delete(S_IS_LAST) || false
|
107
137
|
end
|
108
138
|
|
109
139
|
# Wraps data hash into ViewRow instance
|
@@ -179,94 +209,4 @@ module Couchbase
|
|
179
209
|
end
|
180
210
|
end
|
181
211
|
|
182
|
-
# This class encapsulates information about design docs
|
183
|
-
#
|
184
|
-
# @since 1.2.1
|
185
|
-
#
|
186
|
-
# It is subclass of ViewRow, but also gives access to view creation through method_missing
|
187
|
-
#
|
188
|
-
# @see http://www.couchbase.com/docs/couchbase-manual-2.0/couchbase-views-datastore.html
|
189
|
-
class DesignDoc < ViewRow
|
190
|
-
# It isn't allowed to change design document ID after
|
191
|
-
# initialization
|
192
|
-
undef id=
|
193
|
-
|
194
|
-
# Initialize the design doc instance
|
195
|
-
#
|
196
|
-
# @since 1.2.1
|
197
|
-
#
|
198
|
-
# It takes reference to the bucket, data hash. It will define view
|
199
|
-
# methods if the data object looks like design document.
|
200
|
-
#
|
201
|
-
# @param [Couchbase::Bucket] bucket the reference to connection
|
202
|
-
# @param [Hash] data the data hash, which was built from JSON document
|
203
|
-
# representation
|
204
|
-
def initialize(bucket, data)
|
205
|
-
super
|
206
|
-
@all_views = {}
|
207
|
-
@views = @doc.has_key?('views') ? @doc['views'].keys : []
|
208
|
-
@spatial = @doc.has_key?('spatial') ? @doc['spatial'].keys : []
|
209
|
-
@views.each{|name| @all_views[name] = "#{@id}/_view/#{name}"}
|
210
|
-
@spatial.each{|name| @all_views[name] = "#{@id}/_spatial/#{name}"}
|
211
|
-
end
|
212
|
-
|
213
|
-
def method_missing(meth, *args)
|
214
|
-
if path = @all_views[meth.to_s]
|
215
|
-
View.new(@bucket, path, *args)
|
216
|
-
else
|
217
|
-
super
|
218
|
-
end
|
219
|
-
end
|
220
|
-
|
221
|
-
def respond_to?(meth, *args)
|
222
|
-
if @all_views[meth.to_s]
|
223
|
-
true
|
224
|
-
else
|
225
|
-
super
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
def method(meth, *args)
|
230
|
-
if path = @all_views[meth.to_s]
|
231
|
-
lambda{|*p| View.new(@bucket, path, *p)}
|
232
|
-
else
|
233
|
-
super
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
# The list of views defined or empty array
|
238
|
-
#
|
239
|
-
# @since 1.2.1
|
240
|
-
#
|
241
|
-
# @return [Array<View>]
|
242
|
-
attr_accessor :views
|
243
|
-
|
244
|
-
# The list of spatial views defined or empty array
|
245
|
-
#
|
246
|
-
# @since 1.2.1
|
247
|
-
#
|
248
|
-
# @return [Array<View>]
|
249
|
-
attr_accessor :spatial
|
250
|
-
|
251
|
-
# Check if the document has views defines
|
252
|
-
#
|
253
|
-
# @since 1.2.1
|
254
|
-
#
|
255
|
-
# @see DesignDoc#views
|
256
|
-
#
|
257
|
-
# @return [true, false] +true+ if the document have views
|
258
|
-
def has_views?
|
259
|
-
!@views.empty?
|
260
|
-
end
|
261
|
-
|
262
|
-
def inspect
|
263
|
-
desc = "#<#{self.class.name}:#{self.object_id}"
|
264
|
-
[:@id, :@views, :@spatial].each do |iv|
|
265
|
-
desc << " #{iv}=#{instance_variable_get(iv).inspect}"
|
266
|
-
end
|
267
|
-
desc << ">"
|
268
|
-
desc
|
269
|
-
end
|
270
|
-
|
271
|
-
end
|
272
212
|
end
|