couchbase 3.0.1 → 3.0.2

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