couchbase 3.5.0-arm64-darwin-22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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