couchbase 3.5.0-arm64-darwin-23

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +202 -0
  3. data/README.md +154 -0
  4. data/ext/extconf.rb +0 -0
  5. data/lib/active_support/cache/couchbase_store.rb +339 -0
  6. data/lib/couchbase/3.0/libcouchbase.bundle +0 -0
  7. data/lib/couchbase/3.1/libcouchbase.bundle +0 -0
  8. data/lib/couchbase/3.2/libcouchbase.bundle +0 -0
  9. data/lib/couchbase/3.3/libcouchbase.bundle +0 -0
  10. data/lib/couchbase/analytics_options.rb +107 -0
  11. data/lib/couchbase/authenticator.rb +64 -0
  12. data/lib/couchbase/binary_collection.rb +128 -0
  13. data/lib/couchbase/binary_collection_options.rb +24 -0
  14. data/lib/couchbase/bucket.rb +144 -0
  15. data/lib/couchbase/cluster.rb +460 -0
  16. data/lib/couchbase/cluster_registry.rb +49 -0
  17. data/lib/couchbase/collection.rb +705 -0
  18. data/lib/couchbase/collection_options.rb +399 -0
  19. data/lib/couchbase/config_profiles.rb +55 -0
  20. data/lib/couchbase/configuration.rb +56 -0
  21. data/lib/couchbase/datastructures/couchbase_list.rb +160 -0
  22. data/lib/couchbase/datastructures/couchbase_map.rb +194 -0
  23. data/lib/couchbase/datastructures/couchbase_queue.rb +134 -0
  24. data/lib/couchbase/datastructures/couchbase_set.rb +128 -0
  25. data/lib/couchbase/datastructures.rb +24 -0
  26. data/lib/couchbase/diagnostics.rb +181 -0
  27. data/lib/couchbase/errors.rb +376 -0
  28. data/lib/couchbase/json_transcoder.rb +39 -0
  29. data/lib/couchbase/key_value_scan.rb +117 -0
  30. data/lib/couchbase/libcouchbase.rb +6 -0
  31. data/lib/couchbase/logger.rb +85 -0
  32. data/lib/couchbase/management/analytics_index_manager.rb +1127 -0
  33. data/lib/couchbase/management/bucket_manager.rb +443 -0
  34. data/lib/couchbase/management/collection_manager.rb +470 -0
  35. data/lib/couchbase/management/collection_query_index_manager.rb +222 -0
  36. data/lib/couchbase/management/query_index_manager.rb +617 -0
  37. data/lib/couchbase/management/scope_search_index_manager.rb +198 -0
  38. data/lib/couchbase/management/search_index_manager.rb +424 -0
  39. data/lib/couchbase/management/user_manager.rb +468 -0
  40. data/lib/couchbase/management/view_index_manager.rb +237 -0
  41. data/lib/couchbase/management.rb +29 -0
  42. data/lib/couchbase/mutation_state.rb +63 -0
  43. data/lib/couchbase/options.rb +2837 -0
  44. data/lib/couchbase/protostellar/binary_collection.rb +55 -0
  45. data/lib/couchbase/protostellar/bucket.rb +51 -0
  46. data/lib/couchbase/protostellar/client.rb +99 -0
  47. data/lib/couchbase/protostellar/cluster.rb +163 -0
  48. data/lib/couchbase/protostellar/collection.rb +152 -0
  49. data/lib/couchbase/protostellar/connect_options.rb +63 -0
  50. data/lib/couchbase/protostellar/error_handling.rb +203 -0
  51. data/lib/couchbase/protostellar/generated/admin/bucket/v1/bucket_pb.rb +61 -0
  52. data/lib/couchbase/protostellar/generated/admin/bucket/v1/bucket_services_pb.rb +35 -0
  53. data/lib/couchbase/protostellar/generated/admin/collection/v1/collection_pb.rb +57 -0
  54. data/lib/couchbase/protostellar/generated/admin/collection/v1/collection_services_pb.rb +36 -0
  55. data/lib/couchbase/protostellar/generated/admin/query/v1/query_pb.rb +61 -0
  56. data/lib/couchbase/protostellar/generated/admin/query/v1/query_services_pb.rb +37 -0
  57. data/lib/couchbase/protostellar/generated/admin/search/v1/search_pb.rb +72 -0
  58. data/lib/couchbase/protostellar/generated/admin/search/v1/search_services_pb.rb +44 -0
  59. data/lib/couchbase/protostellar/generated/analytics/v1/analytics_pb.rb +52 -0
  60. data/lib/couchbase/protostellar/generated/analytics/v1/analytics_services_pb.rb +30 -0
  61. data/lib/couchbase/protostellar/generated/internal/hooks/v1/hooks_pb.rb +70 -0
  62. data/lib/couchbase/protostellar/generated/internal/hooks/v1/hooks_services_pb.rb +36 -0
  63. data/lib/couchbase/protostellar/generated/kv/v1/kv_pb.rb +97 -0
  64. data/lib/couchbase/protostellar/generated/kv/v1/kv_services_pb.rb +46 -0
  65. data/lib/couchbase/protostellar/generated/query/v1/query_pb.rb +57 -0
  66. data/lib/couchbase/protostellar/generated/query/v1/query_services_pb.rb +30 -0
  67. data/lib/couchbase/protostellar/generated/routing/v1/routing_pb.rb +52 -0
  68. data/lib/couchbase/protostellar/generated/routing/v1/routing_services_pb.rb +30 -0
  69. data/lib/couchbase/protostellar/generated/search/v1/search_pb.rb +99 -0
  70. data/lib/couchbase/protostellar/generated/search/v1/search_services_pb.rb +30 -0
  71. data/lib/couchbase/protostellar/generated/transactions/v1/transactions_pb.rb +57 -0
  72. data/lib/couchbase/protostellar/generated/transactions/v1/transactions_services_pb.rb +36 -0
  73. data/lib/couchbase/protostellar/generated/view/v1/view_pb.rb +51 -0
  74. data/lib/couchbase/protostellar/generated/view/v1/view_services_pb.rb +30 -0
  75. data/lib/couchbase/protostellar/generated.rb +9 -0
  76. data/lib/couchbase/protostellar/management/bucket_manager.rb +67 -0
  77. data/lib/couchbase/protostellar/management/collection_manager.rb +94 -0
  78. data/lib/couchbase/protostellar/management/collection_query_index_manager.rb +124 -0
  79. data/lib/couchbase/protostellar/management/query_index_manager.rb +112 -0
  80. data/lib/couchbase/protostellar/management.rb +24 -0
  81. data/lib/couchbase/protostellar/request.rb +78 -0
  82. data/lib/couchbase/protostellar/request_behaviour.rb +42 -0
  83. data/lib/couchbase/protostellar/request_generator/admin/bucket.rb +124 -0
  84. data/lib/couchbase/protostellar/request_generator/admin/collection.rb +94 -0
  85. data/lib/couchbase/protostellar/request_generator/admin/query.rb +130 -0
  86. data/lib/couchbase/protostellar/request_generator/admin.rb +24 -0
  87. data/lib/couchbase/protostellar/request_generator/kv.rb +474 -0
  88. data/lib/couchbase/protostellar/request_generator/query.rb +133 -0
  89. data/lib/couchbase/protostellar/request_generator/search.rb +387 -0
  90. data/lib/couchbase/protostellar/request_generator.rb +26 -0
  91. data/lib/couchbase/protostellar/response_converter/admin/bucket.rb +55 -0
  92. data/lib/couchbase/protostellar/response_converter/admin/collection.rb +42 -0
  93. data/lib/couchbase/protostellar/response_converter/admin/query.rb +59 -0
  94. data/lib/couchbase/protostellar/response_converter/admin.rb +24 -0
  95. data/lib/couchbase/protostellar/response_converter/kv.rb +151 -0
  96. data/lib/couchbase/protostellar/response_converter/query.rb +84 -0
  97. data/lib/couchbase/protostellar/response_converter/search.rb +136 -0
  98. data/lib/couchbase/protostellar/response_converter.rb +26 -0
  99. data/lib/couchbase/protostellar/retry/action.rb +38 -0
  100. data/lib/couchbase/protostellar/retry/orchestrator.rb +60 -0
  101. data/lib/couchbase/protostellar/retry/reason.rb +67 -0
  102. data/lib/couchbase/protostellar/retry/strategies/best_effort.rb +49 -0
  103. data/lib/couchbase/protostellar/retry/strategies.rb +26 -0
  104. data/lib/couchbase/protostellar/retry.rb +28 -0
  105. data/lib/couchbase/protostellar/scope.rb +57 -0
  106. data/lib/couchbase/protostellar/timeout_defaults.rb +30 -0
  107. data/lib/couchbase/protostellar/timeouts.rb +83 -0
  108. data/lib/couchbase/protostellar.rb +29 -0
  109. data/lib/couchbase/query_options.rb +120 -0
  110. data/lib/couchbase/railtie.rb +45 -0
  111. data/lib/couchbase/raw_binary_transcoder.rb +37 -0
  112. data/lib/couchbase/raw_json_transcoder.rb +38 -0
  113. data/lib/couchbase/raw_string_transcoder.rb +40 -0
  114. data/lib/couchbase/scope.rb +256 -0
  115. data/lib/couchbase/search_options.rb +1622 -0
  116. data/lib/couchbase/subdoc.rb +290 -0
  117. data/lib/couchbase/transcoder_flags.rb +62 -0
  118. data/lib/couchbase/utils/generic_logger_adapter.rb +38 -0
  119. data/lib/couchbase/utils/stdlib_logger_adapter.rb +65 -0
  120. data/lib/couchbase/utils/time.rb +69 -0
  121. data/lib/couchbase/utils.rb +21 -0
  122. data/lib/couchbase/version.rb +23 -0
  123. data/lib/couchbase/view_options.rb +65 -0
  124. data/lib/couchbase.rb +28 -0
  125. data/lib/rails/generators/couchbase/config/config_generator.rb +27 -0
  126. metadata +191 -0
@@ -0,0 +1,2837 @@
1
+ # Copyright 2020-2021 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/utils/time"
16
+ require "couchbase/config_profiles"
17
+ require "couchbase/json_transcoder"
18
+
19
+ module Couchbase
20
+ # Definition of the Option classes for data APIs
21
+ module Options # rubocop:disable Metrics/ModuleLength
22
+ # Base class for most of the options
23
+ class Base
24
+ attr_accessor :timeout # @return [Integer, #in_milliseconds, nil]
25
+ attr_accessor :retry_strategy # @return [Proc, nil]
26
+ attr_accessor :client_context # @return [Hash, nil]
27
+ attr_accessor :parent_span # @return [Span, nil]
28
+
29
+ # @param [Integer, #in_milliseconds, nil] timeout the time in milliseconds allowed for the operation to complete
30
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
31
+ # @param [Hash, nil] client_context the client context data, if set
32
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
33
+ #
34
+ # @yieldparam [Base]
35
+ def initialize(timeout: nil,
36
+ retry_strategy: nil,
37
+ client_context: nil,
38
+ parent_span: nil)
39
+ @timeout = timeout
40
+ @retry_strategy = retry_strategy
41
+ @client_context = client_context
42
+ @parent_span = parent_span
43
+ yield self if block_given?
44
+ end
45
+
46
+ # @api private
47
+ def to_backend
48
+ {
49
+ timeout: Utils::Time.extract_duration(@timeout),
50
+ }
51
+ end
52
+ end
53
+
54
+ # Options for {Collection#get}
55
+ class Get < Base
56
+ attr_accessor :with_expiry # @return [Boolean]
57
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String, Integer)]
58
+
59
+ # Creates an instance of options for {Collection#get}
60
+ #
61
+ # @param [Array<String>] projections a list of paths that should be loaded if present.
62
+ # @param [Boolean] with_expiry if +true+ the expiration will be also fetched with {Collection#get}
63
+ # @param [JsonTranscoder, #decode(String, Integer)] transcoder used for decoding
64
+ #
65
+ # @param [Integer, #in_milliseconds, nil] timeout the time in milliseconds allowed for the operation to complete
66
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
67
+ # @param [Hash, nil] client_context the client context data, if set
68
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
69
+ #
70
+ # @yieldparam [Get] self
71
+ def initialize(projections: [],
72
+ with_expiry: false,
73
+ transcoder: JsonTranscoder.new,
74
+ timeout: nil,
75
+ retry_strategy: nil,
76
+ client_context: nil,
77
+ parent_span: nil)
78
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
79
+ @projections = projections
80
+ @with_expiry = with_expiry
81
+ @transcoder = transcoder
82
+ @preserve_array_indexes = false
83
+ yield self if block_given?
84
+ end
85
+
86
+ # Allows to specify a custom list paths to fetch from the document instead of the whole.
87
+ #
88
+ # Note that a maximum of 16 individual paths can be projected at a time due to a server limitation. If you need
89
+ # more than that, think about fetching less-generic paths or the full document straight away.
90
+ #
91
+ # @param [String, Array<String>] paths a path that should be loaded if present.
92
+ def project(*paths)
93
+ @projections ||= []
94
+ @projections |= paths.flatten # union with current projections
95
+ end
96
+
97
+ # @api private
98
+ # @return [Boolean] whether to use sparse arrays (default +false+)
99
+ attr_accessor :preserve_array_indexes
100
+
101
+ # @api private
102
+ # @return [Array<String>] list of paths to project
103
+ attr_accessor :projections
104
+
105
+ # @api private
106
+ # @return [Boolean]
107
+ def need_projected_get?
108
+ @with_expiry || !@projections&.empty?
109
+ end
110
+
111
+ # @api private
112
+ def to_backend
113
+ options = {
114
+ timeout: Utils::Time.extract_duration(@timeout),
115
+ }
116
+ options.update(with_expiry: true) if @with_expiry
117
+ unless @projections&.empty?
118
+ options.update({
119
+ projections: @projections,
120
+ preserve_array_indexes: @preserve_array_indexes,
121
+ })
122
+ end
123
+ options
124
+ end
125
+
126
+ # @api private
127
+ DEFAULT = Get.new.freeze
128
+ end
129
+
130
+ # Options for {Collection#get_multi}
131
+ class GetMulti < Base
132
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String, Integer)]
133
+
134
+ # Creates an instance of options for {Collection#get_multi}
135
+ #
136
+ # @param [JsonTranscoder, #decode(String, Integer)] transcoder used for decoding
137
+ #
138
+ # @param [Integer, #in_milliseconds, nil] timeout the time in milliseconds allowed for the operation to complete
139
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
140
+ # @param [Hash, nil] client_context the client context data, if set
141
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
142
+ #
143
+ # @yieldparam [GetMulti] self
144
+ def initialize(transcoder: JsonTranscoder.new,
145
+ timeout: nil,
146
+ retry_strategy: nil,
147
+ client_context: nil,
148
+ parent_span: nil)
149
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
150
+ @transcoder = transcoder
151
+ yield self if block_given?
152
+ end
153
+
154
+ # @api private
155
+ def to_backend
156
+ {
157
+ timeout: Utils::Time.extract_duration(@timeout),
158
+ }
159
+ end
160
+
161
+ # @api private
162
+ DEFAULT = GetMulti.new.freeze
163
+ end
164
+
165
+ # Options for {Collection#get_and_lock}
166
+ class GetAndLock < Base
167
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String, Integer)]
168
+
169
+ # Creates an instance of options for {Collection#get_and_lock}
170
+ #
171
+ # @param [JsonTranscoder, #decode(String, Integer)] transcoder used for decoding
172
+ #
173
+ # @param [Integer, #in_milliseconds, nil] timeout
174
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
175
+ # @param [Hash, nil] client_context the client context data, if set
176
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
177
+ #
178
+ # @yieldparam [GetAndLock] self
179
+ def initialize(transcoder: JsonTranscoder.new,
180
+ timeout: nil,
181
+ retry_strategy: nil,
182
+ client_context: nil,
183
+ parent_span: nil)
184
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
185
+ @transcoder = transcoder
186
+ yield self if block_given?
187
+ end
188
+
189
+ # @api private
190
+ def to_backend
191
+ {
192
+ timeout: Utils::Time.extract_duration(@timeout),
193
+ }
194
+ end
195
+
196
+ # @api private
197
+ DEFAULT = GetAndLock.new.freeze
198
+ end
199
+
200
+ # Options for {Collection#get_and_touch}
201
+ class GetAndTouch < Base
202
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String, Integer)]
203
+
204
+ # Creates an instance of options for {Collection#get_and_touch}
205
+ #
206
+ # @param [JsonTranscoder, #decode(String, Integer)] transcoder used for decoding
207
+ #
208
+ # @param [Integer, #in_milliseconds, nil] timeout
209
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
210
+ # @param [Hash, nil] client_context the client context data, if set
211
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
212
+ #
213
+ # @yieldparam [GetAndTouch] self
214
+ def initialize(transcoder: JsonTranscoder.new,
215
+ timeout: nil,
216
+ retry_strategy: nil,
217
+ client_context: nil,
218
+ parent_span: nil)
219
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
220
+ @transcoder = transcoder
221
+ yield self if block_given?
222
+ end
223
+
224
+ # @api private
225
+ def to_backend
226
+ {
227
+ timeout: Utils::Time.extract_duration(@timeout),
228
+ }
229
+ end
230
+
231
+ # @api private
232
+ DEFAULT = GetAndTouch.new.freeze
233
+ end
234
+
235
+ # Options for {Collection#get_all_replicas}
236
+ class GetAllReplicas < Base
237
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String, Integer)]
238
+
239
+ # Creates an instance of options for {Collection#get_all_replicas}
240
+ #
241
+ # @param [JsonTranscoder, #decode(String, Integer)] transcoder used for decoding
242
+ #
243
+ # @param [Integer, #in_milliseconds, nil] timeout
244
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
245
+ # @param [Hash, nil] client_context the client context data, if set
246
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
247
+ #
248
+ # @yieldparam [GetAllReplicas] self
249
+ def initialize(transcoder: JsonTranscoder.new,
250
+ timeout: nil,
251
+ retry_strategy: nil,
252
+ client_context: nil,
253
+ parent_span: nil)
254
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
255
+ @transcoder = transcoder
256
+ yield self if block_given?
257
+ end
258
+
259
+ # @api private
260
+ def to_backend
261
+ {
262
+ timeout: Utils::Time.extract_duration(@timeout),
263
+ }
264
+ end
265
+
266
+ # @api private
267
+ DEFAULT = GetAllReplicas.new.freeze
268
+ end
269
+
270
+ # Options for {Collection#get_any_replica}
271
+ class GetAnyReplica < Base
272
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String, Integer)]
273
+
274
+ # Creates an instance of options for {Collection#get_any_replica}
275
+ #
276
+ # @param [JsonTranscoder, #decode(String, Integer)] transcoder used for decoding
277
+ #
278
+ # @param [Integer, #in_milliseconds, nil] timeout
279
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
280
+ # @param [Hash, nil] client_context the client context data, if set
281
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
282
+ #
283
+ # @yieldparam [GetAnyReplica] self
284
+ def initialize(transcoder: JsonTranscoder.new,
285
+ timeout: nil,
286
+ retry_strategy: nil,
287
+ client_context: nil,
288
+ parent_span: nil)
289
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
290
+ @transcoder = transcoder
291
+ yield self if block_given?
292
+ end
293
+
294
+ # @api private
295
+ def to_backend
296
+ {
297
+ timeout: Utils::Time.extract_duration(@timeout),
298
+ }
299
+ end
300
+
301
+ # @api private
302
+ DEFAULT = GetAnyReplica.new.freeze
303
+ end
304
+
305
+ # Options for {Collection#exists}
306
+ class Exists < Base
307
+ # Creates an instance of options for {Collection#exists}
308
+ #
309
+ # @param [Integer, #in_milliseconds, nil] timeout
310
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
311
+ # @param [Hash, nil] client_context the client context data, if set
312
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
313
+ #
314
+ # @yieldparam [Exists self
315
+ def initialize(timeout: nil,
316
+ retry_strategy: nil,
317
+ client_context: nil,
318
+ parent_span: nil)
319
+ super
320
+ yield self if block_given?
321
+ end
322
+
323
+ # @api private
324
+ def to_backend
325
+ {
326
+ timeout: Utils::Time.extract_duration(@timeout),
327
+ }
328
+ end
329
+
330
+ # @api private
331
+ DEFAULT = Exists.new.freeze
332
+ end
333
+
334
+ # Options for {Collection#touch}
335
+ class Touch < Base
336
+ # Creates an instance of options for {Collection#touch}
337
+ #
338
+ # @param [Integer, #in_milliseconds, nil] timeout
339
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
340
+ # @param [Hash, nil] client_context the client context data, if set
341
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
342
+ #
343
+ # @yieldparam [TouchOptions] self
344
+ def initialize(timeout: nil,
345
+ retry_strategy: nil,
346
+ client_context: nil,
347
+ parent_span: nil)
348
+ super
349
+ yield self if block_given?
350
+ end
351
+
352
+ # @api private
353
+ def to_backend
354
+ {
355
+ timeout: Utils::Time.extract_duration(@timeout),
356
+ }
357
+ end
358
+
359
+ # @api private
360
+ DEFAULT = Touch.new.freeze
361
+ end
362
+
363
+ # Options for {Collection#unlock}
364
+ class Unlock < Base
365
+ # Creates an instance of options for {Collection#unlock}
366
+ #
367
+ # @param [Integer, #in_milliseconds, nil] timeout
368
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
369
+ # @param [Hash, nil] client_context the client context data, if set
370
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
371
+ #
372
+ # @yieldparam [Unlock] self
373
+ def initialize(timeout: nil,
374
+ retry_strategy: nil,
375
+ client_context: nil,
376
+ parent_span: nil)
377
+ super
378
+ yield self if block_given?
379
+ end
380
+
381
+ # @api private
382
+ def to_backend
383
+ {
384
+ timeout: Utils::Time.extract_duration(@timeout),
385
+ }
386
+ end
387
+
388
+ # @api private
389
+ DEFAULT = Unlock.new.freeze
390
+ end
391
+
392
+ # Options for {Collection#remove}
393
+ class Remove < Base
394
+ attr_accessor :cas # @return [Integer, nil]
395
+ attr_accessor :durability_level # @return [Symbol]
396
+
397
+ # Creates an instance of options for {Collection#remove}
398
+ #
399
+ # @param [Integer, nil] cas CAS value for optimistic locking
400
+ # @param [Symbol] durability_level level of durability
401
+ # +:none+::
402
+ # no enhanced durability required for the mutation
403
+ # +:majority+::
404
+ # the mutation must be replicated to a majority of the Data Service nodes
405
+ # (that is, held in the memory allocated to the bucket)
406
+ # +:majority_and_persist_to_active+::
407
+ # The mutation must be replicated to a majority of the Data Service nodes.
408
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
409
+ # node hosting the active partition (vBucket) for the data.
410
+ # +:persist_to_majority+::
411
+ # The mutation must be persisted to a majority of the Data Service nodes.
412
+ # Accordingly, it will be written to disk on those nodes.
413
+ # @param [Symbol] replicate_to number of nodes to replicate
414
+ # +:none+:: do not apply any replication requirements.
415
+ # +:one+:: wait for replication to at least one node.
416
+ # +:two+:: wait for replication to at least two nodes.
417
+ # +:three+:: wait for replication to at least three nodes.
418
+ # @param [Symbol] persist_to number of nodes to persist
419
+ # +:none+:: do not apply any persistence requirements.
420
+ # +:active+:: wait for persistence to active node
421
+ # +:one+:: wait for persistence to at least one node.
422
+ # +:two+:: wait for persistence to at least two nodes.
423
+ # +:three+:: wait for persistence to at least three nodes.
424
+ # +:four+:: wait for persistence to four nodes (active and replicas).
425
+ #
426
+ # @param [Integer, #in_milliseconds, nil] timeout
427
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
428
+ # @param [Hash, nil] client_context the client context data, if set
429
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
430
+ #
431
+ # @yieldparam [Remove]
432
+ def initialize(cas: nil,
433
+ durability_level: :none,
434
+ replicate_to: :none,
435
+ persist_to: :none,
436
+ timeout: nil,
437
+ retry_strategy: nil,
438
+ client_context: nil,
439
+ parent_span: nil)
440
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
441
+ @cas = cas
442
+ if durability_level != :none && (replicate_to != :none || persist_to != :none)
443
+ raise ArgumentError, "durability_level conflicts with replicate_to and persist_to options"
444
+ end
445
+
446
+ @persist_to = persist_to
447
+ @replicate_to = replicate_to
448
+ @durability_level = durability_level
449
+ yield self if block_given?
450
+ end
451
+
452
+ # @api private
453
+ def to_backend
454
+ {
455
+ timeout: Utils::Time.extract_duration(@timeout),
456
+ durability_level: @durability_level,
457
+ persist_to: @persist_to,
458
+ replicate_to: @replicate_to,
459
+ cas: @cas,
460
+ }
461
+ end
462
+
463
+ # @api private
464
+ DEFAULT = Remove.new.freeze
465
+ end
466
+
467
+ # Options for {Collection#remove_multi}
468
+ class RemoveMulti < Base
469
+ attr_accessor :durability_level # @return [Symbol]
470
+
471
+ # Creates an instance of options for {Collection#remove}
472
+ #
473
+ # @param [Symbol] durability_level level of durability
474
+ # +:none+::
475
+ # no enhanced durability required for the mutation
476
+ # +:majority+::
477
+ # the mutation must be replicated to a majority of the Data Service nodes
478
+ # (that is, held in the memory allocated to the bucket)
479
+ # +:majority_and_persist_to_active+::
480
+ # The mutation must be replicated to a majority of the Data Service nodes.
481
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
482
+ # node hosting the active partition (vBucket) for the data.
483
+ # +:persist_to_majority+::
484
+ # The mutation must be persisted to a majority of the Data Service nodes.
485
+ # Accordingly, it will be written to disk on those nodes.
486
+ # @param [Symbol] replicate_to number of nodes to replicate
487
+ # +:none+:: do not apply any replication requirements.
488
+ # +:one+:: wait for replication to at least one node.
489
+ # +:two+:: wait for replication to at least two nodes.
490
+ # +:three+:: wait for replication to at least three nodes.
491
+ # @param [Symbol] persist_to number of nodes to persist
492
+ # +:none+:: do not apply any persistence requirements.
493
+ # +:active+:: wait for persistence to active node
494
+ # +:one+:: wait for persistence to at least one node.
495
+ # +:two+:: wait for persistence to at least two nodes.
496
+ # +:three+:: wait for persistence to at least three nodes.
497
+ # +:four+:: wait for persistence to four nodes (active and replicas).
498
+ #
499
+ # @param [Integer, #in_milliseconds, nil] timeout
500
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
501
+ # @param [Hash, nil] client_context the client context data, if set
502
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
503
+ #
504
+ # @yieldparam [Remove]
505
+ def initialize(durability_level: :none,
506
+ replicate_to: :none,
507
+ persist_to: :none,
508
+ timeout: nil,
509
+ retry_strategy: nil,
510
+ client_context: nil,
511
+ parent_span: nil)
512
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
513
+ if durability_level != :none && (replicate_to != :none || persist_to != :none)
514
+ raise ArgumentError, "durability_level conflicts with replicate_to and persist_to options"
515
+ end
516
+
517
+ @persist_to = persist_to
518
+ @replicate_to = replicate_to
519
+ @durability_level = durability_level
520
+ yield self if block_given?
521
+ end
522
+
523
+ # @api private
524
+ def to_backend
525
+ {
526
+ timeout: Utils::Time.extract_duration(@timeout),
527
+ durability_level: @durability_level,
528
+ persist_to: @persist_to,
529
+ replicate_to: @replicate_to,
530
+ }
531
+ end
532
+
533
+ # @api private
534
+ DEFAULT = RemoveMulti.new.freeze
535
+ end
536
+
537
+ # Options for {Collection#insert}
538
+ class Insert < Base
539
+ attr_accessor :expiry # @return [Integer, #in_seconds, nil]
540
+ attr_accessor :transcoder # @return [JsonTranscoder, #encode(Object)]
541
+ attr_accessor :durability_level # @return [Symbol]
542
+
543
+ # Creates an instance of options for {Collection#insert}
544
+ #
545
+ # @param [Integer, #in_seconds, Time, nil] expiry expiration time to associate with the document
546
+ # @param [JsonTranscoder, #encode(Object)] transcoder used for encoding
547
+ # @param [Symbol] durability_level level of durability
548
+ # +:none+::
549
+ # no enhanced durability required for the mutation
550
+ # +:majority+::
551
+ # the mutation must be replicated to a majority of the Data Service nodes
552
+ # (that is, held in the memory allocated to the bucket)
553
+ # +:majority_and_persist_to_active+::
554
+ # The mutation must be replicated to a majority of the Data Service nodes.
555
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
556
+ # node hosting the active partition (vBucket) for the data.
557
+ # +:persist_to_majority+::
558
+ # The mutation must be persisted to a majority of the Data Service nodes.
559
+ # Accordingly, it will be written to disk on those nodes.
560
+ # @param [Symbol] replicate_to number of nodes to replicate
561
+ # +:none+:: do not apply any replication requirements.
562
+ # +:one+:: wait for replication to at least one node.
563
+ # +:two+:: wait for replication to at least two nodes.
564
+ # +:three+:: wait for replication to at least three nodes.
565
+ # @param [Symbol] persist_to number of nodes to persist
566
+ # +:none+:: do not apply any persistence requirements.
567
+ # +:active+:: wait for persistence to active node
568
+ # +:one+:: wait for persistence to at least one node.
569
+ # +:two+:: wait for persistence to at least two nodes.
570
+ # +:three+:: wait for persistence to at least three nodes.
571
+ # +:four+:: wait for persistence to four nodes (active and replicas).
572
+ #
573
+ # @param [Integer, #in_milliseconds, nil] timeout
574
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
575
+ # @param [Hash, nil] client_context the client context data, if set
576
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
577
+ #
578
+ # @yieldparam [Insert]
579
+ def initialize(expiry: nil,
580
+ transcoder: JsonTranscoder.new,
581
+ durability_level: :none,
582
+ replicate_to: :none,
583
+ persist_to: :none,
584
+ timeout: nil,
585
+ retry_strategy: nil,
586
+ client_context: nil,
587
+ parent_span: nil)
588
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
589
+ @expiry = expiry
590
+ @transcoder = transcoder
591
+ if durability_level != :none && (replicate_to != :none || persist_to != :none)
592
+ raise ArgumentError, "durability_level conflicts with replicate_to and persist_to options"
593
+ end
594
+
595
+ @persist_to = persist_to
596
+ @replicate_to = replicate_to
597
+ @durability_level = durability_level
598
+ yield self if block_given?
599
+ end
600
+
601
+ # @api private
602
+ def to_backend
603
+ {
604
+ timeout: Utils::Time.extract_duration(@timeout),
605
+ expiry: Utils::Time.extract_expiry_time(@expiry),
606
+ durability_level: @durability_level,
607
+ persist_to: @persist_to,
608
+ replicate_to: @replicate_to,
609
+ }
610
+ end
611
+
612
+ # @api private
613
+ DEFAULT = Insert.new.freeze
614
+ end
615
+
616
+ # Options for {Collection#upsert}
617
+ class Upsert < Base
618
+ attr_accessor :expiry # @return [Integer, #in_seconds, nil]
619
+ attr_accessor :transcoder # @return [JsonTranscoder, #encode(Object)]
620
+ attr_accessor :durability_level # @return [Symbol]
621
+ attr_accessor :preserve_expiry # @return [Boolean]
622
+
623
+ # Creates an instance of options for {Collection#upsert}
624
+ #
625
+ # @param [Integer, #in_seconds, Time, nil] expiry expiration time to associate with the document
626
+ # @param [Boolean] preserve_expiry if true and the document exists, the server will preserve current expiration
627
+ # for the document, otherwise will use {expiry} from the operation.
628
+ # @param [JsonTranscoder, #encode(Object)] transcoder used for encoding
629
+ # @param [Symbol] durability_level level of durability
630
+ # +:none+::
631
+ # no enhanced durability required for the mutation
632
+ # +:majority+::
633
+ # the mutation must be replicated to a majority of the Data Service nodes
634
+ # (that is, held in the memory allocated to the bucket)
635
+ # +:majority_and_persist_to_active+::
636
+ # The mutation must be replicated to a majority of the Data Service nodes.
637
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
638
+ # node hosting the active partition (vBucket) for the data.
639
+ # +:persist_to_majority+::
640
+ # The mutation must be persisted to a majority of the Data Service nodes.
641
+ # Accordingly, it will be written to disk on those nodes.
642
+ # @param [Symbol] replicate_to number of nodes to replicate
643
+ # +:none+:: do not apply any replication requirements.
644
+ # +:one+:: wait for replication to at least one node.
645
+ # +:two+:: wait for replication to at least two nodes.
646
+ # +:three+:: wait for replication to at least three nodes.
647
+ # @param [Symbol] persist_to number of nodes to persist
648
+ # +:none+:: do not apply any persistence requirements.
649
+ # +:active+:: wait for persistence to active node
650
+ # +:one+:: wait for persistence to at least one node.
651
+ # +:two+:: wait for persistence to at least two nodes.
652
+ # +:three+:: wait for persistence to at least three nodes.
653
+ # +:four+:: wait for persistence to four nodes (active and replicas).
654
+ #
655
+ # @param [Integer, #in_milliseconds, nil] timeout
656
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
657
+ # @param [Hash, nil] client_context the client context data, if set
658
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
659
+ #
660
+ # @yieldparam [Upsert]
661
+ def initialize(expiry: nil,
662
+ preserve_expiry: false,
663
+ transcoder: JsonTranscoder.new,
664
+ durability_level: :none,
665
+ replicate_to: :none,
666
+ persist_to: :none,
667
+ timeout: nil,
668
+ retry_strategy: nil,
669
+ client_context: nil,
670
+ parent_span: nil)
671
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
672
+ @expiry = expiry
673
+ @preserve_expiry = preserve_expiry
674
+ @transcoder = transcoder
675
+ if durability_level != :none && (replicate_to != :none || persist_to != :none)
676
+ raise ArgumentError, "durability_level conflicts with replicate_to and persist_to options"
677
+ end
678
+
679
+ @persist_to = persist_to
680
+ @replicate_to = replicate_to
681
+ @durability_level = durability_level
682
+ yield self if block_given?
683
+ end
684
+
685
+ def to_backend
686
+ {
687
+ timeout: Utils::Time.extract_duration(@timeout),
688
+ expiry: Utils::Time.extract_expiry_time(@expiry),
689
+ preserve_expiry: @preserve_expiry,
690
+ durability_level: @durability_level,
691
+ persist_to: @persist_to,
692
+ replicate_to: @replicate_to,
693
+ }
694
+ end
695
+
696
+ # @api private
697
+ DEFAULT = Upsert.new.freeze
698
+ end
699
+
700
+ # Options for {Collection#upsert_multi}
701
+ class UpsertMulti < Base
702
+ attr_accessor :expiry # @return [Integer, #in_seconds, nil]
703
+ attr_accessor :transcoder # @return [JsonTranscoder, #encode(Object)]
704
+ attr_accessor :durability_level # @return [Symbol]
705
+ attr_accessor :preserve_expiry # @return [Boolean]
706
+
707
+ # Creates an instance of options for {Collection#upsert}
708
+ #
709
+ # @param [Integer, #in_seconds, Time, nil] expiry expiration time to associate with the document
710
+ # @param [Boolean] preserve_expiry if true and the document exists, the server will preserve current expiration
711
+ # for the document, otherwise will use {expiry} from the operation.
712
+ # @param [JsonTranscoder, #encode(Object)] transcoder used for encoding
713
+ # @param [Symbol] durability_level level of durability
714
+ # +:none+::
715
+ # no enhanced durability required for the mutation
716
+ # +:majority+::
717
+ # the mutation must be replicated to a majority of the Data Service nodes
718
+ # (that is, held in the memory allocated to the bucket)
719
+ # +:majority_and_persist_to_active+::
720
+ # The mutation must be replicated to a majority of the Data Service nodes.
721
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
722
+ # node hosting the active partition (vBucket) for the data.
723
+ # +:persist_to_majority+::
724
+ # The mutation must be persisted to a majority of the Data Service nodes.
725
+ # Accordingly, it will be written to disk on those nodes.
726
+ # @param [Symbol] replicate_to number of nodes to replicate
727
+ # +:none+:: do not apply any replication requirements.
728
+ # +:one+:: wait for replication to at least one node.
729
+ # +:two+:: wait for replication to at least two nodes.
730
+ # +:three+:: wait for replication to at least three nodes.
731
+ # @param [Symbol] persist_to number of nodes to persist
732
+ # +:none+:: do not apply any persistence requirements.
733
+ # +:active+:: wait for persistence to active node
734
+ # +:one+:: wait for persistence to at least one node.
735
+ # +:two+:: wait for persistence to at least two nodes.
736
+ # +:three+:: wait for persistence to at least three nodes.
737
+ # +:four+:: wait for persistence to four nodes (active and replicas).
738
+ #
739
+ # @param [Integer, #in_milliseconds, nil] timeout
740
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
741
+ # @param [Hash, nil] client_context the client context data, if set
742
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
743
+ #
744
+ # @yieldparam [Upsert]
745
+ def initialize(expiry: nil,
746
+ preserve_expiry: false,
747
+ transcoder: JsonTranscoder.new,
748
+ durability_level: :none,
749
+ replicate_to: :none,
750
+ persist_to: :none,
751
+ timeout: nil,
752
+ retry_strategy: nil,
753
+ client_context: nil,
754
+ parent_span: nil)
755
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
756
+ @expiry = expiry
757
+ @preserve_expiry = preserve_expiry
758
+ @transcoder = transcoder
759
+ if durability_level != :none && (replicate_to != :none || persist_to != :none)
760
+ raise ArgumentError, "durability_level conflicts with replicate_to and persist_to options"
761
+ end
762
+
763
+ @persist_to = persist_to
764
+ @replicate_to = replicate_to
765
+ @durability_level = durability_level
766
+ yield self if block_given?
767
+ end
768
+
769
+ def to_backend
770
+ {
771
+ timeout: Utils::Time.extract_duration(@timeout),
772
+ expiry: Utils::Time.extract_expiry_time(@expiry),
773
+ preserve_expiry: @preserve_expiry,
774
+ durability_level: @durability_level,
775
+ persist_to: @persist_to,
776
+ replicate_to: @replicate_to,
777
+ }
778
+ end
779
+
780
+ # @api private
781
+ DEFAULT = UpsertMulti.new.freeze
782
+ end
783
+
784
+ # Options for {Collection#replace}
785
+ class Replace < Base
786
+ attr_accessor :expiry # @return [Integer, #in_seconds, nil]
787
+ attr_accessor :transcoder # @return [JsonTranscoder, #encode(Object)]
788
+ attr_accessor :cas # @return [Integer, nil]
789
+ attr_accessor :durability_level # @return [Symbol]
790
+ attr_accessor :preserve_expiry # @return [Boolean]
791
+
792
+ # Creates an instance of options for {Collection#replace}
793
+ #
794
+ # @param [Integer, #in_seconds, nil] expiry expiration time to associate with the document
795
+ # @param [Boolean] preserve_expiry if true and the document exists, the server will preserve current expiration
796
+ # for the document, otherwise will use {expiry} from the operation.
797
+ # @param [JsonTranscoder, #encode(Object)] transcoder used for encoding
798
+ # @param [Integer, nil] cas a CAS value that will be taken into account on the server side for optimistic concurrency
799
+ # @param [Symbol] durability_level level of durability
800
+ # +:none+::
801
+ # no enhanced durability required for the mutation
802
+ # +:majority+::
803
+ # the mutation must be replicated to a majority of the Data Service nodes
804
+ # (that is, held in the memory allocated to the bucket)
805
+ # +:majority_and_persist_to_active+::
806
+ # The mutation must be replicated to a majority of the Data Service nodes.
807
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
808
+ # node hosting the active partition (vBucket) for the data.
809
+ # +:persist_to_majority+::
810
+ # The mutation must be persisted to a majority of the Data Service nodes.
811
+ # Accordingly, it will be written to disk on those nodes.
812
+ # @param [Symbol] replicate_to number of nodes to replicate
813
+ # +:none+:: do not apply any replication requirements.
814
+ # +:one+:: wait for replication to at least one node.
815
+ # +:two+:: wait for replication to at least two nodes.
816
+ # +:three+:: wait for replication to at least three nodes.
817
+ # @param [Symbol] persist_to number of nodes to persist
818
+ # +:none+:: do not apply any persistence requirements.
819
+ # +:active+:: wait for persistence to active node
820
+ # +:one+:: wait for persistence to at least one node.
821
+ # +:two+:: wait for persistence to at least two nodes.
822
+ # +:three+:: wait for persistence to at least three nodes.
823
+ # +:four+:: wait for persistence to four nodes (active and replicas).
824
+ #
825
+ # @param [Integer, #in_milliseconds, nil] timeout
826
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
827
+ # @param [Hash, nil] client_context the client context data, if set
828
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
829
+ #
830
+ # @yieldparam [Replace]
831
+ def initialize(expiry: nil,
832
+ preserve_expiry: false,
833
+ transcoder: JsonTranscoder.new,
834
+ cas: nil,
835
+ durability_level: :none,
836
+ replicate_to: :none,
837
+ persist_to: :none,
838
+ timeout: nil,
839
+ retry_strategy: nil,
840
+ client_context: nil,
841
+ parent_span: nil)
842
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
843
+ @expiry = expiry
844
+ @preserve_expiry = preserve_expiry
845
+ @transcoder = transcoder
846
+ @cas = cas
847
+ if durability_level != :none && (replicate_to != :none || persist_to != :none)
848
+ raise ArgumentError, "durability_level conflicts with replicate_to and persist_to options"
849
+ end
850
+
851
+ @persist_to = persist_to
852
+ @replicate_to = replicate_to
853
+ @durability_level = durability_level
854
+ yield self if block_given?
855
+ end
856
+
857
+ def to_backend
858
+ {
859
+ timeout: Utils::Time.extract_duration(@timeout),
860
+ expiry: Utils::Time.extract_expiry_time(@expiry),
861
+ preserve_expiry: @preserve_expiry,
862
+ durability_level: @durability_level,
863
+ persist_to: @persist_to,
864
+ replicate_to: @replicate_to,
865
+ cas: @cas,
866
+ }
867
+ end
868
+
869
+ # @api private
870
+ DEFAULT = Replace.new.freeze
871
+ end
872
+
873
+ # Options for {Collection#mutate_in}
874
+ class MutateIn < Base
875
+ attr_accessor :expiry # @return [Integer, #in_seconds, nil]
876
+ attr_accessor :store_semantics # @return [Symbol]
877
+ attr_accessor :cas # @return [Integer, nil]
878
+ attr_accessor :durability_level # @return [Symbol]
879
+ attr_accessor :transcoder # @return [JsonTranscoder, #encode(Object)]
880
+ attr_accessor :preserve_expiry # @return [Boolean]
881
+
882
+ # Creates an instance of options for {Collection#mutate_in}
883
+ #
884
+ # @param [Integer, #in_seconds, Time, nil] expiry expiration time to associate with the document
885
+ # @param [Boolean] preserve_expiry if true and the document exists, the server will preserve current expiration
886
+ # for the document, otherwise will use {expiry} from the operation.
887
+ # @param [Symbol] store_semantics describes how the outer document store semantics on subdoc should act
888
+ # +:replace+:: replace the document, fail if it does not exist. This is the default
889
+ # +:upsert+:: replace the document or create if it does not exist
890
+ # +:insert+:: create the document, fail if it exists
891
+ # @param [Integer, nil] cas a CAS value that will be taken into account on the server side for optimistic concurrency
892
+ # @param [Boolean] access_deleted for internal use only: allows access to deleted documents that are in "tombstone" form
893
+ # @param [Boolean] create_as_deleted for internal use only: allows creating documents in "tombstone" form
894
+ # @param [Symbol] durability_level level of durability
895
+ # +:none+::
896
+ # no enhanced durability required for the mutation
897
+ # +:majority+::
898
+ # the mutation must be replicated to a majority of the Data Service nodes
899
+ # (that is, held in the memory allocated to the bucket)
900
+ # +:majority_and_persist_to_active+::
901
+ # The mutation must be replicated to a majority of the Data Service nodes.
902
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
903
+ # node hosting the active partition (vBucket) for the data.
904
+ # +:persist_to_majority+::
905
+ # The mutation must be persisted to a majority of the Data Service nodes.
906
+ # Accordingly, it will be written to disk on those nodes.
907
+ # @param [Symbol] replicate_to number of nodes to replicate
908
+ # +:none+:: do not apply any replication requirements.
909
+ # +:one+:: wait for replication to at least one node.
910
+ # +:two+:: wait for replication to at least two nodes.
911
+ # +:three+:: wait for replication to at least three nodes.
912
+ # @param [Symbol] persist_to number of nodes to persist
913
+ # +:none+:: do not apply any persistence requirements.
914
+ # +:active+:: wait for persistence to active node
915
+ # +:one+:: wait for persistence to at least one node.
916
+ # +:two+:: wait for persistence to at least two nodes.
917
+ # +:three+:: wait for persistence to at least three nodes.
918
+ # +:four+:: wait for persistence to four nodes (active and replicas).
919
+ # @param [JsonTranscoder, #encode(Object)] transcoder used for encoding
920
+ #
921
+ # @param [Integer, #in_milliseconds, nil] timeout
922
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
923
+ # @param [Hash, nil] client_context the client context data, if set
924
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
925
+ #
926
+ # @yieldparam [MutateIn]
927
+ def initialize(expiry: nil,
928
+ preserve_expiry: false,
929
+ store_semantics: :replace,
930
+ cas: nil,
931
+ access_deleted: false,
932
+ create_as_deleted: false,
933
+ durability_level: :none,
934
+ replicate_to: :none,
935
+ persist_to: :none,
936
+ transcoder: JsonTranscoder.new,
937
+ timeout: nil,
938
+ retry_strategy: nil,
939
+ client_context: nil,
940
+ parent_span: nil)
941
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
942
+ @expiry = expiry
943
+ @preserve_expiry = preserve_expiry
944
+ @store_semantics = store_semantics
945
+ @cas = cas
946
+ @access_deleted = access_deleted
947
+ @create_as_deleted = create_as_deleted
948
+ if durability_level != :none && (replicate_to != :none || persist_to != :none)
949
+ raise ArgumentError, "durability_level conflicts with replicate_to and persist_to options"
950
+ end
951
+
952
+ @persist_to = persist_to
953
+ @replicate_to = replicate_to
954
+ @durability_level = durability_level
955
+ @transcoder = transcoder
956
+ yield self if block_given?
957
+ end
958
+
959
+ # @api private
960
+ def to_backend
961
+ {
962
+ timeout: Utils::Time.extract_duration(@timeout),
963
+ expiry: Utils::Time.extract_expiry_time(@expiry),
964
+ preserve_expiry: @preserve_expiry,
965
+ durability_level: @durability_level,
966
+ persist_to: @persist_to,
967
+ replicate_to: @replicate_to,
968
+ cas: @cas,
969
+ store_semantics: @store_semantics,
970
+ access_deleted: @access_deleted,
971
+ create_as_deleted: @create_as_deleted,
972
+ }
973
+ end
974
+
975
+ # @api private
976
+ # @return [Boolean]
977
+ attr_accessor :access_deleted
978
+
979
+ # @api private
980
+ # @return [Boolean]
981
+ attr_accessor :create_as_deleted
982
+
983
+ # @api private
984
+ DEFAULT = MutateIn.new.freeze
985
+ end
986
+
987
+ # Options for {Collection#lookup_in}
988
+ class LookupIn < Base
989
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
990
+
991
+ # Creates an instance of options for {Collection#lookup_in}
992
+ #
993
+ # @param [Boolean] access_deleted for internal use only: allows access to deleted documents that are in "tombstone" form
994
+ # @param [JsonTranscoder, #decode(String)] transcoder used for encoding
995
+ #
996
+ # @param [Integer, #in_milliseconds, nil] timeout
997
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
998
+ # @param [Hash, nil] client_context the client context data, if set
999
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
1000
+ #
1001
+ # @yieldparam [LookupIn] self
1002
+ def initialize(access_deleted: false,
1003
+ transcoder: JsonTranscoder.new,
1004
+ timeout: nil,
1005
+ retry_strategy: nil,
1006
+ client_context: nil,
1007
+ parent_span: nil)
1008
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
1009
+ @access_deleted = access_deleted
1010
+ @transcoder = transcoder
1011
+ yield self if block_given?
1012
+ end
1013
+
1014
+ # @api private
1015
+ def to_backend
1016
+ {
1017
+ timeout: Utils::Time.extract_duration(@timeout),
1018
+ access_deleted: @access_deleted,
1019
+ }
1020
+ end
1021
+
1022
+ # @api private
1023
+ # @return [Boolean]
1024
+ attr_accessor :access_deleted
1025
+
1026
+ # @api private
1027
+ DEFAULT = LookupIn.new.freeze
1028
+ end
1029
+
1030
+ # Options for {Collection#lookup_in_any_replica}
1031
+ class LookupInAnyReplica < Base
1032
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
1033
+
1034
+ # Creates an instance of options for {Collection#lookup_in_any_replica}
1035
+ #
1036
+ # @param [JsonTranscoder, #decode(String)] transcoder used for encoding
1037
+ #
1038
+ # @param [Integer, #in_milliseconds, nil] timeout
1039
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
1040
+ # @param [Hash, nil] client_context the client context data, if set
1041
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
1042
+ #
1043
+ # @yieldparam [LookupIn] self
1044
+ def initialize(transcoder: JsonTranscoder.new,
1045
+ timeout: nil,
1046
+ retry_strategy: nil,
1047
+ client_context: nil,
1048
+ parent_span: nil)
1049
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
1050
+ @transcoder = transcoder
1051
+ yield self if block_given?
1052
+ end
1053
+
1054
+ # @api private
1055
+ def to_backend
1056
+ {
1057
+ timeout: Utils::Time.extract_duration(@timeout),
1058
+ }
1059
+ end
1060
+
1061
+ # @api private
1062
+ # @return [Boolean]
1063
+ attr_accessor :access_deleted
1064
+
1065
+ # @api private
1066
+ DEFAULT = LookupInAnyReplica.new.freeze
1067
+ end
1068
+
1069
+ # Options for {Collection#lookup_in_all_replicas}
1070
+ class LookupInAllReplicas < Base
1071
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
1072
+
1073
+ # Creates an instance of options for {Collection#lookup_in_all_replicas}
1074
+ #
1075
+ # @param [JsonTranscoder, #decode(String)] transcoder used for encoding
1076
+ #
1077
+ # @param [Integer, #in_milliseconds, nil] timeout
1078
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
1079
+ # @param [Hash, nil] client_context the client context data, if set
1080
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
1081
+ #
1082
+ # @yieldparam [LookupInAllReplicas] self
1083
+ def initialize(transcoder: JsonTranscoder.new,
1084
+ timeout: nil,
1085
+ retry_strategy: nil,
1086
+ client_context: nil,
1087
+ parent_span: nil)
1088
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
1089
+ @transcoder = transcoder
1090
+ yield self if block_given?
1091
+ end
1092
+
1093
+ # @api private
1094
+ def to_backend
1095
+ {
1096
+ timeout: Utils::Time.extract_duration(@timeout),
1097
+ }
1098
+ end
1099
+
1100
+ # @api private
1101
+ DEFAULT = LookupInAllReplicas.new.freeze
1102
+ end
1103
+
1104
+ # Options for {Collection#scan}
1105
+ class Scan < Base
1106
+ attr_accessor :ids_only # @return [Boolean]
1107
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
1108
+ attr_accessor :mutation_state # @return [MutationState, nil]
1109
+ attr_accessor :batch_byte_limit # @return [Integer, nil]
1110
+ attr_accessor :batch_item_limit # @return [Integer, nil]
1111
+ attr_accessor :concurrency # @return [Integer, nil]
1112
+
1113
+ # Creates an instance of options for {Collection#scan}
1114
+ #
1115
+ # @param [Boolean] ids_only if set to true, the content of the documents is not included in the results
1116
+ # @param [JsonTranscoder, #decode(String)] transcoder used for decoding
1117
+ # @param [MutationState, nil] mutation_state sets the mutation tokens this scan should be consistent with
1118
+ # @param [Integer, nil] batch_byte_limit allows to limit the maximum amount of bytes that are sent from the server
1119
+ # to the client on each partition batch, defaults to 15,000
1120
+ # @param [Integer, nil] batch_item_limit allows to limit the maximum amount of items that are sent from the server
1121
+ # to the client on each partition batch, defaults to 50
1122
+ # @param [Integer, nil] concurrency specifies the maximum number of partitions that can be scanned concurrently,
1123
+ # defaults to 1
1124
+ #
1125
+ # @param [Integer, #in_milliseconds, nil] timeout
1126
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
1127
+ # @param [Hash, nil] client_context the client context data, if set
1128
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
1129
+ #
1130
+ # @yieldparam [LookupIn] self
1131
+ def initialize(ids_only: false,
1132
+ transcoder: JsonTranscoder.new,
1133
+ mutation_state: nil,
1134
+ batch_byte_limit: nil,
1135
+ batch_item_limit: nil,
1136
+ concurrency: nil,
1137
+ timeout: nil,
1138
+ retry_strategy: nil,
1139
+ client_context: nil,
1140
+ parent_span: nil)
1141
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
1142
+ @ids_only = ids_only
1143
+ @transcoder = transcoder
1144
+ @mutation_state = mutation_state
1145
+ @batch_byte_limit = batch_byte_limit
1146
+ @batch_item_limit = batch_item_limit
1147
+ @concurrency = concurrency
1148
+ yield self if block_given?
1149
+ end
1150
+
1151
+ # Sets the mutation tokens this query should be consistent with
1152
+ #
1153
+ # @note overrides consistency level set by {#scan_consistency=}
1154
+ #
1155
+ # @param [MutationState] mutation_state the mutation state containing the mutation tokens
1156
+ def consistent_with(mutation_state)
1157
+ @mutation_state = mutation_state
1158
+ end
1159
+
1160
+ # @api private
1161
+ def to_backend
1162
+ {
1163
+ timeout: Utils::Time.extract_duration(@timeout),
1164
+ ids_only: @ids_only,
1165
+ mutation_state: @mutation_state.to_a,
1166
+ batch_byte_limit: @batch_byte_limit,
1167
+ batch_item_limit: @batch_item_limit,
1168
+ concurrency: @concurrency,
1169
+ }
1170
+ end
1171
+
1172
+ DEFAULT = Scan.new.freeze
1173
+ end
1174
+
1175
+ # Options for {BinaryCollection#append}
1176
+ class Append < Base
1177
+ attr_accessor :cas # @return [Integer]
1178
+ attr_accessor :durability_level # @return [Symbol]
1179
+ attr_accessor :replicate_to # @return [Symbol]
1180
+ attr_accessor :persist_to # @return [Symbol]
1181
+
1182
+ # Creates an instance of options for {BinaryCollection#append}
1183
+ #
1184
+ # @param [Integer] cas The default CAS used (0 means no CAS in this context)
1185
+ # @param [Symbol] durability_level level of durability
1186
+ # +:none+::
1187
+ # no enhanced durability required for the mutation
1188
+ # +:majority+::
1189
+ # the mutation must be replicated to a majority of the Data Service nodes
1190
+ # (that is, held in the memory allocated to the bucket)
1191
+ # +:majority_and_persist_to_active+::
1192
+ # The mutation must be replicated to a majority of the Data Service nodes.
1193
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
1194
+ # node hosting the active partition (vBucket) for the data.
1195
+ # +:persist_to_majority+::
1196
+ # The mutation must be persisted to a majority of the Data Service nodes.
1197
+ # Accordingly, it will be written to disk on those nodes.
1198
+ # @param [Symbol] replicate_to number of nodes to replicate
1199
+ # +:none+:: do not apply any replication requirements.
1200
+ # +:one+:: wait for replication to at least one node.
1201
+ # +:two+:: wait for replication to at least two nodes.
1202
+ # +:three+:: wait for replication to at least three nodes.
1203
+ # @param [Symbol] persist_to number of nodes to persist
1204
+ # +:none+:: do not apply any persistence requirements.
1205
+ # +:active+:: wait for persistence to active node
1206
+ # +:one+:: wait for persistence to at least one node.
1207
+ # +:two+:: wait for persistence to at least two nodes.
1208
+ # +:three+:: wait for persistence to at least three nodes.
1209
+ # +:four+:: wait for persistence to four nodes (active and replicas).
1210
+ #
1211
+ # @param [Integer, #in_milliseconds, nil] timeout
1212
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
1213
+ # @param [Hash, nil] client_context the client context data, if set
1214
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
1215
+ #
1216
+ # @yieldparam [Append] self
1217
+ def initialize(cas: nil,
1218
+ durability_level: :none,
1219
+ replicate_to: :none,
1220
+ persist_to: :none,
1221
+ timeout: nil,
1222
+ retry_strategy: nil,
1223
+ client_context: nil,
1224
+ parent_span: nil)
1225
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
1226
+ @cas = cas
1227
+
1228
+ if durability_level != :none && (replicate_to != :none || persist_to != :none)
1229
+ raise ArgumentError, "durability_level conflicts with replicate_to and persist_to options"
1230
+ end
1231
+
1232
+ @durability_level = durability_level
1233
+ @replicate_to = replicate_to
1234
+ @persist_to = persist_to
1235
+ yield self if block_given?
1236
+ end
1237
+
1238
+ # @api private
1239
+ def to_backend
1240
+ {
1241
+ timeout: Utils::Time.extract_duration(@timeout),
1242
+ cas: @cas,
1243
+ durability_level: @durability_level,
1244
+ persist_to: @persist_to,
1245
+ replicate_to: @replicate_to,
1246
+ }
1247
+ end
1248
+
1249
+ # @api private
1250
+ DEFAULT = Append.new.freeze
1251
+ end
1252
+
1253
+ # Options for {BinaryCollection#prepend}
1254
+ class Prepend < Base
1255
+ attr_accessor :cas # @return [Integer]
1256
+ attr_accessor :durability_level # @return [Symbol]
1257
+ attr_accessor :replicate_to # @return [Symbol]
1258
+ attr_accessor :persist_to # @return [Symbol]
1259
+
1260
+ # Creates an instance of options for {BinaryCollection#prepend}
1261
+ #
1262
+ # @param [Integer] cas The default CAS used (0 means no CAS in this context)
1263
+ # @param [Symbol] durability_level level of durability
1264
+ # +:none+::
1265
+ # no enhanced durability required for the mutation
1266
+ # +:majority+::
1267
+ # the mutation must be replicated to a majority of the Data Service nodes
1268
+ # (that is, held in the memory allocated to the bucket)
1269
+ # +:majority_and_persist_to_active+::
1270
+ # The mutation must be replicated to a majority of the Data Service nodes.
1271
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
1272
+ # node hosting the active partition (vBucket) for the data.
1273
+ # +:persist_to_majority+::
1274
+ # The mutation must be persisted to a majority of the Data Service nodes.
1275
+ # Accordingly, it will be written to disk on those nodes.
1276
+ # @param [Symbol] replicate_to number of nodes to replicate
1277
+ # +:none+:: do not apply any replication requirements.
1278
+ # +:one+:: wait for replication to at least one node.
1279
+ # +:two+:: wait for replication to at least two nodes.
1280
+ # +:three+:: wait for replication to at least three nodes.
1281
+ # @param [Symbol] persist_to number of nodes to persist
1282
+ # +:none+:: do not apply any persistence requirements.
1283
+ # +:active+:: wait for persistence to active node
1284
+ # +:one+:: wait for persistence to at least one node.
1285
+ # +:two+:: wait for persistence to at least two nodes.
1286
+ # +:three+:: wait for persistence to at least three nodes.
1287
+ # +:four+:: wait for persistence to four nodes (active and replicas).
1288
+ #
1289
+ # @param [Integer, #in_milliseconds, nil] timeout
1290
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
1291
+ # @param [Hash, nil] client_context the client context data, if set
1292
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
1293
+ #
1294
+ # @yieldparam [Prepend] self
1295
+ def initialize(cas: nil,
1296
+ durability_level: :none,
1297
+ replicate_to: :none,
1298
+ persist_to: :none,
1299
+ timeout: nil,
1300
+ retry_strategy: nil,
1301
+ client_context: nil,
1302
+ parent_span: nil)
1303
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
1304
+ @cas = cas
1305
+
1306
+ if durability_level != :none && (replicate_to != :none || persist_to != :none)
1307
+ raise ArgumentError, "durability_level conflicts with replicate_to and persist_to options"
1308
+ end
1309
+
1310
+ @durability_level = durability_level
1311
+ @replicate_to = replicate_to
1312
+ @persist_to = persist_to
1313
+ yield self if block_given?
1314
+ end
1315
+
1316
+ # @api private
1317
+ def to_backend
1318
+ {
1319
+ timeout: Utils::Time.extract_duration(@timeout),
1320
+ cas: @cas,
1321
+ durability_level: @durability_level,
1322
+ persist_to: @persist_to,
1323
+ replicate_to: @replicate_to,
1324
+ }
1325
+ end
1326
+
1327
+ # @api private
1328
+ DEFAULT = Prepend.new.freeze
1329
+ end
1330
+
1331
+ # Options for {BinaryCollection#increment}
1332
+ class Increment < Base
1333
+ attr_reader :delta # @return [Integer]
1334
+ attr_accessor :initial # @return [Integer]
1335
+ attr_accessor :expiry # @return [Integer, #in_seconds]
1336
+ attr_accessor :durability_level # @return [Symbol]
1337
+
1338
+ # Creates an instance of options for {BinaryCollection#increment}
1339
+ #
1340
+ # @param [Integer] delta the delta for the operation
1341
+ # @param [Integer] initial if present, holds the initial value
1342
+ # @param [Integer, #in_seconds, Time, nil] expiry if set, holds the expiration for the operation
1343
+ # @param [Symbol] durability_level level of durability
1344
+ # +:none+::
1345
+ # no enhanced durability required for the mutation
1346
+ # +:majority+::
1347
+ # the mutation must be replicated to a majority of the Data Service nodes
1348
+ # (that is, held in the memory allocated to the bucket)
1349
+ # +:majority_and_persist_to_active+::
1350
+ # The mutation must be replicated to a majority of the Data Service nodes.
1351
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
1352
+ # node hosting the active partition (vBucket) for the data.
1353
+ # +:persist_to_majority+::
1354
+ # The mutation must be persisted to a majority of the Data Service nodes.
1355
+ # Accordingly, it will be written to disk on those nodes.
1356
+ # @param [Symbol] replicate_to number of nodes to replicate
1357
+ # +:none+:: do not apply any replication requirements.
1358
+ # +:one+:: wait for replication to at least one node.
1359
+ # +:two+:: wait for replication to at least two nodes.
1360
+ # +:three+:: wait for replication to at least three nodes.
1361
+ # @param [Symbol] persist_to number of nodes to persist
1362
+ # +:none+:: do not apply any persistence requirements.
1363
+ # +:active+:: wait for persistence to active node
1364
+ # +:one+:: wait for persistence to at least one node.
1365
+ # +:two+:: wait for persistence to at least two nodes.
1366
+ # +:three+:: wait for persistence to at least three nodes.
1367
+ # +:four+:: wait for persistence to four nodes (active and replicas).
1368
+ #
1369
+ # @param [Integer, #in_milliseconds, nil] timeout
1370
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
1371
+ # @param [Hash, nil] client_context the client context data, if set
1372
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
1373
+ #
1374
+ # @yieldparam [Increment] self
1375
+ def initialize(delta: 1,
1376
+ initial: nil,
1377
+ expiry: nil,
1378
+ durability_level: :none,
1379
+ replicate_to: :none,
1380
+ persist_to: :none,
1381
+ timeout: nil,
1382
+ retry_strategy: nil,
1383
+ client_context: nil,
1384
+ parent_span: nil)
1385
+ raise ArgumentError, "the delta cannot be less than 0" if delta.negative?
1386
+
1387
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
1388
+ @delta = delta
1389
+ @initial = initial
1390
+ @expiry = expiry
1391
+ if durability_level != :none && (replicate_to != :none || persist_to != :none)
1392
+ raise ArgumentError, "durability_level conflicts with replicate_to and persist_to options"
1393
+ end
1394
+
1395
+ @persist_to = persist_to
1396
+ @replicate_to = replicate_to
1397
+ @durability_level = durability_level
1398
+ yield self if block_given?
1399
+ end
1400
+
1401
+ # @param [Integer] value delta for the operation
1402
+ def delta=(value)
1403
+ raise ArgumentError, "the delta cannot be less than 0" if delta.negative?
1404
+
1405
+ @delta = value
1406
+ end
1407
+
1408
+ # @api private
1409
+ def to_backend
1410
+ {
1411
+ timeout: Utils::Time.extract_duration(@timeout),
1412
+ delta: @delta,
1413
+ initial_value: @initial,
1414
+ expiry: Utils::Time.extract_expiry_time(@expiry),
1415
+ durability_level: @durability_level,
1416
+ persist_to: @persist_to,
1417
+ replicate_to: @replicate_to,
1418
+ }
1419
+ end
1420
+
1421
+ # @api private
1422
+ DEFAULT = Increment.new.freeze
1423
+ end
1424
+
1425
+ # Options for {BinaryCollection#decrement}
1426
+ class Decrement < Base
1427
+ attr_reader :delta # @return [Integer]
1428
+ attr_accessor :initial # @return [Integer]
1429
+ attr_accessor :expiry # @return [Integer, #in_seconds]
1430
+ attr_accessor :durability_level # @return [Symbol]
1431
+
1432
+ # Creates an instance of options for {BinaryCollection#decrement}
1433
+ #
1434
+ # @param [Integer] delta the delta for the operation
1435
+ # @param [Integer] initial if present, holds the initial value
1436
+ # @param [Integer, #in_seconds, Time, nil] expiry if set, holds the expiration for the operation
1437
+ # @param [Symbol] durability_level level of durability
1438
+ # +:none+::
1439
+ # no enhanced durability required for the mutation
1440
+ # +:majority+::
1441
+ # the mutation must be replicated to a majority of the Data Service nodes
1442
+ # (that is, held in the memory allocated to the bucket)
1443
+ # +:majority_and_persist_to_active+::
1444
+ # The mutation must be replicated to a majority of the Data Service nodes.
1445
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
1446
+ # node hosting the active partition (vBucket) for the data.
1447
+ # +:persist_to_majority+::
1448
+ # The mutation must be persisted to a majority of the Data Service nodes.
1449
+ # Accordingly, it will be written to disk on those nodes.
1450
+ # @param [Symbol] replicate_to number of nodes to replicate
1451
+ # +:none+:: do not apply any replication requirements.
1452
+ # +:one+:: wait for replication to at least one node.
1453
+ # +:two+:: wait for replication to at least two nodes.
1454
+ # +:three+:: wait for replication to at least three nodes.
1455
+ # @param [Symbol] persist_to number of nodes to persist
1456
+ # +:none+:: do not apply any persistence requirements.
1457
+ # +:active+:: wait for persistence to active node
1458
+ # +:one+:: wait for persistence to at least one node.
1459
+ # +:two+:: wait for persistence to at least two nodes.
1460
+ # +:three+:: wait for persistence to at least three nodes.
1461
+ # +:four+:: wait for persistence to four nodes (active and replicas).
1462
+ #
1463
+ # @param [Integer, #in_milliseconds, nil] timeout
1464
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
1465
+ # @param [Hash, nil] client_context the client context data, if set
1466
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
1467
+ #
1468
+ # @yieldparam [Decrement] self
1469
+ def initialize(delta: 1,
1470
+ initial: nil,
1471
+ expiry: nil,
1472
+ durability_level: :none,
1473
+ replicate_to: :none,
1474
+ persist_to: :none,
1475
+ timeout: nil,
1476
+ retry_strategy: nil,
1477
+ client_context: nil,
1478
+ parent_span: nil)
1479
+ raise ArgumentError, "the delta cannot be less than 0" if delta.negative?
1480
+
1481
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
1482
+ @delta = delta
1483
+ @initial = initial
1484
+ @expiry = expiry
1485
+ if durability_level != :none && (replicate_to != :none || persist_to != :none)
1486
+ raise ArgumentError, "durability_level conflicts with replicate_to and persist_to options"
1487
+ end
1488
+
1489
+ @persist_to = persist_to
1490
+ @replicate_to = replicate_to
1491
+ @durability_level = durability_level
1492
+ yield self if block_given?
1493
+ end
1494
+
1495
+ # @param [Integer] value delta for the operation
1496
+ def delta=(value)
1497
+ raise ArgumentError, "the delta cannot be less than 0" if delta.negative?
1498
+
1499
+ @delta = value
1500
+ end
1501
+
1502
+ # @api private
1503
+ def to_backend
1504
+ {
1505
+ timeout: Utils::Time.extract_duration(@timeout),
1506
+ delta: @delta,
1507
+ initial_value: @initial,
1508
+ expiry: Utils::Time.extract_expiry_time(@expiry),
1509
+ durability_level: @durability_level,
1510
+ persist_to: @persist_to,
1511
+ replicate_to: @replicate_to,
1512
+ }
1513
+ end
1514
+
1515
+ # @api private
1516
+ DEFAULT = Decrement.new.freeze
1517
+ end
1518
+
1519
+ # Options for {Datastructures::CouchbaseList#initialize}
1520
+ class CouchbaseList
1521
+ attr_accessor :get_options # @return [Get]
1522
+ attr_accessor :remove_options # @return [Remove]
1523
+ attr_accessor :lookup_in_options # @return [LookupIn]
1524
+ attr_accessor :mutate_in_options # @return [MutateIn]
1525
+
1526
+ # Creates an instance of options for {CouchbaseList#initialize}
1527
+ #
1528
+ # @param [Get] get_options
1529
+ # @param [Remove] remove_options
1530
+ # @param [LookupIn] lookup_in_options
1531
+ # @param [MutateIn] mutate_in_options
1532
+ #
1533
+ # @yieldparam [CouchbaseList]
1534
+ def initialize(get_options: Get.new,
1535
+ remove_options: Remove.new,
1536
+ lookup_in_options: LookupIn.new,
1537
+ mutate_in_options: MutateIn.new(store_semantics: :upsert))
1538
+ @get_options = get_options
1539
+ @remove_options = remove_options
1540
+ @lookup_in_options = lookup_in_options
1541
+ @mutate_in_options = mutate_in_options
1542
+ yield self if block_given?
1543
+ end
1544
+ end
1545
+
1546
+ # Options for {Datastructures::CouchbaseMap#initialize}
1547
+ class CouchbaseMap
1548
+ attr_accessor :get_options # @return [Get]
1549
+ attr_accessor :remove_options # @return [Remove]
1550
+ attr_accessor :lookup_in_options # @return [LookupIn]
1551
+ attr_accessor :mutate_in_options # @return [MutateIn]
1552
+
1553
+ # Creates an instance of options for {CouchbaseMap#initialize}
1554
+ #
1555
+ # @param [Get] get_options
1556
+ # @param [Remove] remove_options
1557
+ # @param [LookupIn] lookup_in_options
1558
+ # @param [MutateIn] mutate_in_options
1559
+ #
1560
+ # @yieldparam [CouchbaseMap]
1561
+ def initialize(get_options: Get.new,
1562
+ remove_options: Remove.new,
1563
+ lookup_in_options: LookupIn.new,
1564
+ mutate_in_options: MutateIn.new(store_semantics: :upsert))
1565
+ @get_options = get_options
1566
+ @remove_options = remove_options
1567
+ @lookup_in_options = lookup_in_options
1568
+ @mutate_in_options = mutate_in_options
1569
+ yield self if block_given?
1570
+ end
1571
+ end
1572
+
1573
+ # Options for {Datastructures::CouchbaseQueue#initialize}
1574
+ class CouchbaseQueue
1575
+ attr_accessor :get_options # @return [Get]
1576
+ attr_accessor :remove_options # @return [Remove]
1577
+ attr_accessor :lookup_in_options # @return [LookupIn]
1578
+ attr_accessor :mutate_in_options # @return [MutateIn]
1579
+
1580
+ # Creates an instance of options for {CouchbaseQueue#initialize}
1581
+ #
1582
+ # @param [Get] get_options
1583
+ # @param [Remove] remove_options
1584
+ # @param [LookupIn] lookup_in_options
1585
+ # @param [MutateIn] mutate_in_options
1586
+ #
1587
+ # @yieldparam [CouchbaseQueue]
1588
+ def initialize(get_options: Get.new,
1589
+ remove_options: Remove.new,
1590
+ lookup_in_options: LookupIn.new,
1591
+ mutate_in_options: MutateIn.new(store_semantics: :upsert))
1592
+ @get_options = get_options
1593
+ @remove_options = remove_options
1594
+ @lookup_in_options = lookup_in_options
1595
+ @mutate_in_options = mutate_in_options
1596
+ yield self if block_given?
1597
+ end
1598
+ end
1599
+
1600
+ # Options for {Datastructures::CouchbaseSet#initialize}
1601
+ class CouchbaseSet
1602
+ attr_accessor :get_options # @return [Get]
1603
+ attr_accessor :remove_options # @return [Remove]
1604
+ attr_accessor :lookup_in_options # @return [LookupIn]
1605
+ attr_accessor :mutate_in_options # @return [MutateIn]
1606
+
1607
+ # Creates an instance of options for {CouchbaseSet#initialize}
1608
+ #
1609
+ # @param [Get] get_options
1610
+ # @param [Remove] remove_options
1611
+ # @param [LookupIn] lookup_in_options
1612
+ # @param [MutateIn] mutate_in_options
1613
+ #
1614
+ # @yieldparam [CouchbaseSet]
1615
+ def initialize(get_options: Get.new,
1616
+ remove_options: Remove.new,
1617
+ lookup_in_options: LookupIn.new,
1618
+ mutate_in_options: MutateIn.new(store_semantics: :upsert))
1619
+ @get_options = get_options
1620
+ @remove_options = remove_options
1621
+ @lookup_in_options = lookup_in_options
1622
+ @mutate_in_options = mutate_in_options
1623
+ yield self if block_given?
1624
+ end
1625
+ end
1626
+
1627
+ # Options for {Couchbase::Cluster.connect}
1628
+ #
1629
+ # @example Pass authenticator object to Options
1630
+ # Cluster.connect("couchbase://localhost",
1631
+ # Options::Cluster(authenticator: PasswordAuthenticator.new("Administrator", "password")))
1632
+ #
1633
+ # @example Shorter version, more useful for interactive sessions
1634
+ # Cluster.connect("couchbase://localhost", "Administrator", "password")
1635
+ #
1636
+ # @example Authentication with TLS client certificate (note +couchbases://+ schema)
1637
+ # Cluster.connect("couchbases://localhost?trust_certificate=/tmp/ca.pem",
1638
+ # Options::Cluster(authenticator: CertificateAuthenticator.new("/tmp/certificate.pem", "/tmp/private.key")))
1639
+ #
1640
+ # @see https://docs.couchbase.com/server/current/manage/manage-security/configure-client-certificates.html
1641
+ #
1642
+ # @see .Cluster
1643
+ #
1644
+ class Cluster
1645
+ attr_accessor :authenticator # @return [PasswordAuthenticator, CertificateAuthenticator]
1646
+
1647
+ attr_accessor :enable_metrics # @return [Boolean]
1648
+ attr_accessor :metrics_emit_interval # @return [nil, Integer, #in_milliseconds]
1649
+ attr_accessor :enable_tracing # @return [Boolean]
1650
+ attr_accessor :orphaned_emit_interval # @return [nil, Integer, #in_milliseconds]
1651
+ attr_accessor :orphaned_sample_size # @return [nil, Integer]
1652
+ attr_accessor :threshold_emit_interval # @return [nil, Integer, #in_milliseconds]
1653
+ attr_accessor :threshold_sample_size # @return [nil, Integer]
1654
+ attr_accessor :key_value_threshold # @return [nil, Integer, #in_milliseconds]
1655
+ attr_accessor :query_threshold # @return [nil, Integer, #in_milliseconds]
1656
+ attr_accessor :view_threshold # @return [nil, Integer, #in_milliseconds]
1657
+ attr_accessor :search_threshold # @return [nil, Integer, #in_milliseconds]
1658
+ attr_accessor :analytics_threshold # @return [nil, Integer, #in_milliseconds]
1659
+ attr_accessor :management_threshold # @return [nil, Integer, #in_milliseconds]
1660
+
1661
+ attr_accessor :bootstrap_timeout # @return [nil, Integer, #in_milliseconds]
1662
+ attr_accessor :resolve_timeout # @return [nil, Integer, #in_milliseconds]
1663
+ attr_accessor :connect_timeout # @return [nil, Integer, #in_milliseconds]
1664
+ attr_accessor :key_value_timeout # @return [nil, Integer, #in_milliseconds]
1665
+ attr_accessor :view_timeout # @return [nil, Integer, #in_milliseconds]
1666
+ attr_accessor :query_timeout # @return [nil, Integer, #in_milliseconds]
1667
+ attr_accessor :analytics_timeout # @return [nil, Integer, #in_milliseconds]
1668
+ attr_accessor :search_timeout # @return [nil, Integer, #in_milliseconds]
1669
+ attr_accessor :management_timeout # @return [nil, Integer, #in_milliseconds]
1670
+ attr_accessor :dns_srv_timeout # @return [nil, Integer, #in_milliseconds]
1671
+ attr_accessor :tcp_keep_alive_interval # @return [nil, Integer, #in_milliseconds]
1672
+ attr_accessor :config_poll_interval # @return [nil, Integer, #in_milliseconds]
1673
+ attr_accessor :config_poll_floor # @return [nil, Integer, #in_milliseconds]
1674
+ attr_accessor :config_idle_redial_timeout # @return [nil, Integer, #in_milliseconds]
1675
+ attr_accessor :idle_http_connection_timeout # @return [nil, Integer, #in_milliseconds]
1676
+
1677
+ # Creates an instance of options for {Couchbase::Cluster.connect}
1678
+ #
1679
+ # @param [PasswordAuthenticator, CertificateAuthenticator] authenticator
1680
+ # @param [nil, Integer, #in_milliseconds] key_value_timeout default timeout for Key/Value operations, e.g. {Collection#get}
1681
+ # @param [nil, Integer, #in_milliseconds] view_timeout default timeout for View query
1682
+ # @param [nil, Integer, #in_milliseconds] query_timeout default timeout for N1QL query
1683
+ # @param [nil, Integer, #in_milliseconds] analytics_timeout default timeout for Analytics query
1684
+ # @param [nil, Integer, #in_milliseconds] search_timeout default timeout for Search query
1685
+ # @param [nil, Integer, #in_milliseconds] management_timeout default timeout for management operations
1686
+ #
1687
+ # @see .Cluster
1688
+ #
1689
+ # @yieldparam [Cluster] self
1690
+ def initialize(authenticator: nil,
1691
+ enable_metrics: nil,
1692
+ metrics_emit_interval: nil,
1693
+ enable_tracing: nil,
1694
+ orphaned_emit_interval: nil,
1695
+ orphaned_sample_size: nil,
1696
+ threshold_emit_interval: nil,
1697
+ threshold_sample_size: nil,
1698
+ key_value_threshold: nil,
1699
+ query_threshold: nil,
1700
+ view_threshold: nil,
1701
+ search_threshold: nil,
1702
+ analytics_threshold: nil,
1703
+ management_threshold: nil,
1704
+ bootstrap_timeout: nil,
1705
+ resolve_timeout: nil,
1706
+ connect_timeout: nil,
1707
+ key_value_timeout: nil,
1708
+ view_timeout: nil,
1709
+ query_timeout: nil,
1710
+ analytics_timeout: nil,
1711
+ search_timeout: nil,
1712
+ management_timeout: nil,
1713
+ dns_srv_timeout: nil,
1714
+ tcp_keep_alive_interval: nil,
1715
+ config_poll_interval: nil,
1716
+ config_poll_floor: nil,
1717
+ config_idle_redial_timeout: nil,
1718
+ idle_http_connection_timeout: nil)
1719
+ @authenticator = authenticator
1720
+ @enable_metrics = enable_metrics
1721
+ @metrics_emit_interval = metrics_emit_interval
1722
+ @enable_tracing = enable_tracing
1723
+ @orphaned_emit_interval = orphaned_emit_interval
1724
+ @orphaned_sample_size = orphaned_sample_size
1725
+ @threshold_emit_interval = threshold_emit_interval
1726
+ @threshold_sample_size = threshold_sample_size
1727
+ @key_value_threshold = key_value_threshold
1728
+ @query_threshold = query_threshold
1729
+ @view_threshold = view_threshold
1730
+ @search_threshold = search_threshold
1731
+ @analytics_threshold = analytics_threshold
1732
+ @management_threshold = management_threshold
1733
+ @bootstrap_timeout = bootstrap_timeout
1734
+ @resolve_timeout = resolve_timeout
1735
+ @connect_timeout = connect_timeout
1736
+ @key_value_timeout = key_value_timeout
1737
+ @view_timeout = view_timeout
1738
+ @query_timeout = query_timeout
1739
+ @analytics_timeout = analytics_timeout
1740
+ @search_timeout = search_timeout
1741
+ @management_timeout = management_timeout
1742
+ @dns_srv_timeout = dns_srv_timeout
1743
+ @tcp_keep_alive_interval = tcp_keep_alive_interval
1744
+ @config_poll_interval = config_poll_interval
1745
+ @config_poll_floor = config_poll_floor
1746
+ @config_idle_redial_timeout = config_idle_redial_timeout
1747
+ @idle_http_connection_timeout = idle_http_connection_timeout
1748
+ yield self if block_given?
1749
+ end
1750
+
1751
+ # @param [String] username
1752
+ # @param [String] password
1753
+ def authenticate(username, password)
1754
+ @authenticator = PasswordAuthenticator.new(username, password)
1755
+ end
1756
+
1757
+ # @param [String] profile_name The name of the configuration profile to apply (e.g. "wan_development")
1758
+ def apply_profile(profile_name)
1759
+ ConfigProfiles::KNOWN_PROFILES.apply(profile_name, self)
1760
+ end
1761
+
1762
+ # @api private
1763
+ def to_backend
1764
+ {
1765
+ enable_metrics: @enable_metrics,
1766
+ metrics_emit_interval: Utils::Time.extract_duration(@metrics_emit_interval),
1767
+ enable_tracing: @enable_tracing,
1768
+ orphaned_emit_interval: Utils::Time.extract_duration(@orphaned_emit_interval),
1769
+ orphaned_sample_size: @orphaned_sample_size,
1770
+ threshold_emit_interval: Utils::Time.extract_duration(@threshold_emit_interval),
1771
+ threshold_sample_size: @threshold_sample_size,
1772
+ key_value_threshold: Utils::Time.extract_duration(@key_value_threshold),
1773
+ query_threshold: Utils::Time.extract_duration(@query_threshold),
1774
+ view_threshold: Utils::Time.extract_duration(@view_threshold),
1775
+ search_threshold: Utils::Time.extract_duration(@search_threshold),
1776
+ analytics_threshold: Utils::Time.extract_duration(@analytics_threshold),
1777
+ management_threshold: Utils::Time.extract_duration(@management_threshold),
1778
+ bootstrap_timeout: Utils::Time.extract_duration(@bootstrap_timeout),
1779
+ resolve_timeout: Utils::Time.extract_duration(@resolve_timeout),
1780
+ connect_timeout: Utils::Time.extract_duration(@connect_timeout),
1781
+ key_value_timeout: Utils::Time.extract_duration(@key_value_timeout),
1782
+ view_timeout: Utils::Time.extract_duration(@view_timeout),
1783
+ query_timeout: Utils::Time.extract_duration(@query_timeout),
1784
+ analytics_timeout: Utils::Time.extract_duration(@analytics_timeout),
1785
+ search_timeout: Utils::Time.extract_duration(@search_timeout),
1786
+ management_timeout: Utils::Time.extract_duration(@management_timeout),
1787
+ dns_srv_timeout: Utils::Time.extract_duration(@dns_srv_timeout),
1788
+ tcp_keep_alive_interval: Utils::Time.extract_duration(@tcp_keep_alive_interval),
1789
+ config_poll_interval: Utils::Time.extract_duration(@config_poll_interval),
1790
+ config_poll_floor: Utils::Time.extract_duration(@config_poll_floor),
1791
+ config_idle_redial_timeout: Utils::Time.extract_duration(@config_idle_redial_timeout),
1792
+ idle_http_connection_timeout: Utils::Time.extract_duration(@idle_http_connection_timeout),
1793
+ }
1794
+ end
1795
+ end
1796
+
1797
+ # Options for {Couchbase::Cluster#diagnostics}
1798
+ class Diagnostics
1799
+ attr_accessor :report_id # @return [String]
1800
+
1801
+ # Creates an instance of options for {Couchbase::Cluster#diagnostics}
1802
+ #
1803
+ # @param [String] report_id Holds custom report ID.
1804
+ #
1805
+ # @yieldparam [Diagnostics] self
1806
+ def initialize(report_id: nil)
1807
+ @report_id = report_id
1808
+ yield self if block_given?
1809
+ end
1810
+
1811
+ # @api private
1812
+ DEFAULT = Diagnostics.new.freeze
1813
+ end
1814
+
1815
+ # Options for {Couchbase::Bucket#ping}
1816
+ class Ping
1817
+ attr_accessor :report_id # @return [String]
1818
+ attr_accessor :service_types # @return [Array<Symbol>]
1819
+ attr_accessor :timeout # @return [Integer, #in_milliseconds]
1820
+
1821
+ # Creates an instance of options for {Couchbase::Bucket#ping}
1822
+ #
1823
+ # @param [String] report_id Holds custom report id.
1824
+ # @@param [Array<Symbol>] service_types The service types to limit this diagnostics request
1825
+ # @param [Integer, #in_milliseconds] timeout
1826
+ #
1827
+ # @yieldparam [Ping] self
1828
+ def initialize(report_id: nil,
1829
+ service_types: [:kv, :query, :analytics, :search, :views, :management],
1830
+ timeout: nil)
1831
+ @report_id = report_id
1832
+ @service_types = service_types
1833
+ @timeout = timeout
1834
+ yield self if block_given?
1835
+ end
1836
+
1837
+ # @api private
1838
+ def to_backend
1839
+ {
1840
+ timeout: Utils::Time.extract_duration(@timeout),
1841
+ service_types: @service_types,
1842
+ report_id: @report_id,
1843
+ }
1844
+ end
1845
+
1846
+ # @api private
1847
+ DEFAULT = Ping.new.freeze
1848
+ end
1849
+
1850
+ # Options for {Couchbase::Cluster#analytics_query}
1851
+ class Analytics < Base
1852
+ attr_accessor :client_context_id # @return [String]
1853
+ attr_accessor :scan_consistency # @return [Symbol]
1854
+ attr_accessor :readonly # @return [Boolean]
1855
+ attr_accessor :priority # @return [Boolean]
1856
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
1857
+ attr_accessor :scope_qualifier # @return [String]
1858
+
1859
+ # Creates new instance of options for {Couchbase::Cluster#analytics_query}
1860
+ #
1861
+ # @param [String] client_context_id provides a custom client context ID for this query
1862
+ # @param [Symbol] scan_consistency specifies level of consistency for the query
1863
+ # +:not_bounded+::
1864
+ # The index will return whatever state it has to the analytics query engine at the time of query.
1865
+ #
1866
+ # This is the default (for single-statement requests). No timestamp vector is used in the index scan.
1867
+ # This is also the fastest mode, because we avoid the cost of obtaining the vector, and we also avoid
1868
+ # any wait for the index
1869
+ # +:request_plus+::
1870
+ # The index will wait until all mutations have been processed at the time of request before being processed
1871
+ # in the analytics query engine.
1872
+ #
1873
+ # This implements strong consistency per request. Before processing the request, a current vector is obtained.
1874
+ # The vector is used as a lower bound for the statements in the request.
1875
+ # @param [Boolean] readonly allows explicitly marking a query as being readonly and not mutating any documents on
1876
+ # the server side.
1877
+ # @param [Boolean] priority allows to give certain requests higher priority than others
1878
+ # @param [JsonTranscoder] transcoder to decode rows
1879
+ # @param [Array<#to_json>, nil] positional_parameters parameters to be used as substitution for numbered macros
1880
+ # like +$1+, +$2+ in query string
1881
+ # @param [Hash<String => #to_json>, nil] named_parameters parameters to be used as substitution for named macros
1882
+ # like +$name+ in query string
1883
+ # @param [String, nil] scope_qualifier Associate scope qualifier (also known as +query_context+) with the query.
1884
+ # The qualifier must be in form +{bucket_name}.{scope_name}+ or +default:{bucket_name}.{scope_name}+.
1885
+ #
1886
+ # @param [Integer, #in_milliseconds, nil] timeout
1887
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
1888
+ # @param [Hash, nil] client_context the client context data, if set
1889
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
1890
+ #
1891
+ # @note Either +positional_parameters+ or +named_parameters+ may be specified.
1892
+ #
1893
+ # @yieldparam [Analytics] self
1894
+ def initialize(client_context_id: nil,
1895
+ scan_consistency: nil,
1896
+ readonly: false,
1897
+ priority: nil,
1898
+ transcoder: JsonTranscoder.new,
1899
+ positional_parameters: nil,
1900
+ named_parameters: nil,
1901
+ scope_qualifier: nil,
1902
+ timeout: nil,
1903
+ retry_strategy: nil,
1904
+ client_context: nil,
1905
+ parent_span: nil)
1906
+ raise ArgumentError, "Cannot pass positional and named parameters at the same time" if positional_parameters && named_parameters
1907
+
1908
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
1909
+ @client_context_id = client_context_id
1910
+ @scan_consistency = scan_consistency
1911
+ @readonly = readonly
1912
+ @priority = priority
1913
+ @transcoder = transcoder
1914
+ @positional_parameters = positional_parameters
1915
+ @named_parameters = named_parameters
1916
+ @scope_qualifier = scope_qualifier
1917
+ @raw_parameters = {}
1918
+ yield self if block_given?
1919
+ end
1920
+
1921
+ # Sets positional parameters for the query
1922
+ #
1923
+ # @param [Array] positional the list of parameters that have to be substituted in the statement
1924
+ def positional_parameters(positional)
1925
+ @positional_parameters = positional
1926
+ @named_parameters = nil
1927
+ end
1928
+
1929
+ # Sets named parameters for the query
1930
+ #
1931
+ # @param [Hash] named the key/value map of the parameters to substitute in the statement
1932
+ def named_parameters(named)
1933
+ @named_parameters = named
1934
+ @positional_parameters = nil
1935
+ end
1936
+
1937
+ # Allows providing custom JSON key/value pairs for advanced usage
1938
+ #
1939
+ # @param [String] key the parameter name (key of the JSON property)
1940
+ # @param [Object] value the parameter value (value of the JSON property)
1941
+ def raw(key, value)
1942
+ @raw_parameters[key] = JSON.generate(value)
1943
+ end
1944
+
1945
+ # @api private
1946
+ def to_backend(scope_name: nil, bucket_name: nil)
1947
+ {
1948
+ timeout: Utils::Time.extract_duration(@timeout),
1949
+ client_context_id: @client_context_id,
1950
+ scan_consistency: @scan_consistency,
1951
+ readonly: @readonly,
1952
+ priority: @priority,
1953
+ positional_parameters: export_positional_parameters,
1954
+ named_parameters: export_named_parameters,
1955
+ raw_parameters: @raw_parameters,
1956
+ scope_qualifier: @scope_qualifier,
1957
+ scope_name: scope_name,
1958
+ bucket_name: bucket_name,
1959
+ }
1960
+ end
1961
+
1962
+ # @api private
1963
+ DEFAULT = Analytics.new.freeze
1964
+
1965
+ private
1966
+
1967
+ # @api private
1968
+ # @return [Array<String>, nil]
1969
+ def export_positional_parameters
1970
+ @positional_parameters&.map { |p| JSON.dump(p) }
1971
+ end
1972
+
1973
+ # @api private
1974
+ # @return [Hash<String => String>, nil]
1975
+ def export_named_parameters
1976
+ @named_parameters&.each_with_object({}) { |(n, v), o| o[n.to_s] = JSON.dump(v) }
1977
+ end
1978
+
1979
+ # @api private
1980
+ # @return [Hash<String => #to_json>]
1981
+ attr_reader :raw_parameters
1982
+ end
1983
+
1984
+ # Options for {Couchbase::Cluster#query}
1985
+ class Query < Base
1986
+ attr_accessor :adhoc # @return [Boolean]
1987
+ attr_accessor :client_context_id # @return [String]
1988
+ attr_accessor :max_parallelism # @return [Integer]
1989
+ attr_accessor :readonly # @return [Boolean]
1990
+ attr_accessor :scan_wait # @return [Integer, #in_milliseconds]
1991
+ attr_accessor :scan_cap # @return [Integer]
1992
+ attr_accessor :pipeline_batch # @return [Integer]
1993
+ attr_accessor :pipeline_cap # @return [Integer]
1994
+ attr_accessor :metrics # @return [Boolean]
1995
+ attr_accessor :profile # @return [Symbol]
1996
+ attr_accessor :flex_index # @return [Boolean]
1997
+ attr_accessor :preserve_expiry # @return [Boolean]
1998
+ attr_accessor :use_replica # @return [Boolean, nil]
1999
+ attr_accessor :scope_qualifier # @return [String]
2000
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
2001
+
2002
+ # Creates new instance of options for {Couchbase::Cluster#query}
2003
+ #
2004
+ # @param [Boolean] adhoc allows turning this request into a prepared statement query
2005
+ # @param [String, nil] client_context_id provides a custom client context ID for this query
2006
+ # @param [Integer, nil] max_parallelism allows overriding the default maximum parallelism for the query execution
2007
+ # on the server side.
2008
+ # @param [Boolean, nil] readonly allows explicitly marking a query as being readonly and not mutating any
2009
+ # documents on the server side.
2010
+ # @param [Integer, #in_milliseconds, nil] scan_wait The maximum duration (in milliseconds) the query engine
2011
+ # is willing to wait before failing. Allows customizing how long (in milliseconds) the query engine is willing
2012
+ # to wait until the index catches up to whatever scan consistency is asked for in this query. Note that if
2013
+ # +:not_bounded+ consistency level is used, this method doesn't do anything at all. If no value is provided to
2014
+ # this method, the server default is used.
2015
+ # @param [Integer, nil] scan_cap customize the maximum buffered channel size between the indexer and the query
2016
+ # service
2017
+ # @param [Integer, nil] pipeline_cap customize the number of items execution operators can batch for fetch
2018
+ # from the Key Value layer on the server.
2019
+ # @param [Integer, nil] pipeline_batch customize the maximum number of items each execution operator can buffer
2020
+ # between various operators on the server.
2021
+ # @param [Boolean, nil] metrics enables per-request metrics in the trailing section of the query
2022
+ # @param [Symbol] profile customize server profile level for this query
2023
+ # +:off+::
2024
+ # No profiling information is added to the query response
2025
+ # +:phases+::
2026
+ # The query response includes a profile section with stats and details about various phases of the query plan
2027
+ # and execution. Three phase times will be included in the +system:active_requests+ and
2028
+ # +system:completed_requests+ monitoring keyspaces.
2029
+ # +:timings+::
2030
+ # Besides the phase times, the profile section of the query response document will include a full query plan
2031
+ # with timing and information about the number of processed documents at each phase. This information will be
2032
+ # included in the system:active_requests and system:completed_requests keyspaces.
2033
+ # @param [Symbol, nil] scan_consistency Sets the mutation tokens this query should be consistent with. Overrides
2034
+ # +mutation_state+.
2035
+ # +:not_bounded+::
2036
+ # The indexer will return whatever state it has to the query engine at the time of query. This is the default
2037
+ # (for single-statement requests).
2038
+ # +:request_plus+::
2039
+ # The indexer will wait until all mutations have been processed at the time of request before returning to
2040
+ # the query engine.
2041
+ # @param [Boolean, nil] flex_index Tells the query engine to use a flex index (utilizing the search service)
2042
+ # @param [Boolean, nil] preserve_expiry Tells the query engine to preserve expiration values set on any documents
2043
+ # modified by this query.
2044
+ # @param [Boolean, nil] use_replica Specifies that the query engine should use replica nodes for KV fetches if
2045
+ # the active node is down. If not provided, the server default will be used
2046
+ # @param [String, nil] scope_qualifier Associate scope qualifier (also known as +query_context+) with the query.
2047
+ # The qualifier must be in form +{bucket_name}.{scope_name}+ or +default:{bucket_name}.{scope_name}+.
2048
+ # @param [JsonTranscoder] transcoder to decode rows
2049
+ # @param [Array<#to_json>, nil] positional_parameters parameters to be used as substitution for numbered macros
2050
+ # like +$1+, +$2+ in query string
2051
+ # @param [Hash<String => #to_json>, nil] named_parameters parameters to be used as substitution for named macros
2052
+ # like +$name+ in query string.
2053
+ #
2054
+ # @param [MutationState, nil] mutation_state Sets the mutation tokens this query should be consistent with.
2055
+ # Overrides +scan_consistency+.
2056
+ #
2057
+ # @param [Integer, #in_milliseconds, nil] timeout
2058
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
2059
+ # @param [Hash, nil] client_context the client context data, if set
2060
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
2061
+ #
2062
+ # @note Either +positional_parameters+ or +named_parameters+ may be specified.
2063
+ #
2064
+ # @yieldparam [Query] self
2065
+ def initialize(adhoc: true,
2066
+ client_context_id: nil,
2067
+ max_parallelism: nil,
2068
+ readonly: false,
2069
+ scan_wait: nil,
2070
+ scan_cap: nil,
2071
+ pipeline_cap: nil,
2072
+ pipeline_batch: nil,
2073
+ metrics: nil,
2074
+ profile: :off,
2075
+ flex_index: nil,
2076
+ preserve_expiry: nil,
2077
+ use_replica: nil,
2078
+ scope_qualifier: nil,
2079
+ scan_consistency: :not_bounded,
2080
+ mutation_state: nil,
2081
+ transcoder: JsonTranscoder.new,
2082
+ positional_parameters: nil,
2083
+ named_parameters: nil,
2084
+ timeout: nil,
2085
+ retry_strategy: nil,
2086
+ client_context: nil,
2087
+ parent_span: nil)
2088
+ raise ArgumentError, "Cannot pass positional and named parameters at the same time" if positional_parameters && named_parameters
2089
+
2090
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
2091
+ @adhoc = adhoc
2092
+ @client_context_id = client_context_id
2093
+ @max_parallelism = max_parallelism
2094
+ @readonly = readonly
2095
+ @scan_wait = scan_wait
2096
+ @scan_cap = scan_cap
2097
+ @pipeline_cap = pipeline_cap
2098
+ @pipeline_batch = pipeline_batch
2099
+ @metrics = metrics
2100
+ @profile = profile
2101
+ @flex_index = flex_index
2102
+ @preserve_expiry = preserve_expiry
2103
+ @use_replica = use_replica
2104
+ @scope_qualifier = scope_qualifier
2105
+ @scan_consistency = scan_consistency
2106
+ @mutation_state = mutation_state
2107
+ @transcoder = transcoder
2108
+ @positional_parameters = positional_parameters
2109
+ @named_parameters = named_parameters
2110
+ @raw_parameters = {}
2111
+ yield self if block_given?
2112
+ end
2113
+
2114
+ # Allows providing custom JSON key/value pairs for advanced usage
2115
+ #
2116
+ # @param [String] key the parameter name (key of the JSON property)
2117
+ # @param [Object] value the parameter value (value of the JSON property)
2118
+ def raw(key, value)
2119
+ @raw_parameters[key] = JSON.generate(value)
2120
+ end
2121
+
2122
+ # Customizes the consistency guarantees for this query
2123
+ #
2124
+ # @note overrides consistency level set by {#consistent_with}
2125
+ #
2126
+ # [+:not_bounded+] The indexer will return whatever state it has to the query engine at the time of query. This is the default (for
2127
+ # single-statement requests).
2128
+ #
2129
+ # [+:request_plus+] The indexer will wait until all mutations have been processed at the time of request before returning to the query
2130
+ # engine.
2131
+ #
2132
+ # @param [:not_bounded, :request_plus] level the index scan consistency to be used for this query
2133
+ def scan_consistency=(level)
2134
+ @mutation_state = nil if @mutation_state
2135
+ @scan_consistency = level
2136
+ end
2137
+
2138
+ # Sets the mutation tokens this query should be consistent with
2139
+ #
2140
+ # @note overrides consistency level set by {#scan_consistency=}
2141
+ #
2142
+ # @param [MutationState] mutation_state the mutation state containing the mutation tokens
2143
+ def consistent_with(mutation_state)
2144
+ @scan_consistency = nil if @scan_consistency
2145
+ @mutation_state = mutation_state
2146
+ end
2147
+
2148
+ # Sets positional parameters for the query
2149
+ #
2150
+ # @param [Array] positional the list of parameters that have to be substituted in the statement
2151
+ def positional_parameters(positional)
2152
+ @positional_parameters = positional
2153
+ @named_parameters = nil
2154
+ end
2155
+
2156
+ # @api private
2157
+ # @return [Array<String>, nil]
2158
+ def export_positional_parameters
2159
+ @positional_parameters&.map { |p| JSON.dump(p) }
2160
+ end
2161
+
2162
+ # Sets named parameters for the query
2163
+ #
2164
+ # @param [Hash] named the key/value map of the parameters to substitute in the statement
2165
+ def named_parameters(named)
2166
+ @named_parameters = named
2167
+ @positional_parameters = nil
2168
+ end
2169
+
2170
+ # @api private
2171
+ # @return [Hash<String => String>, nil]
2172
+ def export_named_parameters
2173
+ @named_parameters&.each_with_object({}) { |(n, v), o| o[n.to_s] = JSON.dump(v) }
2174
+ end
2175
+
2176
+ # @api private
2177
+ # @return [MutationState]
2178
+ attr_reader :mutation_state
2179
+
2180
+ # @api private
2181
+ # @return [Hash<String => #to_json>]
2182
+ attr_reader :raw_parameters
2183
+
2184
+ # @api private
2185
+ def to_backend(scope_name: nil, bucket_name: nil)
2186
+ if scope_name && bucket_name
2187
+ default_query_context = format("default:`%<bucket>s`.`%<scope>s`", bucket: bucket_name, scope: scope_name)
2188
+ end
2189
+ {
2190
+ timeout: Utils::Time.extract_duration(@timeout),
2191
+ adhoc: @adhoc,
2192
+ client_context_id: @client_context_id,
2193
+ max_parallelism: @max_parallelism,
2194
+ readonly: @readonly,
2195
+ flex_index: @flex_index,
2196
+ preserve_expiry: @preserve_expiry,
2197
+ use_replica: @use_replica,
2198
+ scan_wait: Utils::Time.extract_duration(@scan_wait),
2199
+ scan_cap: @scan_cap,
2200
+ pipeline_batch: @pipeline_batch,
2201
+ pipeline_cap: @pipeline_cap,
2202
+ metrics: @metrics,
2203
+ profile: @profile,
2204
+ positional_parameters: export_positional_parameters,
2205
+ named_parameters: export_named_parameters,
2206
+ raw_parameters: @raw_parameters,
2207
+ scan_consistency: @scan_consistency,
2208
+ mutation_state: @mutation_state&.to_a,
2209
+ query_context: @scope_qualifier || default_query_context,
2210
+ }
2211
+ end
2212
+
2213
+ # @api private
2214
+ DEFAULT = Query.new.freeze
2215
+ end
2216
+
2217
+ # Options for {Couchbase::Cluster#search_query} and {Couchbase::Cluster#search}
2218
+ class Search < Base
2219
+ attr_accessor :limit # @return [Integer]
2220
+ attr_accessor :skip # @return [Integer]
2221
+ attr_accessor :explain # @return [Boolean]
2222
+ attr_accessor :highlight_style # @return [Symbol]
2223
+ attr_accessor :highlight_fields # @return [Array<String>]
2224
+ attr_accessor :fields # @return [Array<String>]
2225
+ attr_accessor :disable_scoring # @return [Boolean]
2226
+ attr_accessor :include_locations # @return [Boolean]
2227
+ attr_accessor :collections # @return [Array<String>, nil]
2228
+ attr_accessor :sort # @return [Array<String, Cluster::SearchSort>]
2229
+ attr_accessor :facets # @return [Hash<String => Cluster::SearchFacet>]
2230
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
2231
+
2232
+ # @param [Integer] limit limits the number of matches returned from the complete result set.
2233
+ # @param [Integer] skip indicates how many matches are skipped on the result set before starting to return the
2234
+ # matches
2235
+ # @param [Boolean] explain triggers inclusion of additional search result score explanations.
2236
+ # @param [:html, :ansi, nil] highlight_style the style of highlighting in the result excerpts (if not specified,
2237
+ # the server default will be used)
2238
+ # @param [Array<String>] highlight_fields list of the fields to highlight
2239
+ # @param [Array<String>] fields list of field values which should be retrieved for result documents, provided they
2240
+ # were stored while indexing
2241
+ # @param [MutationState] mutation_state the mutation tokens this query should be consistent with
2242
+ # @param [Boolean] disable_scoring If set to true, the server will not perform any scoring on the hits
2243
+ # @param [Boolean] include_locations UNCOMMITTED: If set to true, will include the vector of search_location in rows
2244
+ # @param [Array<String>, nil] collections list of collections by which to filter the results
2245
+ # @param [Array<String, Cluster::SearchSort>] sort Ordering rules to apply to the results. The list might contain
2246
+ # either strings or special objects, that derive from {Cluster::SearchSort}. In case of String, the value
2247
+ # represents the name of the field with optional +-+ in front of the name, which will turn on descending mode
2248
+ # for this field. One field is special is +"_score"+ which will sort results by their score. When nothing
2249
+ # specified, the Server will order results by their score descending, which is equivalent of +"-_score"+.
2250
+ # @param [Hash<String => Cluster::SearchFacet>] facets facets allow to aggregate information collected on a
2251
+ # particular result set
2252
+ # @param [JsonTranscoder, #decode(String)] transcoder to use for the results
2253
+ #
2254
+ # @param [Integer, #in_milliseconds, nil] timeout
2255
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
2256
+ # @param [Hash, nil] client_context the client context data, if set
2257
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
2258
+ #
2259
+ # @yieldparam [Search] self
2260
+ def initialize(limit: nil,
2261
+ skip: nil,
2262
+ explain: false,
2263
+ highlight_style: nil,
2264
+ highlight_fields: nil,
2265
+ fields: nil,
2266
+ mutation_state: nil,
2267
+ disable_scoring: false,
2268
+ include_locations: false,
2269
+ collections: nil,
2270
+ sort: nil,
2271
+ facets: nil,
2272
+ transcoder: JsonTranscoder.new,
2273
+ timeout: nil,
2274
+ retry_strategy: nil,
2275
+ client_context: nil,
2276
+ parent_span: nil)
2277
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
2278
+ @limit = limit
2279
+ @skip = skip
2280
+ @explain = explain
2281
+ @highlight_style = highlight_style
2282
+ @highlight_fields = highlight_fields
2283
+ @fields = fields
2284
+ @disable_scoring = disable_scoring
2285
+ @include_locations = include_locations
2286
+ @collections = collections
2287
+ @sort = sort
2288
+ @facets = facets
2289
+ @transcoder = transcoder
2290
+ @scan_consistency = :not_bounded
2291
+ @mutation_state = mutation_state
2292
+ yield self if block_given?
2293
+ end
2294
+
2295
+ # Sets the mutation tokens this query should be consistent with
2296
+ #
2297
+ # @note overrides consistency level set by {#scan_consistency=}
2298
+ #
2299
+ # @param [MutationState] mutation_state the mutation state containing the mutation tokens
2300
+ #
2301
+ # @return [void]
2302
+ def consistent_with(mutation_state)
2303
+ @scan_consistency = nil if @scan_consistency
2304
+ @mutation_state = mutation_state
2305
+ end
2306
+
2307
+ # Customizes the consistency guarantees for this query
2308
+ #
2309
+ # @note overrides consistency level set by {#consistent_with}
2310
+ #
2311
+ # @param [:not_bounded] level the scan consistency to be used for this query
2312
+ # +:not_bounded+:: The engine will return whatever state it has at the time of query
2313
+ #
2314
+ # @return [void]
2315
+ def scan_consistency=(level)
2316
+ @mutation_state = nil if @mutation_state
2317
+ @scan_consistency = level
2318
+ end
2319
+
2320
+ # @api private
2321
+ # @return [MutationState]
2322
+ attr_reader :mutation_state
2323
+
2324
+ # @api private
2325
+ # @return [Symbol]
2326
+ attr_reader :scan_consistency
2327
+
2328
+ # @api private
2329
+ def to_backend(show_request: nil)
2330
+ {
2331
+ timeout: Utils::Time.extract_duration(@timeout),
2332
+ limit: @limit,
2333
+ skip: @skip,
2334
+ explain: @explain,
2335
+ disable_scoring: @disable_scoring,
2336
+ include_locations: @include_locations,
2337
+ collections: @collections,
2338
+ highlight_style: @highlight_style,
2339
+ highlight_fields: @highlight_fields,
2340
+ fields: @fields,
2341
+ sort: @sort&.map { |v| JSON.generate(v) },
2342
+ facets: @facets&.map { |(k, v)| [k, JSON.generate(v)] },
2343
+ scan_consistency: @scan_consistency,
2344
+ mutation_state: @mutation_state&.to_a,
2345
+ show_request: show_request,
2346
+ }
2347
+ end
2348
+
2349
+ # @api private
2350
+ DEFAULT = Search.new.freeze
2351
+ end
2352
+
2353
+ class VectorSearch
2354
+ # @return [:and, :or, nil]
2355
+ attr_accessor :vector_query_combination
2356
+
2357
+ # @param [:and, :or, nil] vector_query_combination
2358
+ #
2359
+ # @yieldparam [VectorSearchOptions] self
2360
+ def initialize(vector_query_combination: nil)
2361
+ @vector_query_combination = vector_query_combination
2362
+
2363
+ yield self if block_given?
2364
+ end
2365
+
2366
+ def to_backend
2367
+ {
2368
+ vector_query_combination: @vector_query_combination,
2369
+ }
2370
+ end
2371
+
2372
+ DEFAULT = VectorSearch.new.freeze
2373
+ end
2374
+
2375
+ # Options for {Couchbase::Cluster#view_query}
2376
+ class View < Base
2377
+ attr_accessor :scan_consistency # @return [Symbol]
2378
+ attr_accessor :namespace # @return [Symbol]
2379
+ attr_accessor :skip # @return [Integer]
2380
+ attr_accessor :limit # @return [Integer]
2381
+ attr_accessor :start_key # @return [#to_json, nil]
2382
+ attr_accessor :end_key # @return [#to_json, nil]
2383
+ attr_accessor :start_key_doc_id # @return [String, nil]
2384
+ attr_accessor :end_key_doc_id # @return [String, nil]
2385
+ attr_accessor :inclusive_end # @return [Boolean, nil]
2386
+ attr_accessor :group # @return [Boolean, nil]
2387
+ attr_accessor :group_level # @return [Integer, nil]
2388
+ attr_accessor :key # @return [#to_json, nil]
2389
+ attr_accessor :keys # @return [Array<#to_json>, nil]
2390
+ attr_accessor :order # @return [Symbol, nil]
2391
+ attr_accessor :reduce # @return [Boolean, nil]
2392
+ attr_accessor :on_error # @return [Symbol, nil]
2393
+ attr_accessor :debug # @return [Boolean, nil]
2394
+
2395
+ # @param [:not_bounded, :request_plus, :update_after] scan_consistency Specifies the level of consistency for the query
2396
+ # @param [:production, :development] namespace
2397
+ # @param [Integer, nil] skip Specifies the number of results to skip from the start of the result set
2398
+ # @param [Integer, nil] limit Specifies the maximum number of results to return
2399
+ # @param [#to_json, nil] start_key Specifies the key, to which the engine has to skip before result generation
2400
+ # @param [#to_json, nil] end_key Specifies the key, at which the result generation has to be stopped
2401
+ # @param [String, nil] start_key_doc_id Specifies the document id in case {#start_key} gives multiple results within the index
2402
+ # @param [String, nil] end_key_doc_id Specifies the document id in case {#end_key} gives multiple results within the index
2403
+ # @param [Boolean, nil] inclusive_end Specifies whether the {#end_key}/#{#end_key_doc_id} values should be inclusive
2404
+ # @param [Boolean, nil] group Specifies whether to enable grouping of the results
2405
+ # @param [Integer, nil] group_level Specifies the depth within the key to group the results
2406
+ # @param [#to_json, nil] key Specifies the key to fetch from the index
2407
+ # @param [Array<#to_json>, nil] keys Specifies set of the keys to fetch from the index
2408
+ # @param [:ascending, :descending, nil] order Specifies the order of the results that should be returned
2409
+ # @param [Boolean, nil] reduce Specifies whether to enable the reduction function associated with this particular
2410
+ # view index
2411
+ # @param [:stop, :continue, nil] on_error Specifies the behaviour of the view engine should an error occur during
2412
+ # the gathering of view index results which would result in only partial results being available
2413
+ # @param [Boolean, nil] debug allows to return debug information as part of the view response
2414
+ #
2415
+ # @param [Integer, #in_milliseconds, nil] timeout
2416
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
2417
+ # @param [Hash, nil] client_context the client context data, if set
2418
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
2419
+ #
2420
+ # @yieldparam [View] self
2421
+ def initialize(scan_consistency: :not_bounded,
2422
+ namespace: :production,
2423
+ skip: nil,
2424
+ limit: nil,
2425
+ start_key: nil,
2426
+ end_key: nil,
2427
+ start_key_doc_id: nil,
2428
+ end_key_doc_id: nil,
2429
+ inclusive_end: nil,
2430
+ group: nil,
2431
+ group_level: nil,
2432
+ key: nil,
2433
+ keys: nil,
2434
+ order: nil,
2435
+ reduce: nil,
2436
+ on_error: nil,
2437
+ debug: false,
2438
+ timeout: nil,
2439
+ retry_strategy: nil,
2440
+ client_context: nil,
2441
+ parent_span: nil)
2442
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
2443
+
2444
+ @scan_consistency = scan_consistency
2445
+ @namespace = namespace
2446
+ @skip = skip
2447
+ @limit = limit
2448
+ @start_key = start_key
2449
+ @end_key = end_key
2450
+ @start_key_doc_id = start_key_doc_id
2451
+ @end_key_doc_id = end_key_doc_id
2452
+ @inclusive_end = inclusive_end
2453
+ @group = group
2454
+ @group_level = group_level
2455
+ @key = key
2456
+ @keys = keys
2457
+ @order = order
2458
+ @reduce = reduce
2459
+ @on_error = on_error
2460
+ @debug = debug
2461
+ yield self if block_given?
2462
+ end
2463
+
2464
+ # Allows providing custom JSON key/value pairs for advanced usage
2465
+ #
2466
+ # @param [String] key the parameter name (key of the JSON property)
2467
+ # @param [Object] value the parameter value (value of the JSON property)
2468
+ def raw(key, value)
2469
+ @raw_parameters[key] = JSON.generate(value)
2470
+ end
2471
+
2472
+ # @api private
2473
+ def to_backend
2474
+ {
2475
+ timeout: Utils::Time.extract_duration(@timeout),
2476
+ scan_consistency: @scan_consistency,
2477
+ skip: @skip,
2478
+ limit: @limit,
2479
+ start_key: (JSON.generate(@start_key) unless @start_key.nil?),
2480
+ end_key: (JSON.generate(@end_key) unless @end_key.nil?),
2481
+ start_key_doc_id: @start_key_doc_id,
2482
+ end_key_doc_id: @end_key_doc_id,
2483
+ inclusive_end: @inclusive_end,
2484
+ group: @group,
2485
+ group_level: @group_level,
2486
+ key: (JSON.generate(@key) unless @key.nil?),
2487
+ keys: @keys&.map { |key| JSON.generate(key) },
2488
+ order: @order,
2489
+ reduce: @reduce,
2490
+ on_error: @on_error,
2491
+ debug: @debug,
2492
+ }
2493
+ end
2494
+
2495
+ # @api private
2496
+ DEFAULT = View.new.freeze
2497
+ end
2498
+
2499
+ # @api private
2500
+ # TODO: deprecate in 3.1
2501
+ CommonOptions = ::Couchbase::Options::Base
2502
+
2503
+ # rubocop:disable Naming/MethodName constructor shortcuts
2504
+ module_function
2505
+
2506
+ # Construct {Get} options for {Collection#get}
2507
+ #
2508
+ # @example Get partial document using projections
2509
+ # res = collection.get("customer123", Options::Get(projections: ["name", "addresses.billing"]))
2510
+ # res.content
2511
+ #
2512
+ # # {"addresses"=>
2513
+ # # {"billing"=>
2514
+ # # {"country"=>"United Kingdom",
2515
+ # # "line1"=>"123 Any Street",
2516
+ # # "line2"=>"Anytown"}},
2517
+ # # "name"=>"Douglas Reynholm"}
2518
+ #
2519
+ # @return [Get]
2520
+ def Get(**args)
2521
+ Get.new(**args)
2522
+ end
2523
+
2524
+ # Construct {GetMulti} options for {Collection#get_multi}
2525
+ #
2526
+ # @example Fetch "foo" and "bar" in a batch
2527
+ # res = collection.get(["foo", "bar"], Options::GetMulti(timeout: 3_000))
2528
+ # res[0].content #=> content of "foo"
2529
+ # res[1].content #=> content of "bar"
2530
+ #
2531
+ # @return [GetMulti]
2532
+ def GetMulti(**args)
2533
+ GetMulti.new(**args)
2534
+ end
2535
+
2536
+ # Construct {GetAndLock} options for {Collection#get_and_lock}
2537
+ #
2538
+ # @example Retrieve document and lock for 10 seconds
2539
+ # collection.get_and_lock("customer123", 10, Options::GetAndLock(timeout: 3_000))
2540
+ #
2541
+ # @return [GetAndLock]
2542
+ def GetAndLock(**args)
2543
+ GetAndLock.new(**args)
2544
+ end
2545
+
2546
+ # Construct {GetAndTouch} options for {Collection#get_and_touch}
2547
+ #
2548
+ # @example Retrieve document and prolong its expiration for 10 seconds
2549
+ # collection.get_and_touch("customer123", 10, Options::GetAndTouch(timeout: 3_000))
2550
+ #
2551
+ # @return [GetAndTouch]
2552
+ def GetAndTouch(**args)
2553
+ GetAndTouch.new(**args)
2554
+ end
2555
+
2556
+ # Construct {GetAllReplicas} options for {Collection#get_any_replica}
2557
+ #
2558
+ # @return [GetAllReplicas]
2559
+ def GetAllReplicas(**args)
2560
+ GetAllReplicas.new(**args)
2561
+ end
2562
+
2563
+ # Construct {GetAnyReplica} options for {Collection#get_all_replicas}
2564
+ #
2565
+ # @return [GetAnyReplica]
2566
+ def GetAnyReplica(**args)
2567
+ GetAnyReplica.new(**args)
2568
+ end
2569
+
2570
+ # Construct {Exists} options for {Collection#exists}
2571
+ #
2572
+ # @example Check if the document exists without fetching its contents
2573
+ # res = collection.exists("customer123", Options::Exists(timeout: 3_000))
2574
+ # res.exists? #=> true
2575
+ #
2576
+ # @return [Exists]
2577
+ def Exists(**args)
2578
+ Exists.new(**args)
2579
+ end
2580
+
2581
+ # Construct {Touch} options for {Collection#touch}
2582
+ #
2583
+ # @example Reset expiration timer for document to 30 seconds (and use custom operation timeout)
2584
+ # res = collection.touch("customer123", 30, Options::Touch(timeout: 3_000))
2585
+ #
2586
+ # @return [Touch]
2587
+ def Touch(**args)
2588
+ Touch.new(**args)
2589
+ end
2590
+
2591
+ # Construct {Unlock} options for {Collection#touch}
2592
+ #
2593
+ # @example Lock (pessimistically) and unlock document
2594
+ # res = collection.get_and_lock("customer123", 10, Options::Unlock(timeout: 3_000))
2595
+ # collection.unlock("customer123", res.cas)
2596
+ #
2597
+ # @return [Unlock]
2598
+ def Unlock(**args)
2599
+ Unlock.new(**args)
2600
+ end
2601
+
2602
+ # Construct {Remove} options for {Collection#remove}
2603
+ #
2604
+ # @example Remove the document in collection, but apply optimistic lock
2605
+ # res = collection.upsert("mydoc", {"foo" => 42})
2606
+ # res.cas #=> 7751414725654
2607
+ #
2608
+ # begin
2609
+ # res = collection.remove("customer123", Options::Remove(cas: 3735928559))
2610
+ # rescue Error::CasMismatch
2611
+ # puts "Failed to remove the document, it might be changed by other application"
2612
+ # end
2613
+ #
2614
+ # @return [Remove]
2615
+ def Remove(**args)
2616
+ Remove.new(**args)
2617
+ end
2618
+
2619
+ # Construct {RemoveMulti} options for {Collection#remove_multi}
2620
+ #
2621
+ # @example Remove two documents in collection. For "mydoc" apply optimistic lock
2622
+ # res = collection.upsert("mydoc", {"foo" => 42})
2623
+ # res.cas #=> 7751414725654
2624
+ #
2625
+ # res = collection.remove_multi(["foo", ["mydoc", res.cas]], Options::RemoveMulti(timeout: 3_000))
2626
+ # if res[1].error.is_a?(Error::CasMismatch)
2627
+ # puts "Failed to remove the document, it might be changed by other application"
2628
+ # end
2629
+ #
2630
+ # @return [RemoveMulti]
2631
+ def RemoveMulti(**args)
2632
+ RemoveMulti.new(**args)
2633
+ end
2634
+
2635
+ # Construct {Insert} options for {Collection#insert}
2636
+ #
2637
+ # @example Insert new document in collection
2638
+ # res = collection.insert("mydoc", {"foo" => 42}, Options::Insert(expiry: 20))
2639
+ # res.cas #=> 242287264414742
2640
+ #
2641
+ # @return [Insert]
2642
+ def Insert(**args)
2643
+ Insert.new(**args)
2644
+ end
2645
+
2646
+ # Construct {Upsert} options for {Collection#upsert}
2647
+ #
2648
+ # @example Upsert new document in collection
2649
+ # res = collection.upsert("mydoc", {"foo" => 42}, Options::Upsert(expiry: 20))
2650
+ # res.cas #=> 242287264414742
2651
+ #
2652
+ # @return [Upsert]
2653
+ def Upsert(**args)
2654
+ Upsert.new(**args)
2655
+ end
2656
+
2657
+ # Construct {UpsertMulti} options for {Collection#upsert_multi}
2658
+ #
2659
+ # @example Upsert two documents with IDs "foo" and "bar" into a collection with expiration 20 seconds.
2660
+ # res = collection.upsert_multi([
2661
+ # "foo", {"foo" => 42},
2662
+ # "bar", {"bar" => "some value"}
2663
+ # ], Options::UpsertMulti(expiry: 20))
2664
+ # res[0].cas #=> 7751414725654
2665
+ # res[1].cas #=> 7751418925851
2666
+ #
2667
+ # @return [UpsertMulti]
2668
+ def UpsertMulti(**args)
2669
+ UpsertMulti.new(**args)
2670
+ end
2671
+
2672
+ # Construct {Replace} options for {Collection#replace}
2673
+ #
2674
+ # @example Replace new document in collection with optimistic locking
2675
+ # res = collection.get("mydoc")
2676
+ # res = collection.replace("mydoc", {"foo" => 42}, Options::Replace(cas: res.cas))
2677
+ # res.cas #=> 242287264414742
2678
+ #
2679
+ # @return [Replace]
2680
+ def Replace(**args)
2681
+ Replace.new(**args)
2682
+ end
2683
+
2684
+ # Construct {MutateIn} options for {Collection#mutate_in}
2685
+ #
2686
+ # @example Append number into subarray of the document
2687
+ # mutation_specs = [
2688
+ # MutateInSpec::array_append("purchases.complete", [42])
2689
+ # ]
2690
+ # collection.mutate_in("customer123", mutation_specs, Options::MutateIn(expiry: 10))
2691
+ #
2692
+ # @return [MutateIn]
2693
+ def MutateIn(**args)
2694
+ MutateIn.new(**args)
2695
+ end
2696
+
2697
+ # Construct {LookupIn} options for {Collection#lookup_in}
2698
+ #
2699
+ # @example Get list of IDs of completed purchases
2700
+ # lookup_specs = [
2701
+ # LookupInSpec::get("purchases.complete")
2702
+ # ]
2703
+ # collection.lookup_in("customer123", lookup_specs, Options::LookupIn(timeout: 3_000))
2704
+ #
2705
+ # @return [LookupIn]
2706
+ def LookupIn(**args)
2707
+ LookupIn.new(**args)
2708
+ end
2709
+
2710
+ # Construct {Append} options for {BinaryCollection#append}
2711
+ #
2712
+ # @example Append "bar" to the content of the existing document
2713
+ # collection.upsert("mydoc", "foo")
2714
+ # collection.binary.append("mydoc", "bar", Options::Append(timeout: 3_000))
2715
+ # collection.get("mydoc", Options::Get(transcoder: nil)).content #=> "foobar"
2716
+ #
2717
+ # @return [Append]
2718
+ def Append(**args)
2719
+ Append.new(**args)
2720
+ end
2721
+
2722
+ # Construct {Prepend} options for {BinaryCollection#prepend}
2723
+ #
2724
+ # @example Prepend "bar" to the content of the existing document
2725
+ # collection.upsert("mydoc", "foo")
2726
+ # collection.binary.prepend("mydoc", "bar", Options::Prepend(timeout: 3_000))
2727
+ # collection.get("mydoc", Options::Get(transcoder: nil)).content #=> "barfoo"
2728
+ #
2729
+ # @return [Prepend]
2730
+ def Prepend(**args)
2731
+ Prepend.new(**args)
2732
+ end
2733
+
2734
+ # Construct {Diagnostics} options for {Cluster#diagnostics}
2735
+ #
2736
+ # @return [Diagnostics]
2737
+ def Diagnostics(**args)
2738
+ Diagnostics.new(**args)
2739
+ end
2740
+
2741
+ # Construct {Ping} options for {Bucket#ping}
2742
+ #
2743
+ # @return [Ping]
2744
+ def Ping(**args)
2745
+ Ping.new(**args)
2746
+ end
2747
+
2748
+ # Construct {Cluster} options for {Cluster.connect}
2749
+ #
2750
+ # It forwards all its arguments to {Cluster#initialize}
2751
+ #
2752
+ # @return [Cluster]
2753
+ def Cluster(**args)
2754
+ Cluster.new(**args)
2755
+ end
2756
+
2757
+ # Construct {Increment} options for {BinaryCollection#increment}
2758
+ #
2759
+ # @example Increment value by 10, and initialize to 0 if it does not exist
2760
+ # res = collection.binary.increment("raw_counter", Options::Increment(delta: 10, initial: 0))
2761
+ # res.content #=> 0
2762
+ # res = collection.binary.increment("raw_counter", Options::Increment(delta: 10, initial: 0))
2763
+ # res.content #=> 10
2764
+ #
2765
+ # @return [Increment]
2766
+ def Increment(**args)
2767
+ Increment.new(**args)
2768
+ end
2769
+
2770
+ # Construct {Decrement} options for {BinaryCollection#decrement}
2771
+ #
2772
+ # @example Decrement value by 2, and initialize to 100 if it does not exist
2773
+ # res = collection.binary.decrement("raw_counter", Options::Decrement(delta: 2, initial: 100))
2774
+ # res.value #=> 100
2775
+ # res = collection.binary.decrement("raw_counter", Options::Decrement(delta: 2, initial: 100))
2776
+ # res.value #=> 98
2777
+ #
2778
+ # @return [Decrement]
2779
+ def Decrement(**args)
2780
+ Decrement.new(**args)
2781
+ end
2782
+
2783
+ # Construct {Analytics} options for {Cluster#analytics_query}
2784
+ #
2785
+ # @example Select name of the given user
2786
+ # cluster.analytics_query("SELECT u.name AS uname FROM GleambookUsers u WHERE u.id = $user_id ",
2787
+ # Options::Analytics(named_parameters: {user_id: 2}))
2788
+ #
2789
+ # @return [Analytics]
2790
+ def Analytics(**args)
2791
+ Analytics.new(**args)
2792
+ end
2793
+
2794
+ # Construct {Query} options for {Cluster#query}
2795
+ #
2796
+ # @example Select first ten hotels from travel sample dataset
2797
+ # cluster.query("SELECT * FROM `travel-sample` WHERE type = $type LIMIT 10",
2798
+ # Options::Query(named_parameters: {type: "hotel"}, metrics: true))
2799
+ #
2800
+ # @return [Query]
2801
+ def Query(**args)
2802
+ Query.new(**args)
2803
+ end
2804
+
2805
+ # Construct {Search} options for {Cluster#search_query}
2806
+ #
2807
+ # @example Return first 10 results of "hop beer" query and request highlighting
2808
+ # cluster.search_query("beer_index", Cluster::SearchQuery.match_phrase("hop beer"),
2809
+ # Options::Search(
2810
+ # limit: 10,
2811
+ # fields: %w[name],
2812
+ # highlight_style: :html,
2813
+ # highlight_fields: %w[name description]
2814
+ # ))
2815
+ #
2816
+ # @return [Search]
2817
+ def Search(**args)
2818
+ Search.new(**args)
2819
+ end
2820
+
2821
+ # Construct {View} options for {Bucket#view_query}
2822
+ #
2823
+ # @example Make sure the view engine catch up with all mutations and return keys starting from +["random_brewery:"]+
2824
+ # bucket.view_query("beer", "brewery_beers",
2825
+ # Options::View(
2826
+ # start_key: ["random_brewery:"],
2827
+ # scan_consistency: :request_plus
2828
+ # ))
2829
+ #
2830
+ # @return [View]
2831
+ def View(**args)
2832
+ View.new(**args)
2833
+ end
2834
+
2835
+ # rubocop:enable Naming/MethodName
2836
+ end
2837
+ end