Skip to content

Commit da1786c

Browse files
daschlMichael Nitschinger
authored andcommitted
JCBC-1921: Make sure buildDeferredIndexes works aginst 6.0
This changeset splits up the deferred building again into two individual calls since earlier query versions do not support nested statements when building deferred indexes. Change-Id: I789162b256e4d980e8522a93a4c7678de70f3b31 Reviewed-on: https://review.couchbase.org/c/couchbase-jvm-clients/+/171081 Tested-by: Build Bot <[email protected]> Reviewed-by: Michael Reiche <[email protected]>
1 parent 8fb5d5d commit da1786c

File tree

3 files changed

+34
-31
lines changed

3 files changed

+34
-31
lines changed

java-client/src/integrationTest/java/com/couchbase/client/java/manager/query/QueryCollectionsIndexManagerIntegrationTest.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -263,10 +263,7 @@ void buildTwoDeferredIndexes() {
263263

264264
@Test
265265
void buildDeferredIndexOnAbsentBucket() {
266-
assertThrows(
267-
IndexFailureException.class,
268-
() -> indexes.buildDeferredIndexes("noSuchBucket", enrich(buildDeferredQueryIndexesOptions()))
269-
);
266+
indexes.buildDeferredIndexes("noSuchBucket", enrich(buildDeferredQueryIndexesOptions()));
270267
}
271268

272269
@Test

java-client/src/integrationTest/java/com/couchbase/client/java/manager/query/QueryIndexManagerIntegrationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ void buildTwoDeferredIndexes() {
237237

238238
@Test
239239
void buildDeferredIndexOnAbsentBucket() {
240-
assertThrows(IndexFailureException.class, () -> indexes.buildDeferredIndexes("noSuchBucket"));
240+
indexes.buildDeferredIndexes("noSuchBucket");
241241
}
242242

243243
@Test

java-client/src/main/java/com/couchbase/client/java/manager/query/AsyncQueryIndexManager.java

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.couchbase.client.java.manager.query;
1818

19+
import com.couchbase.client.core.Reactor;
1920
import com.couchbase.client.core.annotation.Stability;
2021
import com.couchbase.client.core.cnc.RequestSpan;
2122
import com.couchbase.client.core.cnc.TracingIdentifiers;
@@ -409,33 +410,38 @@ public CompletableFuture<Void> buildDeferredIndexes(final String bucketName, fin
409410
notNull(options, "Options");
410411
final BuildQueryIndexOptions.Built builtOpts = options.build();
411412

412-
String statement;
413-
JsonArray parameters;
414-
if (builtOpts.collectionName().isPresent() && builtOpts.scopeName().isPresent()) {
415-
String keyspace = buildKeyspace(bucketName, builtOpts.scopeName(), builtOpts.collectionName());
416-
417-
statement = "BUILD INDEX ON " + keyspace + " (" +
418-
" (" +
419-
" SELECT RAW name FROM system:indexes " +
420-
" WHERE bucket_id = ?" +
421-
" AND scope_id = ?" +
422-
" AND keyspace_id = ?" +
423-
" AND state = \"deferred\"" +
424-
" )" +
425-
")";
426-
parameters = JsonArray.from(bucketName, builtOpts.scopeName().get(), builtOpts.collectionName().get());
427-
} else {
428-
statement = "BUILD INDEX ON `" + bucketName + "` (" +
429-
" (" +
430-
" SELECT RAW name FROM system:indexes " +
431-
" WHERE keyspace_id = ? AND bucket_id IS MISSING AND state = \"deferred\"" +
432-
" )" +
433-
")";
434-
parameters = JsonArray.from(bucketName);
435-
}
436413

437-
return exec(WRITE, statement, builtOpts, TracingIdentifiers.SPAN_REQUEST_MQ_BUILD_DEFERRED_INDEXES, bucketName, parameters)
438-
.thenApply(result -> null);
414+
GetAllQueryIndexesOptions getAllOptions = getAllQueryIndexesOptions();
415+
builtOpts.collectionName().ifPresent(getAllOptions::collectionName);
416+
builtOpts.scopeName().ifPresent(getAllOptions::scopeName);
417+
builtOpts.timeout().ifPresent(getAllOptions::timeout);
418+
419+
return Reactor
420+
.toMono(() -> getAllIndexes(bucketName, getAllOptions))
421+
.map(indexes -> indexes
422+
.stream()
423+
.filter(idx -> idx.state().equals("deferred"))
424+
.map(idx -> quote(idx.name()))
425+
.collect(Collectors.toList())
426+
)
427+
.flatMap(indexNames -> {
428+
if (indexNames.isEmpty()) {
429+
return Mono.empty();
430+
}
431+
432+
String keyspace = builtOpts.collectionName().isPresent() && builtOpts.scopeName().isPresent()
433+
? buildKeyspace(bucketName, builtOpts.scopeName(), builtOpts.collectionName())
434+
: quote(bucketName);
435+
436+
String statement = "BUILD INDEX ON " + keyspace + " (" + String.join(",", indexNames) + ")";
437+
438+
return Reactor.toMono(
439+
() -> exec(WRITE, statement, builtOpts, TracingIdentifiers.SPAN_REQUEST_MQ_BUILD_DEFERRED_INDEXES, bucketName, null)
440+
.thenApply(result -> null)
441+
);
442+
})
443+
.then()
444+
.toFuture();
439445
}
440446

441447
/**

0 commit comments

Comments
 (0)