couchbase 3.8.1 → 3.9.0
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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/ext/CMakeLists.txt +16 -1
- data/ext/cache/cpm/{CPM_0.42.0.cmake → CPM_0.43.1.cmake} +18 -2
- data/ext/cache/extconf_include.rb +6 -6
- data/ext/cache/mozilla-ca-bundle.crt +214 -155
- data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
- data/ext/couchbase/CMakeLists.txt +130 -21
- data/ext/couchbase/cmake/APKBUILD.in +25 -4
- data/ext/couchbase/cmake/Bundler.cmake +143 -34
- data/ext/couchbase/cmake/CPM.cmake +126 -12
- data/ext/couchbase/cmake/Cache.cmake +7 -1
- data/ext/couchbase/cmake/CompilerOptions.cmake +1 -1
- data/ext/couchbase/cmake/CompilerWarnings.cmake +17 -6
- data/ext/couchbase/cmake/GrpcProtobuf.cmake +481 -0
- data/ext/couchbase/cmake/OpenSSL.cmake +10 -3
- data/ext/couchbase/cmake/Packaging.cmake +519 -65
- data/ext/couchbase/cmake/Protostellar.cmake +250 -0
- data/ext/couchbase/cmake/Sanitizers.cmake +61 -50
- data/ext/couchbase/cmake/StaticAnalyzers.cmake +16 -5
- data/ext/couchbase/cmake/TestFramework.cmake +283 -0
- data/ext/couchbase/cmake/TestFrameworkAddTests.cmake +51 -0
- data/ext/couchbase/cmake/Testing.cmake +27 -9
- data/ext/couchbase/cmake/ThirdPartyDependencies.cmake +141 -8
- data/ext/couchbase/cmake/VersionInfo.cmake +50 -0
- data/ext/couchbase/cmake/build_config.hxx.in +2 -1
- data/ext/couchbase/cmake/couchbase-cxx-client.spec.in +101 -23
- data/ext/couchbase/cmake/couchbase_cxx_client_static-config.cmake.in +7 -0
- data/ext/couchbase/cmake/couchbase_cxx_client_static.pc.in +2 -0
- data/ext/couchbase/cmake/gRPC_Generate.cmake +58 -0
- data/ext/couchbase/cmake/protobuf_Generate.cmake +69 -0
- data/ext/couchbase/cmake/require-git-checkout.cmake +25 -0
- data/ext/couchbase/cmake/tarball_glob.txt +49 -0
- data/ext/couchbase/core/agent_group.cxx +0 -8
- data/ext/couchbase/core/agent_group.hxx +0 -4
- data/ext/couchbase/core/analytics_stream.cxx +314 -0
- data/ext/couchbase/core/analytics_stream.hxx +129 -0
- data/ext/couchbase/core/analytics_stream_component.cxx +245 -0
- data/ext/couchbase/core/analytics_stream_component.hxx +67 -0
- data/ext/couchbase/core/app_telemetry_meter.cxx +25 -3
- data/ext/couchbase/core/app_telemetry_meter.hxx +77 -0
- data/ext/couchbase/core/app_telemetry_reporter.cxx +7 -6
- data/ext/couchbase/core/bucket.cxx +381 -87
- data/ext/couchbase/core/bucket.hxx +105 -25
- data/ext/couchbase/core/bucket_unit_test_api.hxx +57 -0
- data/ext/couchbase/core/capella.hxx +91 -0
- data/ext/couchbase/core/cluster.cxx +1554 -398
- data/ext/couchbase/core/cluster.hxx +39 -8
- data/ext/couchbase/core/cluster_agent.cxx +0 -8
- data/ext/couchbase/core/cluster_agent.hxx +0 -4
- data/ext/couchbase/core/cluster_options.hxx +26 -3
- data/ext/couchbase/core/collections_component.cxx +39 -15
- data/ext/couchbase/core/config_profiles.cxx +1 -1
- data/ext/couchbase/core/crud_component.cxx +2 -2
- data/ext/couchbase/core/crud_options.hxx +34 -0
- data/ext/couchbase/core/crypto/cbcrypto.cc +18 -13
- data/ext/couchbase/core/document_id_redaction.hxx +81 -0
- data/ext/couchbase/core/error_context/base_error_context.hxx +7 -6
- data/ext/couchbase/core/error_context/key_value.cxx +25 -2
- data/ext/couchbase/core/error_context/key_value.hxx +60 -33
- data/ext/couchbase/core/error_context/key_value_error_context.hxx +16 -15
- data/ext/couchbase/core/error_context/search.hxx +5 -0
- data/ext/couchbase/core/error_context/search_json.hxx +3 -0
- data/ext/couchbase/core/error_context/subdocument_error_context.hxx +19 -18
- data/ext/couchbase/core/error_context/view.hxx +5 -0
- data/ext/couchbase/core/free_form_http_request.cxx +237 -4
- data/ext/couchbase/core/free_form_http_request.hxx +41 -8
- data/ext/couchbase/core/http_component.cxx +300 -284
- data/ext/couchbase/core/http_component.hxx +0 -4
- data/ext/couchbase/core/impl/analytics.cxx +38 -5
- data/ext/couchbase/core/impl/analytics.hxx +34 -0
- data/ext/couchbase/core/impl/bootstrap_error.hxx +0 -3
- data/ext/couchbase/core/impl/collection.cxx +215 -202
- data/ext/couchbase/core/impl/collection_manager.cxx +1 -1
- data/ext/couchbase/core/impl/dns_srv_tracker.cxx +45 -18
- data/ext/couchbase/core/impl/error.cxx +22 -2
- data/ext/couchbase/core/impl/internal_analytics_stream_result.hxx +111 -0
- data/ext/couchbase/core/impl/internal_query_stream_result.hxx +110 -0
- data/ext/couchbase/core/impl/invoke_with_node_id.hxx +15 -7
- data/ext/couchbase/core/impl/key_value_error_category.cxx +6 -0
- data/ext/couchbase/core/impl/lookup_in_replica.cxx +10 -10
- data/ext/couchbase/core/impl/lookup_in_replica.hxx +4 -4
- data/ext/couchbase/core/impl/node_id.cxx +49 -13
- data/ext/couchbase/core/impl/observability_recorder.cxx +12 -2
- data/ext/couchbase/core/impl/observe_poll.cxx +63 -23
- data/ext/couchbase/core/impl/public_analytics_stream_result.cxx +372 -0
- data/ext/couchbase/core/impl/public_bucket.cxx +48 -2
- data/ext/couchbase/core/impl/public_cluster.cxx +325 -25
- data/ext/couchbase/core/impl/public_query_stream_result.cxx +380 -0
- data/ext/couchbase/core/impl/public_transaction_get_multi_replicas_from_preferred_server_group_result.cxx +42 -0
- data/ext/couchbase/core/impl/public_transaction_get_multi_result.cxx +42 -0
- data/ext/couchbase/core/impl/query.cxx +76 -7
- data/ext/couchbase/core/impl/query.hxx +36 -0
- data/ext/couchbase/core/impl/query_index_manager.cxx +54 -1
- data/ext/couchbase/core/impl/replica_utils.cxx +101 -0
- data/ext/couchbase/core/impl/replica_utils.hxx +64 -0
- data/ext/couchbase/core/impl/resolve_node_id.hxx +125 -0
- data/ext/couchbase/core/impl/scope.cxx +70 -0
- data/ext/couchbase/core/impl/search.cxx +31 -1
- data/ext/couchbase/core/impl/transactions.cxx +130 -0
- data/ext/couchbase/core/impl/wait_until_ready.cxx +439 -0
- data/ext/couchbase/core/impl/wait_until_ready.hxx +110 -0
- data/ext/couchbase/core/impl/with_bucket_config_or_timeout.hxx +180 -0
- data/ext/couchbase/core/impl/with_cancellation.hxx +11 -3
- data/ext/couchbase/core/io/configuration_belongs_to_session.hxx +66 -0
- data/ext/couchbase/core/io/dns_client.cxx +122 -45
- data/ext/couchbase/core/io/dns_codec.hxx +21 -21
- data/ext/couchbase/core/io/dns_config.cxx +21 -6
- data/ext/couchbase/core/io/http_command.hxx +149 -121
- data/ext/couchbase/core/io/http_error.hxx +107 -0
- data/ext/couchbase/core/io/http_parser.cxx +4 -0
- data/ext/couchbase/core/io/http_session.cxx +606 -154
- data/ext/couchbase/core/io/http_session.hxx +147 -30
- data/ext/couchbase/core/io/http_session_manager.hxx +329 -382
- data/ext/couchbase/core/io/http_streaming_parser.cxx +4 -0
- data/ext/couchbase/core/io/http_streaming_response.cxx +328 -43
- data/ext/couchbase/core/io/http_streaming_response.hxx +37 -3
- data/ext/couchbase/core/io/mcbp_buffer_pool.hxx +122 -0
- data/ext/couchbase/core/io/mcbp_command.hxx +150 -51
- data/ext/couchbase/core/io/mcbp_command_id.hxx +45 -0
- data/ext/couchbase/core/io/mcbp_message.cxx +9 -1
- data/ext/couchbase/core/io/mcbp_message.hxx +19 -0
- data/ext/couchbase/core/io/mcbp_output_queue.hxx +150 -0
- data/ext/couchbase/core/io/mcbp_parser.cxx +24 -7
- data/ext/couchbase/core/io/mcbp_session.cxx +316 -317
- data/ext/couchbase/core/io/mcbp_session.hxx +27 -18
- data/ext/couchbase/core/io/opaque_ring_table.hxx +145 -0
- data/ext/couchbase/core/io/retry_orchestrator.hxx +6 -5
- data/ext/couchbase/core/io/stream_deadline.hxx +50 -0
- data/ext/couchbase/core/io/streams.cxx +275 -14
- data/ext/couchbase/core/io/streams.hxx +53 -0
- data/ext/couchbase/core/logger/logger.cxx +36 -0
- data/ext/couchbase/core/logger/logger.hxx +46 -6
- data/ext/couchbase/core/logger/redaction.hxx +503 -0
- data/ext/couchbase/core/management/eventing_status.hxx +10 -0
- data/ext/couchbase/core/management/eventing_status_json.hxx +4 -0
- data/ext/couchbase/core/mcbp/big_endian.cxx +1 -1
- data/ext/couchbase/core/mcbp/codec.cxx +27 -18
- data/ext/couchbase/core/mcbp/operation_queue.cxx +2 -2
- data/ext/couchbase/core/mcbp/packet.hxx +2 -2
- data/ext/couchbase/core/mcbp/queue_request.cxx +23 -6
- data/ext/couchbase/core/mcbp/queue_request.hxx +21 -0
- data/ext/couchbase/core/meta/features.hxx +13 -0
- data/ext/couchbase/core/meta/version.cxx +6 -3
- data/ext/couchbase/core/metrics/logging_meter.cxx +5 -10
- data/ext/couchbase/core/metrics/meter_wrapper.cxx +63 -33
- data/ext/couchbase/core/metrics/meter_wrapper.hxx +55 -3
- data/ext/couchbase/core/operations/analytics_response_parsing.cxx +177 -0
- data/ext/couchbase/core/operations/analytics_response_parsing.hxx +55 -0
- data/ext/couchbase/core/operations/document_analytics.cxx +48 -130
- data/ext/couchbase/core/operations/document_analytics.hxx +14 -2
- data/ext/couchbase/core/operations/document_get_all_replicas.hxx +15 -7
- data/ext/couchbase/core/operations/document_get_any_replica.hxx +19 -8
- data/ext/couchbase/core/operations/document_get_projected.cxx +1 -1
- data/ext/couchbase/core/{impl/get_replica.cxx → operations/document_get_replica.cxx} +21 -3
- data/ext/couchbase/core/{impl/get_replica.hxx → operations/document_get_replica.hxx} +31 -4
- data/ext/couchbase/core/operations/document_lookup_in.cxx +10 -10
- data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +228 -198
- data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +215 -217
- data/ext/couchbase/core/operations/document_query.cxx +108 -221
- data/ext/couchbase/core/operations/document_query.hxx +18 -4
- data/ext/couchbase/core/operations/document_search.cxx +52 -8
- data/ext/couchbase/core/operations/document_search.hxx +3 -0
- data/ext/couchbase/core/operations/document_view.cxx +3 -3
- data/ext/couchbase/core/operations/management/analytics_dataset_create.cxx +15 -8
- data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +4 -0
- data/ext/couchbase/core/operations/management/analytics_dataset_drop.cxx +11 -6
- data/ext/couchbase/core/operations/management/analytics_dataset_get_all.cxx +3 -2
- data/ext/couchbase/core/operations/management/analytics_dataverse_create.cxx +10 -5
- data/ext/couchbase/core/operations/management/analytics_dataverse_drop.cxx +10 -5
- data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.cxx +2 -1
- data/ext/couchbase/core/operations/management/analytics_index_create.cxx +33 -8
- data/ext/couchbase/core/operations/management/analytics_index_drop.cxx +12 -7
- data/ext/couchbase/core/operations/management/analytics_index_get_all.cxx +3 -2
- data/ext/couchbase/core/operations/management/analytics_link_connect.cxx +11 -6
- data/ext/couchbase/core/operations/management/analytics_link_create.cxx +3 -3
- data/ext/couchbase/core/operations/management/analytics_link_disconnect.cxx +10 -4
- data/ext/couchbase/core/operations/management/analytics_link_drop.cxx +6 -4
- data/ext/couchbase/core/operations/management/analytics_link_get_all.cxx +4 -3
- data/ext/couchbase/core/operations/management/analytics_link_replace.cxx +3 -3
- data/ext/couchbase/core/operations/management/analytics_link_utils.hxx +1 -1
- data/ext/couchbase/core/operations/management/bucket_create.cxx +37 -38
- data/ext/couchbase/core/operations/management/bucket_update.cxx +26 -28
- data/ext/couchbase/core/operations/management/change_password.cxx +2 -0
- data/ext/couchbase/core/operations/management/collection_drop.cxx +5 -1
- data/ext/couchbase/core/operations/management/error_utils.cxx +59 -5
- data/ext/couchbase/core/operations/management/error_utils.hxx +29 -1
- data/ext/couchbase/core/operations/management/eventing_deploy_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_drop_function.cxx +8 -3
- data/ext/couchbase/core/operations/management/eventing_get_all_functions.cxx +4 -2
- data/ext/couchbase/core/operations/management/eventing_get_function.cxx +5 -3
- data/ext/couchbase/core/operations/management/eventing_get_status.cxx +4 -2
- data/ext/couchbase/core/operations/management/eventing_pause_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_resume_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_undeploy_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_upsert_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/group_drop.cxx +3 -1
- data/ext/couchbase/core/operations/management/group_get.cxx +3 -1
- data/ext/couchbase/core/operations/management/group_upsert.cxx +11 -8
- data/ext/couchbase/core/operations/management/query_index_build.cxx +5 -2
- data/ext/couchbase/core/operations/management/query_index_create.cxx +9 -3
- data/ext/couchbase/core/operations/management/query_index_drop.cxx +11 -4
- data/ext/couchbase/core/operations/management/query_index_get_all.cxx +1 -1
- data/ext/couchbase/core/operations/management/query_index_get_all_deferred.cxx +1 -1
- data/ext/couchbase/core/operations/management/scope_drop.cxx +5 -1
- data/ext/couchbase/core/operations/management/scope_get_all.cxx +6 -1
- data/ext/couchbase/core/operations/management/search_get_stats.cxx +10 -0
- data/ext/couchbase/core/operations/management/search_index_analyze_document.cxx +3 -2
- data/ext/couchbase/core/operations/management/search_index_control_ingest.cxx +4 -3
- data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.cxx +4 -3
- data/ext/couchbase/core/operations/management/search_index_control_query.cxx +4 -3
- data/ext/couchbase/core/operations/management/search_index_drop.cxx +2 -2
- data/ext/couchbase/core/operations/management/search_index_get.cxx +2 -2
- data/ext/couchbase/core/operations/management/search_index_get_documents_count.cxx +3 -2
- data/ext/couchbase/core/operations/management/search_index_get_stats.cxx +3 -1
- data/ext/couchbase/core/operations/management/search_index_upsert.cxx +2 -2
- data/ext/couchbase/core/operations/management/user_drop.cxx +3 -1
- data/ext/couchbase/core/operations/management/user_get.cxx +3 -1
- data/ext/couchbase/core/operations/management/user_upsert.cxx +12 -9
- data/ext/couchbase/core/operations/management/view_index_drop.cxx +1 -1
- data/ext/couchbase/core/operations/management/view_index_get.cxx +1 -1
- data/ext/couchbase/core/operations/management/view_index_upsert.cxx +1 -1
- data/ext/couchbase/core/operations/operation_traits.hxx +18 -0
- data/ext/couchbase/core/operations/query_response_parsing.cxx +211 -0
- data/ext/couchbase/core/operations/query_response_parsing.hxx +60 -0
- data/ext/couchbase/core/operations_fwd.hxx +3 -3
- data/ext/couchbase/core/origin.cxx +54 -26
- data/ext/couchbase/core/origin.hxx +12 -0
- data/ext/couchbase/core/orphan_reporter.cxx +2 -1
- data/ext/couchbase/core/platform/random.cc +7 -7
- data/ext/couchbase/core/protocol/client_request.cxx +2 -2
- data/ext/couchbase/core/protocol/client_request.hxx +38 -21
- data/ext/couchbase/core/protocol/client_response.cxx +11 -3
- data/ext/couchbase/core/protocol/client_response.hxx +27 -6
- data/ext/couchbase/core/protocol/cmd_append.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_cluster_map_change_notification.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_decrement.cxx +6 -6
- data/ext/couchbase/core/protocol/cmd_get.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_get_and_lock.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_get_and_touch.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_get_cluster_config.cxx +6 -4
- data/ext/couchbase/core/protocol/cmd_get_collection_id.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_get_error_map.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_get_meta.cxx +4 -4
- data/ext/couchbase/core/protocol/cmd_get_replica.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_hello.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_increment.cxx +6 -6
- data/ext/couchbase/core/protocol/cmd_insert.cxx +4 -4
- data/ext/couchbase/core/protocol/cmd_lookup_in.cxx +4 -3
- data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +4 -3
- data/ext/couchbase/core/protocol/cmd_mutate_in.cxx +10 -9
- data/ext/couchbase/core/protocol/cmd_mutate_in.hxx +10 -10
- data/ext/couchbase/core/protocol/cmd_observe_seqno.cxx +7 -7
- data/ext/couchbase/core/protocol/cmd_prepend.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_remove.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_replace.cxx +4 -4
- data/ext/couchbase/core/protocol/cmd_touch.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_upsert.cxx +4 -4
- data/ext/couchbase/core/protocol/datatype.hxx +118 -1
- data/ext/couchbase/core/protocol/frame_info_utils.cxx +1 -1
- data/ext/couchbase/core/protocol/magic.hxx +4 -0
- data/ext/couchbase/core/protocol/magic_fmt.hxx +3 -0
- data/ext/couchbase/core/protocol/server_request.hxx +3 -1
- data/ext/couchbase/core/protocol/status.cxx +1 -1
- data/ext/couchbase/core/protostellar/analytics_converter.hxx +171 -0
- data/ext/couchbase/core/protostellar/bucket_admin_converter.hxx +301 -0
- data/ext/couchbase/core/protostellar/collection_admin_converter.hxx +92 -0
- data/ext/couchbase/core/protostellar/component.cxx +2445 -0
- data/ext/couchbase/core/protostellar/component.hxx +391 -0
- data/ext/couchbase/core/{columnar/bootstrap_notification_subscriber.hxx → protostellar/compression_settings.hxx} +11 -10
- data/ext/couchbase/core/protostellar/credentials.cxx +233 -0
- data/ext/couchbase/core/protostellar/credentials.hxx +88 -0
- data/ext/couchbase/core/protostellar/dispatcher.cxx +57 -0
- data/ext/couchbase/core/protostellar/dispatcher.hxx +482 -0
- data/ext/couchbase/core/protostellar/error_utils.cxx +293 -0
- data/ext/couchbase/core/protostellar/error_utils.hxx +97 -0
- data/ext/couchbase/core/protostellar/json_payload.hxx +49 -0
- data/ext/couchbase/core/protostellar/kv_converter.cxx +70 -0
- data/ext/couchbase/core/protostellar/kv_converter.hxx +600 -0
- data/ext/couchbase/core/protostellar/query_converter.hxx +265 -0
- data/ext/couchbase/core/protostellar/query_index_admin_converter.hxx +291 -0
- data/ext/couchbase/core/protostellar/query_proto.hxx +73 -0
- data/ext/couchbase/core/protostellar/search_converter.hxx +244 -0
- data/ext/couchbase/core/protostellar/search_index_admin_converter.hxx +156 -0
- data/ext/couchbase/core/protostellar/view_converter.hxx +158 -0
- data/ext/couchbase/core/query_stream.cxx +447 -0
- data/ext/couchbase/core/query_stream.hxx +141 -0
- data/ext/couchbase/core/query_stream_component.cxx +243 -0
- data/ext/couchbase/core/query_stream_component.hxx +68 -0
- data/ext/couchbase/core/range_scan_load_balancer.cxx +15 -8
- data/ext/couchbase/core/range_scan_orchestrator.cxx +15 -3
- data/ext/couchbase/core/response_handler.hxx +41 -4
- data/ext/couchbase/core/row_streamer.cxx +332 -46
- data/ext/couchbase/core/row_streamer.hxx +31 -1
- data/ext/couchbase/core/row_streamer_options.hxx +55 -0
- data/ext/couchbase/core/sasl/client.h +3 -0
- data/ext/couchbase/core/search_scoring.hxx +66 -0
- data/ext/couchbase/core/stream_error_details.hxx +69 -0
- data/ext/couchbase/core/timeout_defaults.hxx +0 -1
- data/ext/couchbase/core/topology/capabilities.hxx +6 -0
- data/ext/couchbase/core/topology/capabilities_fmt.hxx +3 -0
- data/ext/couchbase/core/topology/configuration.cxx +21 -6
- data/ext/couchbase/core/topology/configuration.hxx +29 -8
- data/ext/couchbase/core/topology/configuration_json.hxx +3 -0
- data/ext/couchbase/core/topology/error_map_json.hxx +3 -1
- data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +70 -4
- data/ext/couchbase/core/tracing/threshold_logging_tracer.hxx +10 -0
- data/ext/couchbase/core/transactions/active_transaction_record.cxx +0 -34
- data/ext/couchbase/core/transactions/attempt_context_impl.cxx +362 -241
- data/ext/couchbase/core/transactions/attempt_context_impl.hxx +24 -3
- data/ext/couchbase/core/transactions/error_list.hxx +2 -2
- data/ext/couchbase/core/transactions/get_multi_fetch.hxx +160 -0
- data/ext/couchbase/core/transactions/get_multi_orchestrator.cxx +326 -125
- data/ext/couchbase/core/transactions/get_multi_transaction_id.hxx +62 -0
- data/ext/couchbase/core/transactions/internal/atr_entry.hxx +22 -2
- data/ext/couchbase/core/transactions/internal/transaction_context.hxx +2 -2
- data/ext/couchbase/core/transactions/internal/transactions_cleanup.hxx +23 -1
- data/ext/couchbase/core/transactions/internal/utils.hxx +50 -14
- data/ext/couchbase/core/transactions/staged_mutation.cxx +23 -18
- data/ext/couchbase/core/transactions/staged_mutation.hxx +15 -4
- data/ext/couchbase/core/transactions/transaction_context.cxx +55 -40
- data/ext/couchbase/core/transactions/transaction_get_result.hxx +16 -0
- data/ext/couchbase/core/transactions/transactions.cxx +3 -55
- data/ext/couchbase/core/transactions/transactions_cleanup.cxx +194 -66
- data/ext/couchbase/core/transactions/transactions_config.cxx +0 -11
- data/ext/couchbase/core/transactions/utils.cxx +10 -0
- data/ext/couchbase/core/transactions/waitable_op_list.hxx +15 -4
- data/ext/couchbase/core/transactions.hxx +9 -9
- data/ext/couchbase/core/utils/byteswap.hxx +166 -9
- data/ext/couchbase/core/utils/connection_string.cxx +50 -85
- data/ext/couchbase/core/utils/connection_string.hxx +15 -0
- data/ext/couchbase/core/{columnar/backoff_calculator.hxx → utils/deadline.hxx} +13 -13
- data/ext/couchbase/core/utils/duration_parser.cxx +1 -1
- data/ext/couchbase/core/utils/json_streaming_lexer.cxx +48 -5
- data/ext/couchbase/core/utils/json_streaming_lexer.hxx +4 -1
- data/ext/couchbase/core/utils/movable_function.hxx +301 -52
- data/ext/couchbase/core/utils/name_codec.hxx +154 -11
- data/ext/couchbase/core/{columnar/retry_info.hxx → utils/process_id.hxx} +18 -13
- data/ext/couchbase/core/utils/url_codec.cxx +12 -51
- data/ext/couchbase/core/websocket_codec.cxx +3 -29
- data/ext/couchbase/couchbase/analytics_options.hxx +21 -10
- data/ext/couchbase/couchbase/analytics_row.hxx +105 -0
- data/ext/couchbase/couchbase/analytics_stream_result.hxx +266 -0
- data/ext/couchbase/couchbase/boolean_query.hxx +3 -3
- data/ext/couchbase/couchbase/bucket.hxx +57 -0
- data/ext/couchbase/couchbase/cluster.hxx +216 -5
- data/ext/couchbase/{core/columnar/security_options.hxx → couchbase/cluster_state.hxx} +18 -14
- data/ext/couchbase/couchbase/codec/lenient_json_transcoder.hxx +69 -0
- data/ext/couchbase/couchbase/collection.hxx +234 -14
- data/ext/couchbase/couchbase/common_durability_options.hxx +18 -3
- data/ext/couchbase/couchbase/conjunction_query.hxx +1 -1
- data/ext/couchbase/couchbase/create_dataset_analytics_options.hxx +6 -1
- data/ext/couchbase/couchbase/date_range_query.hxx +2 -2
- data/ext/couchbase/couchbase/decrement_options.hxx +1 -1
- data/ext/couchbase/couchbase/disjunction_query.hxx +1 -1
- data/ext/couchbase/couchbase/error.hxx +32 -0
- data/ext/couchbase/couchbase/error_codes.hxx +32 -0
- data/ext/couchbase/couchbase/geo_bounding_box_query.hxx +1 -1
- data/ext/couchbase/couchbase/geo_distance_query.hxx +1 -1
- data/ext/couchbase/couchbase/geo_polygon_query.hxx +1 -1
- data/ext/couchbase/couchbase/get_replica_options.hxx +68 -0
- data/ext/couchbase/couchbase/get_replica_result.hxx +5 -3
- data/ext/couchbase/couchbase/get_replica_strategy.hxx +161 -0
- data/ext/couchbase/couchbase/get_result.hxx +1 -0
- data/ext/couchbase/couchbase/increment_options.hxx +1 -1
- data/ext/couchbase/couchbase/insert_options.hxx +1 -1
- data/ext/couchbase/couchbase/match_phrase_query.hxx +1 -1
- data/ext/couchbase/couchbase/match_query.hxx +1 -1
- data/ext/couchbase/couchbase/mutate_in_options.hxx +3 -3
- data/ext/couchbase/couchbase/network_options.hxx +1 -1
- data/ext/couchbase/couchbase/node_id.hxx +42 -14
- data/ext/couchbase/couchbase/node_id_for_options.hxx +7 -1
- data/ext/couchbase/couchbase/node_ids_options.hxx +8 -2
- data/ext/couchbase/couchbase/numeric_range_query.hxx +1 -1
- data/ext/couchbase/couchbase/phrase_query.hxx +1 -1
- data/ext/couchbase/couchbase/prefix_query.hxx +1 -1
- data/ext/couchbase/couchbase/query_options.hxx +23 -12
- data/ext/couchbase/couchbase/query_row.hxx +111 -0
- data/ext/couchbase/couchbase/query_stream_result.hxx +302 -0
- data/ext/couchbase/couchbase/query_string_query.hxx +3 -3
- data/ext/couchbase/couchbase/regexp_query.hxx +1 -1
- data/ext/couchbase/couchbase/replace_options.hxx +3 -3
- data/ext/couchbase/couchbase/result.hxx +14 -3
- data/ext/couchbase/couchbase/scan_result_item.hxx +1 -0
- data/ext/couchbase/couchbase/scope.hxx +85 -2
- data/ext/couchbase/couchbase/search_options.hxx +58 -8
- data/ext/couchbase/couchbase/search_scoring.hxx +94 -0
- data/ext/couchbase/couchbase/search_scoring_none.hxx +51 -0
- data/ext/couchbase/couchbase/search_scoring_reciprocal_rank_fusion.hxx +88 -0
- data/ext/couchbase/couchbase/search_scoring_relative_score_fusion.hxx +70 -0
- data/ext/couchbase/couchbase/term_range_query.hxx +1 -1
- data/ext/couchbase/couchbase/tracing/request_span.hxx +46 -0
- data/ext/couchbase/couchbase/transactions/transaction_get_multi_replicas_from_preferred_server_group_result.hxx +23 -21
- data/ext/couchbase/couchbase/transactions/transaction_get_multi_result.hxx +24 -19
- data/ext/couchbase/couchbase/transactions/transaction_get_result.hxx +17 -3
- data/ext/couchbase/couchbase/transactions/transactions_config.hxx +4 -2
- data/ext/couchbase/couchbase/transactions.hxx +27 -18
- data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
- data/ext/couchbase/couchbase/vector_query.hxx +1 -1
- data/ext/couchbase/couchbase/wait_until_ready_options.hxx +111 -0
- data/ext/couchbase/couchbase/wildcard_query.hxx +1 -1
- data/ext/extconf.rb +15 -10
- data/ext/rcb_analytics.cxx +82 -102
- data/ext/rcb_backend.cxx +42 -36
- data/ext/rcb_backend.hxx +2 -0
- data/ext/rcb_buckets.cxx +47 -59
- data/ext/rcb_collections.cxx +42 -52
- data/ext/rcb_crud.cxx +345 -224
- data/ext/rcb_diagnostics.cxx +117 -27
- data/ext/rcb_exceptions.cxx +152 -99
- data/ext/rcb_exceptions.hxx +25 -0
- data/ext/rcb_extras.cxx +18 -19
- data/ext/rcb_hdr_histogram.cxx +19 -4
- data/ext/rcb_logger.cxx +202 -27
- data/ext/rcb_logger.hxx +12 -0
- data/ext/rcb_multi.cxx +40 -40
- data/ext/rcb_observability.cxx +7 -5
- data/ext/rcb_query.cxx +99 -142
- data/ext/rcb_range_scan.cxx +41 -35
- data/ext/rcb_search.cxx +98 -99
- data/ext/rcb_users.cxx +36 -56
- data/ext/rcb_utils.cxx +100 -37
- data/ext/rcb_utils.hxx +287 -33
- data/ext/rcb_version.cxx +1 -1
- data/ext/rcb_views.cxx +55 -51
- data/lib/active_support/cache/couchbase_store.rb +77 -12
- data/lib/couchbase/bucket.rb +20 -0
- data/lib/couchbase/cluster.rb +33 -14
- data/lib/couchbase/collection.rb +36 -1
- data/lib/couchbase/errors.rb +18 -0
- data/lib/couchbase/fork_hooks.rb +16 -7
- data/lib/couchbase/get_replica_strategy.rb +89 -0
- data/lib/couchbase/logger.rb +1 -1
- data/lib/couchbase/management/analytics_index_manager.rb +15 -15
- data/lib/couchbase/management/bucket_manager.rb +6 -6
- data/lib/couchbase/management/collection_manager.rb +6 -6
- data/lib/couchbase/management/query_index_manager.rb +7 -7
- data/lib/couchbase/management/search_index_manager.rb +13 -13
- data/lib/couchbase/management/user_manager.rb +10 -10
- data/lib/couchbase/management/view_index_manager.rb +5 -5
- data/lib/couchbase/options.rb +181 -44
- data/lib/couchbase/protostellar/bucket.rb +4 -0
- data/lib/couchbase/protostellar/cluster.rb +4 -0
- data/lib/couchbase/protostellar/collection.rb +4 -0
- data/lib/couchbase/protostellar/error_handling.rb +2 -1
- data/lib/couchbase/protostellar/request.rb +1 -0
- data/lib/couchbase/protostellar/request_generator/kv.rb +16 -2
- data/lib/couchbase/protostellar/request_generator/search.rb +17 -1
- data/lib/couchbase/protostellar/retry/orchestrator.rb +3 -2
- data/lib/couchbase/protostellar/retry/strategies/fail_fast.rb +33 -0
- data/lib/couchbase/protostellar/retry/strategies.rb +1 -0
- data/lib/couchbase/search_options.rb +95 -6
- data/lib/couchbase/version.rb +1 -1
- metadata +92 -33
- data/ext/0001-fix-build-for-mingw-w64-ucrt-x86_64-toolchain.patch +0 -40
- data/ext/couchbase/core/columnar/agent.hxx +0 -71
- data/ext/couchbase/core/columnar/agent_config.hxx +0 -59
- data/ext/couchbase/core/columnar/background_bootstrap_listener.hxx +0 -42
- data/ext/couchbase/core/columnar/backoff_calculator.cxx +0 -62
- data/ext/couchbase/core/columnar/columnar_agent.cxx +0 -147
- data/ext/couchbase/core/columnar/columnar_agent_config.cxx +0 -48
- data/ext/couchbase/core/columnar/columnar_error.cxx +0 -51
- data/ext/couchbase/core/columnar/database_management_options.hxx +0 -56
- data/ext/couchbase/core/columnar/error.hxx +0 -51
- data/ext/couchbase/core/columnar/error_codes.cxx +0 -107
- data/ext/couchbase/core/columnar/error_codes.hxx +0 -75
- data/ext/couchbase/core/columnar/management_component.cxx +0 -300
- data/ext/couchbase/core/columnar/management_component.hxx +0 -56
- data/ext/couchbase/core/columnar/query_component.cxx +0 -523
- data/ext/couchbase/core/columnar/query_component.hxx +0 -57
- data/ext/couchbase/core/columnar/query_options.hxx +0 -59
- data/ext/couchbase/core/columnar/query_result.cxx +0 -130
- data/ext/couchbase/core/columnar/query_result.hxx +0 -78
- data/ext/couchbase/core/io/config_tracker.cxx +0 -687
- 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
|
|
139
|
-
* same time, since they are mutually exclusive. As a rule of thumb, if
|
|
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
|
|
164
|
-
* the same time, since they are mutually exclusive.
|
|
165
|
-
* consistent with the mutation you just wrote on the
|
|
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}
|
|
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
|
|
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 <
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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/
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|