couchbase 3.4.1 → 3.4.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (278) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/ext/couchbase/CMakeLists.txt +59 -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/ThirdPartyDependencies.cmake +4 -0
  8. data/ext/couchbase/cmake/build_config.hxx.in +3 -0
  9. data/ext/couchbase/core/bucket.cxx +3 -2
  10. data/ext/couchbase/core/bucket.hxx +9 -0
  11. data/ext/couchbase/core/cluster.hxx +17 -0
  12. data/ext/couchbase/core/cluster_options.cxx +2 -2
  13. data/ext/couchbase/core/cluster_options.hxx +4 -7
  14. data/ext/couchbase/core/{config_profile.cxx → cluster_options_fwd.hxx} +7 -6
  15. data/ext/couchbase/core/config_profile.hxx +2 -65
  16. data/ext/couchbase/core/config_profiles.cxx +79 -0
  17. data/ext/couchbase/core/config_profiles.hxx +56 -0
  18. data/ext/couchbase/core/error_context/search.hxx +1 -1
  19. data/ext/couchbase/core/impl/analytics.cxx +237 -0
  20. data/ext/couchbase/core/impl/boolean_field_query.cxx +40 -0
  21. data/ext/couchbase/core/impl/boolean_query.cxx +62 -0
  22. data/ext/couchbase/core/impl/cluster.cxx +2 -1
  23. data/ext/couchbase/core/impl/conjunction_query.cxx +51 -0
  24. data/ext/couchbase/core/impl/date_range.cxx +89 -0
  25. data/ext/couchbase/core/impl/date_range_facet.cxx +54 -0
  26. data/ext/couchbase/core/impl/date_range_facet_result.cxx +64 -0
  27. data/ext/couchbase/core/impl/date_range_query.cxx +125 -0
  28. data/ext/couchbase/core/impl/disjunction_query.cxx +51 -0
  29. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +5 -3
  30. data/ext/couchbase/core/impl/encoded_search_facet.hxx +29 -0
  31. data/ext/couchbase/core/impl/encoded_search_query.hxx +29 -0
  32. data/ext/couchbase/core/impl/encoded_search_sort.hxx +29 -0
  33. data/ext/couchbase/core/impl/geo_bounding_box_query.cxx +46 -0
  34. data/ext/couchbase/core/impl/geo_distance_query.cxx +43 -0
  35. data/ext/couchbase/core/impl/geo_polygon_query.cxx +46 -0
  36. data/ext/couchbase/core/impl/internal_date_range_facet_result.cxx +80 -0
  37. data/ext/couchbase/core/impl/internal_date_range_facet_result.hxx +48 -0
  38. data/ext/couchbase/core/impl/internal_numeric_range_facet_result.cxx +80 -0
  39. data/ext/couchbase/core/impl/internal_numeric_range_facet_result.hxx +48 -0
  40. data/ext/couchbase/core/impl/internal_search_error_context.cxx +141 -0
  41. data/ext/couchbase/core/impl/internal_search_error_context.hxx +61 -0
  42. data/ext/couchbase/core/impl/internal_search_meta_data.cxx +60 -0
  43. data/ext/couchbase/core/impl/internal_search_meta_data.hxx +41 -0
  44. data/ext/couchbase/core/impl/internal_search_result.cxx +84 -0
  45. data/ext/couchbase/core/impl/internal_search_result.hxx +43 -0
  46. data/ext/couchbase/core/impl/internal_search_row.cxx +82 -0
  47. data/ext/couchbase/core/impl/internal_search_row.hxx +56 -0
  48. data/ext/couchbase/core/impl/internal_search_row_location.hxx +32 -0
  49. data/ext/couchbase/core/impl/internal_search_row_locations.cxx +137 -0
  50. data/ext/couchbase/core/impl/internal_search_row_locations.hxx +45 -0
  51. data/ext/couchbase/core/impl/internal_term_facet_result.cxx +80 -0
  52. data/ext/couchbase/core/impl/internal_term_facet_result.hxx +48 -0
  53. data/ext/couchbase/core/impl/match_all_query.cxx +35 -0
  54. data/ext/couchbase/core/impl/match_none_query.cxx +35 -0
  55. data/ext/couchbase/core/impl/match_phrase_query.cxx +43 -0
  56. data/ext/couchbase/core/impl/match_query.cxx +59 -0
  57. data/ext/couchbase/core/impl/numeric_range.cxx +49 -0
  58. data/ext/couchbase/core/impl/numeric_range_facet.cxx +54 -0
  59. data/ext/couchbase/core/impl/numeric_range_facet_result.cxx +64 -0
  60. data/ext/couchbase/core/impl/numeric_range_query.cxx +56 -0
  61. data/ext/couchbase/core/impl/phrase_query.cxx +42 -0
  62. data/ext/couchbase/core/impl/prefix_query.cxx +40 -0
  63. data/ext/couchbase/core/impl/query.cxx +5 -5
  64. data/ext/couchbase/core/impl/query_string_query.cxx +37 -0
  65. data/ext/couchbase/core/impl/regexp_query.cxx +40 -0
  66. data/ext/couchbase/core/impl/search.cxx +191 -0
  67. data/ext/couchbase/core/impl/search_error_context.cxx +147 -0
  68. data/ext/couchbase/core/impl/search_meta_data.cxx +46 -0
  69. data/ext/couchbase/core/impl/search_result.cxx +66 -0
  70. data/ext/couchbase/core/impl/search_row.cxx +74 -0
  71. data/ext/couchbase/core/impl/search_row_location.cxx +64 -0
  72. data/ext/couchbase/core/impl/search_row_locations.cxx +66 -0
  73. data/ext/couchbase/core/impl/search_sort_field.cxx +104 -0
  74. data/ext/couchbase/core/impl/search_sort_id.cxx +43 -0
  75. data/ext/couchbase/core/impl/search_sort_score.cxx +43 -0
  76. data/ext/couchbase/core/impl/term_facet.cxx +36 -0
  77. data/ext/couchbase/core/impl/term_facet_result.cxx +64 -0
  78. data/ext/couchbase/core/impl/term_query.cxx +56 -0
  79. data/ext/couchbase/core/impl/term_range_query.cxx +57 -0
  80. data/ext/couchbase/core/impl/wildcard_query.cxx +40 -0
  81. data/ext/couchbase/core/io/dns_client.cxx +225 -0
  82. data/ext/couchbase/core/io/dns_client.hxx +19 -188
  83. data/ext/couchbase/core/io/http_context.hxx +1 -1
  84. data/ext/couchbase/core/io/http_session.hxx +10 -0
  85. data/ext/couchbase/core/io/http_session_manager.hxx +5 -3
  86. data/ext/couchbase/core/io/mcbp_session.cxx +28 -1
  87. data/ext/couchbase/core/io/retry_orchestrator.hxx +3 -2
  88. data/ext/couchbase/core/json_string.hxx +5 -0
  89. data/ext/couchbase/core/meta/version.cxx +18 -4
  90. data/ext/couchbase/core/mozilla_ca_bundle.hxx +39 -0
  91. data/ext/couchbase/core/operations/document_analytics.cxx +1 -0
  92. data/ext/couchbase/core/operations/document_analytics.hxx +1 -0
  93. data/ext/couchbase/core/operations/document_append.hxx +1 -1
  94. data/ext/couchbase/core/operations/document_decrement.hxx +1 -1
  95. data/ext/couchbase/core/operations/document_exists.hxx +1 -1
  96. data/ext/couchbase/core/operations/document_get.hxx +1 -1
  97. data/ext/couchbase/core/operations/document_get_and_lock.hxx +1 -1
  98. data/ext/couchbase/core/operations/document_get_and_touch.hxx +1 -1
  99. data/ext/couchbase/core/operations/document_get_projected.hxx +1 -1
  100. data/ext/couchbase/core/operations/document_increment.hxx +1 -1
  101. data/ext/couchbase/core/operations/document_insert.hxx +1 -1
  102. data/ext/couchbase/core/operations/document_lookup_in.hxx +1 -1
  103. data/ext/couchbase/core/operations/document_mutate_in.hxx +1 -1
  104. data/ext/couchbase/core/operations/document_prepend.hxx +1 -1
  105. data/ext/couchbase/core/operations/document_query.cxx +2 -0
  106. data/ext/couchbase/core/operations/document_query.hxx +6 -0
  107. data/ext/couchbase/core/operations/document_remove.hxx +1 -1
  108. data/ext/couchbase/core/operations/document_replace.hxx +1 -1
  109. data/ext/couchbase/core/operations/document_search.cxx +4 -1
  110. data/ext/couchbase/core/operations/document_search.hxx +2 -1
  111. data/ext/couchbase/core/operations/document_touch.hxx +1 -1
  112. data/ext/couchbase/core/operations/document_unlock.hxx +1 -1
  113. data/ext/couchbase/core/operations/document_upsert.hxx +1 -1
  114. data/ext/couchbase/core/operations/document_view.hxx +1 -0
  115. data/ext/couchbase/core/protocol/client_request.hxx +11 -2
  116. data/ext/couchbase/core/public_fwd.hxx +21 -0
  117. data/ext/couchbase/core/tls_verify_mode.hxx +26 -0
  118. data/ext/couchbase/core/topology/configuration.cxx +15 -2
  119. data/ext/couchbase/core/topology/configuration.hxx +5 -1
  120. data/ext/couchbase/core/transactions/active_transaction_record.hxx +2 -2
  121. data/ext/couchbase/core/transactions/attempt_context_impl.cxx +3 -0
  122. data/ext/couchbase/core/transactions/attempt_context_impl.hxx +1 -1
  123. data/ext/couchbase/core/transactions/attempt_context_testing_hooks.cxx +93 -0
  124. data/ext/couchbase/core/transactions/attempt_context_testing_hooks.hxx +48 -75
  125. data/ext/couchbase/core/transactions/cleanup_testing_hooks.cxx +52 -0
  126. data/ext/couchbase/core/transactions/cleanup_testing_hooks.hxx +17 -31
  127. data/ext/couchbase/core/transactions/exceptions.hxx +12 -9
  128. data/ext/couchbase/core/transactions/internal/transaction_context.hxx +12 -12
  129. data/ext/couchbase/core/transactions/internal/transactions_cleanup.hxx +7 -1
  130. data/ext/couchbase/core/transactions/transaction_context.cxx +1 -0
  131. data/ext/couchbase/core/transactions/transactions_cleanup.cxx +144 -155
  132. data/ext/couchbase/core/utils/connection_string.cxx +27 -3
  133. data/ext/couchbase/core/utils/connection_string.hxx +3 -3
  134. data/ext/couchbase/core/utils/json.cxx +4 -1
  135. data/ext/couchbase/couchbase/analytics_error_context.hxx +143 -0
  136. data/ext/couchbase/couchbase/analytics_meta_data.hxx +155 -0
  137. data/ext/couchbase/couchbase/analytics_metrics.hxx +163 -0
  138. data/ext/couchbase/couchbase/analytics_options.hxx +359 -0
  139. data/ext/couchbase/couchbase/analytics_result.hxx +102 -0
  140. data/ext/couchbase/couchbase/analytics_scan_consistency.hxx +46 -0
  141. data/ext/couchbase/couchbase/analytics_status.hxx +41 -0
  142. data/ext/couchbase/couchbase/analytics_warning.hxx +85 -0
  143. data/ext/couchbase/couchbase/behavior_options.hxx +10 -1
  144. data/ext/couchbase/couchbase/boolean_field_query.hxx +77 -0
  145. data/ext/couchbase/couchbase/boolean_query.hxx +223 -0
  146. data/ext/couchbase/couchbase/cluster.hxx +75 -1
  147. data/ext/couchbase/couchbase/conjunction_query.hxx +88 -0
  148. data/ext/couchbase/couchbase/date_range.hxx +69 -0
  149. data/ext/couchbase/couchbase/date_range_facet.hxx +56 -0
  150. data/ext/couchbase/couchbase/date_range_facet_result.hxx +55 -0
  151. data/ext/couchbase/couchbase/date_range_query.hxx +265 -0
  152. data/ext/couchbase/couchbase/disjunction_query.hxx +109 -0
  153. data/ext/couchbase/couchbase/doc_id_query.hxx +111 -0
  154. data/ext/couchbase/couchbase/error_context.hxx +7 -6
  155. data/ext/couchbase/couchbase/fmt/analytics_scan_consistency.hxx +52 -0
  156. data/ext/couchbase/couchbase/fmt/analytics_status.hxx +76 -0
  157. data/ext/couchbase/couchbase/fmt/search_scan_consistency.hxx +49 -0
  158. data/ext/couchbase/couchbase/geo_bounding_box_query.hxx +107 -0
  159. data/ext/couchbase/couchbase/geo_distance_query.hxx +109 -0
  160. data/ext/couchbase/couchbase/geo_point.hxx +32 -0
  161. data/ext/couchbase/couchbase/geo_polygon_query.hxx +85 -0
  162. data/ext/couchbase/couchbase/highlight_style.hxx +45 -0
  163. data/ext/couchbase/couchbase/match_all_query.hxx +43 -0
  164. data/ext/couchbase/couchbase/match_none_query.hxx +43 -0
  165. data/ext/couchbase/couchbase/match_operator.hxx +45 -0
  166. data/ext/couchbase/couchbase/match_phrase_query.hxx +108 -0
  167. data/ext/couchbase/couchbase/match_query.hxx +163 -0
  168. data/ext/couchbase/couchbase/numeric_range.hxx +58 -0
  169. data/ext/couchbase/couchbase/numeric_range_facet.hxx +56 -0
  170. data/ext/couchbase/couchbase/numeric_range_facet_result.hxx +55 -0
  171. data/ext/couchbase/couchbase/numeric_range_query.hxx +143 -0
  172. data/ext/couchbase/couchbase/phrase_query.hxx +93 -0
  173. data/ext/couchbase/couchbase/prefix_query.hxx +82 -0
  174. data/ext/couchbase/couchbase/query_options.hxx +0 -1
  175. data/ext/couchbase/couchbase/query_string_query.hxx +72 -0
  176. data/ext/couchbase/couchbase/regexp_query.hxx +82 -0
  177. data/ext/couchbase/couchbase/scope.hxx +73 -0
  178. data/ext/couchbase/couchbase/search_date_range.hxx +68 -0
  179. data/ext/couchbase/couchbase/search_error_context.hxx +138 -0
  180. data/ext/couchbase/couchbase/search_facet.hxx +60 -0
  181. data/ext/couchbase/couchbase/search_facet_result.hxx +50 -0
  182. data/ext/couchbase/couchbase/search_meta_data.hxx +85 -0
  183. data/ext/couchbase/couchbase/search_metrics.hxx +127 -0
  184. data/ext/couchbase/couchbase/search_numeric_range.hxx +69 -0
  185. data/ext/couchbase/couchbase/search_options.hxx +509 -0
  186. data/ext/couchbase/couchbase/search_query.hxx +69 -0
  187. data/ext/couchbase/couchbase/search_result.hxx +77 -0
  188. data/ext/couchbase/couchbase/search_row.hxx +104 -0
  189. data/ext/couchbase/couchbase/search_row_location.hxx +55 -0
  190. data/ext/couchbase/couchbase/search_row_locations.hxx +86 -0
  191. data/ext/couchbase/couchbase/search_scan_consistency.hxx +34 -0
  192. data/ext/couchbase/couchbase/search_sort.hxx +58 -0
  193. data/ext/couchbase/couchbase/search_sort_field.hxx +117 -0
  194. data/ext/couchbase/couchbase/search_sort_field_missing.hxx +26 -0
  195. data/ext/couchbase/couchbase/search_sort_field_mode.hxx +27 -0
  196. data/ext/couchbase/couchbase/search_sort_field_type.hxx +28 -0
  197. data/ext/couchbase/couchbase/search_sort_id.hxx +60 -0
  198. data/ext/couchbase/couchbase/search_sort_score.hxx +60 -0
  199. data/ext/couchbase/couchbase/search_term_range.hxx +51 -0
  200. data/ext/couchbase/couchbase/security_options.hxx +3 -0
  201. data/ext/couchbase/couchbase/term_facet.hxx +48 -0
  202. data/ext/couchbase/couchbase/term_facet_result.hxx +55 -0
  203. data/ext/couchbase/couchbase/term_query.hxx +151 -0
  204. data/ext/couchbase/couchbase/term_range_query.hxx +142 -0
  205. data/ext/couchbase/couchbase/tracing/request_span.hxx +63 -0
  206. data/ext/couchbase/couchbase/tracing/request_tracer.hxx +2 -40
  207. data/ext/couchbase/couchbase/transactions/async_attempt_context.hxx +83 -4
  208. data/ext/couchbase/couchbase/transactions/attempt_context.hxx +68 -1
  209. data/ext/couchbase/couchbase/transactions/transaction_get_result.hxx +2 -0
  210. data/ext/couchbase/couchbase/transactions/transaction_keyspace.hxx +11 -1
  211. data/ext/couchbase/couchbase/transactions/transaction_options.hxx +79 -8
  212. data/ext/couchbase/couchbase/transactions/transaction_query_options.hxx +128 -15
  213. data/ext/couchbase/couchbase/transactions/transaction_query_result.hxx +4 -0
  214. data/ext/couchbase/couchbase/transactions/transaction_result.hxx +1 -1
  215. data/ext/couchbase/couchbase/transactions/transactions_cleanup_config.hxx +5 -3
  216. data/ext/couchbase/couchbase/transactions/transactions_config.hxx +9 -5
  217. data/ext/couchbase/couchbase/transactions/transactions_query_config.hxx +6 -3
  218. data/ext/couchbase/couchbase/transactions.hxx +34 -1
  219. data/ext/couchbase/couchbase/wildcard_query.hxx +83 -0
  220. data/ext/couchbase/test/CMakeLists.txt +8 -7
  221. data/ext/couchbase/test/benchmark_helper_integration.hxx +2 -2
  222. data/ext/couchbase/test/test_helper.hxx +6 -6
  223. data/ext/couchbase/test/test_integration_analytics.cxx +314 -16
  224. data/ext/couchbase/test/test_integration_collections.cxx +7 -3
  225. data/ext/couchbase/test/test_integration_connect.cxx +7 -3
  226. data/ext/couchbase/test/test_integration_crud.cxx +19 -2
  227. data/ext/couchbase/test/test_integration_diagnostics.cxx +11 -5
  228. data/ext/couchbase/test/test_integration_durability.cxx +12 -7
  229. data/ext/couchbase/test/test_integration_examples.cxx +324 -11
  230. data/ext/couchbase/test/test_integration_management.cxx +162 -94
  231. data/ext/couchbase/test/test_integration_query.cxx +68 -10
  232. data/ext/couchbase/test/test_integration_range_scan.cxx +12 -12
  233. data/ext/couchbase/test/test_integration_read_replica.cxx +48 -11
  234. data/ext/couchbase/test/test_integration_search.cxx +621 -0
  235. data/ext/couchbase/test/test_integration_subdoc.cxx +62 -11
  236. data/ext/couchbase/test/test_integration_tracer.cxx +5 -0
  237. data/ext/couchbase/test/test_integration_transcoders.cxx +13 -5
  238. data/ext/couchbase/test/{test_transaction_transaction_context.cxx → test_transaction_context.cxx} +1 -1
  239. data/ext/couchbase/test/test_transaction_examples.cxx +195 -0
  240. data/ext/couchbase/test/{test_transaction_transaction_simple.cxx → test_transaction_simple.cxx} +90 -5
  241. data/ext/couchbase/test/{test_transaction_transaction_simple_async.cxx → test_transaction_simple_async.cxx} +19 -21
  242. data/ext/couchbase/test/test_unit_config_profiles.cxx +13 -13
  243. data/ext/couchbase/test/test_unit_connection_string.cxx +35 -0
  244. data/ext/couchbase/test/test_unit_json_transcoder.cxx +4 -0
  245. data/ext/couchbase/test/test_unit_search.cxx +427 -0
  246. data/ext/couchbase/test/test_unit_transaction_utils.cxx +10 -1
  247. data/ext/couchbase/test/test_unit_utils.cxx +8 -4
  248. data/ext/couchbase/third_party/snappy/CMakeLists.txt +150 -27
  249. data/ext/couchbase/third_party/snappy/cmake/config.h.in +28 -24
  250. data/ext/couchbase/third_party/snappy/snappy-internal.h +189 -25
  251. data/ext/couchbase/third_party/snappy/snappy-sinksource.cc +26 -9
  252. data/ext/couchbase/third_party/snappy/snappy-sinksource.h +11 -11
  253. data/ext/couchbase/third_party/snappy/snappy-stubs-internal.cc +1 -1
  254. data/ext/couchbase/third_party/snappy/snappy-stubs-internal.h +227 -308
  255. data/ext/couchbase/third_party/snappy/snappy-stubs-public.h.in +0 -11
  256. data/ext/couchbase/third_party/snappy/snappy.cc +1176 -410
  257. data/ext/couchbase/third_party/snappy/snappy.h +19 -4
  258. data/ext/couchbase.cxx +85 -22
  259. data/ext/revisions.rb +3 -3
  260. data/lib/couchbase/authenticator.rb +0 -1
  261. data/lib/couchbase/cluster.rb +13 -13
  262. data/lib/couchbase/cluster_registry.rb +7 -2
  263. data/lib/couchbase/config_profiles.rb +1 -1
  264. data/lib/couchbase/configuration.rb +3 -4
  265. data/lib/couchbase/json_transcoder.rb +12 -5
  266. data/lib/couchbase/management/collection_query_index_manager.rb +54 -15
  267. data/lib/couchbase/management/query_index_manager.rb +70 -5
  268. data/lib/couchbase/options.rb +85 -2
  269. data/lib/couchbase/raw_binary_transcoder.rb +37 -0
  270. data/lib/couchbase/raw_json_transcoder.rb +38 -0
  271. data/lib/couchbase/raw_string_transcoder.rb +40 -0
  272. data/lib/couchbase/search_options.rb +163 -240
  273. data/lib/couchbase/transcoder_flags.rb +62 -0
  274. data/lib/couchbase/version.rb +1 -1
  275. metadata +151 -12
  276. data/ext/couchbase/core/CMakeLists.txt +0 -0
  277. /data/ext/couchbase/test/{test_transaction_transaction_public_async_api.cxx → test_transaction_public_async_api.cxx} +0 -0
  278. /data/ext/couchbase/test/{test_transaction_transaction_public_blocking_api.cxx → test_transaction_public_blocking_api.cxx} +0 -0
@@ -17,9 +17,18 @@
17
17
 
18
18
  #include "test_helper_integration.hxx"
19
19
 
20
+ #include "core/operations/management/query_index_build.hxx"
21
+ #include "core/operations/management/query_index_create.hxx"
22
+ #include "core/operations/management/query_index_get_all.hxx"
23
+
24
+ #include <couchbase/boolean_query.hxx>
20
25
  #include <couchbase/cluster.hxx>
21
26
  #include <couchbase/fmt/cas.hxx>
22
27
  #include <couchbase/fmt/mutation_token.hxx>
28
+ #include <couchbase/match_query.hxx>
29
+ #include <couchbase/numeric_range_query.hxx>
30
+ #include <couchbase/query_string_query.hxx>
31
+ #include <couchbase/term_facet.hxx>
23
32
 
24
33
  #include <tao/json.hpp>
25
34
 
@@ -40,9 +49,9 @@ main(int argc, const char* argv[])
40
49
  return 1;
41
50
  }
42
51
 
43
- std::string connection_string{ argv[1] };
44
- std::string username{ argv[2] };
45
- std::string password{ argv[3] };
52
+ std::string connection_string{ argv[1] }; // "couchbase://127.0.0.1"
53
+ std::string username{ argv[2] }; // "Administrator"
54
+ std::string password{ argv[3] }; // "password"
46
55
  std::string bucket_name{ "travel-sample" };
47
56
 
48
57
  // run IO context on separate thread
@@ -55,6 +64,7 @@ main(int argc, const char* argv[])
55
64
  // For example, optimize timeouts for WAN
56
65
  options.apply_profile("wan_development");
57
66
 
67
+ // [1] connect to cluster using the given connection string and the options
58
68
  auto [cluster, ec] = couchbase::cluster::connect(io, connection_string, options).get();
59
69
  if (ec) {
60
70
  fmt::print("unable to connect to the cluster: {}\n", ec.message());
@@ -68,8 +78,7 @@ main(int argc, const char* argv[])
68
78
  auto scope = bucket.scope("tenant_agent_00");
69
79
  auto collection = scope.collection("users");
70
80
 
71
- {
72
- // upsert document
81
+ { // [2] upsert document
73
82
  auto [ctx, upsert_result] = collection.upsert("my-document", tao::json::value{ { "name", "mike" } }).get();
74
83
  if (ctx.ec()) {
75
84
  fmt::print("unable to upsert the document \"{}\": {}\n", ctx.id(), ctx.ec().message());
@@ -78,8 +87,7 @@ main(int argc, const char* argv[])
78
87
  fmt::print("saved document \"{}\", cas={}, token={}\n", ctx.id(), upsert_result.cas(), upsert_result.mutation_token().value());
79
88
  }
80
89
 
81
- {
82
- // get document
90
+ { // [3] get document
83
91
  auto [ctx, get_result] = collection.get("my-document").get();
84
92
  if (ctx.ec()) {
85
93
  fmt::print("unable to get the document \"{}\": {}\n", ctx.id(), ctx.ec().message());
@@ -89,8 +97,7 @@ main(int argc, const char* argv[])
89
97
  fmt::print("retrieved document \"{}\", name=\"{}\"\n", ctx.id(), name);
90
98
  }
91
99
 
92
- {
93
- // N1QL query
100
+ { // [4] N1QL query
94
101
  auto inventory_scope = bucket.scope("inventory");
95
102
  auto [ctx, query_result] = inventory_scope.query("SELECT * FROM airline WHERE id = 10").get();
96
103
  if (ctx.ec()) {
@@ -102,7 +109,7 @@ main(int argc, const char* argv[])
102
109
  }
103
110
  }
104
111
 
105
- // close cluster connection
112
+ // [5] close cluster connection
106
113
  cluster.close();
107
114
  guard.reset();
108
115
 
@@ -126,9 +133,49 @@ TEST_CASE("example: start using", "[integration]")
126
133
  {
127
134
  test::utils::integration_test_guard integration;
128
135
  if (!integration.cluster_version().supports_collections()) {
129
- return;
136
+ SKIP("cluster does not support collections");
137
+ }
138
+ if (integration.cluster_version().is_mock()) {
139
+ SKIP("GOCAVES cannot load travel-sample bucket. See https://github.com/couchbaselabs/gocaves/issues/101");
140
+ }
141
+
142
+ {
143
+ couchbase::core::operations::management::query_index_create_request req{};
144
+ req.index_name = "def_inventory_airline_primary";
145
+ req.bucket_name = "travel-sample";
146
+ req.scope_name = "inventory";
147
+ req.collection_name = "airline";
148
+ req.is_primary = true;
149
+ req.ignore_if_exists = true;
150
+ auto resp = test::utils::execute(integration.cluster, req);
151
+ REQUIRE_FALSE(resp.ctx.ec);
130
152
  }
131
153
 
154
+ {
155
+ couchbase::core::operations::management::query_index_build_request req{};
156
+ req.index_names = { "def_inventory_airline_primary" };
157
+ req.bucket_name = "travel-sample";
158
+ req.scope_name = "inventory";
159
+ req.collection_name = "airline";
160
+ auto resp = test::utils::execute(integration.cluster, req);
161
+ REQUIRE_FALSE(resp.ctx.ec);
162
+ }
163
+
164
+ CHECK(test::utils::wait_until(
165
+ [&integration]() {
166
+ couchbase::core::operations::management::query_index_get_all_request req{};
167
+ req.bucket_name = "travel-sample";
168
+ req.scope_name = "inventory";
169
+ auto resp = test::utils::execute(integration.cluster, req);
170
+ if (resp.ctx.ec) {
171
+ return false;
172
+ }
173
+ return std::any_of(resp.indexes.begin(), resp.indexes.end(), [](const auto& index) {
174
+ return index.collection_name == "airline" && index.is_primary && index.state == "online";
175
+ });
176
+ },
177
+ std::chrono::minutes{ 5 }));
178
+
132
179
  const auto env = test::utils::test_context::load_from_environment();
133
180
  const char* argv[] = {
134
181
  "start_using", // name of the "executable"
@@ -139,3 +186,269 @@ TEST_CASE("example: start using", "[integration]")
139
186
 
140
187
  REQUIRE(start_using::main(4, argv) == 0);
141
188
  }
189
+
190
+ namespace example_search
191
+ {
192
+ //! [example-search]
193
+ #include <couchbase/cluster.hxx>
194
+
195
+ #include <couchbase/boolean_query.hxx>
196
+ #include <couchbase/match_query.hxx>
197
+ #include <couchbase/numeric_range_query.hxx>
198
+ #include <couchbase/query_string_query.hxx>
199
+
200
+ #include <couchbase/fmt/cas.hxx>
201
+ #include <couchbase/fmt/mutation_token.hxx>
202
+
203
+ #include <tao/json.hpp>
204
+
205
+ int
206
+ main(int argc, const char* argv[])
207
+ {
208
+ if (argc != 4) {
209
+ fmt::print("USAGE: ./example_search couchbase://127.0.0.1 Administrator password\n");
210
+ return 1;
211
+ }
212
+
213
+ std::string connection_string{ argv[1] }; // "couchbase://127.0.0.1"
214
+ std::string username{ argv[2] }; // "Administrator"
215
+ std::string password{ argv[3] }; // "password"
216
+ std::string bucket_name{ "travel-sample" };
217
+
218
+ // run IO context on separate thread
219
+ asio::io_context io;
220
+ auto guard = asio::make_work_guard(io);
221
+ std::thread io_thread([&io]() { io.run(); });
222
+
223
+ auto options = couchbase::cluster_options(username, password);
224
+ // customize through the 'options'.
225
+ // For example, optimize timeouts for WAN
226
+ options.apply_profile("wan_development");
227
+
228
+ auto [cluster, ec] = couchbase::cluster::connect(io, connection_string, options).get();
229
+ if (ec) {
230
+ fmt::print("unable to connect to the cluster: {}\n", ec.message());
231
+ return 1;
232
+ }
233
+
234
+ {
235
+ fmt::print("--- simple query\n");
236
+ auto [ctx, result] = cluster.search_query("travel-sample-index", couchbase::query_string_query("nice bar")).get();
237
+
238
+ if (ctx.ec()) {
239
+ fmt::print("unable to perform search query: {}, ({}, {})\n", ctx.ec().message(), ctx.status(), ctx.error());
240
+ return 1;
241
+ }
242
+ fmt::print("{} hits, total: {}\n", result.rows().size(), result.meta_data().metrics().total_rows());
243
+ for (const auto& row : result.rows()) {
244
+ fmt::print("id: {}, score: {}\n", row.id(), row.score());
245
+ }
246
+ }
247
+
248
+ {
249
+ fmt::print("--- simple query with fields\n");
250
+ auto [ctx, result] = cluster
251
+ .search_query("travel-sample-index",
252
+ couchbase::query_string_query("nice bar"),
253
+ couchbase::search_options{}.fields({ "description" }))
254
+ .get();
255
+
256
+ if (ctx.ec()) {
257
+ fmt::print("unable to perform search query: {}, ({}, {})\n", ctx.ec().message(), ctx.status(), ctx.error());
258
+ return 1;
259
+ }
260
+ fmt::print("{} hits, total: {}\n", result.rows().size(), result.meta_data().metrics().total_rows());
261
+ for (const auto& row : result.rows()) {
262
+ auto fields = row.fields_as<couchbase::codec::tao_json_serializer>();
263
+ fmt::print("id: {}, score: {}, description: {}\n", row.id(), row.score(), fields["description"].as<std::string>());
264
+ }
265
+ }
266
+
267
+ {
268
+ fmt::print("--- simple query with limit\n");
269
+ auto [ctx, result] =
270
+ cluster
271
+ .search_query("travel-sample-index", couchbase::query_string_query("nice bar"), couchbase::search_options{}.skip(3).limit(4))
272
+ .get();
273
+
274
+ if (ctx.ec()) {
275
+ fmt::print("unable to perform search query: {}, ({}, {})\n", ctx.ec().message(), ctx.status(), ctx.error());
276
+ return 1;
277
+ }
278
+ fmt::print("{} hits, total: {}\n", result.rows().size(), result.meta_data().metrics().total_rows());
279
+ for (const auto& row : result.rows()) {
280
+ fmt::print("id: {}, score: {}\n", row.id(), row.score());
281
+ }
282
+ }
283
+
284
+ {
285
+ fmt::print("--- simple query with highlight\n");
286
+ auto [ctx, result] =
287
+ cluster
288
+ .search_query("travel-sample-index",
289
+ couchbase::query_string_query("nice bar"),
290
+ couchbase::search_options{}.highlight(couchbase::highlight_style::html, { "description", "title" }))
291
+ .get();
292
+
293
+ if (ctx.ec()) {
294
+ fmt::print("unable to perform search query: {}, ({}, {})\n", ctx.ec().message(), ctx.status(), ctx.error());
295
+ return 1;
296
+ }
297
+ fmt::print("{} hits, total: {}\n", result.rows().size(), result.meta_data().metrics().total_rows());
298
+ for (const auto& row : result.rows()) {
299
+ fmt::print("id: {}, score: {}\n", row.id(), row.score());
300
+ for (const auto& [field, fragments] : row.fragments()) {
301
+ fmt::print("- {}:\n", field);
302
+ for (const auto& fragment : fragments) {
303
+ fmt::print("-- {}\n", fragment);
304
+ }
305
+ }
306
+ }
307
+ }
308
+
309
+ {
310
+ fmt::print("--- simple query with collections\n");
311
+ auto [ctx, result] = cluster
312
+ .search_query("travel-sample-index",
313
+ couchbase::query_string_query("west"),
314
+ couchbase::search_options{}.collections({ "airline" }))
315
+ .get();
316
+
317
+ if (ctx.ec()) {
318
+ fmt::print("unable to perform search query: {}, ({}, {})\n", ctx.ec().message(), ctx.status(), ctx.error());
319
+ return 1;
320
+ }
321
+ fmt::print("{} hits, total: {}\n", result.rows().size(), result.meta_data().metrics().total_rows());
322
+ for (const auto& row : result.rows()) {
323
+ fmt::print("id: {}, score: {}\n", row.id(), row.score());
324
+ }
325
+ }
326
+
327
+ {
328
+ fmt::print("--- query with consistency requirements\n");
329
+
330
+ auto bucket = cluster.bucket(bucket_name);
331
+ auto collection = bucket.scope("inventory").collection("hotel");
332
+
333
+ couchbase::mutation_state state;
334
+
335
+ {
336
+ auto [ctx, upsert_result] =
337
+ collection
338
+ .upsert(
339
+ "prancing-pony",
340
+ tao::json::value{
341
+ { "title", "The Prancing Pony" },
342
+ { "type", "hotel" },
343
+ { "description",
344
+ "The inn was located just where the East Road bent round the foot of Bree-hill, within the dike that stretched "
345
+ "around the town. The building was three stories tall with many windows. Its front faced the Road and it had two "
346
+ "wings that ran back towards the elevated ground of the hill, such that in the rear the second floor was at ground "
347
+ "level. " } })
348
+ .get();
349
+ if (ctx.ec()) {
350
+ fmt::print("unable to upsert the document \"{}\": {}\n", ctx.id(), ctx.ec().message());
351
+ return 1;
352
+ }
353
+ fmt::print("saved document \"{}\", cas={}, token={}\n",
354
+ ctx.id(),
355
+ upsert_result.cas(),
356
+ upsert_result.mutation_token().value_or(couchbase::mutation_token{}));
357
+ state.add(upsert_result);
358
+ }
359
+
360
+ auto [ctx, result] =
361
+ cluster
362
+ .search_query("travel-sample-index", couchbase::query_string_query("bree"), couchbase::search_options{}.consistent_with(state))
363
+ .get();
364
+
365
+ if (ctx.ec()) {
366
+ fmt::print("unable to perform search query: {}, ({}, {})\n", ctx.ec().message(), ctx.status(), ctx.error());
367
+ return 1;
368
+ }
369
+ fmt::print("{} hits, total: {}\n", result.rows().size(), result.meta_data().metrics().total_rows());
370
+ for (const auto& row : result.rows()) {
371
+ fmt::print("id: {}, score: {}\n", row.id(), row.score());
372
+ }
373
+ }
374
+
375
+ {
376
+ fmt::print("--- complex query\n");
377
+ auto [ctx, result] = cluster
378
+ .search_query("travel-sample-index",
379
+ couchbase::boolean_query()
380
+ .must(couchbase::match_query("honeymoon").field("reviews.content"),
381
+ couchbase::numeric_range_query().field("reviews.ratings.Overall").min(4))
382
+ .must_not(couchbase::match_query("San Francisco").field("city")),
383
+ couchbase::search_options{}.collections({ "hotel" }).highlight())
384
+ .get();
385
+ if (ctx.ec()) {
386
+ fmt::print("unable to perform search query: {}, ({}, {})\n", ctx.ec().message(), ctx.status(), ctx.error());
387
+ return 1;
388
+ }
389
+ fmt::print("{} hits, total: {}\n", result.rows().size(), result.meta_data().metrics().total_rows());
390
+ for (const auto& row : result.rows()) {
391
+ fmt::print("id: {}, score: {}\n", row.id(), row.score());
392
+ }
393
+ }
394
+
395
+ {
396
+ fmt::print("--- simple query with facets\n");
397
+ auto [ctx, result] =
398
+ cluster
399
+ .search_query("travel-sample-index",
400
+ couchbase::query_string_query("honeymoon"),
401
+ couchbase::search_options{}.collections({ "hotel" }).facet("by_country", couchbase::term_facet("country", 3)))
402
+ .get();
403
+ if (ctx.ec()) {
404
+ fmt::print("unable to perform search query: {}, ({}, {})\n", ctx.ec().message(), ctx.status(), ctx.error());
405
+ return 1;
406
+ }
407
+ fmt::print("{} hits, total: {}\n", result.rows().size(), result.meta_data().metrics().total_rows());
408
+ for (const auto& [name, facet] : result.facets()) {
409
+ fmt::print("{} facet: total={}, missing={}\n", name, facet->total(), facet->missing());
410
+ if (name == "by_country") {
411
+ auto term_facet = std::static_pointer_cast<couchbase::term_facet_result>(facet);
412
+ for (const auto& group : term_facet->terms()) {
413
+ fmt::print("* {}: {}\n", group.name(), group.count());
414
+ }
415
+ }
416
+ }
417
+ }
418
+
419
+ // close cluster connection
420
+ cluster.close();
421
+ guard.reset();
422
+
423
+ io_thread.join();
424
+ return 0;
425
+ }
426
+
427
+ /*
428
+
429
+ $ ./example_search couchbase://127.0.0.1 Administrator password
430
+ saved document "my-document", cas=17486a1722b20000
431
+ retrieved document "my-document", name="mike"
432
+ row: {"airline":{"callsign":"MILE-AIR","country":"United States","iata":"Q5","icao":"MLA","id":10,"name":"40-Mile Air","type":"airline"}}
433
+
434
+ */
435
+ //! [example-search]
436
+ } // namespace example_search
437
+
438
+ TEST_CASE("example: search", "[integration]")
439
+ {
440
+ test::utils::integration_test_guard integration;
441
+ if (!integration.cluster_version().supports_collections()) {
442
+ return;
443
+ }
444
+
445
+ const auto env = test::utils::test_context::load_from_environment();
446
+ const char* argv[] = {
447
+ "example_search", // name of the "executable"
448
+ env.connection_string.c_str(),
449
+ env.username.c_str(),
450
+ env.password.c_str(),
451
+ };
452
+
453
+ REQUIRE(example_search::main(4, argv) == 0);
454
+ }