couchbase 4.2.1 → 4.2.2

Sign up to get free protection for your applications and to get access to all the features.
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