couchbase 3.0.1 → 3.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +73 -4
  3. data/ext/build_config.hxx.in +2 -0
  4. data/ext/build_version.hxx.in +11 -8
  5. data/ext/cmake/BuildTracing.cmake +1 -1
  6. data/ext/cmake/CompilerWarnings.cmake +5 -0
  7. data/ext/cmake/Testing.cmake +3 -6
  8. data/ext/couchbase/bucket.hxx +9 -1
  9. data/ext/couchbase/cbsasl/client.h +1 -1
  10. data/ext/couchbase/cluster.hxx +89 -6
  11. data/ext/couchbase/configuration.hxx +2 -0
  12. data/ext/couchbase/couchbase.cxx +1647 -507
  13. data/ext/couchbase/diagnostics.hxx +0 -3
  14. data/ext/couchbase/io/dns_client.hxx +2 -2
  15. data/ext/couchbase/io/http_command.hxx +6 -3
  16. data/ext/couchbase/io/http_session.hxx +14 -18
  17. data/ext/couchbase/io/http_session_manager.hxx +83 -2
  18. data/ext/couchbase/io/mcbp_command.hxx +4 -1
  19. data/ext/couchbase/io/mcbp_context.hxx +37 -0
  20. data/ext/couchbase/io/mcbp_session.hxx +91 -30
  21. data/ext/couchbase/operations.hxx +5 -0
  22. data/ext/couchbase/operations/analytics_dataset_create.hxx +3 -2
  23. data/ext/couchbase/operations/analytics_dataset_drop.hxx +3 -2
  24. data/ext/couchbase/operations/analytics_dataset_get_all.hxx +3 -2
  25. data/ext/couchbase/operations/analytics_dataverse_create.hxx +3 -2
  26. data/ext/couchbase/operations/analytics_dataverse_drop.hxx +3 -2
  27. data/ext/couchbase/operations/analytics_get_pending_mutations.hxx +3 -2
  28. data/ext/couchbase/operations/analytics_index_create.hxx +3 -2
  29. data/ext/couchbase/operations/analytics_index_drop.hxx +3 -2
  30. data/ext/couchbase/operations/analytics_index_get_all.hxx +5 -2
  31. data/ext/couchbase/operations/analytics_link_connect.hxx +3 -2
  32. data/ext/couchbase/operations/analytics_link_disconnect.hxx +3 -2
  33. data/ext/couchbase/operations/bucket_create.hxx +3 -2
  34. data/ext/couchbase/operations/bucket_drop.hxx +3 -2
  35. data/ext/couchbase/operations/bucket_flush.hxx +3 -2
  36. data/ext/couchbase/operations/bucket_get.hxx +3 -2
  37. data/ext/couchbase/operations/bucket_get_all.hxx +3 -2
  38. data/ext/couchbase/operations/bucket_update.hxx +3 -2
  39. data/ext/couchbase/operations/cluster_developer_preview_enable.hxx +3 -2
  40. data/ext/couchbase/operations/collection_create.hxx +3 -2
  41. data/ext/couchbase/operations/collection_drop.hxx +3 -2
  42. data/ext/couchbase/operations/collections_manifest_get.hxx +3 -2
  43. data/ext/couchbase/operations/document_analytics.hxx +3 -2
  44. data/ext/couchbase/operations/document_append.hxx +77 -0
  45. data/ext/couchbase/operations/document_decrement.hxx +3 -2
  46. data/ext/couchbase/operations/document_exists.hxx +3 -2
  47. data/ext/couchbase/operations/document_get.hxx +3 -2
  48. data/ext/couchbase/operations/document_get_and_lock.hxx +3 -2
  49. data/ext/couchbase/operations/document_get_and_touch.hxx +3 -2
  50. data/ext/couchbase/operations/document_get_projected.hxx +3 -2
  51. data/ext/couchbase/operations/document_increment.hxx +3 -2
  52. data/ext/couchbase/operations/document_insert.hxx +3 -2
  53. data/ext/couchbase/operations/document_lookup_in.hxx +8 -2
  54. data/ext/couchbase/operations/document_mutate_in.hxx +13 -2
  55. data/ext/couchbase/operations/document_prepend.hxx +77 -0
  56. data/ext/couchbase/operations/document_query.hxx +3 -2
  57. data/ext/couchbase/operations/document_remove.hxx +5 -2
  58. data/ext/couchbase/operations/document_replace.hxx +3 -2
  59. data/ext/couchbase/operations/document_search.hxx +3 -2
  60. data/ext/couchbase/operations/document_touch.hxx +3 -2
  61. data/ext/couchbase/operations/document_unlock.hxx +3 -2
  62. data/ext/couchbase/operations/document_upsert.hxx +3 -2
  63. data/ext/couchbase/operations/document_view.hxx +3 -2
  64. data/ext/couchbase/operations/group_drop.hxx +3 -2
  65. data/ext/couchbase/operations/group_get.hxx +3 -2
  66. data/ext/couchbase/operations/group_get_all.hxx +3 -2
  67. data/ext/couchbase/operations/group_upsert.hxx +3 -2
  68. data/ext/couchbase/operations/http_noop.hxx +78 -0
  69. data/ext/couchbase/operations/mcbp_noop.hxx +61 -0
  70. data/ext/couchbase/operations/query_index_build_deferred.hxx +3 -2
  71. data/ext/couchbase/operations/query_index_create.hxx +3 -2
  72. data/ext/couchbase/operations/query_index_drop.hxx +3 -2
  73. data/ext/couchbase/operations/query_index_get_all.hxx +3 -2
  74. data/ext/couchbase/operations/role_get_all.hxx +3 -2
  75. data/ext/couchbase/operations/scope_create.hxx +3 -2
  76. data/ext/couchbase/operations/scope_drop.hxx +3 -2
  77. data/ext/couchbase/operations/scope_get_all.hxx +3 -2
  78. data/ext/couchbase/operations/search_get_stats.hxx +3 -2
  79. data/ext/couchbase/operations/search_index_analyze_document.hxx +3 -2
  80. data/ext/couchbase/operations/search_index_control_ingest.hxx +3 -2
  81. data/ext/couchbase/operations/search_index_control_plan_freeze.hxx +3 -2
  82. data/ext/couchbase/operations/search_index_control_query.hxx +3 -2
  83. data/ext/couchbase/operations/search_index_drop.hxx +3 -2
  84. data/ext/couchbase/operations/search_index_get.hxx +3 -2
  85. data/ext/couchbase/operations/search_index_get_all.hxx +3 -2
  86. data/ext/couchbase/operations/search_index_get_documents_count.hxx +3 -2
  87. data/ext/couchbase/operations/search_index_get_stats.hxx +3 -2
  88. data/ext/couchbase/operations/search_index_upsert.hxx +3 -2
  89. data/ext/couchbase/operations/user_drop.hxx +3 -2
  90. data/ext/couchbase/operations/user_get.hxx +3 -2
  91. data/ext/couchbase/operations/user_get_all.hxx +3 -2
  92. data/ext/couchbase/operations/user_upsert.hxx +3 -2
  93. data/ext/couchbase/operations/view_index_drop.hxx +3 -2
  94. data/ext/couchbase/operations/view_index_get.hxx +3 -2
  95. data/ext/couchbase/operations/view_index_get_all.hxx +3 -2
  96. data/ext/couchbase/operations/view_index_upsert.hxx +3 -2
  97. data/ext/couchbase/platform/terminate_handler.cc +5 -2
  98. data/ext/couchbase/protocol/client_opcode.hxx +368 -0
  99. data/ext/couchbase/protocol/cmd_append.hxx +145 -0
  100. data/ext/couchbase/protocol/cmd_hello.hxx +1 -0
  101. data/ext/couchbase/protocol/cmd_lookup_in.hxx +11 -3
  102. data/ext/couchbase/protocol/cmd_mutate_in.hxx +46 -4
  103. data/ext/couchbase/protocol/cmd_noop.hxx +82 -0
  104. data/ext/couchbase/protocol/cmd_prepend.hxx +145 -0
  105. data/ext/couchbase/protocol/durability_level.hxx +16 -0
  106. data/ext/couchbase/protocol/hello_feature.hxx +9 -0
  107. data/ext/couchbase/protocol/unsigned_leb128.h +2 -2
  108. data/ext/couchbase/service_type.hxx +1 -1
  109. data/ext/couchbase/version.hxx +18 -4
  110. data/ext/extconf.rb +9 -6
  111. data/ext/test/CMakeLists.txt +5 -0
  112. data/ext/test/test_helper.hxx +3 -3
  113. data/ext/test/test_helper_native.hxx +2 -5
  114. data/ext/test/test_native_binary_operations.cxx +186 -0
  115. data/ext/test/test_native_diagnostics.cxx +54 -3
  116. data/ext/test/test_ruby_trivial_crud.cxx +1 -1
  117. data/lib/couchbase.rb +1 -0
  118. data/lib/couchbase/analytics_options.rb +1 -71
  119. data/lib/couchbase/binary_collection.rb +60 -22
  120. data/lib/couchbase/binary_collection_options.rb +0 -76
  121. data/lib/couchbase/bucket.rb +40 -36
  122. data/lib/couchbase/cluster.rb +89 -156
  123. data/lib/couchbase/collection.rb +290 -72
  124. data/lib/couchbase/collection_options.rb +30 -243
  125. data/lib/couchbase/datastructures/couchbase_list.rb +5 -16
  126. data/lib/couchbase/datastructures/couchbase_map.rb +5 -16
  127. data/lib/couchbase/datastructures/couchbase_queue.rb +5 -16
  128. data/lib/couchbase/datastructures/couchbase_set.rb +5 -16
  129. data/lib/couchbase/diagnostics.rb +181 -0
  130. data/lib/couchbase/json_transcoder.rb +1 -1
  131. data/lib/couchbase/{common_options.rb → logger.rb} +24 -11
  132. data/lib/couchbase/management/query_index_manager.rb +1 -1
  133. data/lib/couchbase/management/user_manager.rb +3 -0
  134. data/lib/couchbase/options.rb +2094 -0
  135. data/lib/couchbase/query_options.rb +1 -144
  136. data/lib/couchbase/scope.rb +8 -25
  137. data/lib/couchbase/search_options.rb +0 -93
  138. data/lib/couchbase/version.rb +20 -1
  139. data/lib/couchbase/view_options.rb +1 -91
  140. metadata +19 -7
@@ -13,6 +13,7 @@
13
13
  # limitations under the License.
14
14
 
15
15
  require "couchbase/collection"
16
+ require "couchbase/options"
16
17
  require "couchbase/errors"
17
18
 
18
19
  module Couchbase
@@ -28,8 +29,8 @@ module Couchbase
28
29
  #
29
30
  # @param [String] id the id of the document to back the set.
30
31
  # @param [Collection] collection the collection through which to interact with the document.
31
- # @param [CouchbaseListOptions] options customization of the datastructure
32
- def initialize(id, collection, options = CouchbaseSetOptions.new)
32
+ # @param [Options::CouchbaseSet] options customization of the datastructure
33
+ def initialize(id, collection, options = Options::CouchbaseSet.new)
33
34
  @id = id
34
35
  @collection = collection
35
36
  @options = options
@@ -121,19 +122,7 @@ module Couchbase
121
122
  end
122
123
  end
123
124
 
124
- class CouchbaseSetOptions
125
- attr_accessor :get_options
126
- attr_accessor :lookup_in_options
127
- attr_accessor :mutate_in_options
128
- attr_accessor :remove_options
129
-
130
- def initialize
131
- @get_options = Collection::GetOptions.new
132
- @remove_options = Collection::RemoveOptions.new
133
- @lookup_in_options = Collection::LookupInOptions.new
134
- @mutate_in_options = Collection::MutateInOptions.new
135
- @mutate_in_options.store_semantics = :upsert
136
- end
137
- end
125
+ # @api private
126
+ CouchbaseSetOptions = ::Couchbase::Options::CouchbaseSet
138
127
  end
139
128
  end
@@ -0,0 +1,181 @@
1
+ # Copyright 2020 Couchbase, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Couchbase
16
+ class DiagnosticsResult
17
+ class ServiceInfo
18
+ # @return [String] endpoint unique identifier
19
+ attr_accessor :id
20
+
21
+ # Possible states are:
22
+ #
23
+ # :disconnected:: the endpoint is not reachable
24
+ # :connecting:: currently connecting (includes auth, handshake, etc.)
25
+ # :connected:: connected and ready
26
+ # :disconnecting:: disconnecting (after being connected)
27
+ #
28
+ # @return [Symbol] state of the endpoint
29
+ attr_accessor :state
30
+
31
+ # @return [String, nil] optional string with additional explanation for the state
32
+ attr_accessor :details
33
+
34
+ # @return [Integer] how long ago the endpoint was active (in microseconds)
35
+ attr_accessor :last_activity_us
36
+
37
+ # @return [String] remote address of the connection
38
+ attr_accessor :remote
39
+
40
+ # @return [String] local address of the connection
41
+ attr_accessor :local
42
+
43
+ # @yieldparam [ServiceInfo] self
44
+ def initialize
45
+ yield self if block_given?
46
+ end
47
+
48
+ def to_json(*args)
49
+ data = {
50
+ id: @id,
51
+ state: @state,
52
+ remote: @remote,
53
+ local: @local,
54
+ }
55
+ data[:details] = @details if @details
56
+ data[:last_activity_us] = @last_activity_us if @last_activity_us
57
+ data.to_json(*args)
58
+ end
59
+ end
60
+
61
+ # @return [String] report id
62
+ attr_accessor :id
63
+
64
+ # @return [String] SDK identifier
65
+ attr_accessor :sdk
66
+
67
+ # Returns information about currently service endpoints, that known to the library at the moment.
68
+ #
69
+ # :kv:: Key/Value data service
70
+ # :query:: N1QL query service
71
+ # :analytics:: Analtyics service
72
+ # :search:: Full text search service
73
+ # :views:: Views service
74
+ # :mgmt:: Management service
75
+ #
76
+ # @return [Hash<Symbol, ServiceInfo>] map service types to info
77
+ attr_accessor :services
78
+
79
+ # @yieldparam [DiagnosticsResult] self
80
+ def initialize
81
+ @services = {}
82
+ yield self if block_given?
83
+ end
84
+
85
+ # @api private
86
+ # @return [Integer] version
87
+ attr_accessor :version
88
+
89
+ def to_json(*args)
90
+ {
91
+ version: @version,
92
+ id: @id,
93
+ sdk: @sdk,
94
+ services: @services,
95
+ }.to_json(*args)
96
+ end
97
+ end
98
+
99
+ class PingResult
100
+ class ServiceInfo
101
+ # @return [String] endpoint unique identifier
102
+ attr_accessor :id
103
+
104
+ # Possible states are:
105
+ #
106
+ # :ok:: endpoint is healthy
107
+ # :timeout:: endpoint didn't respond in time
108
+ # :error:: request to endpoint has failed, see {#error} for additional details
109
+ #
110
+ # @return [Symbol] state of the endpoint
111
+ attr_accessor :state
112
+
113
+ # @return [String, nil] optional string with additional explanation for the state
114
+ attr_accessor :error
115
+
116
+ # @return [Integer] how long ago the endpoint was active (in microseconds)
117
+ attr_accessor :latency
118
+
119
+ # @return [String] remote address of the connection
120
+ attr_accessor :remote
121
+
122
+ # @return [String] local address of the connection
123
+ attr_accessor :local
124
+
125
+ # @yieldparam [ServiceInfo] self
126
+ def initialize
127
+ @error = nil
128
+ yield self if block_given?
129
+ end
130
+
131
+ def to_json(*args)
132
+ data = {
133
+ id: @id,
134
+ state: @state,
135
+ remote: @remote,
136
+ local: @local,
137
+ latency: @latency,
138
+ }
139
+ data[:error] = @error if @error
140
+ data.to_json(*args)
141
+ end
142
+ end
143
+
144
+ # @return [String] report id
145
+ attr_accessor :id
146
+
147
+ # @return [String] SDK identifier
148
+ attr_accessor :sdk
149
+
150
+ # Returns information about currently service endpoints, that known to the library at the moment.
151
+ #
152
+ # :kv:: Key/Value data service
153
+ # :query:: N1QL query service
154
+ # :analytics:: Analtyics service
155
+ # :search:: Full text search service
156
+ # :views:: Views service
157
+ # :mgmt:: Management service
158
+ #
159
+ # @return [Hash<Symbol, ServiceInfo>] map service types to info
160
+ attr_accessor :services
161
+
162
+ # @yieldparam [DiagnosticsResult] self
163
+ def initialize
164
+ @services = {}
165
+ yield self if block_given?
166
+ end
167
+
168
+ # @api private
169
+ # @return [Integer] version
170
+ attr_accessor :version
171
+
172
+ def to_json(*args)
173
+ {
174
+ version: @version,
175
+ id: @id,
176
+ sdk: @sdk,
177
+ services: @services,
178
+ }.to_json(*args)
179
+ end
180
+ end
181
+ end
@@ -26,7 +26,7 @@ module Couchbase
26
26
  # @param [Integer, :json] _flags bit field, describing how the data encoded
27
27
  # @return Object decoded document
28
28
  def decode(blob, _flags)
29
- JSON.parse(blob) unless blob.nil?
29
+ JSON.parse(blob) unless blob&.empty?
30
30
  end
31
31
  end
32
32
  end
@@ -13,17 +13,30 @@
13
13
  # limitations under the License.
14
14
 
15
15
  module Couchbase
16
- class CommonOptions
17
- # @return [Integer] the time in milliseconds allowed for the operation to complete
18
- attr_accessor :timeout
19
-
20
- # @return [Proc] the custom retry strategy, if set
21
- attr_accessor :retry_strategy
22
-
23
- # @return [Hash] the client context data, if set
24
- attr_accessor :client_context
16
+ # Set log level
17
+ #
18
+ # @note The level might be also be set with environment variable +COUCHBASE_BACKEND_LOG_LEVEL+
19
+ #
20
+ # @param [Symbol] level new log level.
21
+ #
22
+ # Allowed levels (in order of decreasing verbosity):
23
+ # * +:trace+
24
+ # * +:debug+
25
+ # * +:info+ (default)
26
+ # * +:warn+
27
+ # * +:error+
28
+ # * +:critical+
29
+ # * +:off+
30
+ #
31
+ # @return [void]
32
+ def self.log_level=(level)
33
+ Backend.set_log_level(level)
34
+ end
25
35
 
26
- # @return [Span] If set holds the parent span, that should be used for this request
27
- attr_accessor :parent_span
36
+ # Get current log level
37
+ #
38
+ # @return [Symbol] current log level
39
+ def self.log_level
40
+ Backend.get_log_level
28
41
  end
29
42
  end
@@ -146,7 +146,7 @@ module Couchbase
146
146
  #
147
147
  # @param [String] bucket_name name of the bucket
148
148
  # @param [Array<String>] index_names names of the indexes to watch
149
- # @param [Integer] timeout
149
+ # @param [Integer, #in_milliseconds] timeout
150
150
  # @param [WatchIndexesOptions] options
151
151
  #
152
152
  # @raise [ArgumentError]
@@ -340,6 +340,7 @@ module Couchbase
340
340
  attr_accessor :description
341
341
 
342
342
  def initialize
343
+ super
343
344
  yield self if block_given?
344
345
  end
345
346
  end
@@ -361,6 +362,7 @@ module Couchbase
361
362
  attr_writer :origins
362
363
 
363
364
  def initialize
365
+ super
364
366
  @origins = []
365
367
  yield self if block_given?
366
368
  end
@@ -403,6 +405,7 @@ module Couchbase
403
405
  attr_accessor :external_groups
404
406
 
405
407
  def initialize
408
+ super
406
409
  @effective_roles = []
407
410
  yield self if block_given?
408
411
  end
@@ -0,0 +1,2094 @@
1
+ # Copyright 2020 Couchbase, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Couchbase
16
+ # Definition of the Option classes for data APIs
17
+ module Options # rubocop:disable Metrics/ModuleLength
18
+ # Base class for most of the options
19
+ class Base
20
+ attr_accessor :timeout # @return [Integer, #in_milliseconds, nil]
21
+ attr_accessor :retry_strategy # @return [Proc, nil]
22
+ attr_accessor :client_context # @return [Hash, nil]
23
+ attr_accessor :parent_span # @return [Span, nil]
24
+
25
+ # @param [Integer, #in_milliseconds, nil] timeout the time in milliseconds allowed for the operation to complete
26
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
27
+ # @param [Hash, nil] client_context the client context data, if set
28
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
29
+ #
30
+ # @yieldparam [Base]
31
+ def initialize(timeout: nil,
32
+ retry_strategy: nil,
33
+ client_context: nil,
34
+ parent_span: nil)
35
+ @timeout = timeout
36
+ @retry_strategy = retry_strategy
37
+ @client_context = client_context
38
+ @parent_span = parent_span
39
+ yield self if block_given?
40
+ end
41
+ end
42
+
43
+ # Options for {Collection#get}
44
+ class Get < Base
45
+ attr_accessor :with_expiry # @return [Boolean]
46
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String, Integer)]
47
+
48
+ # Creates an instance of options for {Collection#get}
49
+ #
50
+ # @param [Array<String>] projections a list of paths that should be loaded if present.
51
+ # @param [Boolean] with_expiry if +true+ the expiration will be also fetched with {Collection#get}
52
+ # @param [JsonTranscoder, #decode(String, Integer)] transcoder used for decoding
53
+ #
54
+ # @param [Integer, #in_milliseconds, nil] timeout the time in milliseconds allowed for the operation to complete
55
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
56
+ # @param [Hash, nil] client_context the client context data, if set
57
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
58
+ #
59
+ # @yieldparam [Get] self
60
+ def initialize(projections: [],
61
+ with_expiry: false,
62
+ transcoder: JsonTranscoder.new,
63
+ timeout: nil,
64
+ retry_strategy: nil,
65
+ client_context: nil,
66
+ parent_span: nil)
67
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
68
+ @projections = projections
69
+ @with_expiry = with_expiry
70
+ @transcoder = transcoder
71
+ @preserve_array_indexes = false
72
+ yield self if block_given?
73
+ end
74
+
75
+ # Allows to specify a custom list paths to fetch from the document instead of the whole.
76
+ #
77
+ # Note that a maximum of 16 individual paths can be projected at a time due to a server limitation. If you need
78
+ # more than that, think about fetching less-generic paths or the full document straight away.
79
+ #
80
+ # @param [String, Array<String>] paths a path that should be loaded if present.
81
+ def project(*paths)
82
+ @projections ||= []
83
+ @projections |= paths.flatten # union with current projections
84
+ end
85
+
86
+ # @api private
87
+ # @return [Boolean] whether to use sparse arrays (default +false+)
88
+ attr_accessor :preserve_array_indexes
89
+
90
+ # @api private
91
+ # @return [Array<String>] list of paths to project
92
+ attr_accessor :projections
93
+
94
+ # @api private
95
+ # @return [Boolean]
96
+ def need_projected_get?
97
+ @with_expiry || !@projections&.empty?
98
+ end
99
+
100
+ # @api private
101
+ def to_backend
102
+ options = {
103
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
104
+ }
105
+ options.update(with_expiry: true) if @with_expiry
106
+ unless @projections&.empty?
107
+ options.update({
108
+ projections: @projections,
109
+ preserve_array_indexes: @preserve_array_indexes,
110
+ })
111
+ end
112
+ options
113
+ end
114
+ end
115
+
116
+ # Options for {Collection#get_multi}
117
+ class GetMulti < Base
118
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String, Integer)]
119
+
120
+ # Creates an instance of options for {Collection#get_multi}
121
+ #
122
+ # @param [JsonTranscoder, #decode(String, Integer)] transcoder used for decoding
123
+ #
124
+ # @param [Integer, #in_milliseconds, nil] timeout the time in milliseconds allowed for the operation to complete
125
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
126
+ # @param [Hash, nil] client_context the client context data, if set
127
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
128
+ #
129
+ # @yieldparam [Get] self
130
+ def initialize(transcoder: JsonTranscoder.new,
131
+ timeout: nil,
132
+ retry_strategy: nil,
133
+ client_context: nil,
134
+ parent_span: nil)
135
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
136
+ @transcoder = transcoder
137
+ yield self if block_given?
138
+ end
139
+
140
+ # @api private
141
+ def to_backend
142
+ {
143
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
144
+ }
145
+ end
146
+ end
147
+
148
+ # Options for {Collection#get_and_lock}
149
+ class GetAndLock < Base
150
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String, Integer)]
151
+
152
+ # Creates an instance of options for {Collection#get_and_lock}
153
+ #
154
+ # @param [JsonTranscoder, #decode(String, Integer)] transcoder used for decoding
155
+ #
156
+ # @param [Integer, #in_milliseconds, nil] timeout
157
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
158
+ # @param [Hash, nil] client_context the client context data, if set
159
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
160
+ #
161
+ # @yieldparam [GetAndLock] self
162
+ def initialize(transcoder: JsonTranscoder.new,
163
+ timeout: nil,
164
+ retry_strategy: nil,
165
+ client_context: nil,
166
+ parent_span: nil)
167
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
168
+ @transcoder = transcoder
169
+ yield self if block_given?
170
+ end
171
+
172
+ # @api private
173
+ def to_backend
174
+ {
175
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
176
+ }
177
+ end
178
+ end
179
+
180
+ # Options for {Collection#get_and_touch}
181
+ class GetAndTouch < Base
182
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String, Integer)]
183
+
184
+ # Creates an instance of options for {Collection#get_and_touch}
185
+ #
186
+ # @param [JsonTranscoder, #decode(String, Integer)] transcoder used for decoding
187
+ #
188
+ # @param [Integer, #in_milliseconds, nil] timeout
189
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
190
+ # @param [Hash, nil] client_context the client context data, if set
191
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
192
+ #
193
+ # @yieldparam [GetAndTouch] self
194
+ def initialize(transcoder: JsonTranscoder.new,
195
+ timeout: nil,
196
+ retry_strategy: nil,
197
+ client_context: nil,
198
+ parent_span: nil)
199
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
200
+ @transcoder = transcoder
201
+ yield self if block_given?
202
+ end
203
+
204
+ # @api private
205
+ def to_backend
206
+ {
207
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
208
+ }
209
+ end
210
+ end
211
+
212
+ # Options for {Collection#get_all_replicas}
213
+ class GetAllReplicas < Base
214
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String, Integer)]
215
+
216
+ # Creates an instance of options for {Collection#get_all_replicas}
217
+ #
218
+ # @param [JsonTranscoder, #decode(String, Integer)] transcoder used for decoding
219
+ #
220
+ # @param [Integer, #in_milliseconds, nil] timeout
221
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
222
+ # @param [Hash, nil] client_context the client context data, if set
223
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
224
+ #
225
+ # @yieldparam [GetAllReplicas] self
226
+ def initialize(transcoder: JsonTranscoder.new,
227
+ timeout: nil,
228
+ retry_strategy: nil,
229
+ client_context: nil,
230
+ parent_span: nil)
231
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
232
+ @transcoder = transcoder
233
+ yield self if block_given?
234
+ end
235
+
236
+ # @api private
237
+ def to_backend
238
+ {
239
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
240
+ }
241
+ end
242
+ end
243
+
244
+ # Options for {Collection#get_any_replica}
245
+ class GetAnyReplica < Base
246
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String, Integer)]
247
+
248
+ # Creates an instance of options for {Collection#get_any_replica}
249
+ #
250
+ # @param [JsonTranscoder, #decode(String, Integer)] transcoder used for decoding
251
+ #
252
+ # @param [Integer, #in_milliseconds, nil] timeout
253
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
254
+ # @param [Hash, nil] client_context the client context data, if set
255
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
256
+ #
257
+ # @yieldparam [GetAnyReplica] self
258
+ def initialize(transcoder: JsonTranscoder.new,
259
+ timeout: nil,
260
+ retry_strategy: nil,
261
+ client_context: nil,
262
+ parent_span: nil)
263
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
264
+ @transcoder = transcoder
265
+ yield self if block_given?
266
+ end
267
+
268
+ # @api private
269
+ def to_backend
270
+ {
271
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
272
+ }
273
+ end
274
+ end
275
+
276
+ # Options for {Collection#exists}
277
+ class Exists < Base
278
+ # Creates an instance of options for {Collection#exists}
279
+ #
280
+ # @param [Integer, #in_milliseconds, nil] timeout
281
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
282
+ # @param [Hash, nil] client_context the client context data, if set
283
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
284
+ #
285
+ # @yieldparam [Exists self
286
+ def initialize(timeout: nil,
287
+ retry_strategy: nil,
288
+ client_context: nil,
289
+ parent_span: nil)
290
+ super
291
+ yield self if block_given?
292
+ end
293
+
294
+ # @api private
295
+ def to_backend
296
+ {
297
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
298
+ }
299
+ end
300
+ end
301
+
302
+ # Options for {Collection#touch}
303
+ class Touch < Base
304
+ # Creates an instance of options for {Collection#touch}
305
+ #
306
+ # @param [Integer, #in_milliseconds, nil] timeout
307
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
308
+ # @param [Hash, nil] client_context the client context data, if set
309
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
310
+ #
311
+ # @yieldparam [TouchOptions] self
312
+ def initialize(timeout: nil,
313
+ retry_strategy: nil,
314
+ client_context: nil,
315
+ parent_span: nil)
316
+ super
317
+ yield self if block_given?
318
+ end
319
+
320
+ # @api private
321
+ def to_backend
322
+ {
323
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
324
+ }
325
+ end
326
+ end
327
+
328
+ # Options for {Collection#unlock}
329
+ class Unlock < Base
330
+ # Creates an instance of options for {Collection#unlock}
331
+ #
332
+ # @param [Integer, #in_milliseconds, nil] timeout
333
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
334
+ # @param [Hash, nil] client_context the client context data, if set
335
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
336
+ #
337
+ # @yieldparam [Unlock] self
338
+ def initialize(timeout: nil,
339
+ retry_strategy: nil,
340
+ client_context: nil,
341
+ parent_span: nil)
342
+ super
343
+ yield self if block_given?
344
+ end
345
+
346
+ # @api private
347
+ def to_backend
348
+ {
349
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
350
+ }
351
+ end
352
+ end
353
+
354
+ # Options for {Collection#remove}
355
+ class Remove < Base
356
+ attr_accessor :cas # @return [Integer, nil]
357
+ attr_accessor :durability_level # @return [Symbol]
358
+
359
+ # Creates an instance of options for {Collection#remove}
360
+ #
361
+ # @param [Integer, nil] cas CAS value for optimistic locking
362
+ # @param [Symbol] durability_level level of durability
363
+ # +:none+::
364
+ # no enhanced durability required for the mutation
365
+ # +:majority+::
366
+ # the mutation must be replicated to a majority of the Data Service nodes
367
+ # (that is, held in the memory allocated to the bucket)
368
+ # +:majority_and_persist_to_active+::
369
+ # The mutation must be replicated to a majority of the Data Service nodes.
370
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
371
+ # node hosting the active partition (vBucket) for the data.
372
+ # +:persist_to_majority+::
373
+ # The mutation must be persisted to a majority of the Data Service nodes.
374
+ # Accordingly, it will be written to disk on those nodes.
375
+ #
376
+ # @param [Integer, #in_milliseconds, nil] timeout
377
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
378
+ # @param [Hash, nil] client_context the client context data, if set
379
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
380
+ #
381
+ # @yieldparam [Remove]
382
+ def initialize(cas: nil,
383
+ durability_level: :none,
384
+ timeout: nil,
385
+ retry_strategy: nil,
386
+ client_context: nil,
387
+ parent_span: nil)
388
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
389
+ @cas = cas
390
+ @durability_level = durability_level
391
+ yield self if block_given?
392
+ end
393
+
394
+ # @api private
395
+ def to_backend
396
+ {
397
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
398
+ durability_level: @durability_level,
399
+ cas: @cas,
400
+ }
401
+ end
402
+ end
403
+
404
+ # Options for {Collection#remove_multi}
405
+ class RemoveMulti < Base
406
+ attr_accessor :durability_level # @return [Symbol]
407
+
408
+ # Creates an instance of options for {Collection#remove}
409
+ #
410
+ # @param [Symbol] durability_level level of durability
411
+ # +:none+::
412
+ # no enhanced durability required for the mutation
413
+ # +:majority+::
414
+ # the mutation must be replicated to a majority of the Data Service nodes
415
+ # (that is, held in the memory allocated to the bucket)
416
+ # +:majority_and_persist_to_active+::
417
+ # The mutation must be replicated to a majority of the Data Service nodes.
418
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
419
+ # node hosting the active partition (vBucket) for the data.
420
+ # +:persist_to_majority+::
421
+ # The mutation must be persisted to a majority of the Data Service nodes.
422
+ # Accordingly, it will be written to disk on those nodes.
423
+ #
424
+ # @param [Integer, #in_milliseconds, nil] timeout
425
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
426
+ # @param [Hash, nil] client_context the client context data, if set
427
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
428
+ #
429
+ # @yieldparam [Remove]
430
+ def initialize(durability_level: :none,
431
+ timeout: nil,
432
+ retry_strategy: nil,
433
+ client_context: nil,
434
+ parent_span: nil)
435
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
436
+ @durability_level = durability_level
437
+ yield self if block_given?
438
+ end
439
+
440
+ # @api private
441
+ def to_backend
442
+ {
443
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
444
+ durability_level: @durability_level,
445
+ }
446
+ end
447
+ end
448
+
449
+ # Options for {Collection#insert}
450
+ class Insert < Base
451
+ attr_accessor :expiry # @return [Integer, #in_seconds, nil]
452
+ attr_accessor :transcoder # @return [JsonTranscoder, #encode(Object)]
453
+ attr_accessor :durability_level # @return [Symbol]
454
+
455
+ # Creates an instance of options for {Collection#insert}
456
+ #
457
+ # @param [Integer, #in_seconds, nil] expiry expiration time to associate with the document
458
+ # @param [JsonTranscoder, #encode(Object)] transcoder used for encoding
459
+ # @param [Symbol] durability_level level of durability
460
+ # +:none+::
461
+ # no enhanced durability required for the mutation
462
+ # +:majority+::
463
+ # the mutation must be replicated to a majority of the Data Service nodes
464
+ # (that is, held in the memory allocated to the bucket)
465
+ # +:majority_and_persist_to_active+::
466
+ # The mutation must be replicated to a majority of the Data Service nodes.
467
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
468
+ # node hosting the active partition (vBucket) for the data.
469
+ # +:persist_to_majority+::
470
+ # The mutation must be persisted to a majority of the Data Service nodes.
471
+ # Accordingly, it will be written to disk on those nodes.
472
+ #
473
+ # @param [Integer, #in_milliseconds, nil] timeout
474
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
475
+ # @param [Hash, nil] client_context the client context data, if set
476
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
477
+ #
478
+ # @yieldparam [Insert]
479
+ def initialize(expiry: nil,
480
+ transcoder: JsonTranscoder.new,
481
+ durability_level: :none,
482
+ timeout: nil,
483
+ retry_strategy: nil,
484
+ client_context: nil,
485
+ parent_span: nil)
486
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
487
+ @expiry = expiry
488
+ @transcoder = transcoder
489
+ @durability_level = durability_level
490
+ yield self if block_given?
491
+ end
492
+
493
+ # @api private
494
+ def to_backend
495
+ {
496
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
497
+ expiry: @expiry.respond_to?(:in_seconds) ? @expiry.public_send(:in_seconds) : @expiry,
498
+ durability_level: @durability_level,
499
+ }
500
+ end
501
+ end
502
+
503
+ # Options for {Collection#upsert}
504
+ class Upsert < Base
505
+ attr_accessor :expiry # @return [Integer, #in_seconds, nil]
506
+ attr_accessor :transcoder # @return [JsonTranscoder, #encode(Object)]
507
+ attr_accessor :durability_level # @return [Symbol]
508
+
509
+ # Creates an instance of options for {Collection#upsert}
510
+ #
511
+ # @param [Integer, #in_seconds, nil] expiry expiration time to associate with the document
512
+ # @param [JsonTranscoder, #encode(Object)] transcoder used for encoding
513
+ # @param [Symbol] durability_level level of durability
514
+ # +:none+::
515
+ # no enhanced durability required for the mutation
516
+ # +:majority+::
517
+ # the mutation must be replicated to a majority of the Data Service nodes
518
+ # (that is, held in the memory allocated to the bucket)
519
+ # +:majority_and_persist_to_active+::
520
+ # The mutation must be replicated to a majority of the Data Service nodes.
521
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
522
+ # node hosting the active partition (vBucket) for the data.
523
+ # +:persist_to_majority+::
524
+ # The mutation must be persisted to a majority of the Data Service nodes.
525
+ # Accordingly, it will be written to disk on those nodes.
526
+ #
527
+ # @param [Integer, #in_milliseconds, nil] timeout
528
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
529
+ # @param [Hash, nil] client_context the client context data, if set
530
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
531
+ #
532
+ # @yieldparam [Upsert]
533
+ def initialize(expiry: nil,
534
+ transcoder: JsonTranscoder.new,
535
+ durability_level: :none,
536
+ timeout: nil,
537
+ retry_strategy: nil,
538
+ client_context: nil,
539
+ parent_span: nil)
540
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
541
+ @expiry = expiry
542
+ @transcoder = transcoder
543
+ @durability_level = durability_level
544
+ yield self if block_given?
545
+ end
546
+
547
+ def to_backend
548
+ {
549
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
550
+ expiry: @expiry.respond_to?(:in_seconds) ? @expiry.public_send(:in_seconds) : @expiry,
551
+ durability_level: @durability_level,
552
+ }
553
+ end
554
+ end
555
+
556
+ # Options for {Collection#upsert_multi}
557
+ class UpsertMulti < Base
558
+ attr_accessor :expiry # @return [Integer, #in_seconds, nil]
559
+ attr_accessor :transcoder # @return [JsonTranscoder, #encode(Object)]
560
+ attr_accessor :durability_level # @return [Symbol]
561
+
562
+ # Creates an instance of options for {Collection#upsert}
563
+ #
564
+ # @param [Integer, #in_seconds, nil] expiry expiration time to associate with the document
565
+ # @param [JsonTranscoder, #encode(Object)] transcoder used for encoding
566
+ # @param [Symbol] durability_level level of durability
567
+ # +:none+::
568
+ # no enhanced durability required for the mutation
569
+ # +:majority+::
570
+ # the mutation must be replicated to a majority of the Data Service nodes
571
+ # (that is, held in the memory allocated to the bucket)
572
+ # +:majority_and_persist_to_active+::
573
+ # The mutation must be replicated to a majority of the Data Service nodes.
574
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
575
+ # node hosting the active partition (vBucket) for the data.
576
+ # +:persist_to_majority+::
577
+ # The mutation must be persisted to a majority of the Data Service nodes.
578
+ # Accordingly, it will be written to disk on those nodes.
579
+ #
580
+ # @param [Integer, #in_milliseconds, nil] timeout
581
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
582
+ # @param [Hash, nil] client_context the client context data, if set
583
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
584
+ #
585
+ # @yieldparam [Upsert]
586
+ def initialize(expiry: nil,
587
+ transcoder: JsonTranscoder.new,
588
+ durability_level: :none,
589
+ timeout: nil,
590
+ retry_strategy: nil,
591
+ client_context: nil,
592
+ parent_span: nil)
593
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
594
+ @expiry = expiry
595
+ @transcoder = transcoder
596
+ @durability_level = durability_level
597
+ yield self if block_given?
598
+ end
599
+
600
+ def to_backend
601
+ {
602
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
603
+ expiry: @expiry.respond_to?(:in_seconds) ? @expiry.public_send(:in_seconds) : @expiry,
604
+ durability_level: @durability_level,
605
+ }
606
+ end
607
+ end
608
+
609
+ # Options for {Collection#replace}
610
+ class Replace < Base
611
+ attr_accessor :expiry # @return [Integer, #in_seconds, nil]
612
+ attr_accessor :transcoder # @return [JsonTranscoder, #encode(Object)]
613
+ attr_accessor :cas # @return [Integer, nil]
614
+ attr_accessor :durability_level # @return [Symbol]
615
+
616
+ # Creates an instance of options for {Collection#replace}
617
+ #
618
+ # @param [Integer, #in_seconds, nil] expiry expiration time to associate with the document
619
+ # @param [JsonTranscoder, #encode(Object)] transcoder used for encoding
620
+ # @param [Integer, nil] cas a CAS value that will be taken into account on the server side for optimistic concurrency
621
+ # @param [Symbol] durability_level level of durability
622
+ # +:none+::
623
+ # no enhanced durability required for the mutation
624
+ # +:majority+::
625
+ # the mutation must be replicated to a majority of the Data Service nodes
626
+ # (that is, held in the memory allocated to the bucket)
627
+ # +:majority_and_persist_to_active+::
628
+ # The mutation must be replicated to a majority of the Data Service nodes.
629
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
630
+ # node hosting the active partition (vBucket) for the data.
631
+ # +:persist_to_majority+::
632
+ # The mutation must be persisted to a majority of the Data Service nodes.
633
+ # Accordingly, it will be written to disk on those nodes.
634
+ #
635
+ # @param [Integer, #in_milliseconds, nil] timeout
636
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
637
+ # @param [Hash, nil] client_context the client context data, if set
638
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
639
+ #
640
+ # @yieldparam [Replace]
641
+ def initialize(expiry: nil,
642
+ transcoder: JsonTranscoder.new,
643
+ cas: nil,
644
+ durability_level: :none,
645
+ timeout: nil,
646
+ retry_strategy: nil,
647
+ client_context: nil,
648
+ parent_span: nil)
649
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
650
+ @expiry = expiry
651
+ @transcoder = transcoder
652
+ @cas = cas
653
+ @durability_level = durability_level
654
+ yield self if block_given?
655
+ end
656
+
657
+ def to_backend
658
+ {
659
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
660
+ expiry: @expiry.respond_to?(:in_seconds) ? @expiry.public_send(:in_seconds) : @expiry,
661
+ durability_level: @durability_level,
662
+ cas: @cas,
663
+ }
664
+ end
665
+ end
666
+
667
+ # Options for {Collection#mutate_in}
668
+ class MutateIn < Base
669
+ attr_accessor :expiry # @return [Integer, #in_seconds, nil]
670
+ attr_accessor :store_semantics # @return [Symbol]
671
+ attr_accessor :cas # @return [Integer, nil]
672
+ attr_accessor :access_deleted # @return [Boolean]
673
+ attr_accessor :create_as_deleted # @return [Boolean]
674
+ attr_accessor :durability_level # @return [Symbol]
675
+ attr_accessor :transcoder # @return [JsonTranscoder, #encode(Object)]
676
+
677
+ # Creates an instance of options for {Collection#mutate_in}
678
+ #
679
+ # @param [Integer, #in_seconds, nil] expiry expiration time to associate with the document
680
+ # @param [Symbol] store_semantics describes how the outer document store semantics on subdoc should act
681
+ # +:replace+:: replace the document, fail if it does not exist. This is the default
682
+ # +:upsert+:: replace the document or create if it does not exist
683
+ # +:insert+:: create the document, fail if it exists
684
+ # @param [Integer, nil] cas a CAS value that will be taken into account on the server side for optimistic concurrency
685
+ # @param [Boolean] access_deleted for internal use only: allows access to deleted documents that are in "tombstone" form
686
+ # @param [Boolean] create_as_deleted for internal use only: allows creating documents in "tombstone" form
687
+ # @param [Symbol] durability_level level of durability
688
+ # +:none+::
689
+ # no enhanced durability required for the mutation
690
+ # +:majority+::
691
+ # the mutation must be replicated to a majority of the Data Service nodes
692
+ # (that is, held in the memory allocated to the bucket)
693
+ # +:majority_and_persist_to_active+::
694
+ # The mutation must be replicated to a majority of the Data Service nodes.
695
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
696
+ # node hosting the active partition (vBucket) for the data.
697
+ # +:persist_to_majority+::
698
+ # The mutation must be persisted to a majority of the Data Service nodes.
699
+ # Accordingly, it will be written to disk on those nodes.
700
+ # @param [JsonTranscoder, #encode(Object)] transcoder used for encoding
701
+ #
702
+ # @param [Integer, #in_milliseconds, nil] timeout
703
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
704
+ # @param [Hash, nil] client_context the client context data, if set
705
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
706
+ #
707
+ # @yieldparam [MutateIn]
708
+ def initialize(expiry: nil,
709
+ store_semantics: :replace,
710
+ cas: nil,
711
+ access_deleted: false,
712
+ create_as_deleted: false,
713
+ durability_level: :none,
714
+ transcoder: JsonTranscoder.new,
715
+ timeout: nil,
716
+ retry_strategy: nil,
717
+ client_context: nil,
718
+ parent_span: nil)
719
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
720
+ @expiry = expiry
721
+ @store_semantics = store_semantics
722
+ @cas = cas
723
+ @access_deleted = access_deleted
724
+ @create_as_deleted = create_as_deleted
725
+ @durability_level = durability_level
726
+ @transcoder = transcoder
727
+ yield self if block_given?
728
+ end
729
+
730
+ # @api private
731
+ def to_backend
732
+ {
733
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
734
+ expiry: @expiry.respond_to?(:in_seconds) ? @expiry.public_send(:in_seconds) : @expiry,
735
+ durability_level: @durability_level,
736
+ cas: @cas,
737
+ store_semantics: @store_semantics,
738
+ access_deleted: @access_deleted,
739
+ create_as_deleted: @create_as_deleted,
740
+ }
741
+ end
742
+ end
743
+
744
+ # Options for {Collection#lookup_in}
745
+ class LookupIn < Base
746
+ attr_accessor :access_deleted # @return [Boolean]
747
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
748
+
749
+ # Creates an instance of options for {Collection#lookup_in}
750
+ #
751
+ # @param [Boolean] access_deleted for internal use only: allows access to deleted documents that are in "tombstone" form
752
+ # @param [JsonTranscoder, #decode(String)] transcoder used for encoding
753
+ #
754
+ # @param [Integer, #in_milliseconds, nil] timeout
755
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
756
+ # @param [Hash, nil] client_context the client context data, if set
757
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
758
+ #
759
+ # @yieldparam [LookupIn] self
760
+ def initialize(access_deleted: false,
761
+ transcoder: JsonTranscoder.new,
762
+ timeout: nil,
763
+ retry_strategy: nil,
764
+ client_context: nil,
765
+ parent_span: nil)
766
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
767
+ @access_deleted = access_deleted
768
+ @transcoder = transcoder
769
+ yield self if block_given?
770
+ end
771
+
772
+ # @api private
773
+ def to_backend
774
+ {
775
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
776
+ access_deleted: @access_deleted,
777
+ }
778
+ end
779
+ end
780
+
781
+ # Options for {BinaryCollection#append}
782
+ class Append < Base
783
+ attr_accessor :cas # @return [Integer]
784
+
785
+ # Creates an instance of options for {BinaryCollection#append}
786
+ #
787
+ # @param [Integer] cas The default CAS used (0 means no CAS in this context)
788
+ #
789
+ # @param [Integer, #in_milliseconds, nil] timeout
790
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
791
+ # @param [Hash, nil] client_context the client context data, if set
792
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
793
+ #
794
+ # @yieldparam [Append] self
795
+ def initialize(cas: nil,
796
+ timeout: nil,
797
+ retry_strategy: nil,
798
+ client_context: nil,
799
+ parent_span: nil)
800
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
801
+ @cas = cas
802
+ yield self if block_given?
803
+ end
804
+
805
+ # @api private
806
+ def to_backend
807
+ {
808
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
809
+ cas: @cas,
810
+ }
811
+ end
812
+ end
813
+
814
+ # Options for {BinaryCollection#prepend}
815
+ class Prepend < Base
816
+ # @return [Integer] The default CAS used (0 means no CAS in this context)
817
+ attr_accessor :cas
818
+
819
+ # Creates an instance of options for {BinaryCollection#prepend}
820
+ #
821
+ # @param [Integer] cas The default CAS used (0 means no CAS in this context)
822
+ #
823
+ # @param [Integer, #in_milliseconds, nil] timeout
824
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
825
+ # @param [Hash, nil] client_context the client context data, if set
826
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
827
+ #
828
+ # @yieldparam [Prepend] self
829
+ def initialize(cas: nil,
830
+ timeout: nil,
831
+ retry_strategy: nil,
832
+ client_context: nil,
833
+ parent_span: nil)
834
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
835
+ @cas = cas
836
+ yield self if block_given?
837
+ end
838
+
839
+ # @api private
840
+ def to_backend
841
+ {
842
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
843
+ cas: @cas,
844
+ }
845
+ end
846
+ end
847
+
848
+ # Options for {BinaryCollection#increment}
849
+ class Increment < Base
850
+ attr_reader :delta # @return [Integer]
851
+ attr_accessor :initial # @return [Integer]
852
+ attr_accessor :expiry # @return [Integer, #in_seconds]
853
+ attr_accessor :durability_level # @return [Symbol]
854
+
855
+ # Creates an instance of options for {BinaryCollection#increment}
856
+ #
857
+ # @param [Integer] delta the delta for the operation
858
+ # @param [Integer] initial if present, holds the initial value
859
+ # @param [Integer, #in_seconds] expiry if set, holds the expiration for the operation
860
+ # @param [Symbol] durability_level level of durability
861
+ # +:none+::
862
+ # no enhanced durability required for the mutation
863
+ # +:majority+::
864
+ # the mutation must be replicated to a majority of the Data Service nodes
865
+ # (that is, held in the memory allocated to the bucket)
866
+ # +:majority_and_persist_to_active+::
867
+ # The mutation must be replicated to a majority of the Data Service nodes.
868
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
869
+ # node hosting the active partition (vBucket) for the data.
870
+ # +:persist_to_majority+::
871
+ # The mutation must be persisted to a majority of the Data Service nodes.
872
+ # Accordingly, it will be written to disk on those nodes.
873
+ #
874
+ # @param [Integer, #in_milliseconds, nil] timeout
875
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
876
+ # @param [Hash, nil] client_context the client context data, if set
877
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
878
+ #
879
+ # @yieldparam [Increment] self
880
+ def initialize(delta: 1,
881
+ initial: nil,
882
+ expiry: nil,
883
+ durability_level: :none,
884
+ timeout: nil,
885
+ retry_strategy: nil,
886
+ client_context: nil,
887
+ parent_span: nil)
888
+ raise ArgumentError, "the delta cannot be less than 0" if delta.negative?
889
+
890
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
891
+ @delta = delta
892
+ @initial = initial
893
+ @expiry = expiry
894
+ @durability_level = durability_level
895
+ yield self if block_given?
896
+ end
897
+
898
+ # @param [Integer] value delta for the operation
899
+ def delta=(value)
900
+ raise ArgumentError, "the delta cannot be less than 0" if delta.negative?
901
+
902
+ @delta = value
903
+ end
904
+
905
+ # @api private
906
+ def to_backend
907
+ {
908
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
909
+ delta: @delta,
910
+ initial_value: @initial,
911
+ expiry: @expiry.respond_to?(:in_seconds) ? @expiry.public_send(:in_seconds) : @expiry,
912
+ durability_level: @durability_level,
913
+ }
914
+ end
915
+ end
916
+
917
+ # Options for {BinaryCollection#decrement}
918
+ class Decrement < Base
919
+ attr_reader :delta # @return [Integer]
920
+ attr_accessor :initial # @return [Integer]
921
+ attr_accessor :expiry # @return [Integer, #in_seconds]
922
+ attr_accessor :durability_level # @return [Symbol]
923
+
924
+ # Creates an instance of options for {BinaryCollection#decrement}
925
+ #
926
+ # @param [Integer] delta the delta for the operation
927
+ # @param [Integer] initial if present, holds the initial value
928
+ # @param [Integer, #in_seconds] expiry if set, holds the expiration for the operation
929
+ # @param [Symbol] durability_level level of durability
930
+ # +:none+::
931
+ # no enhanced durability required for the mutation
932
+ # +:majority+::
933
+ # the mutation must be replicated to a majority of the Data Service nodes
934
+ # (that is, held in the memory allocated to the bucket)
935
+ # +:majority_and_persist_to_active+::
936
+ # The mutation must be replicated to a majority of the Data Service nodes.
937
+ # Additionally, it must be persisted (that is, written and synchronised to disk) on the
938
+ # node hosting the active partition (vBucket) for the data.
939
+ # +:persist_to_majority+::
940
+ # The mutation must be persisted to a majority of the Data Service nodes.
941
+ # Accordingly, it will be written to disk on those nodes.
942
+ #
943
+ # @param [Integer, #in_milliseconds, nil] timeout
944
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
945
+ # @param [Hash, nil] client_context the client context data, if set
946
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
947
+ #
948
+ # @yieldparam [Decrement] self
949
+ def initialize(delta: 1,
950
+ initial: nil,
951
+ expiry: nil,
952
+ durability_level: :none,
953
+ timeout: nil,
954
+ retry_strategy: nil,
955
+ client_context: nil,
956
+ parent_span: nil)
957
+ raise ArgumentError, "the delta cannot be less than 0" if delta.negative?
958
+
959
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
960
+ @delta = delta
961
+ @initial = initial
962
+ @expiry = expiry
963
+ @durability_level = durability_level
964
+ yield self if block_given?
965
+ end
966
+
967
+ # @param [Integer] value delta for the operation
968
+ def delta=(value)
969
+ raise ArgumentError, "the delta cannot be less than 0" if delta.negative?
970
+
971
+ @delta = value
972
+ end
973
+
974
+ # @api private
975
+ def to_backend
976
+ {
977
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
978
+ delta: @delta,
979
+ initial_value: @initial,
980
+ expiry: @expiry.respond_to?(:in_seconds) ? @expiry.public_send(:in_seconds) : @expiry,
981
+ durability_level: @durability_level,
982
+ }
983
+ end
984
+ end
985
+
986
+ # Options for {Datastructures::CouchbaseList#initialize}
987
+ class CouchbaseList
988
+ attr_accessor :get_options # @return [Get]
989
+ attr_accessor :remove_options # @return [Remove]
990
+ attr_accessor :lookup_in_options # @return [LookupIn]
991
+ attr_accessor :mutate_in_options # @return [MutateIn]
992
+
993
+ # Creates an instance of options for {CouchbaseList#initialize}
994
+ #
995
+ # @param [Get] get_options
996
+ # @param [Remove] remove_options
997
+ # @param [LookupIn] lookup_in_options
998
+ # @param [MutateIn] mutate_in_options
999
+ #
1000
+ # @yieldparam [CouchbaseList]
1001
+ def initialize(get_options: Get.new,
1002
+ remove_options: Remove.new,
1003
+ lookup_in_options: LookupIn.new,
1004
+ mutate_in_options: MutateIn.new(store_semantics: :upsert))
1005
+ @get_options = get_options
1006
+ @remove_options = remove_options
1007
+ @lookup_in_options = lookup_in_options
1008
+ @mutate_in_options = mutate_in_options
1009
+ yield self if block_given?
1010
+ end
1011
+ end
1012
+
1013
+ # Options for {Datastructures::CouchbaseMap#initialize}
1014
+ class CouchbaseMap
1015
+ attr_accessor :get_options # @return [Get]
1016
+ attr_accessor :remove_options # @return [Remove]
1017
+ attr_accessor :lookup_in_options # @return [LookupIn]
1018
+ attr_accessor :mutate_in_options # @return [MutateIn]
1019
+
1020
+ # Creates an instance of options for {CouchbaseMap#initialize}
1021
+ #
1022
+ # @param [Get] get_options
1023
+ # @param [Remove] remove_options
1024
+ # @param [LookupIn] lookup_in_options
1025
+ # @param [MutateIn] mutate_in_options
1026
+ #
1027
+ # @yieldparam [CouchbaseMap]
1028
+ def initialize(get_options: Get.new,
1029
+ remove_options: Remove.new,
1030
+ lookup_in_options: LookupIn.new,
1031
+ mutate_in_options: MutateIn.new(store_semantics: :upsert))
1032
+ @get_options = get_options
1033
+ @remove_options = remove_options
1034
+ @lookup_in_options = lookup_in_options
1035
+ @mutate_in_options = mutate_in_options
1036
+ yield self if block_given?
1037
+ end
1038
+ end
1039
+
1040
+ # Options for {Datastructures::CouchbaseQueue#initialize}
1041
+ class CouchbaseQueue
1042
+ attr_accessor :get_options # @return [Get]
1043
+ attr_accessor :remove_options # @return [Remove]
1044
+ attr_accessor :lookup_in_options # @return [LookupIn]
1045
+ attr_accessor :mutate_in_options # @return [MutateIn]
1046
+
1047
+ # Creates an instance of options for {CouchbaseQueue#initialize}
1048
+ #
1049
+ # @param [Get] get_options
1050
+ # @param [Remove] remove_options
1051
+ # @param [LookupIn] lookup_in_options
1052
+ # @param [MutateIn] mutate_in_options
1053
+ #
1054
+ # @yieldparam [CouchbaseQueue]
1055
+ def initialize(get_options: Get.new,
1056
+ remove_options: Remove.new,
1057
+ lookup_in_options: LookupIn.new,
1058
+ mutate_in_options: MutateIn.new(store_semantics: :upsert))
1059
+ @get_options = get_options
1060
+ @remove_options = remove_options
1061
+ @lookup_in_options = lookup_in_options
1062
+ @mutate_in_options = mutate_in_options
1063
+ yield self if block_given?
1064
+ end
1065
+ end
1066
+
1067
+ # Options for {Datastructures::CouchbaseSet#initialize}
1068
+ class CouchbaseSet
1069
+ attr_accessor :get_options # @return [Get]
1070
+ attr_accessor :remove_options # @return [Remove]
1071
+ attr_accessor :lookup_in_options # @return [LookupIn]
1072
+ attr_accessor :mutate_in_options # @return [MutateIn]
1073
+
1074
+ # Creates an instance of options for {CouchbaseSet#initialize}
1075
+ #
1076
+ # @param [Get] get_options
1077
+ # @param [Remove] remove_options
1078
+ # @param [LookupIn] lookup_in_options
1079
+ # @param [MutateIn] mutate_in_options
1080
+ #
1081
+ # @yieldparam [CouchbaseSet]
1082
+ def initialize(get_options: Get.new,
1083
+ remove_options: Remove.new,
1084
+ lookup_in_options: LookupIn.new,
1085
+ mutate_in_options: MutateIn.new(store_semantics: :upsert))
1086
+ @get_options = get_options
1087
+ @remove_options = remove_options
1088
+ @lookup_in_options = lookup_in_options
1089
+ @mutate_in_options = mutate_in_options
1090
+ yield self if block_given?
1091
+ end
1092
+ end
1093
+
1094
+ # Options for {Couchbase::Cluster.connect}
1095
+ class Cluster
1096
+ attr_accessor :authenticator # @return [PasswordAuthenticator, CertificateAuthenticator]
1097
+
1098
+ # Creates an instance of options for {Couchbase::Cluster.connect}
1099
+ #
1100
+ # @param [PasswordAuthenticator, CertificateAuthenticator] authenticator
1101
+ #
1102
+ # @yieldparam [Cluster] self
1103
+ def initialize(authenticator: nil)
1104
+ @authenticator = authenticator
1105
+ yield self if block_given?
1106
+ end
1107
+
1108
+ # @param [String] username
1109
+ # @param [String] password
1110
+ def authenticate(username, password)
1111
+ @authenticator = PasswordAuthenticator.new(username, password)
1112
+ end
1113
+ end
1114
+
1115
+ # Options for {Couchbase::Cluster#diagnostics}
1116
+ class Diagnostics
1117
+ attr_accessor :report_id # @return [String]
1118
+
1119
+ # Creates an instance of options for {Couchbase::Cluster#diagnostics}
1120
+ #
1121
+ # @param [String] report_id Holds custom report ID.
1122
+ #
1123
+ # @yieldparam [Diagnostics] self
1124
+ def initialize(report_id: nil)
1125
+ @report_id = report_id
1126
+ yield self if block_given?
1127
+ end
1128
+ end
1129
+
1130
+ # Options for {Couchbase::Bucket#ping}
1131
+ class Ping
1132
+ attr_accessor :report_id # @return [String]
1133
+ attr_accessor :service_types # @return [Array<Symbol>]
1134
+ attr_accessor :timeout # @return [Integer, #in_milliseconds]
1135
+
1136
+ # Creates an instance of options for {Couchbase::Bucket#ping}
1137
+ #
1138
+ # @param [String] report_id Holds custom report id.
1139
+ # @@param [Array<Symbol>] service_types The service types to limit this diagnostics request
1140
+ # @param [Integer, #in_milliseconds] timeout
1141
+ #
1142
+ # @yieldparam [Ping] self
1143
+ def initialize(report_id: nil,
1144
+ service_types: [:kv, :query, :analytics, :search, :views, :management],
1145
+ timeout: nil)
1146
+ @report_id = report_id
1147
+ @service_types = service_types
1148
+ @timeout = timeout
1149
+ yield self if block_given?
1150
+ end
1151
+
1152
+ # @api private
1153
+ def to_backend
1154
+ {
1155
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
1156
+ service_types: @service_types,
1157
+ report_id: @report_id,
1158
+ }
1159
+ end
1160
+ end
1161
+
1162
+ # Options for {Couchbase::Cluster#analytics_query}
1163
+ class Analytics < Base
1164
+ attr_accessor :client_context_id # @return [String]
1165
+ attr_accessor :scan_consistency # @return [Symbol]
1166
+ attr_accessor :readonly # @return [Boolean]
1167
+ attr_accessor :priority # @return [Boolean]
1168
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
1169
+
1170
+ # Creates new instance of options for {Couchbase::Cluster#analytics_query}
1171
+ #
1172
+ # @param [String] client_context_id provides a custom client context ID for this query
1173
+ # @param [Symbol] scan_consistency specifies level of consistency for the query
1174
+ # +:not_bounded+::
1175
+ # The index will return whatever state it has to the analytics query engine at the time of query.
1176
+ #
1177
+ # This is the default (for single-statement requests). No timestamp vector is used in the index scan.
1178
+ # This is also the fastest mode, because we avoid the cost of obtaining the vector, and we also avoid
1179
+ # any wait for the index
1180
+ # +:request_plus+::
1181
+ # The index will wait until all mutations have been processed at the time of request before being processed
1182
+ # in the analytics query engine.
1183
+ #
1184
+ # This implements strong consistency per request. Before processing the request, a current vector is obtained.
1185
+ # The vector is used as a lower bound for the statements in the request.
1186
+ # @param [Boolean] readonly allows explicitly marking a query as being readonly and not mutating any documents on
1187
+ # the server side.
1188
+ # @param [Boolean] priority allows to give certain requests higher priority than others
1189
+ # @param [JsonTranscoder] transcoder to decode rows
1190
+ # @param [Array<#to_json>, nil] positional_parameters parameters to be used as substitution for numbered macros
1191
+ # like +$1+, +$2+ in query string
1192
+ # @param [Hash<String => #to_json>, nil] named_parameters parameters to be used as substitution for named macros
1193
+ # like +$name+ in query string
1194
+ #
1195
+ # @param [Integer, #in_milliseconds, nil] timeout
1196
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
1197
+ # @param [Hash, nil] client_context the client context data, if set
1198
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
1199
+ #
1200
+ # @note Either +positional_parameters+ or +named_parameters+ may be specified.
1201
+ #
1202
+ # @yieldparam [Analytics] self
1203
+ def initialize(client_context_id: nil,
1204
+ scan_consistency: nil,
1205
+ readonly: false,
1206
+ priority: nil,
1207
+ transcoder: JsonTranscoder.new,
1208
+ positional_parameters: nil,
1209
+ named_parameters: nil,
1210
+ timeout: nil,
1211
+ retry_strategy: nil,
1212
+ client_context: nil,
1213
+ parent_span: nil)
1214
+ raise ArgumentError, "Cannot pass positional and named parameters at the same time" if positional_parameters && named_parameters
1215
+
1216
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
1217
+ @client_context_id = client_context_id
1218
+ @scan_consistency = scan_consistency
1219
+ @readonly = readonly
1220
+ @priority = priority
1221
+ @transcoder = transcoder
1222
+ @positional_parameters = positional_parameters
1223
+ @named_parameters = named_parameters
1224
+ @raw_parameters = {}
1225
+ yield self if block_given?
1226
+ end
1227
+
1228
+ # Sets positional parameters for the query
1229
+ #
1230
+ # @param [Array] positional the list of parameters that have to be substituted in the statement
1231
+ def positional_parameters(positional)
1232
+ @positional_parameters = positional
1233
+ @named_parameters = nil
1234
+ end
1235
+
1236
+ # Sets named parameters for the query
1237
+ #
1238
+ # @param [Hash] named the key/value map of the parameters to substitute in the statement
1239
+ def named_parameters(named)
1240
+ @named_parameters = named
1241
+ @positional_parameters = nil
1242
+ end
1243
+
1244
+ # Allows providing custom JSON key/value pairs for advanced usage
1245
+ #
1246
+ # @param [String] key the parameter name (key of the JSON property)
1247
+ # @param [Object] value the parameter value (value of the JSON property)
1248
+ def raw(key, value)
1249
+ @raw_parameters[key] = JSON.generate(value)
1250
+ end
1251
+
1252
+ # @api private
1253
+ def to_backend
1254
+ {
1255
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
1256
+ client_context_id: @client_context_id,
1257
+ scan_consistency: @scan_consistency,
1258
+ readonly: @readonly,
1259
+ priority: @priority,
1260
+ positional_parameters: export_positional_parameters,
1261
+ named_parameters: export_named_parameters,
1262
+ raw_parameters: @raw_parameters,
1263
+ }
1264
+ end
1265
+
1266
+ private
1267
+
1268
+ # @api private
1269
+ # @return [Array<String>, nil]
1270
+ def export_positional_parameters
1271
+ @positional_parameters&.map { |p| JSON.dump(p) }
1272
+ end
1273
+
1274
+ # @api private
1275
+ # @return [Hash<String => String>, nil]
1276
+ def export_named_parameters
1277
+ @named_parameters&.each_with_object({}) { |(n, v), o| o[n.to_s] = JSON.dump(v) }
1278
+ end
1279
+
1280
+ # @api private
1281
+ # @return [Hash<String => #to_json>]
1282
+ attr_reader :raw_parameters
1283
+ end
1284
+
1285
+ # Options for {Couchbase::Cluster#query}
1286
+ class Query < Base
1287
+ attr_accessor :adhoc # @return [Boolean]
1288
+ attr_accessor :client_context_id # @return [String]
1289
+ attr_accessor :max_parallelism # @return [Integer]
1290
+ attr_accessor :readonly # @return [Boolean]
1291
+ attr_accessor :scan_wait # @return [Integer, #in_milliseconds]
1292
+ attr_accessor :scan_cap # @return [Integer]
1293
+ attr_accessor :pipeline_batch # @return [Integer]
1294
+ attr_accessor :pipeline_cap # @return [Integer]
1295
+ attr_accessor :metrics # @return [Boolean]
1296
+ attr_accessor :profile # @return [Symbol]
1297
+ attr_accessor :flex_index # @return [Boolean]
1298
+ attr_accessor :scope_qualifier # @return [String]
1299
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
1300
+
1301
+ # Creates new instance of options for {Couchbase::Cluster#query}
1302
+ #
1303
+ # @param [Boolean] adhoc allows turning this request into a prepared statement query
1304
+ # @param [String, nil] client_context_id provides a custom client context ID for this query
1305
+ # @param [Integer, nil] max_parallelism allows overriding the default maximum parallelism for the query execution
1306
+ # on the server side.
1307
+ # @param [Boolean, nil] readonly allows explicitly marking a query as being readonly and not mutating any
1308
+ # documents on the server side.
1309
+ # @param [Integer, #in_milliseconds, nil] scan_wait The maximum duration (in milliseconds) the query engine
1310
+ # is willing to wait before failing. Allows customizing how long (in milliseconds) the query engine is willing
1311
+ # to wait until the index catches up to whatever scan consistency is asked for in this query. Note that if
1312
+ # +:not_bounded+ consistency level is used, this method doesn't do anything at all. If no value is provided to
1313
+ # this method, the server default is used.
1314
+ # @param [Integer, nil] scan_cap customize the maximum buffered channel size between the indexer and the query
1315
+ # service
1316
+ # @param [Integer, nil] pipeline_cap customize the number of items execution operators can batch for fetch
1317
+ # from the Key Value layer on the server.
1318
+ # @param [Integer, nil] pipeline_batch customize the maximum number of items each execution operator can buffer
1319
+ # between various operators on the server.
1320
+ # @param [Boolean, nil] metrics enables per-request metrics in the trailing section of the query
1321
+ # @param [Symbol] profile customize server profile level for this query
1322
+ # +:off+::
1323
+ # No profiling information is added to the query response
1324
+ # +:phases+::
1325
+ # The query response includes a profile section with stats and details about various phases of the query plan
1326
+ # and execution. Three phase times will be included in the +system:active_requests+ and
1327
+ # +system:completed_requests+ monitoring keyspaces.
1328
+ # +:timings+::
1329
+ # Besides the phase times, the profile section of the query response document will include a full query plan
1330
+ # with timing and information about the number of processed documents at each phase. This information will be
1331
+ # included in the system:active_requests and system:completed_requests keyspaces.
1332
+ # @param [Symbol, nil] scan_consistency Sets the mutation tokens this query should be consistent with. Overrides
1333
+ # +mutation_state+.
1334
+ # +:not_bounded+::
1335
+ # The indexer will return whatever state it has to the query engine at the time of query. This is the default
1336
+ # (for single-statement requests).
1337
+ # +:request_plus+::
1338
+ # The indexer will wait until all mutations have been processed at the time of request before returning to
1339
+ # the query engine.
1340
+ # @return [Boolean, nil] flex_index Tells the query engine to use a flex index (utilizing the search service)
1341
+ # @param [String, nil] scope_qualifier Associate scope qualifier (also known as +query_context+) with the query.
1342
+ # The qualifier must be in form +{bucket_name}.{scope_name}+ or +default:{bucket_name}.{scope_name}+.
1343
+ # @param [JsonTranscoder] transcoder to decode rows
1344
+ # @param [Array<#to_json>, nil] positional_parameters parameters to be used as substitution for numbered macros
1345
+ # like +$1+, +$2+ in query string
1346
+ # @param [Hash<String => #to_json>, nil] named_parameters parameters to be used as substitution for named macros
1347
+ # like +$name+ in query string.
1348
+ #
1349
+ # @param [MutationState, nil] mutation_state Sets the mutation tokens this query should be consistent with.
1350
+ # Overrides +scan_consistency+.
1351
+ #
1352
+ # @param [Integer, #in_milliseconds, nil] timeout
1353
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
1354
+ # @param [Hash, nil] client_context the client context data, if set
1355
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
1356
+ #
1357
+ # @note Either +positional_parameters+ or +named_parameters+ may be specified.
1358
+ #
1359
+ # @yieldparam [Query] self
1360
+ def initialize(adhoc: true,
1361
+ client_context_id: nil,
1362
+ max_parallelism: nil,
1363
+ readonly: false,
1364
+ scan_wait: nil,
1365
+ scan_cap: nil,
1366
+ pipeline_cap: nil,
1367
+ pipeline_batch: nil,
1368
+ metrics: nil,
1369
+ profile: :off,
1370
+ flex_index: nil,
1371
+ scope_qualifier: nil,
1372
+ scan_consistency: :not_bounded,
1373
+ mutation_state: nil,
1374
+ transcoder: JsonTranscoder.new,
1375
+ positional_parameters: nil,
1376
+ named_parameters: nil,
1377
+ timeout: nil,
1378
+ retry_strategy: nil,
1379
+ client_context: nil,
1380
+ parent_span: nil)
1381
+ raise ArgumentError, "Cannot pass positional and named parameters at the same time" if positional_parameters && named_parameters
1382
+
1383
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
1384
+ @adhoc = adhoc
1385
+ @client_context_id = client_context_id
1386
+ @max_parallelism = max_parallelism
1387
+ @readonly = readonly
1388
+ @scan_wait = scan_wait
1389
+ @scan_cap = scan_cap
1390
+ @pipeline_cap = pipeline_cap
1391
+ @pipeline_batch = pipeline_batch
1392
+ @metrics = metrics
1393
+ @profile = profile
1394
+ @flex_index = flex_index
1395
+ @scope_qualifier = scope_qualifier
1396
+ @scan_consistency = scan_consistency
1397
+ @mutation_state = mutation_state
1398
+ @transcoder = transcoder
1399
+ @positional_parameters = positional_parameters
1400
+ @named_parameters = named_parameters
1401
+ @raw_parameters = {}
1402
+ yield self if block_given?
1403
+ end
1404
+
1405
+ # Allows providing custom JSON key/value pairs for advanced usage
1406
+ #
1407
+ # @param [String] key the parameter name (key of the JSON property)
1408
+ # @param [Object] value the parameter value (value of the JSON property)
1409
+ def raw(key, value)
1410
+ @raw_parameters[key] = JSON.generate(value)
1411
+ end
1412
+
1413
+ # Customizes the consistency guarantees for this query
1414
+ #
1415
+ # @note overrides consistency level set by {#consistent_with}
1416
+ #
1417
+ # [+:not_bounded+] The indexer will return whatever state it has to the query engine at the time of query. This is the default (for
1418
+ # single-statement requests).
1419
+ #
1420
+ # [+:request_plus+] The indexer will wait until all mutations have been processed at the time of request before returning to the query
1421
+ # engine.
1422
+ #
1423
+ # @param [:not_bounded, :request_plus] level the index scan consistency to be used for this query
1424
+ def scan_consistency=(level)
1425
+ @mutation_state = nil if @mutation_state
1426
+ @scan_consistency = level
1427
+ end
1428
+
1429
+ # Sets the mutation tokens this query should be consistent with
1430
+ #
1431
+ # @note overrides consistency level set by {#scan_consistency=}
1432
+ #
1433
+ # @param [MutationState] mutation_state the mutation state containing the mutation tokens
1434
+ def consistent_with(mutation_state)
1435
+ @scan_consistency = nil if @scan_consistency
1436
+ @mutation_state = mutation_state
1437
+ end
1438
+
1439
+ # Sets positional parameters for the query
1440
+ #
1441
+ # @param [Array] positional the list of parameters that have to be substituted in the statement
1442
+ def positional_parameters(positional)
1443
+ @positional_parameters = positional
1444
+ @named_parameters = nil
1445
+ end
1446
+
1447
+ # @api private
1448
+ # @return [Array<String>, nil]
1449
+ def export_positional_parameters
1450
+ @positional_parameters&.map { |p| JSON.dump(p) }
1451
+ end
1452
+
1453
+ # Sets named parameters for the query
1454
+ #
1455
+ # @param [Hash] named the key/value map of the parameters to substitute in the statement
1456
+ def named_parameters(named)
1457
+ @named_parameters = named
1458
+ @positional_parameters = nil
1459
+ end
1460
+
1461
+ # @api private
1462
+ # @return [Hash<String => String>, nil]
1463
+ def export_named_parameters
1464
+ @named_parameters&.each_with_object({}) { |(n, v), o| o[n.to_s] = JSON.dump(v) }
1465
+ end
1466
+
1467
+ # @api private
1468
+ # @return [MutationState]
1469
+ attr_reader :mutation_state
1470
+
1471
+ # @api private
1472
+ # @return [Hash<String => #to_json>]
1473
+ attr_reader :raw_parameters
1474
+
1475
+ # @api private
1476
+ def to_backend(scope_name: nil, bucket_name: nil)
1477
+ {
1478
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
1479
+ adhoc: @adhoc,
1480
+ client_context_id: @client_context_id,
1481
+ max_parallelism: @max_parallelism,
1482
+ readonly: @readonly,
1483
+ flex_index: @flex_index,
1484
+ scan_wait: @scan_wait.respond_to?(:in_milliseconds) ? @scan_wait.public_send(:in_milliseconds) : @scan_wait,
1485
+ scan_cap: @scan_cap,
1486
+ pipeline_batch: @pipeline_batch,
1487
+ pipeline_cap: @pipeline_cap,
1488
+ metrics: @metrics,
1489
+ profile: @profile,
1490
+ positional_parameters: export_positional_parameters,
1491
+ named_parameters: export_named_parameters,
1492
+ raw_parameters: @raw_parameters,
1493
+ scan_consistency: @scan_consistency,
1494
+ mutation_state: @mutation_state&.to_a,
1495
+ scope_qualifier: @scope_qualifier,
1496
+ scope_name: scope_name,
1497
+ bucket_name: bucket_name,
1498
+ }
1499
+ end
1500
+ end
1501
+
1502
+ # Options for {Couchbase::Cluster#search_query}
1503
+ class Search < Base
1504
+ attr_accessor :limit # @return [Integer]
1505
+ attr_accessor :skip # @return [Integer]
1506
+ attr_accessor :explain # @return [Boolean]
1507
+ attr_accessor :highlight_style # @return [Symbol]
1508
+ attr_accessor :highlight_fields # @return [Array<String>]
1509
+ attr_accessor :fields # @return [Array<String>]
1510
+ attr_accessor :disable_scoring # @return [Boolean]
1511
+ attr_accessor :sort # @return [Array<String, Cluster::SearchSort>]
1512
+ attr_accessor :facets # @return [Hash<String => Cluster::SearchFacet>]
1513
+ attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
1514
+
1515
+ # @param [Integer] limit limits the number of matches returned from the complete result set.
1516
+ # @param [Integer] skip indicates how many matches are skipped on the result set before starting to return the
1517
+ # matches
1518
+ # @param [Boolean] explain triggers inclusion of additional search result score explanations.
1519
+ # @param [:html, :ansi, nil] highlight_style the style of highlighting in the result excerpts (if not specified,
1520
+ # the server default will be used)
1521
+ # @param [Array<String>] highlight_fields list of the fields to highlight
1522
+ # @param [Array<String>] fields list of field values which should be retrieved for result documents, provided they
1523
+ # were stored while indexing
1524
+ # @param [MutationState] mutation_state the mutation tokens this query should be consistent with
1525
+ # @param [Boolean] disable_scoring If set to true, the server will not perform any scoring on the hits
1526
+ # @param [Array<String, Cluster::SearchSort>] sort Ordering rules to apply to the results. The list might contain
1527
+ # either strings or special objects, that derive from {Cluster::SearchSort}. In case of String, the value
1528
+ # represents the name of the field with optional +-+ in front of the name, which will turn on descending mode
1529
+ # for this field. One field is special is +"_score"+ which will sort results by their score. When nothing
1530
+ # specified, the Server will order results by their score descending, which is equivalent of +"-_score"+.
1531
+ # @param [Hash<String => Cluster::SearchFacet>] facets facets allow to aggregate information collected on a
1532
+ # particular result set
1533
+ # @param [JsonTranscoder, #decode(String)] transcoder to use for the results
1534
+ #
1535
+ # @param [Integer, #in_milliseconds, nil] timeout
1536
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
1537
+ # @param [Hash, nil] client_context the client context data, if set
1538
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
1539
+ #
1540
+ # @yieldparam [Search] self
1541
+ def initialize(limit: nil,
1542
+ skip: nil,
1543
+ explain: false,
1544
+ highlight_style: nil,
1545
+ highlight_fields: nil,
1546
+ fields: nil,
1547
+ mutation_state: nil,
1548
+ disable_scoring: false,
1549
+ sort: nil,
1550
+ facets: nil,
1551
+ transcoder: JsonTranscoder.new,
1552
+ timeout: nil,
1553
+ retry_strategy: nil,
1554
+ client_context: nil,
1555
+ parent_span: nil)
1556
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
1557
+ @limit = limit
1558
+ @skip = skip
1559
+ @explain = explain
1560
+ @highlight_style = highlight_style
1561
+ @highlight_fields = highlight_fields
1562
+ @fields = fields
1563
+ @disable_scoring = disable_scoring
1564
+ @sort = sort
1565
+ @facets = facets
1566
+ @transcoder = transcoder
1567
+ @scan_consistency = :not_bounded
1568
+ @mutation_state = mutation_state
1569
+ yield self if block_given?
1570
+ end
1571
+
1572
+ # Sets the mutation tokens this query should be consistent with
1573
+ #
1574
+ # @note overrides consistency level set by {#scan_consistency=}
1575
+ #
1576
+ # @param [MutationState] mutation_state the mutation state containing the mutation tokens
1577
+ #
1578
+ # @return [void]
1579
+ def consistent_with(mutation_state)
1580
+ @scan_consistency = nil if @scan_consistency
1581
+ @mutation_state = mutation_state
1582
+ end
1583
+
1584
+ # Customizes the consistency guarantees for this query
1585
+ #
1586
+ # @note overrides consistency level set by {#consistent_with}
1587
+ #
1588
+ # @param [:not_bounded] level the scan consistency to be used for this query
1589
+ # +:not_bounded+:: The engine will return whatever state it has at the time of query
1590
+ #
1591
+ # @return [void]
1592
+ def scan_consistency=(level)
1593
+ @mutation_state = nil if @mutation_state
1594
+ @scan_consistency = level
1595
+ end
1596
+
1597
+ # @api private
1598
+ # @return [MutationState]
1599
+ attr_reader :mutation_state
1600
+
1601
+ # @api private
1602
+ # @return [Symbol
1603
+ attr_reader :scan_consistency
1604
+
1605
+ # @api private
1606
+ def to_backend
1607
+ {
1608
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
1609
+ limit: @limit,
1610
+ skip: @skip,
1611
+ explain: @explain,
1612
+ disable_scoring: @disable_scoring,
1613
+ highlight_style: @highlight_style,
1614
+ highlight_fields: @highlight_fields,
1615
+ fields: @fields,
1616
+ sort: @sort&.map { |v| JSON.generate(v) },
1617
+ facets: @facets&.map { |(k, v)| [k, JSON.generate(v)] },
1618
+ scan_consistency: @scan_consistency,
1619
+ mutation_state: @mutation_state&.to_a,
1620
+ }
1621
+ end
1622
+ end
1623
+
1624
+ # Options for {Couchbase::Cluster#view_query}
1625
+ class View < Base
1626
+ attr_accessor :scan_consistency # @return [Symbol]
1627
+ attr_accessor :namespace # @return [Symbol]
1628
+ attr_accessor :skip # @return [Integer]
1629
+ attr_accessor :limit # @return [Integer]
1630
+ attr_accessor :start_key # @return [#to_json, nil]
1631
+ attr_accessor :end_key # @return [#to_json, nil]
1632
+ attr_accessor :start_key_doc_id # @return [String, nil]
1633
+ attr_accessor :end_key_doc_id # @return [String, nil]
1634
+ attr_accessor :inclusive_end # @return [Boolean, nil]
1635
+ attr_accessor :group # @return [Boolean, nil]
1636
+ attr_accessor :group_level # @return [Integer, nil]
1637
+ attr_accessor :key # @return [#to_json, nil]
1638
+ attr_accessor :keys # @return [Array<#to_json>, nil]
1639
+ attr_accessor :order # @return [Symbol, nil]
1640
+ attr_accessor :reduce # @return [Boolean, nil]
1641
+ attr_accessor :on_error # @return [Symbol, nil]
1642
+ attr_accessor :debug # @return [Boolean, nil]
1643
+
1644
+ # @param [:not_bounded, :request_plus, :update_after] scan_consistency Specifies the level of consistency for the query
1645
+ # @param [:production, :development] namespace
1646
+ # @param [Integer, nil] skip Specifies the number of results to skip from the start of the result set
1647
+ # @param [Integer, nil] limit Specifies the maximum number of results to return
1648
+ # @param [#to_json, nil] start_key Specifies the key, to which the engine has to skip before result generation
1649
+ # @param [#to_json, nil] end_key Specifies the key, at which the result generation has to be stopped
1650
+ # @param [String, nil] start_key_doc_id Specifies the document id in case {#start_key} gives multiple results within the index
1651
+ # @param [String, nil] end_key_doc_id Specifies the document id in case {#end_key} gives multiple results within the index
1652
+ # @param [Boolean, nil] inclusive_end Specifies whether the {#end_key}/#{#end_key_doc_id} values should be inclusive
1653
+ # @param [Boolean, nil] group Specifies whether to enable grouping of the results
1654
+ # @param [Integer, nil] group_level Specifies the depth within the key to group the results
1655
+ # @param [#to_json, nil] key Specifies the key to fetch from the index
1656
+ # @param [Array<#to_json>, nil] keys Specifies set of the keys to fetch from the index
1657
+ # @param [:ascending, :descending, nil] order Specifies the order of the results that should be returned
1658
+ # @param [Boolean, nil] reduce Specifies whether to enable the reduction function associated with this particular
1659
+ # view index
1660
+ # @param [:stop, :continue, nil] on_error Specifies the behaviour of the view engine should an error occur during
1661
+ # the gathering of view index results which would result in only partial results being available
1662
+ # @param [Boolean, nil] debug allows to return debug information as part of the view response
1663
+ #
1664
+ # @param [Integer, #in_milliseconds, nil] timeout
1665
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
1666
+ # @param [Hash, nil] client_context the client context data, if set
1667
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
1668
+ #
1669
+ # @yieldparam [View] self
1670
+ def initialize(scan_consistency: :not_bounded,
1671
+ namespace: :production,
1672
+ skip: nil,
1673
+ limit: nil,
1674
+ start_key: nil,
1675
+ end_key: nil,
1676
+ start_key_doc_id: nil,
1677
+ end_key_doc_id: nil,
1678
+ inclusive_end: nil,
1679
+ group: nil,
1680
+ group_level: nil,
1681
+ key: nil,
1682
+ keys: nil,
1683
+ order: nil,
1684
+ reduce: nil,
1685
+ on_error: nil,
1686
+ debug: false,
1687
+ timeout: nil,
1688
+ retry_strategy: nil,
1689
+ client_context: nil,
1690
+ parent_span: nil)
1691
+ super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
1692
+
1693
+ @scan_consistency = scan_consistency
1694
+ @namespace = namespace
1695
+ @skip = skip
1696
+ @limit = limit
1697
+ @start_key = start_key
1698
+ @end_key = end_key
1699
+ @start_key_doc_id = start_key_doc_id
1700
+ @end_key_doc_id = end_key_doc_id
1701
+ @inclusive_end = inclusive_end
1702
+ @group = group
1703
+ @group_level = group_level
1704
+ @key = key
1705
+ @keys = keys
1706
+ @order = order
1707
+ @reduce = reduce
1708
+ @on_error = on_error
1709
+ @debug = debug
1710
+ yield self if block_given?
1711
+ end
1712
+
1713
+ # Allows providing custom JSON key/value pairs for advanced usage
1714
+ #
1715
+ # @param [String] key the parameter name (key of the JSON property)
1716
+ # @param [Object] value the parameter value (value of the JSON property)
1717
+ def raw(key, value)
1718
+ @raw_parameters[key] = JSON.generate(value)
1719
+ end
1720
+
1721
+ # @api private
1722
+ def to_backend
1723
+ {
1724
+ timeout: @timeout.respond_to?(:in_milliseconds) ? @timeout.public_send(:in_milliseconds) : @timeout,
1725
+ scan_consistency: @scan_consistency,
1726
+ skip: @skip,
1727
+ limit: @limit,
1728
+ start_key: (JSON.generate(@start_key) unless @start_key.nil?),
1729
+ end_key: (JSON.generate(@end_key) unless @end_key.nil?),
1730
+ start_key_doc_id: @start_key_doc_id,
1731
+ end_key_doc_id: @end_key_doc_id,
1732
+ inclusive_end: @inclusive_end,
1733
+ group: @group,
1734
+ group_level: @group_level,
1735
+ key: (JSON.generate(@key) unless @key.nil?),
1736
+ keys: @keys&.map { |key| JSON.generate(key) },
1737
+ order: @order,
1738
+ reduce: @reduce,
1739
+ on_error: @on_error,
1740
+ debug: @debug,
1741
+ }
1742
+ end
1743
+ end
1744
+
1745
+ # @api private
1746
+ # TODO: deprecate in 3.1
1747
+ CommonOptions = ::Couchbase::Options::Base
1748
+
1749
+ # rubocop:disable Naming/MethodName constructor shortcuts
1750
+ module_function
1751
+
1752
+ # Construct {Get} options for {Collection#get}
1753
+ #
1754
+ # @example Get partial document using projections
1755
+ # res = collection.get("customer123", Options::Get(projections: ["name", "addresses.billing"]))
1756
+ # res.content
1757
+ #
1758
+ # # {"addresses"=>
1759
+ # # {"billing"=>
1760
+ # # {"country"=>"United Kingdom",
1761
+ # # "line1"=>"123 Any Street",
1762
+ # # "line2"=>"Anytown"}},
1763
+ # # "name"=>"Douglas Reynholm"}
1764
+ #
1765
+ # @return [Get]
1766
+ def Get(**args)
1767
+ Get.new(**args)
1768
+ end
1769
+
1770
+ # Construct {GetMulti} options for {Collection#get_multi}
1771
+ #
1772
+ # @example Fetch "foo" and "bar" in a batch
1773
+ # res = collection.get(["foo", "bar"], Options::GetMulti(timeout: 3_000))
1774
+ # res[0].content #=> content of "foo"
1775
+ # res[1].content #=> content of "bar"
1776
+ #
1777
+ # @return [GetMulti]
1778
+ def GetMulti(**args)
1779
+ GetMulti.new(**args)
1780
+ end
1781
+
1782
+ # Construct {GetAndLock} options for {Collection#get_and_lock}
1783
+ #
1784
+ # @example Retrieve document and lock for 10 seconds
1785
+ # collection.get_and_lock("customer123", 10, Options::GetAndLock(timeout: 3_000))
1786
+ #
1787
+ # @return [GetAndLock]
1788
+ def GetAndLock(**args)
1789
+ GetAndLock.new(**args)
1790
+ end
1791
+
1792
+ # Construct {GetAndTouch} options for {Collection#get_and_touch}
1793
+ #
1794
+ # @example Retrieve document and prolong its expiration for 10 seconds
1795
+ # collection.get_and_touch("customer123", 10, Options::GetAndTouch(timeout: 3_000))
1796
+ #
1797
+ # @return [GetAndTouch]
1798
+ def GetAndTouch(**args)
1799
+ GetAndTouch.new(**args)
1800
+ end
1801
+
1802
+ # Construct {GetAllReplicas} options for {Collection#get_any_replica}
1803
+ #
1804
+ # @return [GetAllReplicas]
1805
+ def GetAllReplicas(**args)
1806
+ GetAllReplicas.new(**args)
1807
+ end
1808
+
1809
+ # Construct {GetAnyReplica} options for {Collection#get_all_replicas}
1810
+ #
1811
+ # @return [GetAnyReplica]
1812
+ def GetAnyReplica(**args)
1813
+ GetAnyReplica.new(**args)
1814
+ end
1815
+
1816
+ # Construct {Exists} options for {Collection#exists}
1817
+ #
1818
+ # @example Check if the document exists without fetching its contents
1819
+ # res = collection.exists("customer123", Options::Exists(timeout: 3_000))
1820
+ # res.exists? #=> true
1821
+ #
1822
+ # @return [Exists]
1823
+ def Exists(**args)
1824
+ Exists.new(**args)
1825
+ end
1826
+
1827
+ # Construct {Touch} options for {Collection#touch}
1828
+ #
1829
+ # @example Reset expiration timer for document to 30 seconds (and use custom operation timeout)
1830
+ # res = collection.touch("customer123", 30, Options::Touch(timeout: 3_000))
1831
+ #
1832
+ # @return [Touch]
1833
+ def Touch(**args)
1834
+ Touch.new(**args)
1835
+ end
1836
+
1837
+ # Construct {Unlock} options for {Collection#touch}
1838
+ #
1839
+ # @example Lock (pessimistically) and unlock document
1840
+ # res = collection.get_and_lock("customer123", 10, Options::Unlock(timeout: 3_000))
1841
+ # collection.unlock("customer123", res.cas)
1842
+ #
1843
+ # @return [Unlock]
1844
+ def Unlock(**args)
1845
+ Unlock.new(**args)
1846
+ end
1847
+
1848
+ # Construct {Remove} options for {Collection#remove}
1849
+ #
1850
+ # @example Remove the document in collection, but apply optimistic lock
1851
+ # res = collection.upsert("mydoc", {"foo" => 42})
1852
+ # res.cas #=> 7751414725654
1853
+ #
1854
+ # begin
1855
+ # res = collection.remove("customer123", Options::Remove(cas: 3735928559))
1856
+ # rescue Error::CasMismatch
1857
+ # puts "Failed to remove the document, it might be changed by other application"
1858
+ # end
1859
+ #
1860
+ # @return [Remove]
1861
+ def Remove(**args)
1862
+ Remove.new(**args)
1863
+ end
1864
+
1865
+ # Construct {RemoveMulti} options for {Collection#remove_multi}
1866
+ #
1867
+ # @example Remove two documents in collection. For "mydoc" apply optimistic lock
1868
+ # res = collection.upsert("mydoc", {"foo" => 42})
1869
+ # res.cas #=> 7751414725654
1870
+ #
1871
+ # res = collection.remove_multi(["foo", ["mydoc", res.cas]], Options::RemoveMulti(timeout: 3_000))
1872
+ # if res[1].error.is_a?(Error::CasMismatch)
1873
+ # puts "Failed to remove the document, it might be changed by other application"
1874
+ # end
1875
+ #
1876
+ # @return [RemoveMulti]
1877
+ def RemoveMulti(**args)
1878
+ RemoveMulti.new(**args)
1879
+ end
1880
+
1881
+ # Construct {Insert} options for {Collection#insert}
1882
+ #
1883
+ # @example Insert new document in collection
1884
+ # res = collection.insert("mydoc", {"foo" => 42}, Options::Insert(expiry: 20))
1885
+ # res.cas #=> 242287264414742
1886
+ #
1887
+ # @return [Insert]
1888
+ def Insert(**args)
1889
+ Insert.new(**args)
1890
+ end
1891
+
1892
+ # Construct {Upsert} options for {Collection#upsert}
1893
+ #
1894
+ # @example Upsert new document in collection
1895
+ # res = collection.upsert("mydoc", {"foo" => 42}, Options::Upsert(expiry: 20))
1896
+ # res.cas #=> 242287264414742
1897
+ #
1898
+ # @return [Upsert]
1899
+ def Upsert(**args)
1900
+ Upsert.new(**args)
1901
+ end
1902
+
1903
+ # Construct {UpsertMulti} options for {Collection#upsert_multi}
1904
+ #
1905
+ # @example Upsert two documents with IDs "foo" and "bar" into a collection with expiration 20 seconds.
1906
+ # res = collection.upsert_multi([
1907
+ # "foo", {"foo" => 42},
1908
+ # "bar", {"bar" => "some value"}
1909
+ # ], Options::UpsertMulti(expiry: 20))
1910
+ # res[0].cas #=> 7751414725654
1911
+ # res[1].cas #=> 7751418925851
1912
+ #
1913
+ # @return [UpsertMulti]
1914
+ def UpsertMulti(**args)
1915
+ UpsertMulti.new(**args)
1916
+ end
1917
+
1918
+ # Construct {Replace} options for {Collection#replace}
1919
+ #
1920
+ # @example Replace new document in collection with optimistic locking
1921
+ # res = collection.get("mydoc")
1922
+ # res = collection.replace("mydoc", {"foo" => 42}, Options::Replace(cas: res.cas))
1923
+ # res.cas #=> 242287264414742
1924
+ #
1925
+ # @return [Replace]
1926
+ def Replace(**args)
1927
+ Replace.new(**args)
1928
+ end
1929
+
1930
+ # Construct {MutateIn} options for {Collection#mutate_in}
1931
+ #
1932
+ # @example Append number into subarray of the document
1933
+ # mutation_specs = [
1934
+ # MutateInSpec::array_append("purchases.complete", [42])
1935
+ # ]
1936
+ # collection.mutate_in("customer123", mutation_specs, Options::MutateIn(expiry: 10))
1937
+ #
1938
+ # @return [MutateIn]
1939
+ def MutateIn(**args)
1940
+ MutateIn.new(**args)
1941
+ end
1942
+
1943
+ # Construct {LookupIn} options for {Collection#lookup_in}
1944
+ #
1945
+ # @example Get list of IDs of completed purchases
1946
+ # lookup_specs = [
1947
+ # LookupInSpec::get("purchases.complete")
1948
+ # ]
1949
+ # collection.lookup_in("customer123", lookup_specs, Options::LookupIn(timeout: 3_000))
1950
+ #
1951
+ # @return [LookupIn]
1952
+ def LookupIn(**args)
1953
+ LookupIn.new(**args)
1954
+ end
1955
+
1956
+ # Construct {Append} options for {BinaryCollection#append}
1957
+ #
1958
+ # @example Append "bar" to the content of the existing document
1959
+ # collection.upsert("mydoc", "foo")
1960
+ # collection.binary.append("mydoc", "bar", Options::Append(timeout: 3_000))
1961
+ # collection.get("mydoc", Options::Get(transcoder: nil)).content #=> "foobar"
1962
+ #
1963
+ # @return [Append]
1964
+ def Append(**args)
1965
+ Append.new(**args)
1966
+ end
1967
+
1968
+ # Construct {Prepend} options for {BinaryCollection#prepend}
1969
+ #
1970
+ # @example Prepend "bar" to the content of the existing document
1971
+ # collection.upsert("mydoc", "foo")
1972
+ # collection.binary.prepend("mydoc", "bar", Options::Prepend(timeout: 3_000))
1973
+ # collection.get("mydoc", Options::Get(transcoder: nil)).content #=> "barfoo"
1974
+ #
1975
+ # @return [Prepend]
1976
+ def Prepend(**args)
1977
+ Prepend.new(**args)
1978
+ end
1979
+
1980
+ # Construct {Diagnostics} options for {Cluster#diagnostics}
1981
+ #
1982
+ # @return [Diagnostics]
1983
+ def Diagnostics(**args)
1984
+ Diagnostics.new(**args)
1985
+ end
1986
+
1987
+ # Construct {Ping} options for {Bucket#ping}
1988
+ #
1989
+ # @return [Ping]
1990
+ def Ping(**args)
1991
+ Ping.new(**args)
1992
+ end
1993
+
1994
+ # Construct {Cluster} options for {Cluster.connect}
1995
+ #
1996
+ # @example Pass authenticator object to Options
1997
+ # Cluster.connect("couchbase://localhost",
1998
+ # Options::Cluster(authenticator: PasswordAuthenticator.new("Administrator", "password")))
1999
+ #
2000
+ # @example Shorter version, more useful for interactive sessions
2001
+ # Cluster.connect("couchbase://localhost", "Administrator", "password")
2002
+ #
2003
+ # @example Authentication with TLS client certificate (note +couchbases://+ schema)
2004
+ # Cluster.connect("couchbases://localhost?trust_certificate=/tmp/ca.pem",
2005
+ # Options::Cluster(authenticator: CertificateAuthenticator.new("/tmp/certificate.pem", "/tmp/private.key")))
2006
+ #
2007
+ # @see https://docs.couchbase.com/server/current/manage/manage-security/configure-client-certificates.html
2008
+ #
2009
+ # @return [Cluster]
2010
+ def Cluster(**args)
2011
+ Cluster.new(**args)
2012
+ end
2013
+
2014
+ # Construct {Increment} options for {BinaryCollection#increment}
2015
+ #
2016
+ # @example Increment value by 10, and initialize to 0 if it does not exist
2017
+ # res = collection.binary.increment("raw_counter", Options::Increment(delta: 10, initial: 0))
2018
+ # res.content #=> 0
2019
+ # res = collection.binary.increment("raw_counter", Options::Increment(delta: 10, initial: 0))
2020
+ # res.content #=> 10
2021
+ #
2022
+ # @return [Increment]
2023
+ def Increment(**args)
2024
+ Increment.new(**args)
2025
+ end
2026
+
2027
+ # Construct {Decrement} options for {BinaryCollection#decrement}
2028
+ #
2029
+ # @example Decrement value by 2, and initialize to 100 if it does not exist
2030
+ # res = collection.binary.decrement("raw_counter", Options::Decrement(delta: 2, initial: 100))
2031
+ # res.value #=> 100
2032
+ # res = collection.binary.decrement("raw_counter", Options::Decrement(delta: 2, initial: 100))
2033
+ # res.value #=> 98
2034
+ #
2035
+ # @return [Decrement]
2036
+ def Decrement(**args)
2037
+ Decrement.new(**args)
2038
+ end
2039
+
2040
+ # Construct {Analytics} options for {Cluster#analytics_query}
2041
+ #
2042
+ # @example Select name of the given user
2043
+ # cluster.analytics_query("SELECT u.name AS uname FROM GleambookUsers u WHERE u.id = $user_id ",
2044
+ # Options::Analytics(named_parameters: {user_id: 2}))
2045
+ #
2046
+ # @return [Analytics]
2047
+ def Analytics(**args)
2048
+ Analytics.new(**args)
2049
+ end
2050
+
2051
+ # Construct {Query} options for {Cluster#query}
2052
+ #
2053
+ # @example Select first ten hotels from travel sample dataset
2054
+ # cluster.query("SELECT * FROM `travel-sample` WHERE type = $type LIMIT 10",
2055
+ # Options::Query(named_parameters: {type: "hotel"}, metrics: true))
2056
+ #
2057
+ # @return [Query]
2058
+ def Query(**args)
2059
+ Query.new(**args)
2060
+ end
2061
+
2062
+ # Construct {Search} options for {Cluster#search_query}
2063
+ #
2064
+ # @example Return first 10 results of "hop beer" query and request highlighting
2065
+ # cluster.search_query("beer_index", Cluster::SearchQuery.match_phrase("hop beer"),
2066
+ # Options::Search(
2067
+ # limit: 10,
2068
+ # fields: %w[name],
2069
+ # highlight_style: :html,
2070
+ # highlight_fields: %w[name description]
2071
+ # ))
2072
+ #
2073
+ # @return [Search]
2074
+ def Search(**args)
2075
+ Search.new(**args)
2076
+ end
2077
+
2078
+ # Construct {View} options for {Bucket#view_query}
2079
+ #
2080
+ # @example Make sure the view engine catch up with all mutations and return keys starting from +["random_brewery:"]+
2081
+ # bucket.view_query("beer", "brewery_beers",
2082
+ # Options::View(
2083
+ # start_key: ["random_brewery:"],
2084
+ # scan_consistency: :request_plus
2085
+ # ))
2086
+ #
2087
+ # @return [View]
2088
+ def View(**args)
2089
+ View.new(**args)
2090
+ end
2091
+
2092
+ # rubocop:enable Naming/MethodName
2093
+ end
2094
+ end