couchbase 3.4.2 → 3.4.4

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 (355) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/ext/couchbase/CMakeLists.txt +71 -7
  4. data/ext/couchbase/cmake/Documentation.cmake +0 -1
  5. data/ext/couchbase/cmake/OpenSSL.cmake +98 -3
  6. data/ext/couchbase/cmake/Testing.cmake +12 -4
  7. data/ext/couchbase/cmake/build_config.hxx.in +3 -0
  8. data/ext/couchbase/core/bucket.cxx +183 -151
  9. data/ext/couchbase/core/bucket.hxx +23 -1
  10. data/ext/couchbase/core/cluster.hxx +51 -13
  11. data/ext/couchbase/core/cluster_options.cxx +2 -2
  12. data/ext/couchbase/core/cluster_options.hxx +7 -6
  13. data/ext/couchbase/core/cluster_options_fwd.hxx +26 -0
  14. data/ext/couchbase/core/config_profile.hxx +1 -54
  15. data/ext/couchbase/core/config_profiles.cxx +79 -0
  16. data/ext/couchbase/core/config_profiles.hxx +56 -0
  17. data/ext/couchbase/core/crud_component.cxx +51 -22
  18. data/ext/couchbase/core/error_context/key_value.cxx +2 -1
  19. data/ext/couchbase/core/error_context/key_value.hxx +10 -12
  20. data/ext/couchbase/core/error_context/search.hxx +1 -1
  21. data/ext/couchbase/core/impl/analytics.cxx +1 -0
  22. data/ext/couchbase/core/impl/boolean_field_query.cxx +40 -0
  23. data/ext/couchbase/core/impl/boolean_query.cxx +62 -0
  24. data/ext/couchbase/core/impl/build_deferred_query_indexes.cxx +115 -50
  25. data/ext/couchbase/core/impl/cluster.cxx +8 -0
  26. data/ext/couchbase/core/impl/conjunction_query.cxx +51 -0
  27. data/ext/couchbase/core/impl/create_bucket.cxx +155 -0
  28. data/ext/couchbase/core/impl/create_query_index.cxx +172 -59
  29. data/ext/couchbase/core/impl/date_range.cxx +89 -0
  30. data/ext/couchbase/core/impl/date_range_facet.cxx +54 -0
  31. data/ext/couchbase/core/impl/date_range_facet_result.cxx +64 -0
  32. data/ext/couchbase/core/impl/date_range_query.cxx +125 -0
  33. data/ext/couchbase/core/impl/disjunction_query.cxx +51 -0
  34. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +2 -1
  35. data/ext/couchbase/core/impl/drop_bucket.cxx +66 -0
  36. data/ext/couchbase/core/impl/drop_query_index.cxx +138 -59
  37. data/ext/couchbase/core/impl/encoded_search_facet.hxx +29 -0
  38. data/ext/couchbase/core/impl/encoded_search_query.hxx +29 -0
  39. data/ext/couchbase/core/impl/encoded_search_sort.hxx +29 -0
  40. data/ext/couchbase/core/impl/flush_bucket.cxx +66 -0
  41. data/ext/couchbase/core/impl/geo_bounding_box_query.cxx +46 -0
  42. data/ext/couchbase/core/impl/geo_distance_query.cxx +43 -0
  43. data/ext/couchbase/core/impl/geo_polygon_query.cxx +46 -0
  44. data/ext/couchbase/core/impl/get_all_buckets.cxx +163 -0
  45. data/ext/couchbase/core/impl/get_all_query_indexes.cxx +67 -37
  46. data/ext/couchbase/core/impl/get_bucket.cxx +153 -0
  47. data/ext/couchbase/core/impl/internal_date_range_facet_result.cxx +80 -0
  48. data/ext/couchbase/core/impl/internal_date_range_facet_result.hxx +48 -0
  49. data/ext/couchbase/core/impl/internal_manager_error_context.cxx +113 -0
  50. data/ext/couchbase/core/impl/internal_manager_error_context.hxx +60 -0
  51. data/ext/couchbase/core/impl/internal_numeric_range_facet_result.cxx +80 -0
  52. data/ext/couchbase/core/impl/internal_numeric_range_facet_result.hxx +48 -0
  53. data/ext/couchbase/core/impl/internal_search_error_context.cxx +141 -0
  54. data/ext/couchbase/core/impl/internal_search_error_context.hxx +61 -0
  55. data/ext/couchbase/core/impl/internal_search_meta_data.cxx +60 -0
  56. data/ext/couchbase/core/impl/internal_search_meta_data.hxx +41 -0
  57. data/ext/couchbase/core/impl/internal_search_result.cxx +84 -0
  58. data/ext/couchbase/core/impl/internal_search_result.hxx +43 -0
  59. data/ext/couchbase/core/impl/internal_search_row.cxx +82 -0
  60. data/ext/couchbase/core/impl/internal_search_row.hxx +56 -0
  61. data/ext/couchbase/core/impl/internal_search_row_location.hxx +32 -0
  62. data/ext/couchbase/core/impl/internal_search_row_locations.cxx +137 -0
  63. data/ext/couchbase/core/impl/internal_search_row_locations.hxx +45 -0
  64. data/ext/couchbase/core/impl/internal_term_facet_result.cxx +80 -0
  65. data/ext/couchbase/core/impl/internal_term_facet_result.hxx +48 -0
  66. data/ext/couchbase/core/impl/key_value_error_category.cxx +2 -4
  67. data/ext/couchbase/core/impl/key_value_error_context.cxx +98 -0
  68. data/ext/couchbase/core/impl/lookup_in.cxx +1 -0
  69. data/ext/couchbase/core/impl/lookup_in_all_replicas.cxx +176 -0
  70. data/ext/couchbase/core/impl/lookup_in_all_replicas.hxx +80 -0
  71. data/ext/couchbase/core/impl/lookup_in_any_replica.cxx +167 -0
  72. data/ext/couchbase/core/impl/lookup_in_any_replica.hxx +75 -0
  73. data/ext/couchbase/core/impl/lookup_in_replica.cxx +97 -0
  74. data/ext/couchbase/core/impl/lookup_in_replica.hxx +67 -0
  75. data/ext/couchbase/core/impl/manager_error_context.cxx +100 -0
  76. data/ext/couchbase/core/impl/match_all_query.cxx +35 -0
  77. data/ext/couchbase/core/impl/match_none_query.cxx +35 -0
  78. data/ext/couchbase/core/impl/match_phrase_query.cxx +43 -0
  79. data/ext/couchbase/core/impl/match_query.cxx +59 -0
  80. data/ext/couchbase/core/impl/numeric_range.cxx +49 -0
  81. data/ext/couchbase/core/impl/numeric_range_facet.cxx +54 -0
  82. data/ext/couchbase/core/impl/numeric_range_facet_result.cxx +64 -0
  83. data/ext/couchbase/core/impl/numeric_range_query.cxx +56 -0
  84. data/ext/couchbase/core/impl/phrase_query.cxx +42 -0
  85. data/ext/couchbase/core/impl/prefix_query.cxx +40 -0
  86. data/ext/couchbase/core/impl/query.cxx +1 -0
  87. data/ext/couchbase/core/impl/query_error_context.cxx +75 -0
  88. data/ext/couchbase/core/impl/query_string_query.cxx +37 -0
  89. data/ext/couchbase/core/impl/regexp_query.cxx +40 -0
  90. data/ext/couchbase/core/impl/search.cxx +191 -0
  91. data/ext/couchbase/core/impl/search_error_context.cxx +147 -0
  92. data/ext/couchbase/core/impl/search_meta_data.cxx +46 -0
  93. data/ext/couchbase/core/impl/search_result.cxx +66 -0
  94. data/ext/couchbase/core/impl/search_row.cxx +74 -0
  95. data/ext/couchbase/core/impl/search_row_location.cxx +64 -0
  96. data/ext/couchbase/core/impl/search_row_locations.cxx +66 -0
  97. data/ext/couchbase/core/impl/search_sort_field.cxx +104 -0
  98. data/ext/couchbase/core/impl/search_sort_id.cxx +43 -0
  99. data/ext/couchbase/core/impl/search_sort_score.cxx +43 -0
  100. data/ext/couchbase/core/impl/term_facet.cxx +36 -0
  101. data/ext/couchbase/core/impl/term_facet_result.cxx +64 -0
  102. data/ext/couchbase/core/impl/term_query.cxx +56 -0
  103. data/ext/couchbase/core/impl/term_range_query.cxx +57 -0
  104. data/ext/couchbase/core/impl/update_bucket.cxx +130 -0
  105. data/ext/couchbase/core/impl/watch_query_indexes.cxx +53 -29
  106. data/ext/couchbase/core/impl/wildcard_query.cxx +40 -0
  107. data/ext/couchbase/core/io/dns_client.cxx +111 -40
  108. data/ext/couchbase/core/io/dns_config.cxx +5 -4
  109. data/ext/couchbase/core/io/http_context.hxx +1 -1
  110. data/ext/couchbase/core/io/http_session.hxx +34 -1
  111. data/ext/couchbase/core/io/http_session_manager.hxx +5 -3
  112. data/ext/couchbase/core/io/mcbp_command.hxx +9 -2
  113. data/ext/couchbase/core/io/mcbp_session.cxx +106 -42
  114. data/ext/couchbase/core/io/mcbp_session.hxx +4 -3
  115. data/ext/couchbase/core/io/retry_orchestrator.hxx +3 -2
  116. data/ext/couchbase/core/json_string.hxx +5 -0
  117. data/ext/couchbase/core/logger/custom_rotating_file_sink.cxx +1 -1
  118. data/ext/couchbase/core/logger/logger.cxx +80 -20
  119. data/ext/couchbase/core/logger/logger.hxx +31 -0
  120. data/ext/couchbase/core/meta/features.hxx +25 -0
  121. data/ext/couchbase/core/meta/version.cxx +18 -4
  122. data/ext/couchbase/core/mozilla_ca_bundle.hxx +39 -0
  123. data/ext/couchbase/core/operations/document_analytics.cxx +1 -0
  124. data/ext/couchbase/core/operations/document_analytics.hxx +1 -0
  125. data/ext/couchbase/core/operations/document_append.hxx +1 -1
  126. data/ext/couchbase/core/operations/document_decrement.hxx +1 -1
  127. data/ext/couchbase/core/operations/document_exists.hxx +1 -1
  128. data/ext/couchbase/core/operations/document_get.hxx +1 -1
  129. data/ext/couchbase/core/operations/document_get_and_lock.hxx +1 -1
  130. data/ext/couchbase/core/operations/document_get_and_touch.hxx +1 -1
  131. data/ext/couchbase/core/operations/document_get_projected.hxx +1 -1
  132. data/ext/couchbase/core/operations/document_increment.hxx +1 -1
  133. data/ext/couchbase/core/operations/document_insert.hxx +1 -1
  134. data/ext/couchbase/core/operations/document_lookup_in.hxx +1 -1
  135. data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +192 -0
  136. data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +188 -0
  137. data/ext/couchbase/core/operations/document_mutate_in.hxx +1 -1
  138. data/ext/couchbase/core/operations/document_prepend.hxx +1 -1
  139. data/ext/couchbase/core/operations/document_query.cxx +13 -0
  140. data/ext/couchbase/core/operations/document_query.hxx +7 -0
  141. data/ext/couchbase/core/operations/document_remove.hxx +1 -1
  142. data/ext/couchbase/core/operations/document_replace.hxx +1 -1
  143. data/ext/couchbase/core/operations/document_search.cxx +4 -1
  144. data/ext/couchbase/core/operations/document_search.hxx +2 -1
  145. data/ext/couchbase/core/operations/document_touch.hxx +1 -1
  146. data/ext/couchbase/core/operations/document_unlock.hxx +1 -1
  147. data/ext/couchbase/core/operations/document_upsert.hxx +1 -1
  148. data/ext/couchbase/core/operations/document_view.hxx +1 -0
  149. data/ext/couchbase/core/operations.hxx +2 -0
  150. data/ext/couchbase/core/origin.cxx +270 -0
  151. data/ext/couchbase/core/origin.hxx +2 -0
  152. data/ext/couchbase/core/protocol/client_request.hxx +11 -2
  153. data/ext/couchbase/core/protocol/client_response.hxx +1 -0
  154. data/ext/couchbase/core/protocol/cmd_hello.hxx +1 -0
  155. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +107 -0
  156. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.hxx +137 -0
  157. data/ext/couchbase/core/protocol/hello_feature.hxx +6 -0
  158. data/ext/couchbase/core/protocol/hello_feature_fmt.hxx +3 -0
  159. data/ext/couchbase/core/protocol/status.cxx +2 -2
  160. data/ext/couchbase/core/public_fwd.hxx +21 -0
  161. data/ext/couchbase/core/range_scan_options.cxx +3 -27
  162. data/ext/couchbase/core/range_scan_options.hxx +13 -17
  163. data/ext/couchbase/core/range_scan_orchestrator.cxx +388 -170
  164. data/ext/couchbase/core/range_scan_orchestrator.hxx +13 -2
  165. data/ext/couchbase/core/range_scan_orchestrator_options.hxx +5 -3
  166. data/ext/couchbase/core/scan_options.hxx +0 -19
  167. data/ext/couchbase/core/scan_result.cxx +19 -5
  168. data/ext/couchbase/core/scan_result.hxx +5 -2
  169. data/ext/couchbase/core/timeout_defaults.hxx +2 -3
  170. data/ext/couchbase/core/tls_verify_mode.hxx +26 -0
  171. data/ext/couchbase/core/topology/capabilities.hxx +3 -0
  172. data/ext/couchbase/core/topology/capabilities_fmt.hxx +8 -0
  173. data/ext/couchbase/core/topology/collections_manifest_fmt.hxx +1 -1
  174. data/ext/couchbase/core/topology/configuration.cxx +15 -2
  175. data/ext/couchbase/core/topology/configuration.hxx +20 -1
  176. data/ext/couchbase/core/topology/configuration_json.hxx +6 -1
  177. data/ext/couchbase/core/transactions/attempt_context_testing_hooks.cxx +93 -0
  178. data/ext/couchbase/core/transactions/attempt_context_testing_hooks.hxx +48 -75
  179. data/ext/couchbase/core/transactions/cleanup_testing_hooks.cxx +52 -0
  180. data/ext/couchbase/core/transactions/cleanup_testing_hooks.hxx +17 -31
  181. data/ext/couchbase/core/transactions/exceptions.hxx +12 -9
  182. data/ext/couchbase/core/utils/connection_string.cxx +75 -43
  183. data/ext/couchbase/core/utils/connection_string.hxx +1 -0
  184. data/ext/couchbase/core/utils/json.cxx +4 -1
  185. data/ext/couchbase/couchbase/analytics_error_context.hxx +1 -1
  186. data/ext/couchbase/couchbase/behavior_options.hxx +27 -1
  187. data/ext/couchbase/couchbase/boolean_field_query.hxx +77 -0
  188. data/ext/couchbase/couchbase/boolean_query.hxx +223 -0
  189. data/ext/couchbase/couchbase/bucket_manager.hxx +135 -0
  190. data/ext/couchbase/couchbase/build_query_index_options.hxx +0 -30
  191. data/ext/couchbase/couchbase/cluster.hxx +56 -1
  192. data/ext/couchbase/couchbase/collection.hxx +111 -0
  193. data/ext/couchbase/couchbase/collection_query_index_manager.hxx +7 -48
  194. data/ext/couchbase/couchbase/conjunction_query.hxx +88 -0
  195. data/ext/couchbase/couchbase/create_bucket_options.hxx +41 -0
  196. data/ext/couchbase/couchbase/create_primary_query_index_options.hxx +0 -29
  197. data/ext/couchbase/couchbase/create_query_index_options.hxx +0 -33
  198. data/ext/couchbase/couchbase/date_range.hxx +69 -0
  199. data/ext/couchbase/couchbase/date_range_facet.hxx +56 -0
  200. data/ext/couchbase/couchbase/date_range_facet_result.hxx +55 -0
  201. data/ext/couchbase/couchbase/date_range_query.hxx +265 -0
  202. data/ext/couchbase/couchbase/disjunction_query.hxx +109 -0
  203. data/ext/couchbase/couchbase/doc_id_query.hxx +111 -0
  204. data/ext/couchbase/couchbase/drop_bucket_options.hxx +41 -0
  205. data/ext/couchbase/couchbase/drop_primary_query_index_options.hxx +0 -30
  206. data/ext/couchbase/couchbase/drop_query_index_options.hxx +0 -31
  207. data/ext/couchbase/couchbase/error_codes.hxx +1 -2
  208. data/ext/couchbase/couchbase/error_context.hxx +17 -8
  209. data/ext/couchbase/couchbase/flush_bucket_options.hxx +41 -0
  210. data/ext/couchbase/couchbase/fmt/analytics_scan_consistency.hxx +52 -0
  211. data/ext/couchbase/{core/topology/error_map_fmt.hxx → couchbase/fmt/key_value_error_map_attribute.hxx} +21 -21
  212. data/ext/couchbase/couchbase/fmt/search_scan_consistency.hxx +49 -0
  213. data/ext/couchbase/couchbase/geo_bounding_box_query.hxx +107 -0
  214. data/ext/couchbase/couchbase/geo_distance_query.hxx +109 -0
  215. data/ext/couchbase/couchbase/geo_point.hxx +32 -0
  216. data/ext/couchbase/couchbase/geo_polygon_query.hxx +85 -0
  217. data/ext/couchbase/couchbase/get_all_buckets_options.hxx +44 -0
  218. data/ext/couchbase/couchbase/get_all_query_indexes_options.hxx +0 -30
  219. data/ext/couchbase/couchbase/get_and_lock_options.hxx +2 -2
  220. data/ext/couchbase/couchbase/get_and_touch_options.hxx +2 -2
  221. data/ext/couchbase/couchbase/get_bucket_options.hxx +43 -0
  222. data/ext/couchbase/couchbase/get_options.hxx +2 -2
  223. data/ext/couchbase/couchbase/highlight_style.hxx +45 -0
  224. data/ext/couchbase/couchbase/insert_options.hxx +3 -3
  225. data/ext/couchbase/couchbase/key_value_error_context.hxx +7 -2
  226. data/ext/couchbase/couchbase/lookup_in_all_replicas_options.hxx +109 -0
  227. data/ext/couchbase/couchbase/lookup_in_any_replica_options.hxx +101 -0
  228. data/ext/couchbase/couchbase/lookup_in_options.hxx +2 -2
  229. data/ext/couchbase/couchbase/lookup_in_replica_result.hxx +74 -0
  230. data/ext/couchbase/couchbase/lookup_in_result.hxx +26 -0
  231. data/ext/couchbase/couchbase/management/bucket_settings.hxx +116 -0
  232. data/ext/couchbase/couchbase/manager_error_context.hxx +29 -53
  233. data/ext/couchbase/couchbase/match_all_query.hxx +43 -0
  234. data/ext/couchbase/couchbase/match_none_query.hxx +43 -0
  235. data/ext/couchbase/couchbase/match_operator.hxx +45 -0
  236. data/ext/couchbase/couchbase/match_phrase_query.hxx +108 -0
  237. data/ext/couchbase/couchbase/match_query.hxx +163 -0
  238. data/ext/couchbase/couchbase/mutate_in_options.hxx +2 -2
  239. data/ext/couchbase/couchbase/numeric_range.hxx +58 -0
  240. data/ext/couchbase/couchbase/numeric_range_facet.hxx +56 -0
  241. data/ext/couchbase/couchbase/numeric_range_facet_result.hxx +55 -0
  242. data/ext/couchbase/couchbase/numeric_range_query.hxx +143 -0
  243. data/ext/couchbase/couchbase/phrase_query.hxx +93 -0
  244. data/ext/couchbase/couchbase/prefix_query.hxx +82 -0
  245. data/ext/couchbase/couchbase/query_error_context.hxx +3 -1
  246. data/ext/couchbase/couchbase/query_index_manager.hxx +16 -83
  247. data/ext/couchbase/couchbase/query_options.hxx +18 -0
  248. data/ext/couchbase/couchbase/query_string_query.hxx +72 -0
  249. data/ext/couchbase/couchbase/regexp_query.hxx +82 -0
  250. data/ext/couchbase/couchbase/remove_options.hxx +2 -2
  251. data/ext/couchbase/couchbase/replace_options.hxx +3 -3
  252. data/ext/couchbase/couchbase/scope.hxx +40 -0
  253. data/ext/couchbase/couchbase/search_date_range.hxx +68 -0
  254. data/ext/couchbase/couchbase/search_error_context.hxx +138 -0
  255. data/ext/couchbase/couchbase/search_facet.hxx +60 -0
  256. data/ext/couchbase/couchbase/search_facet_result.hxx +50 -0
  257. data/ext/couchbase/couchbase/search_meta_data.hxx +85 -0
  258. data/ext/couchbase/couchbase/search_metrics.hxx +127 -0
  259. data/ext/couchbase/couchbase/search_numeric_range.hxx +69 -0
  260. data/ext/couchbase/couchbase/search_options.hxx +509 -0
  261. data/ext/couchbase/couchbase/search_query.hxx +69 -0
  262. data/ext/couchbase/couchbase/search_result.hxx +77 -0
  263. data/ext/couchbase/couchbase/search_row.hxx +104 -0
  264. data/ext/couchbase/couchbase/search_row_location.hxx +55 -0
  265. data/ext/couchbase/couchbase/search_row_locations.hxx +86 -0
  266. data/ext/couchbase/couchbase/search_scan_consistency.hxx +34 -0
  267. data/ext/couchbase/couchbase/search_sort.hxx +58 -0
  268. data/ext/couchbase/couchbase/search_sort_field.hxx +117 -0
  269. data/ext/couchbase/couchbase/search_sort_field_missing.hxx +26 -0
  270. data/ext/couchbase/couchbase/search_sort_field_mode.hxx +27 -0
  271. data/ext/couchbase/couchbase/search_sort_field_type.hxx +28 -0
  272. data/ext/couchbase/couchbase/search_sort_id.hxx +60 -0
  273. data/ext/couchbase/couchbase/search_sort_score.hxx +60 -0
  274. data/ext/couchbase/couchbase/search_term_range.hxx +51 -0
  275. data/ext/couchbase/couchbase/security_options.hxx +18 -0
  276. data/ext/couchbase/couchbase/subdocument_error_context.hxx +4 -2
  277. data/ext/couchbase/couchbase/term_facet.hxx +48 -0
  278. data/ext/couchbase/couchbase/term_facet_result.hxx +55 -0
  279. data/ext/couchbase/couchbase/term_query.hxx +151 -0
  280. data/ext/couchbase/couchbase/term_range_query.hxx +142 -0
  281. data/ext/couchbase/couchbase/touch_options.hxx +2 -2
  282. data/ext/couchbase/couchbase/tracing/request_span.hxx +63 -0
  283. data/ext/couchbase/couchbase/tracing/request_tracer.hxx +2 -40
  284. data/ext/couchbase/couchbase/transactions/async_attempt_context.hxx +83 -4
  285. data/ext/couchbase/couchbase/transactions/attempt_context.hxx +67 -0
  286. data/ext/couchbase/couchbase/transactions/transaction_get_result.hxx +2 -0
  287. data/ext/couchbase/couchbase/transactions/transaction_keyspace.hxx +11 -1
  288. data/ext/couchbase/couchbase/transactions/transaction_options.hxx +79 -8
  289. data/ext/couchbase/couchbase/transactions/transaction_query_options.hxx +128 -15
  290. data/ext/couchbase/couchbase/transactions/transaction_query_result.hxx +4 -0
  291. data/ext/couchbase/couchbase/transactions/transaction_result.hxx +1 -1
  292. data/ext/couchbase/couchbase/transactions/transactions_cleanup_config.hxx +5 -3
  293. data/ext/couchbase/couchbase/transactions/transactions_config.hxx +9 -5
  294. data/ext/couchbase/couchbase/transactions/transactions_query_config.hxx +6 -3
  295. data/ext/couchbase/couchbase/transactions.hxx +34 -1
  296. data/ext/couchbase/couchbase/unlock_options.hxx +2 -2
  297. data/ext/couchbase/couchbase/update_bucket_options.hxx +41 -0
  298. data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
  299. data/ext/couchbase/couchbase/watch_query_indexes_options.hxx +0 -31
  300. data/ext/couchbase/couchbase/wildcard_query.hxx +83 -0
  301. data/ext/couchbase/test/CMakeLists.txt +8 -5
  302. data/ext/couchbase/test/benchmark_helper_integration.hxx +2 -2
  303. data/ext/couchbase/test/test_helper.hxx +5 -5
  304. data/ext/couchbase/test/test_integration_analytics.cxx +28 -6
  305. data/ext/couchbase/test/test_integration_collections.cxx +13 -3
  306. data/ext/couchbase/test/test_integration_connect.cxx +7 -3
  307. data/ext/couchbase/test/test_integration_crud.cxx +18 -3
  308. data/ext/couchbase/test/test_integration_diagnostics.cxx +11 -5
  309. data/ext/couchbase/test/test_integration_durability.cxx +12 -7
  310. data/ext/couchbase/test/test_integration_examples.cxx +419 -11
  311. data/ext/couchbase/test/test_integration_management.cxx +867 -368
  312. data/ext/couchbase/test/test_integration_query.cxx +87 -17
  313. data/ext/couchbase/test/test_integration_range_scan.cxx +363 -124
  314. data/ext/couchbase/test/test_integration_read_replica.cxx +48 -11
  315. data/ext/couchbase/test/test_integration_search.cxx +32 -3
  316. data/ext/couchbase/test/test_integration_subdoc.cxx +717 -11
  317. data/ext/couchbase/test/test_integration_tracer.cxx +5 -0
  318. data/ext/couchbase/test/test_integration_transcoders.cxx +13 -5
  319. data/ext/couchbase/test/{test_transaction_transaction_context.cxx → test_transaction_context.cxx} +1 -1
  320. data/ext/couchbase/test/test_transaction_examples.cxx +195 -0
  321. data/ext/couchbase/test/{test_transaction_transaction_public_async_api.cxx → test_transaction_public_async_api.cxx} +13 -12
  322. data/ext/couchbase/test/{test_transaction_transaction_public_blocking_api.cxx → test_transaction_public_blocking_api.cxx} +27 -21
  323. data/ext/couchbase/test/{test_transaction_transaction_simple.cxx → test_transaction_simple.cxx} +17 -5
  324. data/ext/couchbase/test/{test_transaction_transaction_simple_async.cxx → test_transaction_simple_async.cxx} +19 -21
  325. data/ext/couchbase/test/test_unit_config_profiles.cxx +1 -1
  326. data/ext/couchbase/test/test_unit_connection_string.cxx +29 -0
  327. data/ext/couchbase/test/test_unit_json_transcoder.cxx +4 -0
  328. data/ext/couchbase/test/test_unit_query.cxx +75 -0
  329. data/ext/couchbase/test/test_unit_search.cxx +427 -0
  330. data/ext/couchbase/test/test_unit_transaction_utils.cxx +10 -1
  331. data/ext/couchbase/test/test_unit_utils.cxx +8 -4
  332. data/ext/couchbase.cxx +641 -45
  333. data/ext/revisions.rb +3 -3
  334. data/lib/couchbase/authenticator.rb +0 -1
  335. data/lib/couchbase/cluster.rb +1 -5
  336. data/lib/couchbase/collection.rb +108 -0
  337. data/lib/couchbase/collection_options.rb +100 -0
  338. data/lib/couchbase/config_profiles.rb +1 -1
  339. data/lib/couchbase/errors.rb +5 -0
  340. data/lib/couchbase/json_transcoder.rb +12 -5
  341. data/lib/couchbase/key_value_scan.rb +125 -0
  342. data/lib/couchbase/management/collection_query_index_manager.rb +54 -15
  343. data/lib/couchbase/management/query_index_manager.rb +70 -5
  344. data/lib/couchbase/options.rb +151 -0
  345. data/lib/couchbase/raw_binary_transcoder.rb +37 -0
  346. data/lib/couchbase/raw_json_transcoder.rb +38 -0
  347. data/lib/couchbase/raw_string_transcoder.rb +40 -0
  348. data/lib/couchbase/scope.rb +1 -1
  349. data/lib/couchbase/search_options.rb +5 -0
  350. data/lib/couchbase/transcoder_flags.rb +62 -0
  351. data/lib/couchbase/utils/time.rb +14 -1
  352. data/lib/couchbase/version.rb +1 -1
  353. metadata +175 -13
  354. data/ext/couchbase/core/config_profile.cxx +0 -47
  355. data/ext/couchbase/core/impl/collection_query_index_manager.cxx +0 -93
@@ -0,0 +1,55 @@
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_facet_result.hxx>
21
+ #include <couchbase/search_numeric_range.hxx>
22
+
23
+ #include <string>
24
+ #include <vector>
25
+
26
+ namespace couchbase
27
+ {
28
+ #ifndef COUCHBASE_CXX_CLIENT_DOXYGEN
29
+ class internal_numeric_range_facet_result;
30
+ #endif
31
+
32
+ /**
33
+ * @since 1.0.0
34
+ * @committed
35
+ */
36
+ class numeric_range_facet_result : public search_facet_result
37
+ {
38
+ public:
39
+ /**
40
+ * @since 1.0.0
41
+ * @internal
42
+ */
43
+ explicit numeric_range_facet_result(internal_numeric_range_facet_result internal);
44
+
45
+ [[nodiscard]] auto name() const -> const std::string& override;
46
+ [[nodiscard]] auto field() const -> const std::string& override;
47
+ [[nodiscard]] auto total() const -> std::uint64_t override;
48
+ [[nodiscard]] auto missing() const -> std::uint64_t override;
49
+ [[nodiscard]] auto other() const -> std::uint64_t override;
50
+ [[nodiscard]] auto numeric_ranges() const -> const std::vector<search_numeric_range>&;
51
+
52
+ private:
53
+ std::unique_ptr<internal_numeric_range_facet_result> internal_;
54
+ };
55
+ } // namespace couchbase
@@ -0,0 +1,143 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2023-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/match_operator.hxx>
21
+ #include <couchbase/search_query.hxx>
22
+
23
+ #include <cstdint>
24
+ #include <optional>
25
+ #include <string>
26
+
27
+ namespace couchbase
28
+ {
29
+ /**
30
+ * The numeric range query finds documents containing a numeric value in the specified field within the specified range. Either min or max
31
+ * can be omitted, but not both.
32
+ *
33
+ * By default, min is inclusive and max is exclusive.
34
+ *
35
+ * Match documents where field `id` contains numbers in the range `(100, 1000)`:
36
+ * @snippet test_unit_search.cxx search-numeric-range
37
+ *
38
+ * @since 1.0.0
39
+ * @committed
40
+ */
41
+ class numeric_range_query : public search_query
42
+ {
43
+ public:
44
+ /**
45
+ * Set lower limit of the range. Whether to include limit into the range will be decided by server defaults (inclusive).
46
+ *
47
+ * @param value lower limit of the range.
48
+ *
49
+ * @return this query for chaining purposes.
50
+ *
51
+ * @since 1.0.0
52
+ * @committed
53
+ */
54
+ auto min(double value) -> numeric_range_query&
55
+ {
56
+ min_ = value;
57
+ return *this;
58
+ }
59
+
60
+ /**
61
+ * Set lower limit and specify whether to include it into the limit.
62
+ *
63
+ * @param value lower limit of the range.
64
+ * @param inclusive whether to include limit value into the interval.
65
+ *
66
+ * @return this query for chaining purposes.
67
+ *
68
+ * @since 1.0.0
69
+ * @committed
70
+ */
71
+ auto min(double value, bool inclusive) -> numeric_range_query&
72
+ {
73
+ min_ = value;
74
+ inclusive_min_ = inclusive;
75
+ return *this;
76
+ }
77
+
78
+ /**
79
+ * Set upper limit of the range. Whether to include limit into the range will be decided by server defaults (exclusive).
80
+ *
81
+ * @param value upper limit of the range
82
+ *
83
+ * @return this query for chaining purposes.
84
+ *
85
+ * @since 1.0.0
86
+ * @committed
87
+ */
88
+ auto max(double value) -> numeric_range_query&
89
+ {
90
+ max_ = value;
91
+ return *this;
92
+ }
93
+
94
+ /**
95
+ * Set upper limit and specify whether to include it into the limit.
96
+ *
97
+ * @param value upper limit of the range.
98
+ * @param inclusive whether to include limit value into the interval.
99
+ *
100
+ * @return this query for chaining purposes.
101
+ *
102
+ * @since 1.0.0
103
+ * @committed
104
+ */
105
+ auto max(double value, bool inclusive) -> numeric_range_query&
106
+ {
107
+ max_ = value;
108
+ inclusive_max_ = inclusive;
109
+ return *this;
110
+ }
111
+
112
+ /**
113
+ * If a field is specified, only terms in that field will be matched.
114
+ *
115
+ * @param field_name name of the field to be matched
116
+ *
117
+ * @return this query for chaining purposes.
118
+ *
119
+ * @since 1.0.0
120
+ * @committed
121
+ */
122
+ auto field(std::string field_name) -> numeric_range_query&
123
+ {
124
+ field_ = std::move(field_name);
125
+ return *this;
126
+ }
127
+
128
+ /**
129
+ * @return encoded representation of the query.
130
+ *
131
+ * @since 1.0.0
132
+ * @internal
133
+ */
134
+ [[nodiscard]] auto encode() const -> encoded_search_query override;
135
+
136
+ private:
137
+ std::optional<double> min_{};
138
+ std::optional<double> max_{};
139
+ std::optional<bool> inclusive_min_{};
140
+ std::optional<bool> inclusive_max_{};
141
+ std::optional<std::string> field_{};
142
+ };
143
+ } // namespace couchbase
@@ -0,0 +1,93 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2023-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_query.hxx>
21
+
22
+ #include <optional>
23
+ #include <stdexcept>
24
+ #include <string>
25
+ #include <vector>
26
+
27
+ namespace couchbase
28
+ {
29
+ /**
30
+ * A query that looks for **exact** match of several terms (in the exact order) in the index. The provided terms must exist in the correct
31
+ * order, at the correct index offsets, in the specified field (as no analyzer are applied to the terms). Queried field must have been
32
+ * indexed with `includeTermVectors` set to `true`. It is generally more useful in debugging scenarios, and the @ref match_phrase_query
33
+ * should usually be preferred for real-world use cases.
34
+ *
35
+ * Match documents with terms `"nice"` and `"view"` in field `reviews.content`:
36
+ * @snippet test_unit_search.cxx search-phrase
37
+ *
38
+ * @see https://docs.couchbase.com/server/current/fts/fts-supported-queries-phrase.html server documentation
39
+ *
40
+ * @since 1.0.0
41
+ * @committed
42
+ */
43
+ class phrase_query : public search_query
44
+ {
45
+ public:
46
+ /**
47
+ * Create a new phrase query.
48
+ *
49
+ * The mandatory list of terms that must exactly match in the index. Note that the index can (and usually will) contain terms that are
50
+ * derived from the text in documents, as analyzers can apply process like stemming.
51
+ *
52
+ * @param terms non-empty vector of terms.
53
+ *
54
+ * @since 1.0.0
55
+ * @committed
56
+ */
57
+ explicit phrase_query(std::initializer_list<std::string> terms)
58
+ : terms_{ terms }
59
+ {
60
+ if (terms_.empty()) {
61
+ throw std::invalid_argument("terms must not be empty in phrase_query");
62
+ }
63
+ }
64
+
65
+ /**
66
+ * If a field is specified, only terms in that field will be matched.
67
+ *
68
+ * @param field_name name of the field to be matched
69
+ *
70
+ * @return this query for chaining purposes.
71
+ *
72
+ * @since 1.0.0
73
+ * @committed
74
+ */
75
+ auto field(std::string field_name) -> phrase_query&
76
+ {
77
+ field_ = std::move(field_name);
78
+ return *this;
79
+ }
80
+
81
+ /**
82
+ * @return encoded representation of the query.
83
+ *
84
+ * @since 1.0.0
85
+ * @internal
86
+ */
87
+ [[nodiscard]] auto encode() const -> encoded_search_query override;
88
+
89
+ private:
90
+ std::vector<std::string> terms_;
91
+ std::optional<std::string> field_{};
92
+ };
93
+ } // namespace couchbase
@@ -0,0 +1,82 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2023-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_query.hxx>
21
+
22
+ #include <optional>
23
+ #include <string>
24
+
25
+ namespace couchbase
26
+ {
27
+ /**
28
+ * The prefix query finds documents containing terms that start with the provided prefix. Usual better alternative is @ref match_query.
29
+ *
30
+ * Match documents where field `reviews.content` contains words starting with `"inter"`:
31
+ * @snippet test_unit_search.cxx search-prefix
32
+ *
33
+ * @see https://docs.couchbase.com/server/current/fts/fts-supported-queries-prefix-query.html server documentation
34
+ *
35
+ * @since 1.0.0
36
+ * @committed
37
+ */
38
+ class prefix_query : public search_query
39
+ {
40
+ public:
41
+ /**
42
+ * Create a new prefix query.
43
+ *
44
+ * @param prefix prefix to match
45
+ *
46
+ * @since 1.0.0
47
+ * @committed
48
+ */
49
+ explicit prefix_query(std::string prefix)
50
+ : prefix_{ std::move(prefix) }
51
+ {
52
+ }
53
+
54
+ /**
55
+ * If a field is specified, only terms in that field will be matched.
56
+ *
57
+ * @param field_name name of the field to be matched
58
+ *
59
+ * @return this query for chaining purposes.
60
+ *
61
+ * @since 1.0.0
62
+ * @committed
63
+ */
64
+ auto field(std::string field_name) -> prefix_query&
65
+ {
66
+ field_ = std::move(field_name);
67
+ return *this;
68
+ }
69
+
70
+ /**
71
+ * @return encoded representation of the query.
72
+ *
73
+ * @since 1.0.0
74
+ * @internal
75
+ */
76
+ [[nodiscard]] auto encode() const -> encoded_search_query override;
77
+
78
+ private:
79
+ std::string prefix_;
80
+ std::optional<std::string> field_{};
81
+ };
82
+ } // namespace couchbase
@@ -57,7 +57,7 @@ class query_error_context : public error_context
57
57
  std::string http_body,
58
58
  std::string hostname,
59
59
  std::uint16_t port)
60
- : error_context{ ec, std::move(last_dispatched_to), std::move(last_dispatched_from), retry_attempts, std::move(retry_reasons) }
60
+ : error_context{ {}, ec, std::move(last_dispatched_to), std::move(last_dispatched_from), retry_attempts, std::move(retry_reasons) }
61
61
  , first_error_code_{ first_error_code }
62
62
  , first_error_message_{ std::move(first_error_message) }
63
63
  , client_context_id_{ std::move(client_context_id) }
@@ -127,6 +127,8 @@ class query_error_context : public error_context
127
127
  return port_;
128
128
  }
129
129
 
130
+ [[nodiscard]] auto to_json() const -> std::string;
131
+
130
132
  private:
131
133
  std::uint64_t first_error_code_{};
132
134
  std::string first_error_message_{};
@@ -61,19 +61,11 @@ class query_index_manager
61
61
  */
62
62
  void get_all_indexes(std::string bucket_name,
63
63
  const get_all_query_indexes_options& options,
64
- get_all_query_indexes_handler&& handler) const
65
- {
66
- return core::impl::initiate_get_all_query_indexes(
67
- core_, std::move(bucket_name), options.build(), std::forward<get_all_query_indexes_handler>(handler));
68
- }
64
+ get_all_query_indexes_handler&& handler) const;
65
+
69
66
  [[nodiscard]] auto get_all_indexes(std::string bucket_name, const get_all_query_indexes_options& options) const
70
- -> std::future<std::pair<manager_error_context, std::vector<couchbase::management::query::index>>>
71
- {
72
- auto barrier = std::make_shared<std::promise<std::pair<manager_error_context, std::vector<couchbase::management::query::index>>>>();
73
- auto future = barrier->get_future();
74
- get_all_indexes(std::move(bucket_name), options, [barrier](auto ctx, auto resp) { barrier->set_value({ ctx, resp }); });
75
- return future;
76
- }
67
+ -> std::future<std::pair<manager_error_context, std::vector<couchbase::management::query::index>>>;
68
+
77
69
  /**
78
70
  * Create an index on a bucket.
79
71
  *
@@ -90,23 +82,12 @@ class query_index_manager
90
82
  std::string index_name,
91
83
  std::vector<std::string> fields,
92
84
  const create_query_index_options& options,
93
- create_query_index_handler&& handler) const
94
- {
95
- core::impl::initiate_create_query_index(
96
- core_, std::move(bucket_name), std::move(index_name), std::move(fields), options.build(), std::move(handler));
97
- }
85
+ create_query_index_handler&& handler) const;
98
86
 
99
87
  [[nodiscard]] auto create_index(std::string bucket_name,
100
88
  std::string index_name,
101
89
  std::vector<std::string> fields,
102
- const create_query_index_options& options) const -> std::future<manager_error_context>
103
- {
104
- auto barrier = std::make_shared<std::promise<manager_error_context>>();
105
- auto future = barrier->get_future();
106
- create_index(
107
- std::move(bucket_name), std::move(index_name), std::move(fields), options, [barrier](auto ctx) { barrier->set_value(ctx); });
108
- return future;
109
- }
90
+ const create_query_index_options& options) const -> std::future<manager_error_context>;
110
91
 
111
92
  /**
112
93
  * Create a primary index on a bucket.
@@ -120,19 +101,10 @@ class query_index_manager
120
101
  */
121
102
  void create_primary_index(std::string bucket_name,
122
103
  const create_primary_query_index_options& options,
123
- create_query_index_handler&& handler)
124
- {
125
- return core::impl::initiate_create_primary_query_index(core_, std::move(bucket_name), options.build(), std::move(handler));
126
- }
104
+ create_query_index_handler&& handler);
127
105
 
128
106
  [[nodiscard]] auto create_primary_index(std::string bucket_name, const create_primary_query_index_options& options)
129
- -> std::future<manager_error_context>
130
- {
131
- auto barrier = std::make_shared<std::promise<manager_error_context>>();
132
- auto future = barrier->get_future();
133
- create_primary_index(std::move(bucket_name), options, [barrier](auto ctx) { barrier->set_value(ctx); });
134
- return future;
135
- }
107
+ -> std::future<manager_error_context>;
136
108
  /**
137
109
  * Drop primary index on a bucket.
138
110
  *
@@ -143,19 +115,10 @@ class query_index_manager
143
115
  * @since 1.0.0
144
116
  * @committed
145
117
  */
146
- void drop_primary_index(std::string bucket_name, const drop_primary_query_index_options& options, drop_query_index_handler&& handler)
147
- {
148
- return core::impl::initiate_drop_primary_query_index(core_, std::move(bucket_name), options.build(), std::move(handler));
149
- }
118
+ void drop_primary_index(std::string bucket_name, const drop_primary_query_index_options& options, drop_query_index_handler&& handler);
150
119
 
151
120
  [[nodiscard]] auto drop_primary_index(std::string bucket_name, const drop_primary_query_index_options& options)
152
- -> std::future<manager_error_context>
153
- {
154
- auto barrier = std::make_shared<std::promise<manager_error_context>>();
155
- auto future = barrier->get_future();
156
- drop_primary_index(std::move(bucket_name), options, [barrier](auto ctx) { barrier->set_value(ctx); });
157
- return future;
158
- }
121
+ -> std::future<manager_error_context>;
159
122
 
160
123
  /**
161
124
  *
@@ -170,20 +133,10 @@ class query_index_manager
170
133
  void drop_index(std::string bucket_name,
171
134
  std::string index_name,
172
135
  const drop_query_index_options& options,
173
- drop_query_index_handler&& handler)
174
- {
175
- return core::impl::initiate_drop_query_index(
176
- core_, std::move(bucket_name), std::move(index_name), options.build(), std::move(handler));
177
- }
136
+ drop_query_index_handler&& handler);
178
137
 
179
138
  [[nodiscard]] auto drop_index(std::string bucket_name, std::string index_name, const drop_query_index_options& options)
180
- -> std::future<manager_error_context>
181
- {
182
- auto barrier = std::make_shared<std::promise<manager_error_context>>();
183
- auto future = barrier->get_future();
184
- drop_index(std::move(bucket_name), std::move(index_name), options, [barrier](auto ctx) { barrier->set_value(ctx); });
185
- return future;
186
- }
139
+ -> std::future<manager_error_context>;
187
140
  /**
188
141
  * Builds all currently deferred indexes.
189
142
  *
@@ -198,20 +151,10 @@ class query_index_manager
198
151
  */
199
152
  void build_deferred_indexes(std::string bucket_name,
200
153
  const build_query_index_options& options,
201
- build_deferred_query_indexes_handler&& handler) const
202
- {
203
- return core::impl::initiate_build_deferred_indexes(
204
- core_, std::move(bucket_name), options.build(), std::forward<build_deferred_query_indexes_handler>(handler));
205
- }
154
+ build_deferred_query_indexes_handler&& handler) const;
206
155
 
207
156
  [[nodiscard]] auto build_deferred_indexes(std::string bucket_name, const build_query_index_options& options) const
208
- -> std::future<manager_error_context>
209
- {
210
- auto barrier = std::make_shared<std::promise<manager_error_context>>();
211
- auto future = barrier->get_future();
212
- build_deferred_indexes(std::move(bucket_name), options, [barrier](auto ctx) { barrier->set_value(std::move(ctx)); });
213
- return future;
214
- }
157
+ -> std::future<manager_error_context>;
215
158
 
216
159
  /**
217
160
  * Polls the state of a set of indexes, until they all are online.
@@ -227,21 +170,11 @@ class query_index_manager
227
170
  void watch_indexes(std::string bucket_name,
228
171
  std::vector<std::string> index_names,
229
172
  const watch_query_indexes_options& options,
230
- watch_query_indexes_handler&& handler)
231
- {
232
- return core::impl::initiate_watch_query_indexes(
233
- core_, std::move(bucket_name), std::move(index_names), options.build(), std::move(handler));
234
- }
173
+ watch_query_indexes_handler&& handler);
235
174
 
236
175
  [[nodiscard]] auto watch_indexes(std::string bucket_name,
237
176
  std::vector<std::string> index_names,
238
- const watch_query_indexes_options& options)
239
- {
240
- auto barrier = std::make_shared<std::promise<manager_error_context>>();
241
- auto future = barrier->get_future();
242
- watch_indexes(std::move(bucket_name), std::move(index_names), options, [barrier](auto ctx) { barrier->set_value(ctx); });
243
- return future;
244
- }
177
+ const watch_query_indexes_options& options) -> std::future<manager_error_context>;
245
178
 
246
179
  private:
247
180
  friend class cluster;
@@ -51,6 +51,7 @@ struct query_options : public common_options<query_options> {
51
51
  const bool readonly;
52
52
  const bool flex_index;
53
53
  const bool preserve_expiry;
54
+ std::optional<bool> use_replica;
54
55
  std::optional<std::uint64_t> max_parallelism;
55
56
  std::optional<std::uint64_t> scan_cap;
56
57
  std::optional<std::chrono::milliseconds> scan_wait;
@@ -84,6 +85,7 @@ struct query_options : public common_options<query_options> {
84
85
  readonly_,
85
86
  flex_index_,
86
87
  preserve_expiry_,
88
+ use_replica_,
87
89
  max_parallelism_,
88
90
  scan_cap_,
89
91
  scan_wait_,
@@ -225,6 +227,21 @@ struct query_options : public common_options<query_options> {
225
227
  return self();
226
228
  }
227
229
 
230
+ /**
231
+ * Specifies that the query engine should use replica nodes for KV fetches if the active node is down.
232
+ *
233
+ * @param use_replica whether replica nodes should be used if the active node is down. If not provided, the server default will be used.
234
+ * @return the options builder for chaining purposes.
235
+ *
236
+ * @since 1.0.0
237
+ * @committed
238
+ */
239
+ auto use_replica(bool use_replica) -> query_options&
240
+ {
241
+ use_replica_ = use_replica;
242
+ return self();
243
+ }
244
+
228
245
  /**
229
246
  * Allows overriding the default maximum parallelism for the query execution on the server side.
230
247
  *
@@ -529,6 +546,7 @@ struct query_options : public common_options<query_options> {
529
546
  bool readonly_{ false };
530
547
  bool flex_index_{ false };
531
548
  bool preserve_expiry_{ false };
549
+ std::optional<bool> use_replica_{};
532
550
  std::optional<std::uint64_t> max_parallelism_{};
533
551
  std::optional<std::uint64_t> scan_cap_{};
534
552
  std::optional<std::uint64_t> pipeline_batch_{};
@@ -0,0 +1,72 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2023-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_query.hxx>
21
+
22
+ #include <string>
23
+
24
+ namespace couchbase
25
+ {
26
+ /**
27
+ * The query string query allows humans to describe complex queries using a simple syntax.
28
+ *
29
+ * 1. When you specify multiple query-clauses, you can specify the relative importance to a given clause by suffixing it with the `^`
30
+ * operator, followed by a number or by specifying the boost parameter with the number to boost the search. For example perform
31
+ * @ref match_query for pool in both the name and description fields, but documents having the term in the name field score higher.
32
+ * @snippet test_unit_search.cxx search-query-string-boosting
33
+ *
34
+ * 2. You can perform date or numeric range searches by using the `>`, `>=`, `<`, and `<=` operators, followed by a date value in quotes.
35
+ * For example, perform a @ref date_range_query on the created field for values after September 21, 2016.
36
+ * @snippet test_unit_search.cxx search-query-string-date-range
37
+ * Or, perform a @ref numeric_range_query on the `reviews.ratings.Cleanliness` field, for values greater than 4.
38
+ * @snippet test_unit_search.cxx search-query-string-numeric-range
39
+ *
40
+ * @see https://docs.couchbase.com/server/current/fts/fts-query-string-syntax.html definition of query syntax
41
+ *
42
+ * @since 1.0.0
43
+ * @committed
44
+ */
45
+ class query_string_query : public search_query
46
+ {
47
+ public:
48
+ /**
49
+ * Create a new query string query.
50
+ *
51
+ * @param query the query string to be analyzed and used against
52
+ *
53
+ * @since 1.0.0
54
+ * @committed
55
+ */
56
+ explicit query_string_query(std::string query)
57
+ : query_{ std::move(query) }
58
+ {
59
+ }
60
+
61
+ /**
62
+ * @return encoded representation of the query.
63
+ *
64
+ * @since 1.0.0
65
+ * @internal
66
+ */
67
+ [[nodiscard]] auto encode() const -> encoded_search_query override;
68
+
69
+ private:
70
+ std::string query_;
71
+ };
72
+ } // namespace couchbase