couchbase 4.2.1 → 4.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/CMakeLists.txt +1 -0
  2. package/deps/couchbase-cxx-client/.gitmodules +3 -0
  3. package/deps/couchbase-cxx-client/.idea/misc.xml +1 -0
  4. package/deps/couchbase-cxx-client/.idea/vcs.xml +1 -0
  5. package/deps/couchbase-cxx-client/CMakeLists.txt +11 -1
  6. package/deps/couchbase-cxx-client/README.md +3 -3
  7. package/deps/couchbase-cxx-client/cmake/CompilerWarnings.cmake +4 -1
  8. package/deps/couchbase-cxx-client/cmake/VersionInfo.cmake +13 -1
  9. package/deps/couchbase-cxx-client/cmake/build_version.hxx.in +1 -0
  10. package/deps/couchbase-cxx-client/core/cluster.hxx +15 -5
  11. package/deps/couchbase-cxx-client/core/impl/build_deferred_query_indexes.cxx +17 -6
  12. package/deps/couchbase-cxx-client/core/impl/cluster.cxx +1 -1
  13. package/deps/couchbase-cxx-client/core/impl/collection_query_index_manager.cxx +93 -0
  14. package/deps/couchbase-cxx-client/core/impl/configuration_profiles_registry.cxx +11 -0
  15. package/deps/couchbase-cxx-client/core/impl/create_query_index.cxx +119 -0
  16. package/deps/couchbase-cxx-client/core/impl/drop_query_index.cxx +108 -0
  17. package/deps/couchbase-cxx-client/core/impl/get.cxx +1 -1
  18. package/deps/couchbase-cxx-client/core/impl/get_all_query_indexes.cxx +76 -0
  19. package/deps/couchbase-cxx-client/core/impl/query.cxx +5 -7
  20. package/deps/couchbase-cxx-client/core/impl/watch_query_indexes.cxx +168 -0
  21. package/deps/couchbase-cxx-client/core/io/mcbp_session.cxx +15 -1
  22. package/deps/couchbase-cxx-client/core/logger/configuration.hxx +3 -0
  23. package/deps/couchbase-cxx-client/core/logger/level.hxx +21 -0
  24. package/deps/couchbase-cxx-client/core/logger/logger.hxx +4 -6
  25. package/deps/couchbase-cxx-client/core/meta/CMakeLists.txt +4 -2
  26. package/deps/couchbase-cxx-client/core/meta/features.hxx +31 -0
  27. package/deps/couchbase-cxx-client/core/meta/version.cxx +67 -5
  28. package/deps/couchbase-cxx-client/core/meta/version.hxx +12 -1
  29. package/deps/couchbase-cxx-client/core/metrics/CMakeLists.txt +4 -1
  30. package/deps/couchbase-cxx-client/core/metrics/logging_meter.cxx +46 -5
  31. package/deps/couchbase-cxx-client/core/metrics/logging_meter.hxx +10 -26
  32. package/deps/couchbase-cxx-client/core/operations/document_get_projected.cxx +3 -2
  33. package/deps/couchbase-cxx-client/core/operations/document_query.cxx +10 -12
  34. package/deps/couchbase-cxx-client/core/operations/document_query.hxx +1 -3
  35. package/deps/couchbase-cxx-client/core/operations/management/query_index_build.cxx +8 -14
  36. package/deps/couchbase-cxx-client/core/operations/management/query_index_build.hxx +2 -1
  37. package/deps/couchbase-cxx-client/core/operations/management/query_index_build_deferred.hxx +15 -8
  38. package/deps/couchbase-cxx-client/core/operations/management/query_index_create.cxx +7 -14
  39. package/deps/couchbase-cxx-client/core/operations/management/query_index_create.hxx +2 -0
  40. package/deps/couchbase-cxx-client/core/operations/management/query_index_drop.cxx +11 -16
  41. package/deps/couchbase-cxx-client/core/operations/management/query_index_drop.hxx +2 -0
  42. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all.cxx +8 -12
  43. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all.hxx +4 -3
  44. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all_deferred.cxx +21 -12
  45. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all_deferred.hxx +3 -2
  46. package/deps/couchbase-cxx-client/core/origin.hxx +1 -1
  47. package/deps/couchbase-cxx-client/core/platform/uuid.cc +1 -2
  48. package/deps/couchbase-cxx-client/core/protocol/cmd_hello.hxx +5 -1
  49. package/deps/couchbase-cxx-client/core/query_context.hxx +79 -0
  50. package/deps/couchbase-cxx-client/core/tracing/CMakeLists.txt +3 -1
  51. package/deps/couchbase-cxx-client/core/tracing/threshold_logging_tracer.cxx +19 -4
  52. package/deps/couchbase-cxx-client/core/tracing/threshold_logging_tracer.hxx +2 -2
  53. package/deps/couchbase-cxx-client/core/transactions/async_attempt_context.hxx +10 -4
  54. package/deps/couchbase-cxx-client/core/transactions/atr_cleanup_entry.cxx +52 -63
  55. package/deps/couchbase-cxx-client/core/transactions/attempt_context.hxx +8 -3
  56. package/deps/couchbase-cxx-client/core/transactions/attempt_context_impl.cxx +163 -126
  57. package/deps/couchbase-cxx-client/core/transactions/attempt_context_impl.hxx +24 -37
  58. package/deps/couchbase-cxx-client/core/transactions/forward_compat.hxx +4 -4
  59. package/deps/couchbase-cxx-client/core/transactions/internal/atr_cleanup_entry.hxx +51 -13
  60. package/deps/couchbase-cxx-client/core/transactions/internal/client_record.hxx +26 -1
  61. package/deps/couchbase-cxx-client/core/transactions/internal/doc_record.hxx +21 -0
  62. package/deps/couchbase-cxx-client/core/transactions/internal/logging.hxx +40 -18
  63. package/deps/couchbase-cxx-client/core/transactions/internal/transaction_context.hxx +5 -0
  64. package/deps/couchbase-cxx-client/core/transactions/result.hxx +26 -0
  65. package/deps/couchbase-cxx-client/core/transactions/staged_mutation.cxx +48 -47
  66. package/deps/couchbase-cxx-client/core/transactions/staged_mutation.hxx +6 -6
  67. package/deps/couchbase-cxx-client/core/transactions/transaction_context.cxx +33 -19
  68. package/deps/couchbase-cxx-client/core/transactions/transaction_get_result.hxx +18 -2
  69. package/deps/couchbase-cxx-client/core/transactions/transaction_links.hxx +25 -2
  70. package/deps/couchbase-cxx-client/core/transactions/transactions.cxx +4 -4
  71. package/deps/couchbase-cxx-client/core/transactions/transactions_cleanup.cxx +49 -56
  72. package/deps/couchbase-cxx-client/core/transactions/waitable_op_list.hxx +7 -7
  73. package/deps/couchbase-cxx-client/core/transactions.hxx +0 -12
  74. package/deps/couchbase-cxx-client/core/utils/binary.hxx +1 -1
  75. package/deps/couchbase-cxx-client/core/utils/keyspace.hxx +55 -0
  76. package/deps/couchbase-cxx-client/couchbase/build_query_index_options.hxx +12 -45
  77. package/deps/couchbase-cxx-client/couchbase/cluster.hxx +1 -1
  78. package/deps/couchbase-cxx-client/couchbase/cluster_options.hxx +6 -7
  79. package/deps/couchbase-cxx-client/couchbase/collection.hxx +8 -0
  80. package/deps/couchbase-cxx-client/couchbase/collection_query_index_manager.hxx +218 -0
  81. package/deps/couchbase-cxx-client/couchbase/configuration_profiles_registry.hxx +3 -0
  82. package/deps/couchbase-cxx-client/couchbase/create_primary_query_index_options.hxx +166 -0
  83. package/deps/couchbase-cxx-client/couchbase/create_query_index_options.hxx +172 -0
  84. package/deps/couchbase-cxx-client/couchbase/drop_primary_query_index_options.hxx +129 -0
  85. package/deps/couchbase-cxx-client/couchbase/drop_query_index_options.hxx +116 -0
  86. package/deps/couchbase-cxx-client/couchbase/fmt/cas.hxx +1 -1
  87. package/deps/couchbase-cxx-client/couchbase/fmt/query_scan_consistency.hxx +46 -0
  88. package/deps/couchbase-cxx-client/couchbase/fmt/query_status.hxx +70 -0
  89. package/deps/couchbase-cxx-client/couchbase/fmt/tls_verify_mode.hxx +46 -0
  90. package/deps/couchbase-cxx-client/couchbase/get_all_query_indexes_options.hxx +100 -0
  91. package/deps/couchbase-cxx-client/{core → couchbase}/management/query_index.hxx +2 -2
  92. package/deps/couchbase-cxx-client/couchbase/metrics/meter.hxx +16 -0
  93. package/deps/couchbase-cxx-client/couchbase/query_index_manager.hxx +178 -6
  94. package/deps/couchbase-cxx-client/couchbase/query_options.hxx +1 -18
  95. package/deps/couchbase-cxx-client/couchbase/scope.hxx +5 -2
  96. package/deps/couchbase-cxx-client/couchbase/tracing/request_tracer.hxx +16 -0
  97. package/deps/couchbase-cxx-client/couchbase/transactions/async_attempt_context.hxx +11 -4
  98. package/deps/couchbase-cxx-client/couchbase/transactions/attempt_context.hxx +5 -3
  99. package/deps/couchbase-cxx-client/couchbase/transactions/transaction_keyspace.hxx +16 -0
  100. package/deps/couchbase-cxx-client/couchbase/transactions/transaction_query_options.hxx +0 -6
  101. package/deps/couchbase-cxx-client/couchbase/watch_query_indexes_options.hxx +115 -0
  102. package/deps/couchbase-cxx-client/examples/minimal.cxx +3 -1
  103. package/deps/couchbase-cxx-client/test/test_integration_crud.cxx +72 -0
  104. package/deps/couchbase-cxx-client/test/test_integration_management.cxx +727 -310
  105. package/deps/couchbase-cxx-client/test/test_integration_query.cxx +4 -8
  106. package/deps/couchbase-cxx-client/test/test_integration_transcoders.cxx +14 -0
  107. package/deps/couchbase-cxx-client/test/test_transaction_transaction_public_blocking_api.cxx +34 -19
  108. package/deps/couchbase-cxx-client/test/test_unit_transaction_logging.cxx +66 -22
  109. package/deps/couchbase-cxx-client/test/test_unit_utils.cxx +51 -0
  110. package/deps/couchbase-cxx-client/test/tools/tool_kv_loader.cxx +2 -2
  111. package/deps/couchbase-cxx-client/test/utils/integration_test_guard.cxx +2 -0
  112. package/deps/couchbase-cxx-client/test/utils/wait_until.cxx +4 -4
  113. package/deps/couchbase-cxx-client/third_party/docopt/.travis.yml +103 -0
  114. package/deps/couchbase-cxx-client/third_party/docopt/CMakeLists.txt +129 -0
  115. package/deps/couchbase-cxx-client/third_party/docopt/LICENSE-Boost-1.0 +23 -0
  116. package/deps/couchbase-cxx-client/third_party/docopt/LICENSE-MIT +23 -0
  117. package/deps/couchbase-cxx-client/third_party/docopt/README.rst +479 -0
  118. package/deps/couchbase-cxx-client/third_party/docopt/docopt-config.cmake +1 -0
  119. package/deps/couchbase-cxx-client/third_party/docopt/docopt.cpp +687 -0
  120. package/deps/couchbase-cxx-client/third_party/docopt/docopt.h +98 -0
  121. package/deps/couchbase-cxx-client/third_party/docopt/docopt.pc.in +9 -0
  122. package/deps/couchbase-cxx-client/third_party/docopt/docopt_private.h +676 -0
  123. package/deps/couchbase-cxx-client/third_party/docopt/docopt_util.h +122 -0
  124. package/deps/couchbase-cxx-client/third_party/docopt/docopt_value.h +341 -0
  125. package/deps/couchbase-cxx-client/third_party/docopt/examples/naval_fate.cpp +36 -0
  126. package/deps/couchbase-cxx-client/third_party/docopt/main.cpp +16 -0
  127. package/deps/couchbase-cxx-client/third_party/docopt/run_testcase.cpp +40 -0
  128. package/deps/couchbase-cxx-client/third_party/docopt/run_tests.py +72 -0
  129. package/deps/couchbase-cxx-client/third_party/docopt/testcases.docopt +957 -0
  130. package/deps/couchbase-cxx-client/tools/CMakeLists.txt +14 -0
  131. package/deps/couchbase-cxx-client/tools/cbc.cxx +65 -0
  132. package/deps/couchbase-cxx-client/tools/command.hxx +31 -0
  133. package/deps/couchbase-cxx-client/tools/command_registry.cxx +43 -0
  134. package/deps/couchbase-cxx-client/tools/command_registry.hxx +39 -0
  135. package/deps/couchbase-cxx-client/tools/get.cxx +267 -0
  136. package/deps/couchbase-cxx-client/tools/get.hxx +26 -0
  137. package/deps/couchbase-cxx-client/tools/query.cxx +441 -0
  138. package/deps/couchbase-cxx-client/tools/query.hxx +26 -0
  139. package/deps/couchbase-cxx-client/tools/utils.cxx +418 -0
  140. package/deps/couchbase-cxx-client/tools/utils.hxx +150 -0
  141. package/deps/couchbase-cxx-client/tools/version.cxx +82 -0
  142. package/deps/couchbase-cxx-client/tools/version.hxx +26 -0
  143. package/dist/authenticators.d.ts +2 -2
  144. package/dist/authenticators.js +1 -2
  145. package/dist/binding.d.ts +32 -16
  146. package/dist/cluster.js +14 -7
  147. package/dist/collection.d.ts +6 -0
  148. package/dist/collection.js +8 -0
  149. package/dist/queryexecutor.js +1 -1
  150. package/dist/queryindexmanager.d.ts +100 -4
  151. package/dist/queryindexmanager.js +344 -118
  152. package/dist/transactions.js +0 -2
  153. package/package.json +1 -1
  154. package/src/connection.cpp +2 -0
  155. package/src/connection.hpp +1 -0
  156. package/src/connection_autogen.cpp +16 -0
  157. package/src/jstocbpp_autogen.hpp +93 -23
  158. package/src/jstocbpp_basic.hpp +24 -0
  159. package/src/jstocbpp_transactions.hpp +0 -8
  160. package/tools/gen-bindings-js.js +1 -0
  161. package/tools/gen-bindings-json.py +4 -2
  162. package/deps/couchbase-cxx-client/core/transactions/logging.cxx +0 -107
@@ -27,6 +27,10 @@
27
27
  #include "core/operations/management/search.hxx"
28
28
  #include "core/operations/management/user.hxx"
29
29
  #include "couchbase/cluster.hxx"
30
+ #include "couchbase/create_primary_query_index_options.hxx"
31
+ #include "couchbase/create_query_index_options.hxx"
32
+ #include "couchbase/drop_query_index_options.hxx"
33
+ #include "couchbase/watch_query_indexes_options.hxx"
30
34
 
31
35
  static couchbase::core::operations::management::bucket_get_response
32
36
  wait_for_bucket_created(test::utils::integration_test_guard& integration, const std::string& bucket_name)
@@ -1029,12 +1033,6 @@ TEST_CASE("integration: query index management", "[integration]")
1029
1033
  {
1030
1034
  test::utils::integration_test_guard integration;
1031
1035
 
1032
- if (!integration.cluster_version().supports_collections()) {
1033
- return;
1034
- }
1035
-
1036
- auto index_name = test::utils::uniq_id("index");
1037
-
1038
1036
  if (integration.cluster_version().supports_bucket_management()) {
1039
1037
  SECTION("primary index")
1040
1038
  {
@@ -1049,13 +1047,82 @@ TEST_CASE("integration: query index management", "[integration]")
1049
1047
  }
1050
1048
 
1051
1049
  REQUIRE(!wait_for_bucket_created(integration, bucket_name).ctx.ec);
1050
+ SECTION("core API")
1051
+ {
1052
+
1053
+ {
1054
+ couchbase::core::operations::management::query_index_create_response resp;
1055
+ bool operation_completed = test::utils::wait_until([&integration, &bucket_name, &resp]() {
1056
+ couchbase::core::operations::management::query_index_create_request req{};
1057
+ req.bucket_name = bucket_name;
1058
+ req.is_primary = true;
1059
+ resp = test::utils::execute(integration.cluster, req);
1060
+ return resp.ctx.ec != couchbase::errc::common::bucket_not_found;
1061
+ });
1062
+ REQUIRE(operation_completed);
1063
+ REQUIRE_SUCCESS(resp.ctx.ec);
1064
+ }
1065
+
1066
+ {
1067
+ couchbase::core::operations::management::query_index_get_all_request req{};
1068
+ req.bucket_name = bucket_name;
1069
+ auto resp = test::utils::execute(integration.cluster, req);
1070
+ REQUIRE_SUCCESS(resp.ctx.ec);
1071
+ REQUIRE(resp.indexes.size() == 1);
1072
+ REQUIRE(resp.indexes[0].name == "#primary");
1073
+ REQUIRE(resp.indexes[0].is_primary);
1074
+ }
1075
+
1076
+ {
1077
+ couchbase::core::operations::management::bucket_drop_request req{ bucket_name };
1078
+ test::utils::execute(integration.cluster, req);
1079
+ }
1080
+ }
1081
+ SECTION("public api")
1082
+ {
1083
+ couchbase::cluster c(integration.cluster);
1084
+ {
1085
+ std::error_code ec;
1086
+ bool operation_completed = test::utils::wait_until([&bucket_name, &ec, &c]() {
1087
+ auto ctx = c.query_indexes().create_primary_index(bucket_name, {}).get();
1088
+ ec = ctx.ec();
1089
+ return ec != couchbase::errc::common::bucket_not_found;
1090
+ });
1091
+ REQUIRE(operation_completed);
1092
+ REQUIRE_SUCCESS(ec);
1093
+ }
1094
+ {
1095
+ auto [ctx, indexes] = c.query_indexes().get_all_indexes(bucket_name, {}).get();
1096
+ REQUIRE_SUCCESS(ctx.ec());
1097
+ REQUIRE(indexes.size() == 1);
1098
+ REQUIRE(indexes[0].name == "#primary");
1099
+ REQUIRE(indexes[0].is_primary);
1100
+ }
1101
+ {
1102
+ auto ctx =
1103
+ c.query_indexes().watch_indexes(bucket_name, {}, couchbase::watch_query_indexes_options().watch_primary(true)).get();
1104
+ REQUIRE_SUCCESS(ctx.ec());
1105
+ }
1106
+ {
1107
+ auto ctx = c.query_indexes().drop_primary_index(bucket_name, {}).get();
1108
+ REQUIRE_SUCCESS(ctx.ec());
1109
+ }
1110
+ }
1111
+ }
1112
+ }
1052
1113
 
1114
+ SECTION("non primary index")
1115
+ {
1116
+ SECTION("core API")
1117
+ {
1118
+ auto index_name = test::utils::uniq_id("index");
1053
1119
  {
1054
1120
  couchbase::core::operations::management::query_index_create_response resp;
1055
- bool operation_completed = test::utils::wait_until([&integration, &bucket_name, &resp]() {
1121
+ bool operation_completed = test::utils::wait_until([&integration, &index_name, &resp]() {
1056
1122
  couchbase::core::operations::management::query_index_create_request req{};
1057
- req.bucket_name = bucket_name;
1058
- req.is_primary = true;
1123
+ req.bucket_name = integration.ctx.bucket;
1124
+ req.index_name = index_name;
1125
+ req.fields = { "field", "field2 DESC", "`two words` DESC" };
1059
1126
  resp = test::utils::execute(integration.cluster, req);
1060
1127
  return resp.ctx.ec != couchbase::errc::common::bucket_not_found;
1061
1128
  });
@@ -1064,174 +1131,308 @@ TEST_CASE("integration: query index management", "[integration]")
1064
1131
  }
1065
1132
 
1066
1133
  {
1067
- couchbase::core::operations::management::query_index_get_all_request req{};
1068
- req.bucket_name = bucket_name;
1134
+ couchbase::core::operations::management::query_index_create_request req{};
1135
+ req.bucket_name = integration.ctx.bucket;
1136
+ req.index_name = index_name;
1137
+ req.fields = { "field" };
1138
+ auto resp = test::utils::execute(integration.cluster, req);
1139
+ REQUIRE(resp.ctx.ec == couchbase::errc::common::index_exists);
1140
+ }
1141
+
1142
+ {
1143
+ couchbase::core::operations::management::query_index_create_request req{};
1144
+ req.bucket_name = integration.ctx.bucket;
1145
+ req.index_name = index_name;
1146
+ req.fields = { "field" };
1147
+ req.ignore_if_exists = true;
1069
1148
  auto resp = test::utils::execute(integration.cluster, req);
1070
1149
  REQUIRE_SUCCESS(resp.ctx.ec);
1071
- REQUIRE(resp.indexes.size() == 1);
1072
- REQUIRE(resp.indexes[0].name == "#primary");
1073
- REQUIRE(resp.indexes[0].is_primary);
1074
1150
  }
1075
1151
 
1076
1152
  {
1077
- couchbase::core::operations::management::bucket_drop_request req{ bucket_name };
1078
- test::utils::execute(integration.cluster, req);
1153
+ couchbase::core::operations::management::query_index_get_all_request req{};
1154
+ req.bucket_name = integration.ctx.bucket;
1155
+ auto resp = test::utils::execute(integration.cluster, req);
1156
+ REQUIRE_SUCCESS(resp.ctx.ec);
1157
+ auto index = std::find_if(
1158
+ resp.indexes.begin(), resp.indexes.end(), [&index_name](const auto& exp_index) { return exp_index.name == index_name; });
1159
+ REQUIRE(index != resp.indexes.end());
1160
+ REQUIRE(index->name == index_name);
1161
+ REQUIRE_FALSE(index->is_primary);
1162
+ REQUIRE(index->index_key.size() == 3);
1163
+ REQUIRE(index->index_key[0] == "`field`");
1164
+ REQUIRE(index->index_key[1] == "`field2` DESC");
1165
+ REQUIRE(index->index_key[2] == "`two words` DESC");
1166
+ REQUIRE(index->bucket_name == integration.ctx.bucket);
1167
+ REQUIRE(index->state == "online");
1168
+ }
1169
+ {
1170
+ couchbase::core::operations::management::query_index_drop_request req{};
1171
+ req.bucket_name = integration.ctx.bucket;
1172
+ req.index_name = index_name;
1173
+ auto resp = test::utils::execute(integration.cluster, req);
1174
+ REQUIRE_SUCCESS(resp.ctx.ec);
1079
1175
  }
1080
- }
1081
- }
1082
1176
 
1083
- SECTION("non primary index")
1084
- {
1085
- {
1086
- couchbase::core::operations::management::query_index_create_response resp;
1087
- bool operation_completed = test::utils::wait_until([&integration, &index_name, &resp]() {
1088
- couchbase::core::operations::management::query_index_create_request req{};
1177
+ {
1178
+ couchbase::core::operations::management::query_index_drop_request req{};
1089
1179
  req.bucket_name = integration.ctx.bucket;
1090
1180
  req.index_name = index_name;
1091
- req.fields = { "field", "field2 DESC", "`two words` DESC" };
1092
- resp = test::utils::execute(integration.cluster, req);
1093
- return resp.ctx.ec != couchbase::errc::common::bucket_not_found;
1094
- });
1095
- REQUIRE(operation_completed);
1096
- REQUIRE_SUCCESS(resp.ctx.ec);
1181
+ auto resp = test::utils::execute(integration.cluster, req);
1182
+ REQUIRE(resp.ctx.ec == couchbase::errc::common::index_not_found);
1183
+ }
1097
1184
  }
1098
-
1185
+ SECTION("public API")
1099
1186
  {
1100
- couchbase::core::operations::management::query_index_create_request req{};
1101
- req.bucket_name = integration.ctx.bucket;
1102
- req.index_name = index_name;
1103
- req.fields = { "field" };
1104
- auto resp = test::utils::execute(integration.cluster, req);
1105
- REQUIRE(resp.ctx.ec == couchbase::errc::common::index_exists);
1187
+ couchbase::cluster c(integration.cluster);
1188
+ auto index_name = test::utils::uniq_id("index");
1189
+ {
1190
+ std::error_code ec;
1191
+ bool operation_completed = test::utils::wait_until([&integration, &index_name, c, &ec]() {
1192
+ auto ctx = c.query_indexes()
1193
+ .create_index(integration.ctx.bucket, index_name, { "field", "field2 DESC", "`two words` DESC" }, {})
1194
+ .get();
1195
+ ec = ctx.ec();
1196
+ return ec != couchbase::errc::common::bucket_not_found;
1197
+ });
1198
+ REQUIRE(operation_completed);
1199
+ REQUIRE_SUCCESS(ec);
1200
+ }
1201
+ {
1202
+ auto ctx = c.query_indexes().watch_indexes(integration.ctx.bucket, { index_name }, {}).get();
1203
+ REQUIRE_SUCCESS(ctx.ec());
1204
+ }
1205
+
1206
+ {
1207
+ auto ctx = c.query_indexes().create_index(integration.ctx.bucket, index_name, { "field" }, {}).get();
1208
+ REQUIRE(ctx.ec() == couchbase::errc::common::index_exists);
1209
+ }
1210
+
1211
+ {
1212
+ auto ctx =
1213
+ c.query_indexes()
1214
+ .create_index(
1215
+ integration.ctx.bucket, index_name, { "field" }, couchbase::create_query_index_options().ignore_if_exists(true))
1216
+ .get();
1217
+ REQUIRE_SUCCESS(ctx.ec());
1218
+ }
1219
+
1220
+ {
1221
+ auto [ctx, indexes] = c.query_indexes().get_all_indexes(integration.ctx.bucket, {}).get();
1222
+ auto index = std::find_if(
1223
+ indexes.begin(), indexes.end(), [&index_name](const auto& exp_index) { return exp_index.name == index_name; });
1224
+ REQUIRE(index != indexes.end());
1225
+ REQUIRE(index->name == index_name);
1226
+ REQUIRE_FALSE(index->is_primary);
1227
+ REQUIRE(index->index_key.size() == 3);
1228
+ REQUIRE(index->index_key[0] == "`field`");
1229
+ REQUIRE(index->index_key[1] == "`field2` DESC");
1230
+ REQUIRE(index->index_key[2] == "`two words` DESC");
1231
+ REQUIRE(index->bucket_name == integration.ctx.bucket);
1232
+ REQUIRE(index->state == "online");
1233
+ }
1234
+ {
1235
+ auto ctx = c.query_indexes().drop_index(integration.ctx.bucket, index_name, {}).get();
1236
+ couchbase::core::operations::management::query_index_drop_request req{};
1237
+ REQUIRE_SUCCESS(ctx.ec());
1238
+ }
1239
+
1240
+ {
1241
+ auto ctx = c.query_indexes().drop_index(integration.ctx.bucket, index_name, {}).get();
1242
+ couchbase::core::operations::management::query_index_drop_request req{};
1243
+ REQUIRE(ctx.ec() == couchbase::errc::common::index_not_found);
1244
+ }
1245
+ {
1246
+ auto ctx =
1247
+ c.query_indexes()
1248
+ .drop_index(integration.ctx.bucket, index_name, couchbase::drop_query_index_options().ignore_if_not_exists(true))
1249
+ .get();
1250
+ couchbase::core::operations::management::query_index_drop_request req{};
1251
+ REQUIRE_SUCCESS(ctx.ec());
1252
+ }
1106
1253
  }
1254
+ }
1107
1255
 
1256
+ SECTION("deferred index")
1257
+ {
1258
+ SECTION("public API")
1108
1259
  {
1109
- couchbase::core::operations::management::query_index_create_request req{};
1110
- req.bucket_name = integration.ctx.bucket;
1111
- req.index_name = index_name;
1112
- req.fields = { "field" };
1113
- req.ignore_if_exists = true;
1114
- auto resp = test::utils::execute(integration.cluster, req);
1115
- REQUIRE_SUCCESS(resp.ctx.ec);
1260
+ couchbase::cluster c(integration.cluster);
1261
+ auto index_name = test::utils::uniq_id("index");
1262
+ {
1263
+ std::error_code ec;
1264
+ bool operation_completed = test::utils::wait_until([c, &ec, &index_name, &integration]() {
1265
+ auto ctx =
1266
+ c.query_indexes()
1267
+ .create_index(
1268
+ integration.ctx.bucket, index_name, { "field" }, couchbase::create_query_index_options().build_deferred(true))
1269
+ .get();
1270
+ ec = ctx.ec();
1271
+ return ec != couchbase::errc::common::bucket_not_found;
1272
+ });
1273
+ REQUIRE(operation_completed);
1274
+ REQUIRE_SUCCESS(ec);
1275
+ }
1276
+
1277
+ {
1278
+ auto [ctx, indexes] = c.query_indexes().get_all_indexes(integration.ctx.bucket, {}).get();
1279
+ REQUIRE_SUCCESS(ctx.ec());
1280
+ auto index = std::find_if(
1281
+ indexes.begin(), indexes.end(), [&index_name](const auto& exp_index) { return exp_index.name == index_name; });
1282
+ REQUIRE(index != indexes.end());
1283
+ REQUIRE(index->name == index_name);
1284
+ REQUIRE(index->state == "deferred");
1285
+ }
1286
+
1287
+ {
1288
+ auto manager = couchbase::cluster(integration.cluster).query_indexes();
1289
+ auto ctx = manager.build_deferred_indexes(integration.ctx.bucket, {}).get();
1290
+ REQUIRE_SUCCESS(ctx.ec());
1291
+ }
1292
+ {
1293
+ // now wait till it is online before proceeding
1294
+ auto operation_completed = test::utils::wait_until([&integration, &index_name, c]() {
1295
+ auto [ctx, indexes] = c.query_indexes().get_all_indexes(integration.ctx.bucket, {}).get();
1296
+ if (indexes.empty()) {
1297
+ return false;
1298
+ }
1299
+ auto index = std::find_if(
1300
+ indexes.begin(), indexes.end(), [&index_name](const auto& exp_index) { return exp_index.name == index_name; });
1301
+ return index->state == "online";
1302
+ });
1303
+ REQUIRE(operation_completed);
1304
+ }
1116
1305
  }
1117
1306
 
1307
+ SECTION("core API")
1118
1308
  {
1119
- couchbase::core::operations::management::query_index_get_all_request req{};
1120
- req.bucket_name = integration.ctx.bucket;
1121
- auto resp = test::utils::execute(integration.cluster, req);
1122
- REQUIRE_SUCCESS(resp.ctx.ec);
1123
- auto index = std::find_if(
1124
- resp.indexes.begin(), resp.indexes.end(), [&index_name](const auto& exp_index) { return exp_index.name == index_name; });
1125
- REQUIRE(index != resp.indexes.end());
1126
- REQUIRE(index->name == index_name);
1127
- REQUIRE_FALSE(index->is_primary);
1128
- REQUIRE(index->index_key.size() == 3);
1129
- REQUIRE(index->index_key[0] == "`field`");
1130
- REQUIRE(index->index_key[1] == "`field2` DESC");
1131
- REQUIRE(index->index_key[2] == "`two words` DESC");
1132
- REQUIRE(index->bucket_name == integration.ctx.bucket);
1133
- REQUIRE(index->state == "online");
1309
+ auto index_name = test::utils::uniq_id("index");
1310
+ {
1311
+ couchbase::core::operations::management::query_index_create_response resp;
1312
+ bool operation_completed = test::utils::wait_until([&integration, &index_name, &resp]() {
1313
+ couchbase::core::operations::management::query_index_create_request req{};
1314
+ req.bucket_name = integration.ctx.bucket;
1315
+ req.index_name = index_name;
1316
+ req.fields = { "field" };
1317
+ req.deferred = true;
1318
+ resp = test::utils::execute(integration.cluster, req);
1319
+ return resp.ctx.ec != couchbase::errc::common::bucket_not_found;
1320
+ });
1321
+ REQUIRE(operation_completed);
1322
+ REQUIRE_SUCCESS(resp.ctx.ec);
1323
+ }
1324
+ {
1325
+ couchbase::core::operations::management::query_index_build_deferred_request req{};
1326
+ req.bucket_name = integration.ctx.bucket;
1327
+ auto resp = test::utils::execute(integration.cluster, req);
1328
+ REQUIRE_SUCCESS(resp.ctx.ec);
1329
+ }
1330
+
1331
+ {
1332
+ test::utils::wait_until([&integration, &index_name]() {
1333
+ couchbase::core::operations::management::query_index_get_all_request req{};
1334
+ req.bucket_name = integration.ctx.bucket;
1335
+ auto resp = test::utils::execute(integration.cluster, req);
1336
+ if (resp.indexes.empty()) {
1337
+ return false;
1338
+ }
1339
+ auto index = std::find_if(resp.indexes.begin(), resp.indexes.end(), [&index_name](const auto& exp_index) {
1340
+ return exp_index.name == index_name;
1341
+ });
1342
+ return index->state == "online";
1343
+ });
1344
+ }
1134
1345
  }
1346
+ }
1135
1347
 
1348
+ SECTION("create missing bucket")
1349
+ {
1350
+ SECTION("core API")
1136
1351
  {
1137
- couchbase::core::operations::management::query_index_drop_request req{};
1138
- req.bucket_name = integration.ctx.bucket;
1139
- req.index_name = index_name;
1352
+ couchbase::core::operations::management::query_index_create_request req{};
1353
+ req.bucket_name = "missing_bucket";
1354
+ req.is_primary = true;
1140
1355
  auto resp = test::utils::execute(integration.cluster, req);
1141
- REQUIRE_SUCCESS(resp.ctx.ec);
1356
+ REQUIRE(resp.ctx.ec == couchbase::errc::common::bucket_not_found);
1142
1357
  }
1143
-
1358
+ SECTION("public API")
1144
1359
  {
1145
- couchbase::core::operations::management::query_index_drop_request req{};
1146
- req.bucket_name = integration.ctx.bucket;
1147
- req.index_name = index_name;
1148
- auto resp = test::utils::execute(integration.cluster, req);
1149
- REQUIRE(resp.ctx.ec == couchbase::errc::common::index_not_found);
1360
+ couchbase::cluster c(integration.cluster);
1361
+ auto ctx = c.query_indexes().create_primary_index("missing_bucket", {}).get();
1362
+ REQUIRE(ctx.ec() == couchbase::errc::common::bucket_not_found);
1150
1363
  }
1151
1364
  }
1152
1365
 
1153
- SECTION("deferred index")
1366
+ SECTION("get missing bucket")
1154
1367
  {
1155
- {
1156
- couchbase::core::operations::management::query_index_create_response resp;
1157
- bool operation_completed = test::utils::wait_until([&integration, &index_name, &resp]() {
1158
- couchbase::core::operations::management::query_index_create_request req{};
1159
- req.bucket_name = integration.ctx.bucket;
1160
- req.index_name = index_name;
1161
- req.fields = { "field" };
1162
- req.deferred = true;
1163
- resp = test::utils::execute(integration.cluster, req);
1164
- return resp.ctx.ec != couchbase::errc::common::bucket_not_found;
1165
- });
1166
- REQUIRE(operation_completed);
1167
- REQUIRE_SUCCESS(resp.ctx.ec);
1168
- }
1169
-
1368
+ SECTION("core API")
1170
1369
  {
1171
1370
  couchbase::core::operations::management::query_index_get_all_request req{};
1172
- req.bucket_name = integration.ctx.bucket;
1371
+ req.bucket_name = "missing_bucket";
1173
1372
  auto resp = test::utils::execute(integration.cluster, req);
1174
1373
  REQUIRE_SUCCESS(resp.ctx.ec);
1175
- auto index = std::find_if(
1176
- resp.indexes.begin(), resp.indexes.end(), [&index_name](const auto& exp_index) { return exp_index.name == index_name; });
1177
- REQUIRE(index != resp.indexes.end());
1178
- REQUIRE(index->name == index_name);
1179
- REQUIRE(index->state == "deferred");
1374
+ REQUIRE(resp.indexes.empty());
1180
1375
  }
1181
-
1182
1376
  SECTION("public API")
1183
1377
  {
1184
- auto manager = couchbase::cluster(integration.cluster).query_indexes();
1185
- auto ctx = manager.build_deferred_indexes(integration.ctx.bucket, {}).get();
1378
+ couchbase::cluster c(integration.cluster);
1379
+ auto [ctx, indexes] = c.query_indexes().get_all_indexes("missing_bucket", {}).get();
1186
1380
  REQUIRE_SUCCESS(ctx.ec());
1381
+ REQUIRE(indexes.empty());
1187
1382
  }
1383
+ }
1188
1384
 
1385
+ SECTION("drop missing bucket")
1386
+ {
1189
1387
  SECTION("core API")
1190
1388
  {
1191
- couchbase::core::operations::management::query_index_build_deferred_request req{};
1192
- req.bucket_name = integration.ctx.bucket;
1389
+ couchbase::core::operations::management::query_index_drop_request req{};
1390
+ req.bucket_name = "missing_bucket";
1391
+ req.is_primary = true;
1193
1392
  auto resp = test::utils::execute(integration.cluster, req);
1194
- REQUIRE_SUCCESS(resp.ctx.ec);
1393
+ REQUIRE(resp.ctx.ec == couchbase::errc::common::bucket_not_found);
1394
+ }
1395
+ SECTION("public API")
1396
+ {
1397
+ couchbase::cluster c(integration.cluster);
1398
+ auto ctx = c.query_indexes().drop_primary_index("missing_bucket", {}).get();
1399
+ REQUIRE(ctx.ec() == couchbase::errc::common::bucket_not_found);
1195
1400
  }
1196
-
1197
- test::utils::wait_until([&integration, &index_name]() {
1198
- couchbase::core::operations::management::query_index_get_all_request req{};
1199
- req.bucket_name = integration.ctx.bucket;
1200
- auto resp = test::utils::execute(integration.cluster, req);
1201
- if (resp.indexes.empty()) {
1202
- return false;
1203
- }
1204
- auto index = std::find_if(
1205
- resp.indexes.begin(), resp.indexes.end(), [&index_name](const auto& exp_index) { return exp_index.name == index_name; });
1206
- return index->state == "online";
1207
- });
1208
- }
1209
-
1210
- SECTION("create missing bucket")
1211
- {
1212
- couchbase::core::operations::management::query_index_create_request req{};
1213
- req.bucket_name = "missing_bucket";
1214
- req.is_primary = true;
1215
- auto resp = test::utils::execute(integration.cluster, req);
1216
- REQUIRE(resp.ctx.ec == couchbase::errc::common::bucket_not_found);
1217
1401
  }
1218
1402
 
1219
- SECTION("get missing bucket")
1403
+ SECTION("watch missing index")
1220
1404
  {
1221
- couchbase::core::operations::management::query_index_get_all_request req{};
1222
- req.bucket_name = "missing_bucket";
1223
- auto resp = test::utils::execute(integration.cluster, req);
1224
- REQUIRE_SUCCESS(resp.ctx.ec);
1225
- REQUIRE(resp.indexes.empty());
1405
+ SECTION("public API")
1406
+ {
1407
+ couchbase::cluster c(integration.cluster);
1408
+ auto start = std::chrono::steady_clock::now();
1409
+ auto ctx = c.query_indexes()
1410
+ .watch_indexes(integration.ctx.bucket,
1411
+ { "idontexist", "neitherdoI" },
1412
+ couchbase::watch_query_indexes_options()
1413
+ .timeout(std::chrono::milliseconds(10000))
1414
+ .polling_interval(std::chrono::milliseconds(1000)))
1415
+ .get();
1416
+ REQUIRE(ctx.ec() == couchbase::errc::common::ambiguous_timeout);
1417
+ REQUIRE(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - start).count() >= 10000);
1418
+ }
1226
1419
  }
1227
-
1228
- SECTION("drop missing bucket")
1420
+ SECTION("watch missing bucket")
1229
1421
  {
1230
- couchbase::core::operations::management::query_index_drop_request req{};
1231
- req.bucket_name = "missing_bucket";
1232
- req.is_primary = true;
1233
- auto resp = test::utils::execute(integration.cluster, req);
1234
- REQUIRE(resp.ctx.ec == couchbase::errc::common::bucket_not_found);
1422
+ SECTION("public API")
1423
+ {
1424
+ couchbase::cluster c(integration.cluster);
1425
+ auto start = std::chrono::steady_clock::now();
1426
+ auto ctx = c.query_indexes()
1427
+ .watch_indexes("missing_buckeet",
1428
+ { "idontexist", "neitherdoI" },
1429
+ couchbase::watch_query_indexes_options()
1430
+ .timeout(std::chrono::milliseconds(10000))
1431
+ .polling_interval(std::chrono::milliseconds(1000)))
1432
+ .get();
1433
+ REQUIRE(ctx.ec() == couchbase::errc::common::ambiguous_timeout);
1434
+ REQUIRE(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - start).count() >= 10000);
1435
+ }
1235
1436
  }
1236
1437
  }
1237
1438
 
@@ -1266,272 +1467,488 @@ TEST_CASE("integration: collections query index management", "[integration]")
1266
1467
  REQUIRE(created);
1267
1468
  }
1268
1469
 
1470
+ auto manager =
1471
+ couchbase::cluster(integration.cluster).bucket(integration.ctx.bucket).scope(scope_name).collection(collection_name).query_indexes();
1472
+
1269
1473
  SECTION("primary index")
1270
1474
  {
1475
+ SECTION("core API")
1271
1476
  {
1272
- couchbase::core::operations::management::query_index_create_response resp;
1273
- bool operation_completed = test::utils::wait_until([&integration, &scope_name, &collection_name, &resp]() {
1274
- couchbase::core::operations::management::query_index_create_request req{};
1477
+ {
1478
+ couchbase::core::operations::management::query_index_create_response resp;
1479
+ bool operation_completed = test::utils::wait_until([&integration, &scope_name, &collection_name, &resp]() {
1480
+ couchbase::core::operations::management::query_index_create_request req{};
1481
+ req.bucket_name = integration.ctx.bucket;
1482
+ req.scope_name = scope_name;
1483
+ req.collection_name = collection_name;
1484
+ req.is_primary = true;
1485
+ resp = test::utils::execute(integration.cluster, req);
1486
+ return resp.ctx.ec != couchbase::errc::common::bucket_not_found;
1487
+ });
1488
+ REQUIRE(operation_completed);
1489
+ REQUIRE_SUCCESS(resp.ctx.ec);
1490
+ }
1491
+
1492
+ {
1493
+ couchbase::core::operations::management::query_index_get_all_request req{};
1275
1494
  req.bucket_name = integration.ctx.bucket;
1276
1495
  req.scope_name = scope_name;
1277
1496
  req.collection_name = collection_name;
1278
- req.is_primary = true;
1279
- resp = test::utils::execute(integration.cluster, req);
1280
- return resp.ctx.ec != couchbase::errc::common::bucket_not_found;
1281
- });
1282
- REQUIRE(operation_completed);
1283
- REQUIRE_SUCCESS(resp.ctx.ec);
1497
+ auto resp = test::utils::execute(integration.cluster, req);
1498
+ REQUIRE_SUCCESS(resp.ctx.ec);
1499
+ REQUIRE(resp.indexes.size() == 1);
1500
+ REQUIRE(resp.indexes[0].name == "#primary");
1501
+ REQUIRE(resp.indexes[0].is_primary);
1502
+ }
1284
1503
  }
1285
-
1504
+ SECTION("public API")
1286
1505
  {
1287
- couchbase::core::operations::management::query_index_get_all_request req{};
1288
- req.bucket_name = integration.ctx.bucket;
1289
- req.scope_name = scope_name;
1290
- req.collection_name = collection_name;
1291
- auto resp = test::utils::execute(integration.cluster, req);
1292
- REQUIRE_SUCCESS(resp.ctx.ec);
1293
- REQUIRE(resp.indexes.size() == 1);
1294
- REQUIRE(resp.indexes[0].name == "#primary");
1295
- REQUIRE(resp.indexes[0].is_primary);
1506
+ {
1507
+ std::error_code ec;
1508
+ bool operation_completed = test::utils::wait_until([&manager, &ec]() {
1509
+ auto ctx = manager.create_primary_index({}).get();
1510
+ ec = ctx.ec();
1511
+ return ctx.ec() != couchbase::errc::common::bucket_not_found;
1512
+ });
1513
+
1514
+ REQUIRE(operation_completed);
1515
+ REQUIRE_SUCCESS(ec);
1516
+ }
1517
+ {
1518
+ auto [ctx, indexes] = manager.get_all_indexes({}).get();
1519
+ REQUIRE_SUCCESS(ctx.ec());
1520
+ REQUIRE(indexes.size() == 1);
1521
+ REQUIRE(indexes[0].name == "#primary");
1522
+ REQUIRE(indexes[0].is_primary);
1523
+ }
1296
1524
  }
1297
1525
  }
1298
1526
 
1299
1527
  SECTION("named primary index")
1300
1528
  {
1529
+ SECTION("core API")
1301
1530
  {
1302
- couchbase::core::operations::management::query_index_create_response resp;
1303
- bool operation_completed = test::utils::wait_until([&integration, &index_name, &scope_name, &collection_name, &resp]() {
1304
- couchbase::core::operations::management::query_index_create_request req{};
1531
+ {
1532
+ couchbase::core::operations::management::query_index_create_response resp;
1533
+ bool operation_completed = test::utils::wait_until([&integration, &index_name, &scope_name, &collection_name, &resp]() {
1534
+ couchbase::core::operations::management::query_index_create_request req{};
1535
+ req.bucket_name = integration.ctx.bucket;
1536
+ req.scope_name = scope_name;
1537
+ req.collection_name = collection_name;
1538
+ req.index_name = index_name;
1539
+ req.is_primary = true;
1540
+ resp = test::utils::execute(integration.cluster, req);
1541
+ return resp.ctx.ec != couchbase::errc::common::bucket_not_found;
1542
+ });
1543
+ REQUIRE(operation_completed);
1544
+ REQUIRE_SUCCESS(resp.ctx.ec);
1545
+ }
1546
+
1547
+ {
1548
+ couchbase::core::operations::management::query_index_get_all_request req{};
1305
1549
  req.bucket_name = integration.ctx.bucket;
1306
1550
  req.scope_name = scope_name;
1307
1551
  req.collection_name = collection_name;
1552
+ auto resp = test::utils::execute(integration.cluster, req);
1553
+ REQUIRE_SUCCESS(resp.ctx.ec);
1554
+ REQUIRE(resp.indexes.size() == 1);
1555
+ REQUIRE(resp.indexes[0].name == index_name);
1556
+ REQUIRE(resp.indexes[0].is_primary);
1557
+ }
1558
+
1559
+ {
1560
+ couchbase::core::operations::management::query_index_drop_request req{};
1561
+ req.bucket_name = integration.ctx.bucket;
1308
1562
  req.index_name = index_name;
1563
+ req.scope_name = scope_name;
1309
1564
  req.is_primary = true;
1310
- resp = test::utils::execute(integration.cluster, req);
1311
- return resp.ctx.ec != couchbase::errc::common::bucket_not_found;
1312
- });
1313
- REQUIRE(operation_completed);
1314
- REQUIRE_SUCCESS(resp.ctx.ec);
1315
- }
1316
-
1317
- {
1318
- couchbase::core::operations::management::query_index_get_all_request req{};
1319
- req.bucket_name = integration.ctx.bucket;
1320
- req.scope_name = scope_name;
1321
- req.collection_name = collection_name;
1322
- auto resp = test::utils::execute(integration.cluster, req);
1323
- REQUIRE_SUCCESS(resp.ctx.ec);
1324
- REQUIRE(resp.indexes.size() == 1);
1325
- REQUIRE(resp.indexes[0].name == index_name);
1326
- REQUIRE(resp.indexes[0].is_primary);
1565
+ req.collection_name = collection_name;
1566
+ auto resp = test::utils::execute(integration.cluster, req);
1567
+ REQUIRE_SUCCESS(resp.ctx.ec);
1568
+ }
1327
1569
  }
1328
-
1570
+ SECTION("public API")
1329
1571
  {
1330
- couchbase::core::operations::management::query_index_drop_request req{};
1331
- req.bucket_name = integration.ctx.bucket;
1332
- req.index_name = index_name;
1333
- req.scope_name = scope_name;
1334
- req.is_primary = true;
1335
- req.collection_name = collection_name;
1336
- auto resp = test::utils::execute(integration.cluster, req);
1337
- REQUIRE_SUCCESS(resp.ctx.ec);
1572
+ {
1573
+ std::error_code ec;
1574
+ auto operation_completed = test::utils::wait_until([&index_name, &manager, &ec]() {
1575
+ auto ctx = manager.create_primary_index(couchbase::create_primary_query_index_options().index_name(index_name)).get();
1576
+ ec = ctx.ec();
1577
+ return ec != couchbase::errc::common::bucket_not_found;
1578
+ });
1579
+ REQUIRE(operation_completed);
1580
+ REQUIRE_SUCCESS(ec);
1581
+ }
1582
+ {
1583
+ auto [ctx, indexes] = manager.get_all_indexes({}).get();
1584
+ REQUIRE_SUCCESS(ctx.ec());
1585
+ REQUIRE(indexes.size() == 1);
1586
+ REQUIRE(indexes[0].name == index_name);
1587
+ REQUIRE(indexes[0].is_primary);
1588
+ }
1589
+ {
1590
+ auto ctx = manager.watch_indexes({ index_name }, {}).get();
1591
+ REQUIRE_SUCCESS(ctx.ec());
1592
+ }
1593
+ {
1594
+ auto ctx = manager.drop_index(index_name, {}).get();
1595
+ REQUIRE_SUCCESS(ctx.ec());
1596
+ }
1338
1597
  }
1339
1598
  }
1340
1599
 
1341
1600
  SECTION("non primary index")
1342
1601
  {
1602
+ SECTION("core API")
1343
1603
  {
1344
- couchbase::core::operations::management::query_index_create_response resp;
1345
- bool operation_completed = test::utils::wait_until([&integration, &index_name, &scope_name, &collection_name, &resp]() {
1604
+
1605
+ {
1606
+ couchbase::core::operations::management::query_index_create_response resp;
1607
+ bool operation_completed = test::utils::wait_until([&integration, &index_name, &scope_name, &collection_name, &resp]() {
1608
+ couchbase::core::operations::management::query_index_create_request req{};
1609
+ req.bucket_name = integration.ctx.bucket;
1610
+ req.index_name = index_name;
1611
+ req.scope_name = scope_name;
1612
+ req.collection_name = collection_name;
1613
+ req.fields = { "field" };
1614
+ resp = test::utils::execute(integration.cluster, req);
1615
+ return resp.ctx.ec != couchbase::errc::common::bucket_not_found;
1616
+ });
1617
+ REQUIRE(operation_completed);
1618
+ REQUIRE_SUCCESS(resp.ctx.ec);
1619
+ }
1620
+
1621
+ {
1346
1622
  couchbase::core::operations::management::query_index_create_request req{};
1347
1623
  req.bucket_name = integration.ctx.bucket;
1348
1624
  req.index_name = index_name;
1349
1625
  req.scope_name = scope_name;
1350
1626
  req.collection_name = collection_name;
1351
1627
  req.fields = { "field" };
1352
- resp = test::utils::execute(integration.cluster, req);
1353
- return resp.ctx.ec != couchbase::errc::common::bucket_not_found;
1628
+ auto resp = test::utils::execute(integration.cluster, req);
1629
+ REQUIRE(resp.ctx.ec == couchbase::errc::common::index_exists);
1630
+ }
1631
+
1632
+ {
1633
+ couchbase::core::operations::management::query_index_create_request req{};
1634
+ req.bucket_name = integration.ctx.bucket;
1635
+ req.index_name = index_name;
1636
+ req.scope_name = scope_name;
1637
+ req.collection_name = collection_name;
1638
+ req.fields = { "field" };
1639
+ req.ignore_if_exists = true;
1640
+ auto resp = test::utils::execute(integration.cluster, req);
1641
+ REQUIRE_SUCCESS(resp.ctx.ec);
1642
+ }
1643
+
1644
+ {
1645
+ couchbase::core::operations::management::query_index_get_all_request req{};
1646
+ req.bucket_name = integration.ctx.bucket;
1647
+ req.scope_name = scope_name;
1648
+ req.collection_name = collection_name;
1649
+ auto resp = test::utils::execute(integration.cluster, req);
1650
+ REQUIRE_SUCCESS(resp.ctx.ec);
1651
+ REQUIRE(resp.indexes.size() == 1);
1652
+ REQUIRE(resp.indexes[0].name == index_name);
1653
+ REQUIRE_FALSE(resp.indexes[0].is_primary);
1654
+ REQUIRE(resp.indexes[0].index_key.size() == 1);
1655
+ REQUIRE(resp.indexes[0].index_key[0] == "`field`");
1656
+ REQUIRE(resp.indexes[0].collection_name == collection_name);
1657
+ REQUIRE(resp.indexes[0].scope_name == scope_name);
1658
+ REQUIRE(resp.indexes[0].bucket_name == integration.ctx.bucket);
1659
+ REQUIRE(resp.indexes[0].state == "online");
1660
+ }
1661
+
1662
+ {
1663
+ couchbase::core::operations::management::query_index_drop_request req{};
1664
+ req.bucket_name = integration.ctx.bucket;
1665
+ req.index_name = index_name;
1666
+ req.scope_name = scope_name;
1667
+ req.collection_name = collection_name;
1668
+ auto resp = test::utils::execute(integration.cluster, req);
1669
+ REQUIRE_SUCCESS(resp.ctx.ec);
1670
+ }
1671
+
1672
+ {
1673
+ couchbase::core::operations::management::query_index_drop_request req{};
1674
+ req.bucket_name = integration.ctx.bucket;
1675
+ req.index_name = index_name;
1676
+ req.scope_name = scope_name;
1677
+ req.collection_name = collection_name;
1678
+ auto resp = test::utils::execute(integration.cluster, req);
1679
+ REQUIRE(resp.ctx.ec == couchbase::errc::common::index_not_found);
1680
+ }
1681
+ }
1682
+ SECTION("public API")
1683
+ {
1684
+ {
1685
+ std::error_code ec;
1686
+ auto operation_complete = test::utils::wait_until([&manager, &ec, &index_name]() {
1687
+ ec = manager.create_index(index_name, { "field" }, {}).get().ec();
1688
+ return ec != couchbase::errc::common::bucket_not_found;
1689
+ });
1690
+ REQUIRE(operation_complete);
1691
+ REQUIRE_SUCCESS(ec);
1692
+ }
1693
+ {
1694
+ REQUIRE(manager.create_index(index_name, { "field" }, {}).get().ec() == couchbase::errc::common::index_exists);
1695
+ }
1696
+ {
1697
+ REQUIRE_SUCCESS(
1698
+ manager.create_index(index_name, { "field" }, couchbase::create_query_index_options().ignore_if_exists(true)).get().ec());
1699
+ }
1700
+ {
1701
+ REQUIRE_SUCCESS(manager.watch_indexes({ index_name }, {}).get().ec());
1702
+ auto [ctx, indexes] = manager.get_all_indexes({}).get();
1703
+ REQUIRE_SUCCESS(ctx.ec());
1704
+ REQUIRE(indexes.size() == 1);
1705
+ REQUIRE(indexes[0].name == index_name);
1706
+ REQUIRE_FALSE(indexes[0].is_primary);
1707
+ REQUIRE(indexes[0].index_key.size() == 1);
1708
+ REQUIRE(indexes[0].index_key[0] == "`field`");
1709
+ REQUIRE(indexes[0].collection_name == collection_name);
1710
+ REQUIRE(indexes[0].scope_name == scope_name);
1711
+ REQUIRE(indexes[0].bucket_name == integration.ctx.bucket);
1712
+ REQUIRE(indexes[0].state == "online");
1713
+ }
1714
+ {
1715
+ auto ctx = manager.drop_index(index_name, {}).get();
1716
+ REQUIRE_SUCCESS(ctx.ec());
1717
+ }
1718
+ {
1719
+ REQUIRE(manager.drop_index(index_name, {}).get().ec() == couchbase::errc::common::index_not_found);
1720
+ }
1721
+ {
1722
+ REQUIRE_SUCCESS(
1723
+ manager.drop_index(index_name, couchbase::drop_query_index_options().ignore_if_not_exists(true)).get().ec());
1724
+ }
1725
+ }
1726
+ }
1727
+
1728
+ SECTION("deferred index")
1729
+ {
1730
+
1731
+ SECTION("public API")
1732
+ {
1733
+ {
1734
+ auto ctx =
1735
+ manager.create_index(index_name, { "field" }, couchbase::create_query_index_options().build_deferred(true)).get();
1736
+ REQUIRE_SUCCESS(ctx.ec());
1737
+ }
1738
+ {
1739
+ auto [ctx, indexes] = manager.get_all_indexes({}).get();
1740
+ REQUIRE_SUCCESS(ctx.ec());
1741
+ REQUIRE(indexes.size() == 1);
1742
+ REQUIRE(indexes[0].name == index_name);
1743
+ REQUIRE(indexes[0].state == "deferred");
1744
+ }
1745
+ {
1746
+ auto ctx = manager.build_deferred_indexes({}).get();
1747
+ REQUIRE_SUCCESS(ctx.ec());
1748
+ }
1749
+ {
1750
+ auto ctx = manager.watch_indexes({ index_name }, {}).get();
1751
+ REQUIRE_SUCCESS(ctx.ec());
1752
+ }
1753
+ }
1754
+
1755
+ SECTION("core API")
1756
+ {
1757
+ {
1758
+ couchbase::core::operations::management::query_index_create_response resp;
1759
+ bool operation_completed = test::utils::wait_until([&integration, &index_name, &scope_name, &collection_name, &resp]() {
1760
+ couchbase::core::operations::management::query_index_create_request req{};
1761
+ req.bucket_name = integration.ctx.bucket;
1762
+ req.index_name = index_name;
1763
+ req.scope_name = scope_name;
1764
+ req.collection_name = collection_name;
1765
+ req.fields = { "field" };
1766
+ req.deferred = true;
1767
+ resp = test::utils::execute(integration.cluster, req);
1768
+ return resp.ctx.ec != couchbase::errc::common::bucket_not_found;
1769
+ });
1770
+ REQUIRE(operation_completed);
1771
+ REQUIRE_SUCCESS(resp.ctx.ec);
1772
+ }
1773
+
1774
+ {
1775
+ couchbase::core::operations::management::query_index_get_all_request req{};
1776
+ req.bucket_name = integration.ctx.bucket;
1777
+ req.scope_name = scope_name;
1778
+ req.collection_name = collection_name;
1779
+ auto resp = test::utils::execute(integration.cluster, req);
1780
+ REQUIRE_SUCCESS(resp.ctx.ec);
1781
+ REQUIRE(resp.indexes.size() == 1);
1782
+ REQUIRE(resp.indexes[0].name == index_name);
1783
+ REQUIRE(resp.indexes[0].state == "deferred");
1784
+ }
1785
+ {
1786
+ couchbase::core::operations::management::query_index_build_deferred_request req{};
1787
+ req.bucket_name = integration.ctx.bucket;
1788
+ req.scope_name = scope_name;
1789
+ req.collection_name = collection_name;
1790
+ auto resp = test::utils::execute(integration.cluster, req);
1791
+ REQUIRE_SUCCESS(resp.ctx.ec);
1792
+ }
1793
+
1794
+ test::utils::wait_until([&integration, scope_name, collection_name]() {
1795
+ couchbase::core::operations::management::query_index_get_all_request req{};
1796
+ req.bucket_name = integration.ctx.bucket;
1797
+ req.scope_name = scope_name;
1798
+ req.collection_name = collection_name;
1799
+ auto resp = test::utils::execute(integration.cluster, req);
1800
+ if (resp.indexes.empty()) {
1801
+ return false;
1802
+ }
1803
+ return resp.indexes[0].state == "online";
1354
1804
  });
1355
- REQUIRE(operation_completed);
1356
- REQUIRE_SUCCESS(resp.ctx.ec);
1357
1805
  }
1806
+ }
1358
1807
 
1808
+ SECTION("create missing collection")
1809
+ {
1810
+ SECTION("core API")
1359
1811
  {
1360
1812
  couchbase::core::operations::management::query_index_create_request req{};
1361
1813
  req.bucket_name = integration.ctx.bucket;
1362
- req.index_name = index_name;
1363
1814
  req.scope_name = scope_name;
1364
- req.collection_name = collection_name;
1365
- req.fields = { "field" };
1815
+ req.collection_name = "missing_collection";
1816
+ req.is_primary = true;
1366
1817
  auto resp = test::utils::execute(integration.cluster, req);
1367
- REQUIRE(resp.ctx.ec == couchbase::errc::common::index_exists);
1818
+ REQUIRE(resp.ctx.ec == couchbase::errc::common::collection_not_found);
1368
1819
  }
1820
+ SECTION("public API")
1821
+ {
1822
+ couchbase::cluster c(integration.cluster);
1823
+ auto coll = c.bucket(integration.ctx.bucket).scope(scope_name).collection("missing_collection");
1824
+ REQUIRE(coll.query_indexes().create_primary_index({}).get().ec() == couchbase::errc::common::collection_not_found);
1825
+ }
1826
+ }
1369
1827
 
1828
+ SECTION("create missing scope")
1829
+ {
1830
+ SECTION("core API")
1370
1831
  {
1371
1832
  couchbase::core::operations::management::query_index_create_request req{};
1372
1833
  req.bucket_name = integration.ctx.bucket;
1373
- req.index_name = index_name;
1374
- req.scope_name = scope_name;
1834
+ req.scope_name = "missing_scope";
1375
1835
  req.collection_name = collection_name;
1376
- req.fields = { "field" };
1377
- req.ignore_if_exists = true;
1836
+ req.is_primary = true;
1378
1837
  auto resp = test::utils::execute(integration.cluster, req);
1379
- REQUIRE_SUCCESS(resp.ctx.ec);
1838
+ REQUIRE(resp.ctx.ec == couchbase::errc::common::scope_not_found);
1380
1839
  }
1381
-
1840
+ SECTION("public API")
1382
1841
  {
1383
- couchbase::core::operations::management::query_index_get_all_request req{};
1384
- req.bucket_name = integration.ctx.bucket;
1385
- req.scope_name = scope_name;
1386
- req.collection_name = collection_name;
1387
- auto resp = test::utils::execute(integration.cluster, req);
1388
- REQUIRE_SUCCESS(resp.ctx.ec);
1389
- REQUIRE(resp.indexes.size() == 1);
1390
- REQUIRE(resp.indexes[0].name == index_name);
1391
- REQUIRE_FALSE(resp.indexes[0].is_primary);
1392
- REQUIRE(resp.indexes[0].index_key.size() == 1);
1393
- REQUIRE(resp.indexes[0].index_key[0] == "`field`");
1394
- REQUIRE(resp.indexes[0].collection_name == collection_name);
1395
- REQUIRE(resp.indexes[0].scope_name == scope_name);
1396
- REQUIRE(resp.indexes[0].bucket_name == integration.ctx.bucket);
1397
- REQUIRE(resp.indexes[0].state == "online");
1842
+ couchbase::cluster c(integration.cluster);
1843
+ auto coll = c.bucket(integration.ctx.bucket).scope("missing scope").collection(collection_name);
1844
+ REQUIRE(coll.query_indexes().create_primary_index({}).get().ec() == couchbase::errc::common::scope_not_found);
1398
1845
  }
1846
+ }
1399
1847
 
1848
+ SECTION("get missing collection")
1849
+ {
1850
+ SECTION("core API")
1400
1851
  {
1401
- couchbase::core::operations::management::query_index_drop_request req{};
1852
+ couchbase::core::operations::management::query_index_get_all_request req{};
1402
1853
  req.bucket_name = integration.ctx.bucket;
1403
- req.index_name = index_name;
1404
1854
  req.scope_name = scope_name;
1405
- req.collection_name = collection_name;
1855
+ req.collection_name = "missing_collection";
1406
1856
  auto resp = test::utils::execute(integration.cluster, req);
1407
1857
  REQUIRE_SUCCESS(resp.ctx.ec);
1858
+ REQUIRE(resp.indexes.empty());
1408
1859
  }
1409
-
1860
+ SECTION("public API")
1410
1861
  {
1411
- couchbase::core::operations::management::query_index_drop_request req{};
1412
- req.bucket_name = integration.ctx.bucket;
1413
- req.index_name = index_name;
1414
- req.scope_name = scope_name;
1415
- req.collection_name = collection_name;
1416
- auto resp = test::utils::execute(integration.cluster, req);
1417
- REQUIRE(resp.ctx.ec == couchbase::errc::common::index_not_found);
1862
+ couchbase::cluster c(integration.cluster);
1863
+ auto coll = c.bucket(integration.ctx.bucket).scope(scope_name).collection("missing_collection");
1864
+ auto [ctx, indexes] = coll.query_indexes().get_all_indexes({}).get();
1865
+ REQUIRE_SUCCESS(ctx.ec());
1866
+ REQUIRE(indexes.empty());
1418
1867
  }
1419
1868
  }
1420
-
1421
- SECTION("deferred index")
1869
+ SECTION("get missing scope")
1422
1870
  {
1423
- {
1424
- couchbase::core::operations::management::query_index_create_response resp;
1425
- bool operation_completed = test::utils::wait_until([&integration, &index_name, &scope_name, &collection_name, &resp]() {
1426
- couchbase::core::operations::management::query_index_create_request req{};
1427
- req.bucket_name = integration.ctx.bucket;
1428
- req.index_name = index_name;
1429
- req.scope_name = scope_name;
1430
- req.collection_name = collection_name;
1431
- req.fields = { "field" };
1432
- req.deferred = true;
1433
- resp = test::utils::execute(integration.cluster, req);
1434
- return resp.ctx.ec != couchbase::errc::common::bucket_not_found;
1435
- });
1436
- REQUIRE(operation_completed);
1437
- REQUIRE_SUCCESS(resp.ctx.ec);
1438
- }
1439
-
1871
+ SECTION("core API")
1440
1872
  {
1441
1873
  couchbase::core::operations::management::query_index_get_all_request req{};
1442
1874
  req.bucket_name = integration.ctx.bucket;
1443
- req.scope_name = scope_name;
1875
+ req.scope_name = "missing_scope";
1444
1876
  req.collection_name = collection_name;
1445
1877
  auto resp = test::utils::execute(integration.cluster, req);
1446
1878
  REQUIRE_SUCCESS(resp.ctx.ec);
1447
- REQUIRE(resp.indexes.size() == 1);
1448
- REQUIRE(resp.indexes[0].name == index_name);
1449
- REQUIRE(resp.indexes[0].state == "deferred");
1879
+ REQUIRE(resp.indexes.empty());
1450
1880
  }
1451
-
1452
1881
  SECTION("public API")
1453
1882
  {
1454
- auto manager = couchbase::cluster(integration.cluster).query_indexes();
1455
- auto ctx = manager.build_deferred_indexes(integration.ctx.bucket, {}).get();
1883
+ couchbase::cluster c(integration.cluster);
1884
+ auto coll = c.bucket(integration.ctx.bucket).scope("missing_scope").collection(collection_name);
1885
+ auto [ctx, indexes] = coll.query_indexes().get_all_indexes({}).get();
1456
1886
  REQUIRE_SUCCESS(ctx.ec());
1887
+ REQUIRE(indexes.empty());
1457
1888
  }
1889
+ }
1458
1890
 
1891
+ SECTION("drop missing collection")
1892
+ {
1459
1893
  SECTION("core API")
1460
1894
  {
1461
- couchbase::core::operations::management::query_index_build_deferred_request req{};
1895
+ couchbase::core::operations::management::query_index_drop_request req{};
1462
1896
  req.bucket_name = integration.ctx.bucket;
1463
1897
  req.scope_name = scope_name;
1464
- req.collection_name = collection_name;
1898
+ req.collection_name = "missing_collection";
1899
+ req.is_primary = true;
1465
1900
  auto resp = test::utils::execute(integration.cluster, req);
1466
- REQUIRE_SUCCESS(resp.ctx.ec);
1901
+ REQUIRE(resp.ctx.ec == couchbase::errc::common::collection_not_found);
1467
1902
  }
1468
-
1469
- test::utils::wait_until([&integration, scope_name, collection_name]() {
1470
- couchbase::core::operations::management::query_index_get_all_request req{};
1903
+ SECTION("public API")
1904
+ {
1905
+ couchbase::cluster c(integration.cluster);
1906
+ auto coll = c.bucket(integration.ctx.bucket).scope(scope_name).collection("missing_collection");
1907
+ REQUIRE(coll.query_indexes().drop_index(index_name, {}).get().ec() == couchbase::errc::common::collection_not_found);
1908
+ }
1909
+ }
1910
+ SECTION("drop missing scope")
1911
+ {
1912
+ SECTION("core API")
1913
+ {
1914
+ couchbase::core::operations::management::query_index_drop_request req{};
1471
1915
  req.bucket_name = integration.ctx.bucket;
1472
- req.scope_name = scope_name;
1916
+ req.scope_name = "missing_scope";
1473
1917
  req.collection_name = collection_name;
1918
+ req.is_primary = true;
1474
1919
  auto resp = test::utils::execute(integration.cluster, req);
1475
- if (resp.indexes.empty()) {
1476
- return false;
1477
- }
1478
- return resp.indexes[0].state == "online";
1479
- });
1480
- }
1481
-
1482
- SECTION("create missing collection")
1483
- {
1484
- couchbase::core::operations::management::query_index_create_request req{};
1485
- req.bucket_name = integration.ctx.bucket;
1486
- req.scope_name = scope_name;
1487
- req.collection_name = "missing_collection";
1488
- req.is_primary = true;
1489
- auto resp = test::utils::execute(integration.cluster, req);
1490
- REQUIRE(resp.ctx.ec == couchbase::errc::common::collection_not_found);
1491
- }
1492
-
1493
- SECTION("create missing scope")
1494
- {
1495
- couchbase::core::operations::management::query_index_create_request req{};
1496
- req.bucket_name = integration.ctx.bucket;
1497
- req.scope_name = "missing_scope";
1498
- req.collection_name = collection_name;
1499
- req.is_primary = true;
1500
- auto resp = test::utils::execute(integration.cluster, req);
1501
- REQUIRE(resp.ctx.ec == couchbase::errc::common::scope_not_found);
1502
- }
1503
-
1504
- SECTION("get missing collection")
1505
- {
1506
- couchbase::core::operations::management::query_index_get_all_request req{};
1507
- req.bucket_name = integration.ctx.bucket;
1508
- req.scope_name = scope_name;
1509
- req.collection_name = "missing_collection";
1510
- auto resp = test::utils::execute(integration.cluster, req);
1511
- REQUIRE_SUCCESS(resp.ctx.ec);
1512
- REQUIRE(resp.indexes.empty());
1920
+ REQUIRE(resp.ctx.ec == couchbase::errc::common::scope_not_found);
1921
+ }
1922
+ SECTION("public API")
1923
+ {
1924
+ couchbase::cluster c(integration.cluster);
1925
+ auto coll = c.bucket(integration.ctx.bucket).scope("missing_scope").collection(collection_name);
1926
+ REQUIRE(coll.query_indexes().drop_index(index_name, {}).get().ec() == couchbase::errc::common::scope_not_found);
1927
+ }
1513
1928
  }
1514
-
1515
- SECTION("drop missing collection")
1929
+ SECTION("watch missing scope")
1516
1930
  {
1517
- couchbase::core::operations::management::query_index_drop_request req{};
1518
- req.bucket_name = integration.ctx.bucket;
1519
- req.scope_name = scope_name;
1520
- req.collection_name = "missing_collection";
1521
- req.is_primary = true;
1522
- auto resp = test::utils::execute(integration.cluster, req);
1523
- REQUIRE(resp.ctx.ec == couchbase::errc::common::collection_not_found);
1931
+ SECTION("public API")
1932
+ {
1933
+ couchbase::cluster c(integration.cluster);
1934
+ auto coll = c.bucket(integration.ctx.bucket).scope("missing_scope").collection(collection_name);
1935
+ REQUIRE(coll.query_indexes()
1936
+ .watch_indexes({ index_name }, couchbase::watch_query_indexes_options().timeout(std::chrono::seconds(5)))
1937
+ .get()
1938
+ .ec() == couchbase::errc::common::ambiguous_timeout);
1939
+ }
1524
1940
  }
1525
-
1526
- SECTION("drop missing scope")
1941
+ SECTION("watch missing collection")
1527
1942
  {
1528
- couchbase::core::operations::management::query_index_drop_request req{};
1529
- req.bucket_name = integration.ctx.bucket;
1530
- req.scope_name = "missing_scope";
1531
- req.collection_name = collection_name;
1532
- req.is_primary = true;
1533
- auto resp = test::utils::execute(integration.cluster, req);
1534
- REQUIRE(resp.ctx.ec == couchbase::errc::common::scope_not_found);
1943
+ SECTION("public API")
1944
+ {
1945
+ couchbase::cluster c(integration.cluster);
1946
+ auto coll = c.bucket(integration.ctx.bucket).scope(scope_name).collection("missing_collection");
1947
+ REQUIRE(coll.query_indexes()
1948
+ .watch_indexes({ index_name }, couchbase::watch_query_indexes_options().timeout(std::chrono::seconds(5)))
1949
+ .get()
1950
+ .ec() == couchbase::errc::common::ambiguous_timeout);
1951
+ }
1535
1952
  }
1536
1953
  }
1537
1954