couchbase 3.0.0.alpha.3-universal-darwin-19 → 3.0.0.alpha.4-universal-darwin-19
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/tests-6.0.3.yml +4 -1
- data/.github/workflows/tests-dev-preview.yml +4 -1
- data/.github/workflows/tests.yml +4 -1
- data/README.md +1 -1
- data/bin/check-cluster +31 -0
- data/bin/init-cluster +16 -4
- data/examples/analytics.rb +221 -0
- data/examples/managing_analytics_indexes.rb +72 -0
- data/examples/managing_view_indexes.rb +54 -0
- data/examples/search_with_consistency.rb +84 -0
- data/examples/view.rb +50 -0
- data/ext/.clang-tidy +1 -0
- data/ext/build_version.hxx.in +1 -1
- data/ext/couchbase/bucket.hxx +0 -1
- data/ext/couchbase/couchbase.cxx +1421 -55
- data/ext/couchbase/io/dns_client.hxx +215 -0
- data/ext/couchbase/io/dns_codec.hxx +207 -0
- data/ext/couchbase/io/dns_config.hxx +116 -0
- data/ext/couchbase/io/dns_message.hxx +558 -0
- data/ext/couchbase/io/http_session.hxx +16 -4
- data/ext/couchbase/io/mcbp_session.hxx +2 -1
- data/ext/couchbase/mutation_token.hxx +1 -1
- data/ext/couchbase/operations.hxx +19 -0
- data/ext/couchbase/operations/analytics_dataset_create.hxx +117 -0
- data/ext/couchbase/operations/analytics_dataset_drop.hxx +103 -0
- data/ext/couchbase/operations/analytics_dataset_get_all.hxx +107 -0
- data/ext/couchbase/operations/analytics_dataverse_create.hxx +104 -0
- data/ext/couchbase/operations/analytics_dataverse_drop.hxx +104 -0
- data/ext/couchbase/operations/analytics_get_pending_mutations.hxx +91 -0
- data/ext/couchbase/operations/analytics_index_create.hxx +128 -0
- data/ext/couchbase/operations/analytics_index_drop.hxx +110 -0
- data/ext/couchbase/operations/analytics_index_get_all.hxx +106 -0
- data/ext/couchbase/operations/analytics_link_connect.hxx +102 -0
- data/ext/couchbase/operations/analytics_link_disconnect.hxx +101 -0
- data/ext/couchbase/operations/design_document.hxx +59 -0
- data/ext/couchbase/operations/document_analytics.hxx +293 -0
- data/ext/couchbase/operations/document_query.hxx +2 -2
- data/ext/couchbase/operations/document_search.hxx +19 -1
- data/ext/couchbase/operations/document_view.hxx +227 -0
- data/ext/couchbase/operations/search_index.hxx +17 -0
- data/ext/couchbase/operations/search_index_control_ingest.hxx +3 -1
- data/ext/couchbase/operations/view_index_drop.hxx +67 -0
- data/ext/couchbase/operations/view_index_get.hxx +90 -0
- data/ext/couchbase/operations/view_index_get_all.hxx +125 -0
- data/ext/couchbase/operations/view_index_upsert.hxx +87 -0
- data/ext/couchbase/service_type.hxx +38 -1
- data/ext/couchbase/timeout_defaults.hxx +3 -1
- data/ext/couchbase/utils/connection_string.hxx +231 -0
- data/ext/couchbase/version.hxx +1 -1
- data/ext/test/main.cxx +3 -12
- data/lib/couchbase/analytics_options.rb +165 -0
- data/lib/couchbase/bucket.rb +49 -0
- data/lib/couchbase/cluster.rb +46 -207
- data/lib/couchbase/management/analytics_index_manager.rb +138 -24
- data/lib/couchbase/management/view_index_manager.rb +63 -10
- data/lib/couchbase/query_options.rb +219 -0
- data/lib/couchbase/search_options.rb +6 -6
- data/lib/couchbase/version.rb +1 -1
- data/lib/couchbase/view_options.rb +155 -0
- metadata +34 -2
data/ext/couchbase/version.hxx
CHANGED
data/ext/test/main.cxx
CHANGED
@@ -44,23 +44,14 @@ main()
|
|
44
44
|
rb_require("json");
|
45
45
|
run_script(R"(
|
46
46
|
p Couchbase::VERSION
|
47
|
-
)");
|
48
|
-
|
49
|
-
run_script(R"(
|
50
47
|
B = Couchbase::Backend.new
|
51
48
|
B.open("localhost", "Administrator", "password")
|
52
|
-
)");
|
53
49
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
}
|
58
|
-
p B.document_search("beers", JSON.generate(query), {})
|
50
|
+
pp B.document_view("beer-sample", "test", "get_all", :development, {
|
51
|
+
keys: [JSON.generate("21st_amendment_brewery_cafe-563_stout")]
|
52
|
+
})
|
59
53
|
)");
|
60
54
|
|
61
|
-
run_script(R"(
|
62
|
-
B.close
|
63
|
-
)");
|
64
55
|
|
65
56
|
ruby_finalize();
|
66
57
|
return 0;
|
@@ -0,0 +1,165 @@
|
|
1
|
+
# Copyright 2020 Couchbase, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'couchbase/json_transcoder'
|
16
|
+
|
17
|
+
module Couchbase
|
18
|
+
class Cluster
|
19
|
+
class AnalyticsOptions
|
20
|
+
# @return [Integer] Timeout in milliseconds
|
21
|
+
attr_accessor :timeout
|
22
|
+
|
23
|
+
# @return [String] Provides a custom client context ID for this query
|
24
|
+
attr_accessor :client_context_id
|
25
|
+
|
26
|
+
# @return [:not_bounded, :request_plus] specifies level of consistency for the query
|
27
|
+
attr_accessor :scan_consistency
|
28
|
+
|
29
|
+
# @return [Integer] The maximum duration (in milliseconds) the query engine is willing to wait before failing.
|
30
|
+
attr_accessor :scan_wait
|
31
|
+
|
32
|
+
# @return [Boolean] Allows explicitly marking a query as being readonly and not mutating and documents on the server side.
|
33
|
+
attr_accessor :readonly
|
34
|
+
|
35
|
+
# @return [Boolean] Allows to give certain requests higher priority than others
|
36
|
+
attr_accessor :priority
|
37
|
+
|
38
|
+
# @return [JsonTranscoder] transcoder to use on rows
|
39
|
+
attr_accessor :transcoder
|
40
|
+
|
41
|
+
# @yieldparam [AnalyticsOptions] self
|
42
|
+
def initialize
|
43
|
+
@transcoder = JsonTranscoder.new
|
44
|
+
@raw_parameters = {}
|
45
|
+
@positional_parameters = nil
|
46
|
+
@named_parameters = nil
|
47
|
+
@scan_consistency = nil
|
48
|
+
yield self if block_given?
|
49
|
+
end
|
50
|
+
|
51
|
+
# Sets positional parameters for the query
|
52
|
+
#
|
53
|
+
# @param [Array] positional the list of parameters that have to be substituted in the statement
|
54
|
+
def positional_parameters(positional)
|
55
|
+
@positional_parameters = positional
|
56
|
+
@named_parameters = nil
|
57
|
+
end
|
58
|
+
|
59
|
+
# Sets named parameters for the query
|
60
|
+
#
|
61
|
+
# @param [Hash] named the key/value map of the parameters to substitute in the statement
|
62
|
+
def named_parameters(named)
|
63
|
+
@named_parameters = named
|
64
|
+
@positional_parameters = nil
|
65
|
+
end
|
66
|
+
|
67
|
+
# Allows providing custom JSON key/value pairs for advanced usage
|
68
|
+
#
|
69
|
+
# @param [String] key the parameter name (key of the JSON property)
|
70
|
+
# @param [Object] value the parameter value (value of the JSON property)
|
71
|
+
def raw(key, value)
|
72
|
+
@raw_parameters[key] = JSON.generate(value)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class AnalyticsWarning
|
77
|
+
# @return [Integer]
|
78
|
+
attr_accessor :code
|
79
|
+
|
80
|
+
# @return [String]
|
81
|
+
attr_accessor :message
|
82
|
+
|
83
|
+
# @param [Integer] code
|
84
|
+
# @param [String] message
|
85
|
+
def initialize(code, message)
|
86
|
+
@code = code
|
87
|
+
@message = message
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
class AnalyticsMetrics
|
92
|
+
# @return [Integer] duration in milliseconds
|
93
|
+
attr_accessor :elapsed_time
|
94
|
+
|
95
|
+
# @return [Integer] duration in milliseconds
|
96
|
+
attr_accessor :execution_time
|
97
|
+
|
98
|
+
# @return [Integer]
|
99
|
+
attr_accessor :result_count
|
100
|
+
|
101
|
+
# @return [Integer]
|
102
|
+
attr_accessor :result_size
|
103
|
+
|
104
|
+
# @return [Integer]
|
105
|
+
attr_accessor :error_count
|
106
|
+
|
107
|
+
# @return [Integer]
|
108
|
+
attr_accessor :processed_objects
|
109
|
+
|
110
|
+
# @return [Integer]
|
111
|
+
attr_accessor :warning_count
|
112
|
+
|
113
|
+
# @yieldparam [AnalyticsMetrics] self
|
114
|
+
def initialize
|
115
|
+
yield self if block_given?
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
class AnalyticsMetaData
|
120
|
+
# @return [String]
|
121
|
+
attr_accessor :request_id
|
122
|
+
|
123
|
+
# @return [String]
|
124
|
+
attr_accessor :client_context_id
|
125
|
+
|
126
|
+
# @return [:running, :success, :errors, :completed, :stopped, :timeout, :closed, :fatal, :aborted, :unknown]
|
127
|
+
attr_accessor :status
|
128
|
+
|
129
|
+
# @return [Hash] returns the signature as returned by the query engine which is then decoded as JSON object
|
130
|
+
attr_accessor :signature
|
131
|
+
|
132
|
+
# @return [Array<AnalyticsWarning>]
|
133
|
+
attr_accessor :warnings
|
134
|
+
|
135
|
+
# @return [AnalyticsMetrics]
|
136
|
+
attr_accessor :metrics
|
137
|
+
|
138
|
+
# @yieldparam [AnalyticsMetaData] self
|
139
|
+
def initialize
|
140
|
+
yield self if block_given?
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
class AnalyticsResult
|
145
|
+
# @return [AnalyticsMetaData]
|
146
|
+
attr_accessor :meta_data
|
147
|
+
|
148
|
+
attr_accessor :transcoder
|
149
|
+
|
150
|
+
# Returns all rows converted using a transcoder
|
151
|
+
#
|
152
|
+
# @return [Array]
|
153
|
+
def rows(transcoder = self.transcoder)
|
154
|
+
@rows.lazy.map { |row| transcoder.decode(row, 0) }
|
155
|
+
end
|
156
|
+
|
157
|
+
# @yieldparam [AnalyticsResult] self
|
158
|
+
def initialize
|
159
|
+
@transcoder = JsonTranscoder.new
|
160
|
+
yield self if block_given?
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
data/lib/couchbase/bucket.rb
CHANGED
@@ -14,6 +14,8 @@
|
|
14
14
|
|
15
15
|
require "couchbase/scope"
|
16
16
|
require "couchbase/management/collection_manager"
|
17
|
+
require "couchbase/management/view_index_manager"
|
18
|
+
require "couchbase/view_options"
|
17
19
|
|
18
20
|
module Couchbase
|
19
21
|
class Bucket
|
@@ -58,11 +60,58 @@ module Couchbase
|
|
58
60
|
default_scope.default_collection
|
59
61
|
end
|
60
62
|
|
63
|
+
# Performs query to view index.
|
64
|
+
#
|
65
|
+
# @param [String] design_document_name name of the design document
|
66
|
+
# @param [String] view_name name of the view to query
|
67
|
+
# @param [ViewOptions] options
|
68
|
+
#
|
69
|
+
# @return [ViewQueryResult]
|
70
|
+
def view_query(design_document_name, view_name, options = ViewOptions.new)
|
71
|
+
resp = @backend.document_view(@name, design_document_name, view_name, options.namespace, {
|
72
|
+
timeout: options.timeout,
|
73
|
+
scan_consistency: options.scan_consistency,
|
74
|
+
skip: options.skip,
|
75
|
+
limit: options.limit,
|
76
|
+
start_key: (JSON.generate(options.start_key) unless options.start_key.nil?),
|
77
|
+
end_key: (JSON.generate(options.end_key) unless options.end_key.nil?),
|
78
|
+
start_key_doc_id: options.start_key_doc_id,
|
79
|
+
end_key_doc_id: options.end_key_doc_id,
|
80
|
+
inclusive_end: options.inclusive_end,
|
81
|
+
group: options.group,
|
82
|
+
group_level: options.group_level,
|
83
|
+
key: (JSON.generate(options.key) unless options.key.nil?),
|
84
|
+
keys: options.keys&.map { |key| JSON.generate(key) },
|
85
|
+
order: options.order,
|
86
|
+
reduce: options.reduce,
|
87
|
+
on_error: options.on_error,
|
88
|
+
debug: options.debug,
|
89
|
+
})
|
90
|
+
ViewResult.new do |res|
|
91
|
+
res.meta_data = ViewMetaData.new do |meta|
|
92
|
+
meta.total_rows = resp[:meta][:total_rows]
|
93
|
+
meta.debug_info = resp[:meta][:debug_info]
|
94
|
+
end
|
95
|
+
res.rows = resp[:rows].map do |entry|
|
96
|
+
ViewRow.new do |row|
|
97
|
+
row.id = entry[:id] if entry.key?(:id)
|
98
|
+
row.key = JSON.parse(entry[:key])
|
99
|
+
row.value = JSON.parse(entry[:value])
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
61
105
|
# @return [Management::CollectionManager]
|
62
106
|
def collections
|
63
107
|
Management::CollectionManager.new(@backend, @name)
|
64
108
|
end
|
65
109
|
|
110
|
+
# @return [Management::ViewIndexManager]
|
111
|
+
def view_indexes
|
112
|
+
Management::ViewIndexManager.new(@backend, @name)
|
113
|
+
end
|
114
|
+
|
66
115
|
# Performs application-level ping requests against services in the couchbase cluster
|
67
116
|
#
|
68
117
|
# @return [PingResult]
|
data/lib/couchbase/cluster.rb
CHANGED
@@ -22,6 +22,8 @@ require "couchbase/management/analytics_index_manager"
|
|
22
22
|
require "couchbase/management/search_index_manager"
|
23
23
|
|
24
24
|
require "couchbase/search_options"
|
25
|
+
require "couchbase/query_options"
|
26
|
+
require "couchbase/analytics_options"
|
25
27
|
|
26
28
|
module Couchbase
|
27
29
|
class Cluster
|
@@ -87,6 +89,7 @@ module Couchbase
|
|
87
89
|
metrics.execution_time = resp[:meta][:metrics][:execution_time]
|
88
90
|
metrics.sort_count = resp[:meta][:metrics][:sort_count]
|
89
91
|
metrics.result_count = resp[:meta][:metrics][:result_count]
|
92
|
+
metrics.result_size = resp[:meta][:metrics][:result_size]
|
90
93
|
metrics.mutation_count = resp[:meta][:metrics][:mutation_count]
|
91
94
|
metrics.error_count = resp[:meta][:metrics][:error_count]
|
92
95
|
metrics.warning_count = resp[:meta][:metrics][:warning_count]
|
@@ -104,7 +107,42 @@ module Couchbase
|
|
104
107
|
# @param [AnalyticsOptions] options the custom options for this query
|
105
108
|
#
|
106
109
|
# @return [AnalyticsResult]
|
107
|
-
def analytics_query(statement, options = AnalyticsOptions.new)
|
110
|
+
def analytics_query(statement, options = AnalyticsOptions.new)
|
111
|
+
resp = @backend.document_analytics(statement, {
|
112
|
+
timeout: options.timeout,
|
113
|
+
client_context_id: options.client_context_id,
|
114
|
+
scan_consistency: options.scan_consistency,
|
115
|
+
readonly: options.readonly,
|
116
|
+
priority: options.priority,
|
117
|
+
positional_parameters: options.instance_variable_get("@positional_parameters")&.map { |p| JSON.dump(p) },
|
118
|
+
named_parameters: options.instance_variable_get("@named_parameters")&.each_with_object({}) { |(n, v), o| o[n.to_s] = JSON.dump(v) },
|
119
|
+
raw_parameters: options.instance_variable_get("@raw_parameters"),
|
120
|
+
})
|
121
|
+
|
122
|
+
AnalyticsResult.new do |res|
|
123
|
+
res.transcoder = options.transcoder
|
124
|
+
res.meta_data = AnalyticsMetaData.new do |meta|
|
125
|
+
meta.status = resp[:meta][:status]
|
126
|
+
meta.request_id = resp[:meta][:request_id]
|
127
|
+
meta.client_context_id = resp[:meta][:client_context_id]
|
128
|
+
meta.signature = JSON.parse(resp[:meta][:signature]) if resp[:meta][:signature]
|
129
|
+
meta.profile = JSON.parse(resp[:meta][:profile]) if resp[:meta][:profile]
|
130
|
+
meta.metrics = AnalyticsMetrics.new do |metrics|
|
131
|
+
if resp[:meta][:metrics]
|
132
|
+
metrics.elapsed_time = resp[:meta][:metrics][:elapsed_time]
|
133
|
+
metrics.execution_time = resp[:meta][:metrics][:execution_time]
|
134
|
+
metrics.result_count = resp[:meta][:metrics][:result_count]
|
135
|
+
metrics.result_size = resp[:meta][:metrics][:result_size]
|
136
|
+
metrics.error_count = resp[:meta][:metrics][:error_count]
|
137
|
+
metrics.warning_count = resp[:meta][:metrics][:warning_count]
|
138
|
+
metrics.processed_objects = resp[:meta][:metrics][:processed_objects]
|
139
|
+
end
|
140
|
+
end
|
141
|
+
res[:warnings] = resp[:warnings].map { |warn| QueryWarning.new(warn[:code], warn[:message]) } if resp[:warnings]
|
142
|
+
end
|
143
|
+
res.instance_variable_set("@rows", resp[:rows])
|
144
|
+
end
|
145
|
+
end
|
108
146
|
|
109
147
|
# Performs a Full Text Search (FTS) query
|
110
148
|
#
|
@@ -243,210 +281,6 @@ module Couchbase
|
|
243
281
|
end
|
244
282
|
end
|
245
283
|
|
246
|
-
class QueryOptions
|
247
|
-
# @return [Integer] Timeout in milliseconds
|
248
|
-
attr_accessor :timeout
|
249
|
-
|
250
|
-
# @return [Boolean] Allows turning this request into a prepared statement query
|
251
|
-
attr_accessor :adhoc
|
252
|
-
|
253
|
-
# @return [String] Provides a custom client context ID for this query
|
254
|
-
attr_accessor :client_context_id
|
255
|
-
|
256
|
-
# @return [Integer] Allows overriding the default maximum parallelism for the query execution on the server side.
|
257
|
-
attr_accessor :max_parallelism
|
258
|
-
|
259
|
-
# @return [Boolean] Allows explicitly marking a query as being readonly and not mutating and documents on the server side.
|
260
|
-
attr_accessor :readonly
|
261
|
-
|
262
|
-
# Allows customizing how long (in milliseconds) the query engine is willing to wait until the index catches up to whatever scan consistency is asked for in this query.
|
263
|
-
#
|
264
|
-
# @note that if +:not_bounded+ consistency level is used, this method doesn't do anything
|
265
|
-
# at all. If no value is provided to this method, the server default is used.
|
266
|
-
#
|
267
|
-
# @return [Integer] The maximum duration (in milliseconds) the query engine is willing to wait before failing.
|
268
|
-
attr_accessor :scan_wait
|
269
|
-
|
270
|
-
# @return [Integer] Supports customizing the maximum buffered channel size between the indexer and the query service
|
271
|
-
attr_accessor :scan_cap
|
272
|
-
|
273
|
-
# @return [Integer] Supports customizing the number of items execution operators can batch for fetch from the KV layer on the server.
|
274
|
-
attr_accessor :pipeline_batch
|
275
|
-
|
276
|
-
# @return [Integer] Allows customizing the maximum number of items each execution operator can buffer between various operators on the server.
|
277
|
-
attr_accessor :pipeline_cap
|
278
|
-
|
279
|
-
# @return [Boolean] Enables per-request metrics in the trailing section of the query
|
280
|
-
attr_accessor :metrics
|
281
|
-
|
282
|
-
# @return [:off, :phases, :timings] Customize server profile level for this query
|
283
|
-
attr_accessor :profile
|
284
|
-
|
285
|
-
def initialize
|
286
|
-
@timeout = 75_000 # ms
|
287
|
-
@adhoc = true
|
288
|
-
@raw_parameters = {}
|
289
|
-
@positional_parameters = nil
|
290
|
-
@named_parameters = nil
|
291
|
-
@scan_consistency = nil
|
292
|
-
@mutation_state = nil
|
293
|
-
yield self if block_given?
|
294
|
-
end
|
295
|
-
|
296
|
-
# Allows providing custom JSON key/value pairs for advanced usage
|
297
|
-
#
|
298
|
-
# @param [String] key the parameter name (key of the JSON property)
|
299
|
-
# @param [Object] value the parameter value (value of the JSON property)
|
300
|
-
def raw(key, value)
|
301
|
-
@raw_parameters[key] = JSON.generate(value)
|
302
|
-
end
|
303
|
-
|
304
|
-
# Customizes the consistency guarantees for this query
|
305
|
-
#
|
306
|
-
# @note overrides consistency level set by {#consistent_with}
|
307
|
-
#
|
308
|
-
# [+:not_bounded+] The indexer will return whatever state it has to the query engine at the time of query. This is the default (for single-statement requests).
|
309
|
-
#
|
310
|
-
# [+:request_plus+] The indexer will wait until all mutations have been processed at the time of request before returning to the query engine.
|
311
|
-
#
|
312
|
-
# @param [:not_bounded, :request_plus] level the index scan consistency to be used for this query
|
313
|
-
def scan_consistency=(level)
|
314
|
-
@mutation_state = nil if @mutation_state
|
315
|
-
@scan_consistency = level
|
316
|
-
end
|
317
|
-
|
318
|
-
# Sets the mutation tokens this query should be consistent with
|
319
|
-
#
|
320
|
-
# @note overrides consistency level set by {#scan_consistency=}
|
321
|
-
#
|
322
|
-
# @param [MutationState] mutation_state the mutation state containing the mutation tokens
|
323
|
-
def consistent_with(mutation_state)
|
324
|
-
@scan_consistency = nil if @scan_consistency
|
325
|
-
@mutation_state = mutation_state
|
326
|
-
end
|
327
|
-
|
328
|
-
# Sets positional parameters for the query
|
329
|
-
#
|
330
|
-
# @param [Array] positional the list of parameters that have to be substituted in the statement
|
331
|
-
def positional_parameters(positional)
|
332
|
-
@positional_parameters = positional
|
333
|
-
@named_parameters = nil
|
334
|
-
end
|
335
|
-
|
336
|
-
# Sets named parameters for the query
|
337
|
-
#
|
338
|
-
# @param [Hash] named the key/value map of the parameters to substitute in the statement
|
339
|
-
def named_parameters(named)
|
340
|
-
@named_parameters = named
|
341
|
-
@positional_parameters = nil
|
342
|
-
end
|
343
|
-
end
|
344
|
-
|
345
|
-
class QueryResult
|
346
|
-
# @return [QueryMetaData] returns object representing additional metadata associated with this query
|
347
|
-
attr_accessor :meta_data
|
348
|
-
|
349
|
-
attr_accessor :transcoder
|
350
|
-
|
351
|
-
# Returns all rows converted using a transcoder
|
352
|
-
#
|
353
|
-
# @return [Array]
|
354
|
-
def rows(transcoder = self.transcoder)
|
355
|
-
@rows.lazy.map do |row|
|
356
|
-
if transcoder == :json
|
357
|
-
JSON.parse(row)
|
358
|
-
else
|
359
|
-
transcoder.call(row)
|
360
|
-
end
|
361
|
-
end
|
362
|
-
end
|
363
|
-
|
364
|
-
# @yieldparam [QueryResult] self
|
365
|
-
def initialize
|
366
|
-
yield self if block_given?
|
367
|
-
@transcoder = :json
|
368
|
-
end
|
369
|
-
end
|
370
|
-
|
371
|
-
class QueryMetaData
|
372
|
-
# @return [String] returns the request identifier string of the query request
|
373
|
-
attr_accessor :request_id
|
374
|
-
|
375
|
-
# @return [String] returns the client context identifier string set of the query request
|
376
|
-
attr_accessor :client_context_id
|
377
|
-
|
378
|
-
# @return [Symbol] returns raw query execution status as returned by the query engine
|
379
|
-
attr_accessor :status
|
380
|
-
|
381
|
-
# @return [Hash] returns the signature as returned by the query engine which is then decoded as JSON object
|
382
|
-
attr_accessor :signature
|
383
|
-
|
384
|
-
# @return [Hash] returns the profiling information returned by the query engine which is then decoded as JSON object
|
385
|
-
attr_accessor :profile
|
386
|
-
|
387
|
-
# @return [QueryMetrics] metrics as returned by the query engine, if enabled
|
388
|
-
attr_accessor :metrics
|
389
|
-
|
390
|
-
# @return [List<QueryWarning>] list of warnings returned by the query engine
|
391
|
-
attr_accessor :warnings
|
392
|
-
|
393
|
-
# @yieldparam [QueryMetaData] self
|
394
|
-
def initialize
|
395
|
-
yield self if block_given?
|
396
|
-
end
|
397
|
-
end
|
398
|
-
|
399
|
-
class QueryMetrics
|
400
|
-
# @return [Integer] The total time taken for the request, that is the time from when the request was received until the results were returned
|
401
|
-
attr_accessor :elapsed_time
|
402
|
-
|
403
|
-
# @return [Integer] The time taken for the execution of the request, that is the time from when query execution started until the results were returned
|
404
|
-
attr_accessor :execution_time
|
405
|
-
|
406
|
-
# @return [Integer] the total number of results selected by the engine before restriction through LIMIT clause.
|
407
|
-
attr_accessor :sort_count
|
408
|
-
|
409
|
-
# @return [Integer] The total number of objects in the results.
|
410
|
-
attr_accessor :result_count
|
411
|
-
|
412
|
-
# @return [Integer] The total number of bytes in the results.
|
413
|
-
attr_accessor :result_size
|
414
|
-
|
415
|
-
# @return [Integer] The number of mutations that were made during the request.
|
416
|
-
attr_accessor :mutation_count
|
417
|
-
|
418
|
-
# @return [Integer] The number of errors that occurred during the request.
|
419
|
-
attr_accessor :error_count
|
420
|
-
|
421
|
-
# @return [Integer] The number of warnings that occurred during the request.
|
422
|
-
attr_accessor :warning_count
|
423
|
-
|
424
|
-
# @yieldparam [QueryMetrics] self
|
425
|
-
def initialize
|
426
|
-
yield self if block_given?
|
427
|
-
end
|
428
|
-
end
|
429
|
-
|
430
|
-
# Represents a single warning returned from the query engine.
|
431
|
-
class QueryWarning
|
432
|
-
# @return [Integer]
|
433
|
-
attr_accessor :code
|
434
|
-
|
435
|
-
# @return [String]
|
436
|
-
attr_accessor :message
|
437
|
-
|
438
|
-
def initialize(code, message)
|
439
|
-
@code = code
|
440
|
-
@message = message
|
441
|
-
end
|
442
|
-
end
|
443
|
-
|
444
|
-
class AnalyticsOptions
|
445
|
-
def initialize
|
446
|
-
yield self if block_given?
|
447
|
-
end
|
448
|
-
end
|
449
|
-
|
450
284
|
class DiagnosticsOptions
|
451
285
|
# @return [String] Holds custom report id.
|
452
286
|
attr_accessor :report_id
|
@@ -458,9 +292,14 @@ module Couchbase
|
|
458
292
|
|
459
293
|
private
|
460
294
|
|
295
|
+
# Initialize {Cluster} object
|
296
|
+
#
|
297
|
+
# @param [String] connection_string connection string used to locate the Couchbase Cluster
|
298
|
+
# @param [ClusterOptions] options custom options when creating the cluster connection
|
461
299
|
def initialize(connection_string, options)
|
462
|
-
|
463
|
-
raise ArgumentError, "missing hostname"
|
300
|
+
conn_info = Backend.parse_connection_string(connection_string)
|
301
|
+
raise ArgumentError, "missing hostname" if conn_info[:nodes].empty?
|
302
|
+
hostname = conn_info[:nodes].first[:address]
|
464
303
|
raise ArgumentError, "options must have authenticator configured" unless options.authenticator
|
465
304
|
username = options.authenticator.username
|
466
305
|
raise ArgumentError, "missing username" unless username
|