couchbase-jruby-client 0.1.0-java → 0.1.5-java
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.
- 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
|