couchbase 3.8.2 → 3.9.1

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 (473) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/ext/CMakeLists.txt +16 -1
  4. data/ext/cache/cpm/{CPM_0.42.0.cmake → CPM_0.43.1.cmake} +18 -2
  5. data/ext/cache/extconf_include.rb +6 -6
  6. data/ext/cache/mozilla-ca-bundle.crt +121 -55
  7. data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
  8. data/ext/couchbase/CMakeLists.txt +136 -23
  9. data/ext/couchbase/cmake/APKBUILD.in +25 -4
  10. data/ext/couchbase/cmake/Bundler.cmake +143 -34
  11. data/ext/couchbase/cmake/CPM.cmake +126 -12
  12. data/ext/couchbase/cmake/Cache.cmake +7 -1
  13. data/ext/couchbase/cmake/CompilerOptions.cmake +1 -1
  14. data/ext/couchbase/cmake/CompilerWarnings.cmake +17 -6
  15. data/ext/couchbase/cmake/GrpcProtobuf.cmake +481 -0
  16. data/ext/couchbase/cmake/OpenSSL.cmake +82 -7
  17. data/ext/couchbase/cmake/Packaging.cmake +519 -65
  18. data/ext/couchbase/cmake/Protostellar.cmake +250 -0
  19. data/ext/couchbase/cmake/Sanitizers.cmake +61 -50
  20. data/ext/couchbase/cmake/StaticAnalyzers.cmake +16 -5
  21. data/ext/couchbase/cmake/TestFramework.cmake +283 -0
  22. data/ext/couchbase/cmake/TestFrameworkAddTests.cmake +51 -0
  23. data/ext/couchbase/cmake/Testing.cmake +27 -9
  24. data/ext/couchbase/cmake/ThirdPartyDependencies.cmake +141 -8
  25. data/ext/couchbase/cmake/VersionInfo.cmake +50 -0
  26. data/ext/couchbase/cmake/build_config.hxx.in +2 -1
  27. data/ext/couchbase/cmake/couchbase-cxx-client.spec.in +101 -23
  28. data/ext/couchbase/cmake/couchbase_cxx_client_static-config.cmake.in +7 -0
  29. data/ext/couchbase/cmake/couchbase_cxx_client_static.pc.in +2 -0
  30. data/ext/couchbase/cmake/gRPC_Generate.cmake +58 -0
  31. data/ext/couchbase/cmake/protobuf_Generate.cmake +69 -0
  32. data/ext/couchbase/cmake/require-git-checkout.cmake +25 -0
  33. data/ext/couchbase/cmake/tarball_glob.txt +49 -0
  34. data/ext/couchbase/core/agent_group.cxx +0 -8
  35. data/ext/couchbase/core/agent_group.hxx +0 -4
  36. data/ext/couchbase/core/analytics_stream.cxx +314 -0
  37. data/ext/couchbase/core/analytics_stream.hxx +129 -0
  38. data/ext/couchbase/core/analytics_stream_component.cxx +245 -0
  39. data/ext/couchbase/core/analytics_stream_component.hxx +67 -0
  40. data/ext/couchbase/core/app_telemetry_meter.cxx +25 -3
  41. data/ext/couchbase/core/app_telemetry_meter.hxx +77 -0
  42. data/ext/couchbase/core/app_telemetry_reporter.cxx +7 -6
  43. data/ext/couchbase/core/bucket.cxx +381 -87
  44. data/ext/couchbase/core/bucket.hxx +105 -25
  45. data/ext/couchbase/core/bucket_unit_test_api.hxx +57 -0
  46. data/ext/couchbase/core/capella.hxx +91 -0
  47. data/ext/couchbase/core/cluster.cxx +1551 -397
  48. data/ext/couchbase/core/cluster.hxx +39 -8
  49. data/ext/couchbase/core/cluster_agent.cxx +0 -8
  50. data/ext/couchbase/core/cluster_agent.hxx +0 -4
  51. data/ext/couchbase/core/cluster_options.hxx +26 -3
  52. data/ext/couchbase/core/collections_component.cxx +39 -15
  53. data/ext/couchbase/core/config_profiles.cxx +1 -1
  54. data/ext/couchbase/core/crud_component.cxx +2 -2
  55. data/ext/couchbase/core/crud_options.hxx +34 -0
  56. data/ext/couchbase/core/crypto/cbcrypto.cc +18 -13
  57. data/ext/couchbase/core/document_id_redaction.hxx +81 -0
  58. data/ext/couchbase/core/error_context/base_error_context.hxx +7 -6
  59. data/ext/couchbase/core/error_context/key_value.cxx +25 -2
  60. data/ext/couchbase/core/error_context/key_value.hxx +60 -33
  61. data/ext/couchbase/core/error_context/key_value_error_context.hxx +16 -15
  62. data/ext/couchbase/core/error_context/search.hxx +5 -0
  63. data/ext/couchbase/core/error_context/search_json.hxx +3 -0
  64. data/ext/couchbase/core/error_context/subdocument_error_context.hxx +19 -18
  65. data/ext/couchbase/core/error_context/view.hxx +5 -0
  66. data/ext/couchbase/core/free_form_http_request.cxx +237 -4
  67. data/ext/couchbase/core/free_form_http_request.hxx +41 -8
  68. data/ext/couchbase/core/http_component.cxx +300 -284
  69. data/ext/couchbase/core/http_component.hxx +0 -4
  70. data/ext/couchbase/core/impl/analytics.cxx +38 -5
  71. data/ext/couchbase/core/impl/analytics.hxx +34 -0
  72. data/ext/couchbase/core/impl/bootstrap_error.hxx +0 -3
  73. data/ext/couchbase/core/impl/collection.cxx +215 -202
  74. data/ext/couchbase/core/impl/collection_manager.cxx +1 -1
  75. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +45 -18
  76. data/ext/couchbase/core/impl/error.cxx +22 -2
  77. data/ext/couchbase/core/impl/internal_analytics_stream_result.hxx +111 -0
  78. data/ext/couchbase/core/impl/internal_query_stream_result.hxx +110 -0
  79. data/ext/couchbase/core/impl/invoke_with_node_id.hxx +15 -7
  80. data/ext/couchbase/core/impl/key_value_error_category.cxx +6 -0
  81. data/ext/couchbase/core/impl/lookup_in_replica.cxx +10 -10
  82. data/ext/couchbase/core/impl/lookup_in_replica.hxx +4 -4
  83. data/ext/couchbase/core/impl/node_id.cxx +49 -13
  84. data/ext/couchbase/core/impl/observability_recorder.cxx +12 -2
  85. data/ext/couchbase/core/impl/observe_poll.cxx +63 -23
  86. data/ext/couchbase/core/impl/public_analytics_stream_result.cxx +372 -0
  87. data/ext/couchbase/core/impl/public_bucket.cxx +48 -2
  88. data/ext/couchbase/core/impl/public_cluster.cxx +229 -42
  89. data/ext/couchbase/core/impl/public_query_stream_result.cxx +380 -0
  90. data/ext/couchbase/core/impl/public_transaction_get_multi_replicas_from_preferred_server_group_result.cxx +42 -0
  91. data/ext/couchbase/core/impl/public_transaction_get_multi_result.cxx +42 -0
  92. data/ext/couchbase/core/impl/query.cxx +76 -7
  93. data/ext/couchbase/core/impl/query.hxx +36 -0
  94. data/ext/couchbase/core/impl/query_index_manager.cxx +54 -1
  95. data/ext/couchbase/core/impl/replica_utils.cxx +101 -0
  96. data/ext/couchbase/core/impl/replica_utils.hxx +64 -0
  97. data/ext/couchbase/core/impl/resolve_node_id.hxx +125 -0
  98. data/ext/couchbase/core/impl/scope.cxx +70 -0
  99. data/ext/couchbase/core/impl/search.cxx +31 -1
  100. data/ext/couchbase/core/impl/transactions.cxx +130 -0
  101. data/ext/couchbase/core/impl/wait_until_ready.cxx +439 -0
  102. data/ext/couchbase/core/impl/wait_until_ready.hxx +110 -0
  103. data/ext/couchbase/core/impl/with_bucket_config_or_timeout.hxx +180 -0
  104. data/ext/couchbase/core/impl/with_cancellation.hxx +11 -3
  105. data/ext/couchbase/core/io/configuration_belongs_to_session.hxx +1 -2
  106. data/ext/couchbase/core/io/dns_client.cxx +122 -45
  107. data/ext/couchbase/core/io/dns_codec.hxx +21 -21
  108. data/ext/couchbase/core/io/dns_config.cxx +21 -6
  109. data/ext/couchbase/core/io/http_command.hxx +149 -121
  110. data/ext/couchbase/core/io/http_error.hxx +107 -0
  111. data/ext/couchbase/core/io/http_parser.cxx +4 -0
  112. data/ext/couchbase/core/io/http_session.cxx +606 -154
  113. data/ext/couchbase/core/io/http_session.hxx +147 -30
  114. data/ext/couchbase/core/io/http_session_manager.hxx +329 -382
  115. data/ext/couchbase/core/io/http_streaming_parser.cxx +4 -0
  116. data/ext/couchbase/core/io/http_streaming_response.cxx +328 -43
  117. data/ext/couchbase/core/io/http_streaming_response.hxx +37 -3
  118. data/ext/couchbase/core/io/mcbp_buffer_pool.hxx +122 -0
  119. data/ext/couchbase/core/io/mcbp_command.hxx +150 -51
  120. data/ext/couchbase/core/io/mcbp_command_id.hxx +45 -0
  121. data/ext/couchbase/core/io/mcbp_message.cxx +9 -1
  122. data/ext/couchbase/core/io/mcbp_message.hxx +19 -0
  123. data/ext/couchbase/core/io/mcbp_output_queue.hxx +150 -0
  124. data/ext/couchbase/core/io/mcbp_parser.cxx +24 -7
  125. data/ext/couchbase/core/io/mcbp_session.cxx +309 -301
  126. data/ext/couchbase/core/io/mcbp_session.hxx +27 -18
  127. data/ext/couchbase/core/io/opaque_ring_table.hxx +145 -0
  128. data/ext/couchbase/core/io/retry_orchestrator.hxx +6 -5
  129. data/ext/couchbase/core/io/stream_deadline.hxx +50 -0
  130. data/ext/couchbase/core/io/streams.cxx +151 -21
  131. data/ext/couchbase/core/io/streams.hxx +48 -1
  132. data/ext/couchbase/core/logger/logger.cxx +36 -0
  133. data/ext/couchbase/core/logger/logger.hxx +46 -6
  134. data/ext/couchbase/core/logger/redaction.hxx +503 -0
  135. data/ext/couchbase/core/management/eventing_status.hxx +10 -0
  136. data/ext/couchbase/core/management/eventing_status_json.hxx +4 -0
  137. data/ext/couchbase/core/mcbp/big_endian.cxx +1 -1
  138. data/ext/couchbase/core/mcbp/codec.cxx +27 -18
  139. data/ext/couchbase/core/mcbp/operation_queue.cxx +2 -2
  140. data/ext/couchbase/core/mcbp/packet.hxx +2 -2
  141. data/ext/couchbase/core/mcbp/queue_request.cxx +23 -6
  142. data/ext/couchbase/core/mcbp/queue_request.hxx +21 -0
  143. data/ext/couchbase/core/meta/features.hxx +13 -0
  144. data/ext/couchbase/core/meta/version.cxx +6 -3
  145. data/ext/couchbase/core/metrics/logging_meter.cxx +5 -10
  146. data/ext/couchbase/core/metrics/meter_wrapper.cxx +63 -33
  147. data/ext/couchbase/core/metrics/meter_wrapper.hxx +55 -3
  148. data/ext/couchbase/core/operations/analytics_response_parsing.cxx +177 -0
  149. data/ext/couchbase/core/operations/analytics_response_parsing.hxx +55 -0
  150. data/ext/couchbase/core/operations/document_analytics.cxx +48 -130
  151. data/ext/couchbase/core/operations/document_analytics.hxx +14 -2
  152. data/ext/couchbase/core/operations/document_get_all_replicas.hxx +15 -7
  153. data/ext/couchbase/core/operations/document_get_any_replica.hxx +19 -8
  154. data/ext/couchbase/core/operations/document_get_projected.cxx +1 -1
  155. data/ext/couchbase/core/{impl/get_replica.cxx → operations/document_get_replica.cxx} +21 -3
  156. data/ext/couchbase/core/{impl/get_replica.hxx → operations/document_get_replica.hxx} +31 -4
  157. data/ext/couchbase/core/operations/document_lookup_in.cxx +10 -10
  158. data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +228 -198
  159. data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +215 -217
  160. data/ext/couchbase/core/operations/document_query.cxx +108 -221
  161. data/ext/couchbase/core/operations/document_query.hxx +18 -4
  162. data/ext/couchbase/core/operations/document_search.cxx +52 -8
  163. data/ext/couchbase/core/operations/document_search.hxx +3 -0
  164. data/ext/couchbase/core/operations/document_view.cxx +3 -3
  165. data/ext/couchbase/core/operations/management/analytics_dataset_create.cxx +15 -8
  166. data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +4 -0
  167. data/ext/couchbase/core/operations/management/analytics_dataset_drop.cxx +11 -6
  168. data/ext/couchbase/core/operations/management/analytics_dataset_get_all.cxx +3 -2
  169. data/ext/couchbase/core/operations/management/analytics_dataverse_create.cxx +10 -5
  170. data/ext/couchbase/core/operations/management/analytics_dataverse_drop.cxx +10 -5
  171. data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.cxx +2 -1
  172. data/ext/couchbase/core/operations/management/analytics_index_create.cxx +33 -8
  173. data/ext/couchbase/core/operations/management/analytics_index_drop.cxx +12 -7
  174. data/ext/couchbase/core/operations/management/analytics_index_get_all.cxx +3 -2
  175. data/ext/couchbase/core/operations/management/analytics_link_connect.cxx +11 -6
  176. data/ext/couchbase/core/operations/management/analytics_link_create.cxx +3 -3
  177. data/ext/couchbase/core/operations/management/analytics_link_disconnect.cxx +10 -4
  178. data/ext/couchbase/core/operations/management/analytics_link_drop.cxx +6 -4
  179. data/ext/couchbase/core/operations/management/analytics_link_get_all.cxx +4 -3
  180. data/ext/couchbase/core/operations/management/analytics_link_replace.cxx +3 -3
  181. data/ext/couchbase/core/operations/management/analytics_link_utils.hxx +1 -1
  182. data/ext/couchbase/core/operations/management/change_password.cxx +2 -0
  183. data/ext/couchbase/core/operations/management/collection_drop.cxx +5 -1
  184. data/ext/couchbase/core/operations/management/error_utils.cxx +60 -6
  185. data/ext/couchbase/core/operations/management/error_utils.hxx +29 -1
  186. data/ext/couchbase/core/operations/management/eventing_deploy_function.cxx +9 -3
  187. data/ext/couchbase/core/operations/management/eventing_drop_function.cxx +8 -3
  188. data/ext/couchbase/core/operations/management/eventing_get_all_functions.cxx +4 -2
  189. data/ext/couchbase/core/operations/management/eventing_get_function.cxx +5 -3
  190. data/ext/couchbase/core/operations/management/eventing_get_status.cxx +4 -2
  191. data/ext/couchbase/core/operations/management/eventing_pause_function.cxx +9 -3
  192. data/ext/couchbase/core/operations/management/eventing_resume_function.cxx +9 -3
  193. data/ext/couchbase/core/operations/management/eventing_undeploy_function.cxx +9 -3
  194. data/ext/couchbase/core/operations/management/eventing_upsert_function.cxx +9 -3
  195. data/ext/couchbase/core/operations/management/group_drop.cxx +3 -1
  196. data/ext/couchbase/core/operations/management/group_get.cxx +3 -1
  197. data/ext/couchbase/core/operations/management/group_upsert.cxx +11 -8
  198. data/ext/couchbase/core/operations/management/query_index_build.cxx +5 -2
  199. data/ext/couchbase/core/operations/management/query_index_create.cxx +9 -3
  200. data/ext/couchbase/core/operations/management/query_index_drop.cxx +11 -4
  201. data/ext/couchbase/core/operations/management/query_index_get_all.cxx +1 -1
  202. data/ext/couchbase/core/operations/management/query_index_get_all_deferred.cxx +1 -1
  203. data/ext/couchbase/core/operations/management/scope_drop.cxx +5 -1
  204. data/ext/couchbase/core/operations/management/scope_get_all.cxx +6 -1
  205. data/ext/couchbase/core/operations/management/search_get_stats.cxx +10 -0
  206. data/ext/couchbase/core/operations/management/search_index_analyze_document.cxx +3 -2
  207. data/ext/couchbase/core/operations/management/search_index_control_ingest.cxx +4 -3
  208. data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.cxx +4 -3
  209. data/ext/couchbase/core/operations/management/search_index_control_query.cxx +4 -3
  210. data/ext/couchbase/core/operations/management/search_index_drop.cxx +2 -2
  211. data/ext/couchbase/core/operations/management/search_index_get.cxx +2 -2
  212. data/ext/couchbase/core/operations/management/search_index_get_documents_count.cxx +3 -2
  213. data/ext/couchbase/core/operations/management/search_index_get_stats.cxx +3 -1
  214. data/ext/couchbase/core/operations/management/search_index_upsert.cxx +2 -2
  215. data/ext/couchbase/core/operations/management/user_drop.cxx +3 -1
  216. data/ext/couchbase/core/operations/management/user_get.cxx +3 -1
  217. data/ext/couchbase/core/operations/management/user_upsert.cxx +12 -9
  218. data/ext/couchbase/core/operations/management/view_index_drop.cxx +1 -1
  219. data/ext/couchbase/core/operations/management/view_index_get.cxx +1 -1
  220. data/ext/couchbase/core/operations/management/view_index_upsert.cxx +1 -1
  221. data/ext/couchbase/core/operations/operation_traits.hxx +18 -0
  222. data/ext/couchbase/core/operations/query_response_parsing.cxx +211 -0
  223. data/ext/couchbase/core/operations/query_response_parsing.hxx +60 -0
  224. data/ext/couchbase/core/operations_fwd.hxx +3 -3
  225. data/ext/couchbase/core/origin.cxx +54 -26
  226. data/ext/couchbase/core/origin.hxx +12 -0
  227. data/ext/couchbase/core/orphan_reporter.cxx +2 -1
  228. data/ext/couchbase/core/platform/random.cc +7 -7
  229. data/ext/couchbase/core/protocol/client_request.cxx +2 -2
  230. data/ext/couchbase/core/protocol/client_request.hxx +38 -21
  231. data/ext/couchbase/core/protocol/client_response.cxx +11 -3
  232. data/ext/couchbase/core/protocol/client_response.hxx +27 -6
  233. data/ext/couchbase/core/protocol/cmd_append.cxx +2 -2
  234. data/ext/couchbase/core/protocol/cmd_cluster_map_change_notification.cxx +2 -2
  235. data/ext/couchbase/core/protocol/cmd_decrement.cxx +6 -6
  236. data/ext/couchbase/core/protocol/cmd_get.cxx +1 -1
  237. data/ext/couchbase/core/protocol/cmd_get_and_lock.cxx +2 -2
  238. data/ext/couchbase/core/protocol/cmd_get_and_touch.cxx +2 -2
  239. data/ext/couchbase/core/protocol/cmd_get_cluster_config.cxx +6 -4
  240. data/ext/couchbase/core/protocol/cmd_get_collection_id.cxx +2 -2
  241. data/ext/couchbase/core/protocol/cmd_get_error_map.cxx +1 -1
  242. data/ext/couchbase/core/protocol/cmd_get_meta.cxx +4 -4
  243. data/ext/couchbase/core/protocol/cmd_get_replica.cxx +1 -1
  244. data/ext/couchbase/core/protocol/cmd_hello.cxx +1 -1
  245. data/ext/couchbase/core/protocol/cmd_increment.cxx +6 -6
  246. data/ext/couchbase/core/protocol/cmd_insert.cxx +4 -4
  247. data/ext/couchbase/core/protocol/cmd_lookup_in.cxx +4 -3
  248. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +4 -3
  249. data/ext/couchbase/core/protocol/cmd_mutate_in.cxx +10 -9
  250. data/ext/couchbase/core/protocol/cmd_mutate_in.hxx +10 -10
  251. data/ext/couchbase/core/protocol/cmd_observe_seqno.cxx +7 -7
  252. data/ext/couchbase/core/protocol/cmd_prepend.cxx +2 -2
  253. data/ext/couchbase/core/protocol/cmd_remove.cxx +2 -2
  254. data/ext/couchbase/core/protocol/cmd_replace.cxx +4 -4
  255. data/ext/couchbase/core/protocol/cmd_touch.cxx +1 -1
  256. data/ext/couchbase/core/protocol/cmd_upsert.cxx +4 -4
  257. data/ext/couchbase/core/protocol/datatype.hxx +118 -1
  258. data/ext/couchbase/core/protocol/frame_info_utils.cxx +1 -1
  259. data/ext/couchbase/core/protocol/magic.hxx +4 -0
  260. data/ext/couchbase/core/protocol/magic_fmt.hxx +3 -0
  261. data/ext/couchbase/core/protocol/server_request.hxx +3 -1
  262. data/ext/couchbase/core/protocol/status.cxx +1 -1
  263. data/ext/couchbase/core/protostellar/analytics_converter.hxx +171 -0
  264. data/ext/couchbase/core/protostellar/bucket_admin_converter.hxx +301 -0
  265. data/ext/couchbase/core/protostellar/collection_admin_converter.hxx +92 -0
  266. data/ext/couchbase/core/protostellar/component.cxx +2445 -0
  267. data/ext/couchbase/core/protostellar/component.hxx +391 -0
  268. data/ext/couchbase/core/{columnar/bootstrap_notification_subscriber.hxx → protostellar/compression_settings.hxx} +11 -10
  269. data/ext/couchbase/core/protostellar/credentials.cxx +233 -0
  270. data/ext/couchbase/core/protostellar/credentials.hxx +88 -0
  271. data/ext/couchbase/core/protostellar/dispatcher.cxx +57 -0
  272. data/ext/couchbase/core/protostellar/dispatcher.hxx +482 -0
  273. data/ext/couchbase/core/protostellar/error_utils.cxx +293 -0
  274. data/ext/couchbase/core/protostellar/error_utils.hxx +97 -0
  275. data/ext/couchbase/core/protostellar/json_payload.hxx +49 -0
  276. data/ext/couchbase/core/protostellar/kv_converter.cxx +70 -0
  277. data/ext/couchbase/core/protostellar/kv_converter.hxx +600 -0
  278. data/ext/couchbase/core/protostellar/query_converter.hxx +265 -0
  279. data/ext/couchbase/core/protostellar/query_index_admin_converter.hxx +291 -0
  280. data/ext/couchbase/core/protostellar/query_proto.hxx +73 -0
  281. data/ext/couchbase/core/protostellar/search_converter.hxx +244 -0
  282. data/ext/couchbase/core/protostellar/search_index_admin_converter.hxx +156 -0
  283. data/ext/couchbase/core/protostellar/view_converter.hxx +158 -0
  284. data/ext/couchbase/core/query_stream.cxx +447 -0
  285. data/ext/couchbase/core/query_stream.hxx +141 -0
  286. data/ext/couchbase/core/query_stream_component.cxx +243 -0
  287. data/ext/couchbase/core/query_stream_component.hxx +68 -0
  288. data/ext/couchbase/core/range_scan_load_balancer.cxx +15 -8
  289. data/ext/couchbase/core/range_scan_orchestrator.cxx +15 -3
  290. data/ext/couchbase/core/response_handler.hxx +41 -4
  291. data/ext/couchbase/core/row_streamer.cxx +332 -46
  292. data/ext/couchbase/core/row_streamer.hxx +31 -1
  293. data/ext/couchbase/core/row_streamer_options.hxx +55 -0
  294. data/ext/couchbase/core/sasl/client.h +3 -0
  295. data/ext/couchbase/core/search_scoring.hxx +66 -0
  296. data/ext/couchbase/core/stream_error_details.hxx +69 -0
  297. data/ext/couchbase/core/timeout_defaults.hxx +0 -1
  298. data/ext/couchbase/core/topology/capabilities.hxx +6 -0
  299. data/ext/couchbase/core/topology/capabilities_fmt.hxx +3 -0
  300. data/ext/couchbase/core/topology/configuration.cxx +21 -6
  301. data/ext/couchbase/core/topology/configuration.hxx +29 -8
  302. data/ext/couchbase/core/topology/configuration_json.hxx +3 -0
  303. data/ext/couchbase/core/topology/error_map_json.hxx +3 -1
  304. data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +70 -4
  305. data/ext/couchbase/core/tracing/threshold_logging_tracer.hxx +10 -0
  306. data/ext/couchbase/core/transactions/active_transaction_record.cxx +0 -34
  307. data/ext/couchbase/core/transactions/attempt_context_impl.cxx +108 -63
  308. data/ext/couchbase/core/transactions/attempt_context_impl.hxx +19 -2
  309. data/ext/couchbase/core/transactions/error_list.hxx +2 -2
  310. data/ext/couchbase/core/transactions/get_multi_fetch.hxx +160 -0
  311. data/ext/couchbase/core/transactions/get_multi_orchestrator.cxx +326 -125
  312. data/ext/couchbase/core/transactions/get_multi_transaction_id.hxx +62 -0
  313. data/ext/couchbase/core/transactions/internal/atr_entry.hxx +22 -2
  314. data/ext/couchbase/core/transactions/internal/transaction_context.hxx +2 -2
  315. data/ext/couchbase/core/transactions/internal/transactions_cleanup.hxx +23 -1
  316. data/ext/couchbase/core/transactions/internal/utils.hxx +50 -14
  317. data/ext/couchbase/core/transactions/staged_mutation.cxx +23 -18
  318. data/ext/couchbase/core/transactions/staged_mutation.hxx +15 -4
  319. data/ext/couchbase/core/transactions/transaction_context.cxx +55 -40
  320. data/ext/couchbase/core/transactions/transaction_get_result.hxx +16 -0
  321. data/ext/couchbase/core/transactions/transactions.cxx +3 -55
  322. data/ext/couchbase/core/transactions/transactions_cleanup.cxx +165 -72
  323. data/ext/couchbase/core/transactions/transactions_config.cxx +0 -11
  324. data/ext/couchbase/core/transactions/utils.cxx +10 -0
  325. data/ext/couchbase/core/transactions/waitable_op_list.hxx +2 -2
  326. data/ext/couchbase/core/transactions.hxx +9 -9
  327. data/ext/couchbase/core/utils/byteswap.hxx +166 -9
  328. data/ext/couchbase/core/utils/connection_string.cxx +50 -85
  329. data/ext/couchbase/core/utils/connection_string.hxx +15 -0
  330. data/ext/couchbase/core/{columnar/backoff_calculator.hxx → utils/deadline.hxx} +13 -13
  331. data/ext/couchbase/core/utils/duration_parser.cxx +1 -1
  332. data/ext/couchbase/core/utils/json_streaming_lexer.cxx +48 -5
  333. data/ext/couchbase/core/utils/json_streaming_lexer.hxx +4 -1
  334. data/ext/couchbase/core/utils/movable_function.hxx +301 -52
  335. data/ext/couchbase/core/utils/name_codec.hxx +154 -11
  336. data/ext/couchbase/core/{columnar/retry_info.hxx → utils/process_id.hxx} +18 -13
  337. data/ext/couchbase/core/utils/url_codec.cxx +12 -51
  338. data/ext/couchbase/core/websocket_codec.cxx +13 -37
  339. data/ext/couchbase/couchbase/analytics_options.hxx +21 -10
  340. data/ext/couchbase/couchbase/analytics_row.hxx +105 -0
  341. data/ext/couchbase/couchbase/analytics_stream_result.hxx +266 -0
  342. data/ext/couchbase/couchbase/boolean_query.hxx +3 -3
  343. data/ext/couchbase/couchbase/bucket.hxx +57 -0
  344. data/ext/couchbase/couchbase/cluster.hxx +183 -5
  345. data/ext/couchbase/{core/columnar/security_options.hxx → couchbase/cluster_state.hxx} +18 -14
  346. data/ext/couchbase/couchbase/codec/lenient_json_transcoder.hxx +69 -0
  347. data/ext/couchbase/couchbase/collection.hxx +234 -14
  348. data/ext/couchbase/couchbase/common_durability_options.hxx +18 -3
  349. data/ext/couchbase/couchbase/conjunction_query.hxx +1 -1
  350. data/ext/couchbase/couchbase/create_dataset_analytics_options.hxx +6 -1
  351. data/ext/couchbase/couchbase/date_range_query.hxx +2 -2
  352. data/ext/couchbase/couchbase/decrement_options.hxx +1 -1
  353. data/ext/couchbase/couchbase/disjunction_query.hxx +1 -1
  354. data/ext/couchbase/couchbase/error.hxx +32 -0
  355. data/ext/couchbase/couchbase/error_codes.hxx +33 -1
  356. data/ext/couchbase/couchbase/geo_bounding_box_query.hxx +1 -1
  357. data/ext/couchbase/couchbase/geo_distance_query.hxx +1 -1
  358. data/ext/couchbase/couchbase/geo_polygon_query.hxx +1 -1
  359. data/ext/couchbase/couchbase/get_replica_options.hxx +68 -0
  360. data/ext/couchbase/couchbase/get_replica_result.hxx +5 -3
  361. data/ext/couchbase/couchbase/get_replica_strategy.hxx +161 -0
  362. data/ext/couchbase/couchbase/get_result.hxx +1 -0
  363. data/ext/couchbase/couchbase/increment_options.hxx +1 -1
  364. data/ext/couchbase/couchbase/insert_options.hxx +1 -1
  365. data/ext/couchbase/couchbase/match_phrase_query.hxx +1 -1
  366. data/ext/couchbase/couchbase/match_query.hxx +1 -1
  367. data/ext/couchbase/couchbase/mutate_in_options.hxx +3 -3
  368. data/ext/couchbase/couchbase/network_options.hxx +1 -1
  369. data/ext/couchbase/couchbase/node_id.hxx +42 -14
  370. data/ext/couchbase/couchbase/node_id_for_options.hxx +7 -1
  371. data/ext/couchbase/couchbase/node_ids_options.hxx +8 -2
  372. data/ext/couchbase/couchbase/numeric_range_query.hxx +1 -1
  373. data/ext/couchbase/couchbase/phrase_query.hxx +1 -1
  374. data/ext/couchbase/couchbase/prefix_query.hxx +1 -1
  375. data/ext/couchbase/couchbase/query_options.hxx +23 -12
  376. data/ext/couchbase/couchbase/query_row.hxx +111 -0
  377. data/ext/couchbase/couchbase/query_stream_result.hxx +302 -0
  378. data/ext/couchbase/couchbase/query_string_query.hxx +3 -3
  379. data/ext/couchbase/couchbase/regexp_query.hxx +1 -1
  380. data/ext/couchbase/couchbase/replace_options.hxx +3 -3
  381. data/ext/couchbase/couchbase/result.hxx +14 -3
  382. data/ext/couchbase/couchbase/scan_result_item.hxx +1 -0
  383. data/ext/couchbase/couchbase/scope.hxx +85 -2
  384. data/ext/couchbase/couchbase/search_options.hxx +58 -8
  385. data/ext/couchbase/couchbase/search_scoring.hxx +94 -0
  386. data/ext/couchbase/couchbase/search_scoring_none.hxx +51 -0
  387. data/ext/couchbase/couchbase/search_scoring_reciprocal_rank_fusion.hxx +88 -0
  388. data/ext/couchbase/couchbase/search_scoring_relative_score_fusion.hxx +70 -0
  389. data/ext/couchbase/couchbase/term_range_query.hxx +1 -1
  390. data/ext/couchbase/couchbase/tracing/request_span.hxx +46 -0
  391. data/ext/couchbase/couchbase/transactions/transaction_get_multi_replicas_from_preferred_server_group_result.hxx +23 -21
  392. data/ext/couchbase/couchbase/transactions/transaction_get_multi_result.hxx +24 -19
  393. data/ext/couchbase/couchbase/transactions/transaction_get_result.hxx +17 -3
  394. data/ext/couchbase/couchbase/transactions/transactions_config.hxx +4 -2
  395. data/ext/couchbase/couchbase/transactions.hxx +27 -18
  396. data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
  397. data/ext/couchbase/couchbase/vector_query.hxx +1 -1
  398. data/ext/couchbase/couchbase/wait_until_ready_options.hxx +111 -0
  399. data/ext/couchbase/couchbase/wildcard_query.hxx +1 -1
  400. data/ext/extconf.rb +15 -10
  401. data/ext/rcb_analytics.cxx +82 -102
  402. data/ext/rcb_backend.cxx +42 -36
  403. data/ext/rcb_backend.hxx +2 -0
  404. data/ext/rcb_buckets.cxx +47 -59
  405. data/ext/rcb_collections.cxx +42 -52
  406. data/ext/rcb_crud.cxx +345 -224
  407. data/ext/rcb_diagnostics.cxx +117 -27
  408. data/ext/rcb_exceptions.cxx +152 -99
  409. data/ext/rcb_exceptions.hxx +25 -0
  410. data/ext/rcb_extras.cxx +18 -19
  411. data/ext/rcb_hdr_histogram.cxx +19 -4
  412. data/ext/rcb_logger.cxx +202 -27
  413. data/ext/rcb_logger.hxx +12 -0
  414. data/ext/rcb_multi.cxx +40 -40
  415. data/ext/rcb_observability.cxx +7 -5
  416. data/ext/rcb_query.cxx +99 -142
  417. data/ext/rcb_range_scan.cxx +41 -35
  418. data/ext/rcb_search.cxx +98 -99
  419. data/ext/rcb_users.cxx +36 -56
  420. data/ext/rcb_utils.cxx +100 -37
  421. data/ext/rcb_utils.hxx +287 -33
  422. data/ext/rcb_version.cxx +1 -1
  423. data/ext/rcb_views.cxx +55 -51
  424. data/lib/active_support/cache/couchbase_store.rb +77 -12
  425. data/lib/couchbase/bucket.rb +20 -0
  426. data/lib/couchbase/cluster.rb +17 -0
  427. data/lib/couchbase/collection.rb +36 -1
  428. data/lib/couchbase/errors.rb +18 -0
  429. data/lib/couchbase/fork_hooks.rb +16 -7
  430. data/lib/couchbase/get_replica_strategy.rb +89 -0
  431. data/lib/couchbase/logger.rb +1 -1
  432. data/lib/couchbase/management/analytics_index_manager.rb +15 -15
  433. data/lib/couchbase/management/bucket_manager.rb +6 -6
  434. data/lib/couchbase/management/collection_manager.rb +6 -6
  435. data/lib/couchbase/management/query_index_manager.rb +7 -7
  436. data/lib/couchbase/management/search_index_manager.rb +13 -13
  437. data/lib/couchbase/management/user_manager.rb +10 -10
  438. data/lib/couchbase/management/view_index_manager.rb +5 -5
  439. data/lib/couchbase/options.rb +174 -42
  440. data/lib/couchbase/protostellar/bucket.rb +4 -0
  441. data/lib/couchbase/protostellar/cluster.rb +4 -0
  442. data/lib/couchbase/protostellar/collection.rb +4 -0
  443. data/lib/couchbase/protostellar/error_handling.rb +2 -1
  444. data/lib/couchbase/protostellar/request.rb +1 -0
  445. data/lib/couchbase/protostellar/request_generator/kv.rb +16 -2
  446. data/lib/couchbase/protostellar/request_generator/search.rb +17 -1
  447. data/lib/couchbase/protostellar/retry/orchestrator.rb +3 -2
  448. data/lib/couchbase/protostellar/retry/strategies/fail_fast.rb +33 -0
  449. data/lib/couchbase/protostellar/retry/strategies.rb +1 -0
  450. data/lib/couchbase/search_options.rb +95 -6
  451. data/lib/couchbase/version.rb +1 -1
  452. metadata +91 -33
  453. data/ext/0001-fix-build-for-mingw-w64-ucrt-x86_64-toolchain.patch +0 -40
  454. data/ext/couchbase/core/columnar/agent.hxx +0 -71
  455. data/ext/couchbase/core/columnar/agent_config.hxx +0 -59
  456. data/ext/couchbase/core/columnar/background_bootstrap_listener.hxx +0 -42
  457. data/ext/couchbase/core/columnar/backoff_calculator.cxx +0 -62
  458. data/ext/couchbase/core/columnar/columnar_agent.cxx +0 -147
  459. data/ext/couchbase/core/columnar/columnar_agent_config.cxx +0 -48
  460. data/ext/couchbase/core/columnar/columnar_error.cxx +0 -51
  461. data/ext/couchbase/core/columnar/database_management_options.hxx +0 -56
  462. data/ext/couchbase/core/columnar/error.hxx +0 -51
  463. data/ext/couchbase/core/columnar/error_codes.cxx +0 -107
  464. data/ext/couchbase/core/columnar/error_codes.hxx +0 -75
  465. data/ext/couchbase/core/columnar/management_component.cxx +0 -300
  466. data/ext/couchbase/core/columnar/management_component.hxx +0 -56
  467. data/ext/couchbase/core/columnar/query_component.cxx +0 -523
  468. data/ext/couchbase/core/columnar/query_component.hxx +0 -57
  469. data/ext/couchbase/core/columnar/query_options.hxx +0 -59
  470. data/ext/couchbase/core/columnar/query_result.cxx +0 -130
  471. data/ext/couchbase/core/columnar/query_result.hxx +0 -78
  472. data/ext/couchbase/core/io/config_tracker.cxx +0 -687
  473. data/ext/couchbase/core/io/config_tracker.hxx +0 -123
@@ -24,12 +24,15 @@
24
24
  #include <couchbase/search_facet.hxx>
25
25
  #include <couchbase/search_result.hxx>
26
26
  #include <couchbase/search_scan_consistency.hxx>
27
+ #include <couchbase/search_scoring.hxx>
27
28
  #include <couchbase/search_sort.hxx>
28
29
 
29
30
  #include <chrono>
30
31
  #include <functional>
31
32
  #include <memory>
32
33
  #include <optional>
34
+ #include <stdexcept>
35
+ #include <type_traits>
33
36
 
34
37
  namespace couchbase
35
38
  {
@@ -68,6 +71,7 @@ struct search_options : public common_options<search_options> {
68
71
  std::map<std::string, std::shared_ptr<search_facet>, std::less<>> facets{};
69
72
  std::vector<std::shared_ptr<search_sort>> sort{};
70
73
  std::vector<std::string> sort_string{};
74
+ std::optional<search_scoring::built> scoring{};
71
75
  };
72
76
 
73
77
  /**
@@ -101,6 +105,7 @@ struct search_options : public common_options<search_options> {
101
105
  facets_,
102
106
  sort_,
103
107
  sort_string_,
108
+ scoring_,
104
109
  };
105
110
  }
106
111
 
@@ -135,10 +140,10 @@ struct search_options : public common_options<search_options> {
135
140
  * data it has in the index right away. This is fast, but might not include the most recent
136
141
  * mutations.
137
142
  *
138
- * Note that you cannot use this method and {@link #consistent_with(const mutation_state&)} at the
139
- * same time, since they are mutually exclusive. As a rule of thumb, if you only care to be
140
- * consistent with the mutation you just wrote on the same thread/app, use
141
- * {@link #consistent_with(const mutation_state&)}.
143
+ * Note that you cannot use this method and {@link #consistent_with consistent_with(const
144
+ * mutation_state&)} at the same time, since they are mutually exclusive. As a rule of thumb, if
145
+ * you only care to be consistent with the mutation you just wrote on the same thread/app, use
146
+ * {@link #consistent_with consistent_with(const mutation_state&)}.
142
147
  *
143
148
  * @param scan_consistency the index scan consistency to be used for this query
144
149
  * @return this options builder for chaining purposes.
@@ -160,9 +165,10 @@ struct search_options : public common_options<search_options> {
160
165
  * and if you want your N1QL query to include those you need to pass the mutation tokens into a
161
166
  * {@link mutation_state}.
162
167
  *
163
- * Note that you cannot use this method and {@link #scan_consistency(search_scan_consistency)} at
164
- * the same time, since they are mutually exclusive. As a rule of thumb, if you only care to be
165
- * consistent with the mutation you just wrote on the same thread/app, use this method.
168
+ * Note that you cannot use this method and {@link #scan_consistency
169
+ * scan_consistency(search_scan_consistency)} at the same time, since they are mutually exclusive.
170
+ * As a rule of thumb, if you only care to be consistent with the mutation you just wrote on the
171
+ * same thread/app, use this method.
166
172
  *
167
173
  * @param state the mutation state containing the mutation tokens.
168
174
  * @return this options builder for chaining purposes.
@@ -249,15 +255,58 @@ struct search_options : public common_options<search_options> {
249
255
  * @param disable
250
256
  * @return this options builder for chaining purposes.
251
257
  *
258
+ * @deprecated Use scoring(search_scoring_none{}) instead; see
259
+ * <couchbase/search_scoring_none.hxx>.
260
+ *
261
+ * @throws std::invalid_argument if @ref scoring() has already been set and @p disable is true:
262
+ * both would write the same field, so they cannot be used together. Turning this back off with
263
+ * `disable_scoring(false)` after `scoring()` is not a conflict.
264
+ *
252
265
  * @since 1.0.0
253
- * @committed
254
266
  */
267
+ [[deprecated("Use search_options::scoring(search_scoring_none{}) instead.")]]
255
268
  auto disable_scoring(bool disable) -> search_options&
256
269
  {
270
+ if (disable && scoring_.has_value()) {
271
+ throw std::invalid_argument("disable_scoring() cannot be used together with scoring()");
272
+ }
257
273
  disable_scoring_ = disable;
258
274
  return self();
259
275
  }
260
276
 
277
+ /**
278
+ * Selects how the server scores the hits, and how it merges the FTS and vector result sets of a
279
+ * hybrid request into a single ranked list.
280
+ *
281
+ * @tparam Scoring type of the scoring mode, that derives from @ref search_scoring
282
+ * @param scoring the scoring mode, see @ref search_scoring
283
+ * @return this options builder for chaining purposes.
284
+ *
285
+ * @note the score fusion strategies require Couchbase Server 8.1 or above. Setting one on an
286
+ * older cluster fails the operation with @ref errc::common::feature_not_available.
287
+ *
288
+ * @note this writes the request's top-level "score" and "params" fields. A @ref raw() call for
289
+ * either of those names is applied after this option is encoded and silently wins.
290
+ *
291
+ * @throws std::invalid_argument if @ref disable_scoring() is currently set to true: both write
292
+ * the same field, so they cannot be used together, even when they agree (scoring @ref
293
+ * search_scoring_none with disable_scoring(true)). Calling `disable_scoring(false)` first clears
294
+ * the conflict.
295
+ *
296
+ * @since 1.5.0
297
+ * @committed
298
+ */
299
+ template<typename Scoring,
300
+ std::enable_if_t<std::is_base_of_v<search_scoring, Scoring>, bool> = true>
301
+ auto scoring(const Scoring& scoring) -> search_options&
302
+ {
303
+ if (disable_scoring_) {
304
+ throw std::invalid_argument("scoring() cannot be used together with disable_scoring()");
305
+ }
306
+ scoring_ = scoring.build();
307
+ return self();
308
+ }
309
+
261
310
  /**
262
311
  * If set to true, will include the @ref search_row#locations().
263
312
  *
@@ -517,6 +566,7 @@ private:
517
566
  std::map<std::string, std::shared_ptr<search_facet>, std::less<>> facets_{};
518
567
  std::vector<std::shared_ptr<search_sort>> sort_{};
519
568
  std::vector<std::string> sort_string_{};
569
+ std::optional<search_scoring::built> scoring_{};
520
570
  };
521
571
 
522
572
  /**
@@ -0,0 +1,94 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2020-Present Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include <cstdint>
21
+ #include <optional>
22
+ #include <variant>
23
+
24
+ namespace couchbase
25
+ {
26
+ /**
27
+ * Base class for the scoring mode of a search query.
28
+ *
29
+ * Score fusion controls how the FTS and vector result sets of a hybrid request are merged into a
30
+ * single ranked list. It is only meaningful for a hybrid request (both an FTS query and a vector
31
+ * search); when applied to a single result set the server re-scores the hits but leaves their
32
+ * ordering unchanged.
33
+ *
34
+ * Each mode is its own type and only exposes its own parameters:
35
+ *
36
+ * @li @ref search_scoring_reciprocal_rank_fusion merges by rank.
37
+ * @li @ref search_scoring_relative_score_fusion merges by normalized score.
38
+ * @li @ref search_scoring_none disables scoring.
39
+ *
40
+ * @see search_options#scoring()
41
+ *
42
+ * @since 1.5.0
43
+ * @committed
44
+ */
45
+ class search_scoring
46
+ {
47
+ public:
48
+ /**
49
+ * Immutable value object representing a scoring mode.
50
+ *
51
+ * @since 1.5.0
52
+ * @internal
53
+ */
54
+ struct built {
55
+ /**
56
+ * Scoring is disabled.
57
+ */
58
+ struct none {
59
+ };
60
+
61
+ /**
62
+ * Reciprocal Rank Fusion: merges the result sets by rank.
63
+ */
64
+ struct reciprocal_rank_fusion {
65
+ std::optional<std::uint32_t> rank_constant{};
66
+ std::optional<std::uint32_t> window_size{};
67
+ };
68
+
69
+ /**
70
+ * Relative Score Fusion: merges the result sets by normalized score.
71
+ */
72
+ struct relative_score_fusion {
73
+ std::optional<std::uint32_t> window_size{};
74
+ };
75
+
76
+ std::variant<none, reciprocal_rank_fusion, relative_score_fusion> mode{ none{} };
77
+ };
78
+
79
+ virtual ~search_scoring() = default;
80
+
81
+ /**
82
+ * Returns the scoring mode as an immutable value.
83
+ *
84
+ * @return the scoring mode as an immutable value
85
+ *
86
+ * @since 1.5.0
87
+ * @internal
88
+ */
89
+ [[nodiscard]] virtual auto build() const -> built = 0;
90
+
91
+ protected:
92
+ search_scoring() = default;
93
+ };
94
+ } // namespace couchbase
@@ -0,0 +1,51 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2020-Present Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include <couchbase/search_scoring.hxx>
21
+
22
+ namespace couchbase
23
+ {
24
+ /**
25
+ * Disables scoring, so that the server does not perform any scoring on the hits.
26
+ *
27
+ * This sends the same `"none"` that the deprecated @ref search_options#disable_scoring() sends. It
28
+ * is not a fusion strategy: `"none"` predates score fusion, so it works on older server versions.
29
+ *
30
+ * @since 1.5.0
31
+ * @committed
32
+ */
33
+ class search_scoring_none : public search_scoring
34
+ {
35
+ public:
36
+ search_scoring_none() = default;
37
+
38
+ /**
39
+ * Returns the scoring mode as an immutable value.
40
+ *
41
+ * @return the scoring mode as an immutable value
42
+ *
43
+ * @since 1.5.0
44
+ * @internal
45
+ */
46
+ [[nodiscard]] auto build() const -> search_scoring::built override
47
+ {
48
+ return { search_scoring::built::none{} };
49
+ }
50
+ };
51
+ } // namespace couchbase
@@ -0,0 +1,88 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2020-Present Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include <couchbase/search_scoring.hxx>
21
+
22
+ namespace couchbase
23
+ {
24
+ /**
25
+ * Merges the FTS and vector result sets by rank rather than by raw score.
26
+ *
27
+ * It works well with the server defaults, and is the recommended strategy.
28
+ *
29
+ * @note available from Couchbase Server 8.1. Setting it makes the SDK check for the score fusion
30
+ * cluster capability, and fail the operation with @ref errc::common::feature_not_available if the
31
+ * cluster does not advertise it.
32
+ *
33
+ * @since 1.5.0
34
+ * @uncommitted
35
+ */
36
+ class search_scoring_reciprocal_rank_fusion : public search_scoring
37
+ {
38
+ public:
39
+ search_scoring_reciprocal_rank_fusion() = default;
40
+
41
+ /**
42
+ * The rank constant of the Reciprocal Rank Fusion formula.
43
+ *
44
+ * @param rank_constant the rank constant
45
+ * @return this scoring mode for chaining purposes.
46
+ *
47
+ * @since 1.5.0
48
+ * @uncommitted
49
+ */
50
+ auto rank_constant(std::uint32_t rank_constant) -> search_scoring_reciprocal_rank_fusion&
51
+ {
52
+ rank_constant_ = rank_constant;
53
+ return *this;
54
+ }
55
+
56
+ /**
57
+ * How many results per list are considered for fusion.
58
+ *
59
+ * @param window_size the window size
60
+ * @return this scoring mode for chaining purposes.
61
+ *
62
+ * @since 1.5.0
63
+ * @uncommitted
64
+ */
65
+ auto window_size(std::uint32_t window_size) -> search_scoring_reciprocal_rank_fusion&
66
+ {
67
+ window_size_ = window_size;
68
+ return *this;
69
+ }
70
+
71
+ /**
72
+ * Returns the scoring mode as an immutable value.
73
+ *
74
+ * @return the scoring mode as an immutable value
75
+ *
76
+ * @since 1.5.0
77
+ * @internal
78
+ */
79
+ [[nodiscard]] auto build() const -> search_scoring::built override
80
+ {
81
+ return { search_scoring::built::reciprocal_rank_fusion{ rank_constant_, window_size_ } };
82
+ }
83
+
84
+ private:
85
+ std::optional<std::uint32_t> rank_constant_{};
86
+ std::optional<std::uint32_t> window_size_{};
87
+ };
88
+ } // namespace couchbase
@@ -0,0 +1,70 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2020-Present Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include <couchbase/search_scoring.hxx>
21
+
22
+ namespace couchbase
23
+ {
24
+ /**
25
+ * Merges the FTS and vector result sets by normalized score rather than by rank.
26
+ *
27
+ * @note available from Couchbase Server 8.1. Setting it makes the SDK check for the score fusion
28
+ * cluster capability, and fail the operation with @ref errc::common::feature_not_available if the
29
+ * cluster does not advertise it.
30
+ *
31
+ * @since 1.5.0
32
+ * @uncommitted
33
+ */
34
+ class search_scoring_relative_score_fusion : public search_scoring
35
+ {
36
+ public:
37
+ search_scoring_relative_score_fusion() = default;
38
+
39
+ /**
40
+ * How many results per list are considered for fusion.
41
+ *
42
+ * @param window_size the window size
43
+ * @return this scoring mode for chaining purposes.
44
+ *
45
+ * @since 1.5.0
46
+ * @uncommitted
47
+ */
48
+ auto window_size(std::uint32_t window_size) -> search_scoring_relative_score_fusion&
49
+ {
50
+ window_size_ = window_size;
51
+ return *this;
52
+ }
53
+
54
+ /**
55
+ * Returns the scoring mode as an immutable value.
56
+ *
57
+ * @return the scoring mode as an immutable value
58
+ *
59
+ * @since 1.5.0
60
+ * @internal
61
+ */
62
+ [[nodiscard]] auto build() const -> search_scoring::built override
63
+ {
64
+ return { search_scoring::built::relative_score_fusion{ window_size_ } };
65
+ }
66
+
67
+ private:
68
+ std::optional<std::uint32_t> window_size_{};
69
+ };
70
+ } // namespace couchbase
@@ -30,7 +30,7 @@ namespace couchbase
30
30
  * specified range. Either min or max can be omitted, but not both.
31
31
  *
32
32
  * Match documents where field `desc` contains terms in the range `("foo", "foof")`:
33
- * @snippet{trimleft} test_unit_search.cxx search-term-range
33
+ * @snippet{trimleft} unit/management/search.cxx search-term-range
34
34
  *
35
35
  * @see https://docs.couchbase.com/server/current/fts/fts-supported-queries-term-range.html server
36
36
  * documentation.
@@ -61,6 +61,52 @@ public:
61
61
  return true;
62
62
  }
63
63
 
64
+ /**
65
+ * Efficiently record the dispatch operation identifier (the request opaque) without formatting it
66
+ * to a string on the hot path.
67
+ *
68
+ * The default implementation returns false, which tells the SDK to record the identifier as a
69
+ * regular string tag via add_tag() instead — so external tracer implementations are unaffected.
70
+ * Built-in spans may override this to capture the raw value and defer the (rarely needed)
71
+ * formatting until the span is actually reported.
72
+ *
73
+ * @return true if the span captured the identifier; false to request the string-tag fallback.
74
+ */
75
+ [[nodiscard]] virtual auto try_set_dispatch_operation_id(std::uint32_t /* opaque */) -> bool
76
+ {
77
+ return false;
78
+ }
79
+
80
+ /**
81
+ * Efficiently record the local connection identifier of a dispatch span without materializing a
82
+ * tag-name string on the hot path.
83
+ *
84
+ * Like try_set_dispatch_operation_id(), the default returns false so the SDK records the value as
85
+ * a regular string tag and external tracer implementations are unaffected.
86
+ *
87
+ * @return true if the span captured the identifier; false to request the string-tag fallback.
88
+ */
89
+ [[nodiscard]] virtual auto try_set_dispatch_local_id(const std::string& /* local_id */) -> bool
90
+ {
91
+ return false;
92
+ }
93
+
94
+ /**
95
+ * Efficiently record the result metadata of a dispatch span (server processing time and the peer
96
+ * socket) in a single call, without materializing tag-name strings on the hot path.
97
+ *
98
+ * The default returns false so the SDK records the values as regular string tags and external
99
+ * tracer implementations are unaffected.
100
+ *
101
+ * @return true if the span captured the metadata; false to request the string-tag fallback.
102
+ */
103
+ [[nodiscard]] virtual auto try_set_dispatch_result(std::uint64_t /* server_duration_us */,
104
+ const std::string& /* peer_address */,
105
+ std::uint16_t /* peer_port */) -> bool
106
+ {
107
+ return false;
108
+ }
109
+
64
110
  private:
65
111
  std::string name_{};
66
112
  std::shared_ptr<request_span> parent_{ nullptr };
@@ -15,12 +15,12 @@
15
15
  */
16
16
  #pragma once
17
17
 
18
- #include "couchbase/error_codes.hxx"
19
- #include <couchbase/codec/default_json_transcoder.hxx>
18
+ #include <couchbase/codec/lenient_json_transcoder.hxx>
20
19
 
20
+ #include <cstddef>
21
21
  #include <optional>
22
22
  #include <stdexcept>
23
- #include <system_error>
23
+ #include <string>
24
24
  #include <vector>
25
25
 
26
26
  namespace couchbase
@@ -48,40 +48,40 @@ public:
48
48
  /**
49
49
  * Content of the document.
50
50
  *
51
+ * When no transcoder is given, the document is decoded leniently, without validating its
52
+ * common flags. Pass a transcoder explicitly to enforce its flag handling instead.
53
+ *
54
+ * @return content of the document.
55
+ */
56
+ template<typename Document, std::enable_if_t<!codec::is_transcoder_v<Document>, bool> = true>
57
+ [[nodiscard]] auto content_as(std::size_t spec_index) const -> Document
58
+ {
59
+ return codec::default_lenient_json_transcoder::decode<Document>(content_at(spec_index));
60
+ }
61
+
62
+ /**
63
+ * Content of the document, decoded with the given transcoder.
64
+ *
51
65
  * @return content of the document.
52
66
  */
53
67
  template<typename Document,
54
- typename Transcoder = codec::default_json_transcoder,
68
+ typename Transcoder,
55
69
  std::enable_if_t<!codec::is_transcoder_v<Document>, bool> = true,
56
70
  std::enable_if_t<codec::is_transcoder_v<Transcoder>, bool> = true>
57
71
  [[nodiscard]] auto content_as(std::size_t spec_index) const -> Document
58
72
  {
59
- if (spec_index >= content_.size()) {
60
- throw std::invalid_argument("spec index " + std::to_string(spec_index) + " is not valid");
61
- }
62
- if (const auto& content = content_[spec_index]; content.has_value()) {
63
- return Transcoder::template decode<Document>(content.value());
64
- }
65
- throw std::system_error(errc::key_value::document_not_found,
66
- "document was not found for index " + std::to_string(spec_index));
73
+ return Transcoder::template decode<Document>(content_at(spec_index));
67
74
  }
68
75
 
69
76
  /**
70
- * Content of the document.
77
+ * Content of the document, decoded with the given transcoder.
71
78
  *
72
79
  * @return content of the document.
73
80
  */
74
81
  template<typename Transcoder, std::enable_if_t<codec::is_transcoder_v<Transcoder>, bool> = true>
75
82
  [[nodiscard]] auto content_as(std::size_t spec_index) const -> typename Transcoder::document_type
76
83
  {
77
- if (spec_index >= content_.size()) {
78
- throw std::invalid_argument("spec index " + std::to_string(spec_index) + " is not valid");
79
- }
80
- if (const auto& content = content_[spec_index]; content.has_value()) {
81
- return Transcoder::decode(content.value());
82
- }
83
- throw std::system_error(errc::key_value::document_not_found,
84
- "document was not found for index " + std::to_string(spec_index));
84
+ return Transcoder::decode(content_at(spec_index));
85
85
  }
86
86
 
87
87
  /**
@@ -106,6 +106,8 @@ private:
106
106
  {
107
107
  }
108
108
 
109
+ [[nodiscard]] auto content_at(std::size_t spec_index) const -> const codec::encoded_value&;
110
+
109
111
  std::vector<std::optional<codec::encoded_value>> content_;
110
112
  };
111
113
  } // namespace transactions
@@ -15,9 +15,12 @@
15
15
  */
16
16
  #pragma once
17
17
 
18
- #include <couchbase/codec/default_json_transcoder.hxx>
18
+ #include <couchbase/codec/lenient_json_transcoder.hxx>
19
19
 
20
+ #include <cstddef>
20
21
  #include <optional>
22
+ #include <stdexcept>
23
+ #include <string>
21
24
  #include <vector>
22
25
 
23
26
  namespace couchbase
@@ -42,40 +45,40 @@ public:
42
45
  /**
43
46
  * Content of the document.
44
47
  *
48
+ * When no transcoder is given, the document is decoded leniently, without validating its
49
+ * common flags. Pass a transcoder explicitly to enforce its flag handling instead.
50
+ *
51
+ * @return content of the document.
52
+ */
53
+ template<typename Document, std::enable_if_t<!codec::is_transcoder_v<Document>, bool> = true>
54
+ [[nodiscard]] auto content_as(std::size_t spec_index) const -> Document
55
+ {
56
+ return codec::default_lenient_json_transcoder::decode<Document>(content_at(spec_index));
57
+ }
58
+
59
+ /**
60
+ * Content of the document, decoded with the given transcoder.
61
+ *
45
62
  * @return content of the document.
46
63
  */
47
64
  template<typename Document,
48
- typename Transcoder = codec::default_json_transcoder,
65
+ typename Transcoder,
49
66
  std::enable_if_t<!codec::is_transcoder_v<Document>, bool> = true,
50
67
  std::enable_if_t<codec::is_transcoder_v<Transcoder>, bool> = true>
51
68
  [[nodiscard]] auto content_as(std::size_t spec_index) const -> Document
52
69
  {
53
- if (spec_index >= content_.size()) {
54
- throw std::invalid_argument("spec index " + std::to_string(spec_index) + " is not valid");
55
- }
56
- if (const auto& content = content_[spec_index]; content.has_value()) {
57
- return Transcoder::template decode<Document>(content.value());
58
- }
59
- throw std::system_error(errc::key_value::document_not_found,
60
- "document was not found for index " + std::to_string(spec_index));
70
+ return Transcoder::template decode<Document>(content_at(spec_index));
61
71
  }
62
72
 
63
73
  /**
64
- * Content of the document.
74
+ * Content of the document, decoded with the given transcoder.
65
75
  *
66
76
  * @return content of the document.
67
77
  */
68
78
  template<typename Transcoder, std::enable_if_t<codec::is_transcoder_v<Transcoder>, bool> = true>
69
79
  [[nodiscard]] auto content_as(std::size_t spec_index) const -> typename Transcoder::document_type
70
80
  {
71
- if (spec_index >= content_.size()) {
72
- throw std::invalid_argument("spec index " + std::to_string(spec_index) + " is not valid");
73
- }
74
- if (const auto& content = content_[spec_index]; content.has_value()) {
75
- return Transcoder::decode(content_[spec_index]);
76
- }
77
- throw std::system_error(errc::key_value::document_not_found,
78
- "document was not found for index " + std::to_string(spec_index));
81
+ return Transcoder::decode(content_at(spec_index));
79
82
  }
80
83
 
81
84
  /**
@@ -99,6 +102,8 @@ private:
99
102
  {
100
103
  }
101
104
 
105
+ [[nodiscard]] auto content_at(std::size_t spec_index) const -> const codec::encoded_value&;
106
+
102
107
  std::vector<std::optional<codec::encoded_value>> content_;
103
108
  };
104
109
  } // namespace transactions