You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ko...@apache.org on 2023/09/05 10:14:07 UTC
[ignite-3] branch main updated: IGNITE-20307 Move handler of DropTable command from CatalogManager to command itself (#2526)
This is an automated email from the ASF dual-hosted git repository.
korlov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new 73acf1841e IGNITE-20307 Move handler of DropTable command from CatalogManager to command itself (#2526)
73acf1841e is described below
commit 73acf1841eaede7931596af6124bdd3bb977a8aa
Author: korlov42 <ko...@gridgain.com>
AuthorDate: Tue Sep 5 13:14:01 2023 +0300
IGNITE-20307 Move handler of DropTable command from CatalogManager to command itself (#2526)
---
.../ignite/internal/catalog/CatalogCommand.java | 6 +-
.../ignite/internal/catalog/CatalogManager.java | 29 +---
.../internal/catalog/CatalogManagerImpl.java | 58 +------
.../catalog/CatalogParamsValidationUtils.java | 5 -
....java => TableNotFoundValidationException.java} | 9 +-
.../catalog/commands/AbstractTableCommand.java | 46 +++++
...arams.java => AbstractTableCommandBuilder.java} | 30 ++--
.../internal/catalog/commands/CatalogUtils.java | 22 +++
.../catalog/commands/CreateTableCommand.java | 35 ++--
.../commands/CreateTableCommandBuilder.java | 12 +-
.../catalog/commands/DropTableCommand.java | 95 +++++++++++
...bleParams.java => DropTableCommandBuilder.java} | 25 +--
.../internal/catalog/CatalogManagerSelfTest.java | 34 +---
.../catalog/CatalogManagerValidationTest.java | 9 -
.../commands/AbstractCommandValidationTest.java | 106 ++++++++++++
.../commands/CreateTableCommandValidationTest.java | 186 ++++++---------------
.../commands/DropTableCommandValidationTest.java | 99 +++++++++++
.../internal/catalog/BaseCatalogManagerTest.java | 11 +-
.../engine/exec/ddl/DdlCommandHandlerWrapper.java | 11 +-
.../exec/ddl/DdlToCatalogCommandConverter.java | 10 +-
.../sql/engine/exec/MockedStructuresTest.java | 3 -
21 files changed, 500 insertions(+), 341 deletions(-)
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogCommand.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogCommand.java
index 1c45724808..417dc9ca6b 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogCommand.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogCommand.java
@@ -17,10 +17,14 @@
package org.apache.ignite.internal.catalog;
+import java.util.List;
+
/**
* Marker interface for commands executed by {@link CatalogManager}.
*
* @see CatalogManager#execute(CatalogCommand)
+ * @see CatalogManager#execute(List)
*/
-public interface CatalogCommand {
+@SuppressWarnings("InterfaceMayBeAnnotatedFunctional")
+public interface CatalogCommand extends UpdateProducer {
}
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManager.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManager.java
index 3f292bbe3c..ca1d3d00a5 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManager.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManager.java
@@ -25,10 +25,8 @@ import org.apache.ignite.internal.catalog.commands.AlterTableDropColumnParams;
import org.apache.ignite.internal.catalog.commands.AlterZoneParams;
import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
-import org.apache.ignite.internal.catalog.commands.CreateTableCommandBuilder;
import org.apache.ignite.internal.catalog.commands.CreateZoneParams;
import org.apache.ignite.internal.catalog.commands.DropIndexParams;
-import org.apache.ignite.internal.catalog.commands.DropTableParams;
import org.apache.ignite.internal.catalog.commands.DropZoneParams;
import org.apache.ignite.internal.catalog.commands.RenameZoneParams;
import org.apache.ignite.internal.manager.IgniteComponent;
@@ -40,42 +38,19 @@ public interface CatalogManager extends IgniteComponent, CatalogService {
/**
* Executes given command.
*
- * <p>Accepts only those commands provided by builders returned by this very {@link CatalogManager}.
- * Otherwise will throw {@link IllegalArgumentException}.
- *
* @param command Command to execute.
* @return Future representing result of execution.
- * @throws IllegalArgumentException If given command was created not by this manager.
- * @see #createTableCommandBuilder()
*/
- CompletableFuture<Void> execute(CatalogCommand command) throws IllegalArgumentException;
+ CompletableFuture<Void> execute(CatalogCommand command);
/**
* Executes given list of commands atomically. That is, either all commands will be applied at once
* or neither of them. The whole bulk will increment catalog's version by a single point.
*
- * <p>Accepts only those commands provided by builders returned by this very {@link CatalogManager}.
- * Otherwise will throw {@link IllegalArgumentException}.
- *
* @param commands Commands to execute.
* @return Future representing result of execution.
- * @throws IllegalArgumentException If given command was created not by this manager.
- * @see #createTableCommandBuilder()
- */
- CompletableFuture<Void> execute(List<CatalogCommand> commands) throws IllegalArgumentException;
-
- /**
- * Returns builder to create a command to create a new table.
- */
- CreateTableCommandBuilder createTableCommandBuilder();
-
- /**
- * Drops table.
- *
- * @param params Parameters.
- * @return Operation future.
*/
- CompletableFuture<Void> dropTable(DropTableParams params);
+ CompletableFuture<Void> execute(List<CatalogCommand> commands);
/**
* Add columns to a table.
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
index 6f9efb0e6f..c126a817ed 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
@@ -28,7 +28,6 @@ import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.va
import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateCreateZoneParams;
import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateDropColumnParams;
import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateDropIndexParams;
-import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateDropTableParams;
import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateDropZoneParams;
import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateRenameZoneParams;
import static org.apache.ignite.internal.catalog.commands.CatalogUtils.fromParams;
@@ -55,11 +54,8 @@ import org.apache.ignite.internal.catalog.commands.CatalogUtils;
import org.apache.ignite.internal.catalog.commands.ColumnParams;
import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
-import org.apache.ignite.internal.catalog.commands.CreateTableCommand;
-import org.apache.ignite.internal.catalog.commands.CreateTableCommandBuilder;
import org.apache.ignite.internal.catalog.commands.CreateZoneParams;
import org.apache.ignite.internal.catalog.commands.DropIndexParams;
-import org.apache.ignite.internal.catalog.commands.DropTableParams;
import org.apache.ignite.internal.catalog.commands.DropZoneParams;
import org.apache.ignite.internal.catalog.commands.RenameZoneParams;
import org.apache.ignite.internal.catalog.descriptors.CatalogHashIndexDescriptor;
@@ -75,7 +71,6 @@ import org.apache.ignite.internal.catalog.storage.AlterColumnEntry;
import org.apache.ignite.internal.catalog.storage.AlterZoneEntry;
import org.apache.ignite.internal.catalog.storage.DropColumnsEntry;
import org.apache.ignite.internal.catalog.storage.DropIndexEntry;
-import org.apache.ignite.internal.catalog.storage.DropTableEntry;
import org.apache.ignite.internal.catalog.storage.DropZoneEntry;
import org.apache.ignite.internal.catalog.storage.Fireable;
import org.apache.ignite.internal.catalog.storage.NewColumnsEntry;
@@ -313,53 +308,12 @@ public class CatalogManagerImpl extends Producer<CatalogEvent, CatalogEventParam
@Override
public CompletableFuture<Void> execute(CatalogCommand command) {
- return saveUpdateAndWaitForActivation(toProducerOrThrow(command));
+ return saveUpdateAndWaitForActivation(command);
}
@Override
public CompletableFuture<Void> execute(List<CatalogCommand> commands) throws IllegalArgumentException {
- List<UpdateProducer> producers = new ArrayList<>(commands.size());
-
- for (CatalogCommand command : commands) {
- producers.add(toProducerOrThrow(command));
- }
-
- return saveUpdateAndWaitForActivation(new BulkUpdateProducer(producers));
- }
-
- private static UpdateProducer toProducerOrThrow(CatalogCommand command) {
- if (!(command instanceof UpdateProducer)) {
- throw new IllegalArgumentException("Expected command created by this very manager, but got "
- + (command == null ? "<null>" : command.getClass().getCanonicalName()));
- }
-
- return (UpdateProducer) command;
- }
-
- @Override
- public CreateTableCommandBuilder createTableCommandBuilder() {
- return new CreateTableCommand.Builder();
- }
-
- @Override
- public CompletableFuture<Void> dropTable(DropTableParams params) {
- return saveUpdateAndWaitForActivation(catalog -> {
- validateDropTableParams(params);
-
- CatalogSchemaDescriptor schema = getSchema(catalog, params.schemaName());
-
- CatalogTableDescriptor table = getTable(schema, params.tableName());
-
- List<UpdateEntry> updateEntries = new ArrayList<>();
-
- Arrays.stream(schema.indexes())
- .filter(index -> index.tableId() == table.id())
- .forEach(index -> updateEntries.add(new DropIndexEntry(index.id(), index.tableId())));
-
- updateEntries.add(new DropTableEntry(table.id()));
-
- return updateEntries;
- });
+ return saveUpdateAndWaitForActivation(new BulkUpdateProducer(List.copyOf(commands)));
}
@Override
@@ -856,17 +810,17 @@ public class CatalogManagerImpl extends Producer<CatalogEvent, CatalogEventParam
}
private static class BulkUpdateProducer implements UpdateProducer {
- private final List<UpdateProducer> producers;
+ private final List<? extends UpdateProducer> commands;
- BulkUpdateProducer(List<UpdateProducer> producers) {
- this.producers = producers;
+ BulkUpdateProducer(List<? extends UpdateProducer> producers) {
+ this.commands = producers;
}
@Override
public List<UpdateEntry> get(Catalog catalog) {
List<UpdateEntry> bulkUpdateEntries = new ArrayList<>();
- for (UpdateProducer producer : producers) {
+ for (UpdateProducer producer : commands) {
List<UpdateEntry> entries = producer.get(catalog);
for (UpdateEntry entry : entries) {
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogParamsValidationUtils.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogParamsValidationUtils.java
index ce65b53103..6b4c6de152 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogParamsValidationUtils.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogParamsValidationUtils.java
@@ -40,7 +40,6 @@ import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
import org.apache.ignite.internal.catalog.commands.CreateZoneParams;
import org.apache.ignite.internal.catalog.commands.DropIndexParams;
-import org.apache.ignite.internal.catalog.commands.DropTableParams;
import org.apache.ignite.internal.catalog.commands.DropZoneParams;
import org.apache.ignite.internal.catalog.commands.RenameZoneParams;
import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
@@ -120,10 +119,6 @@ public class CatalogParamsValidationUtils {
validateZoneName(params.newZoneName(), "Missing new zone name");
}
- static void validateDropTableParams(DropTableParams params) {
- validateCommonTableParams(params);
- }
-
static void validateDropColumnParams(AlterTableDropColumnParams params) {
validateCommonTableParams(params);
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogCommand.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/TableNotFoundValidationException.java
similarity index 71%
copy from modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogCommand.java
copy to modules/catalog/src/main/java/org/apache/ignite/internal/catalog/TableNotFoundValidationException.java
index 1c45724808..6a1e6cec7e 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogCommand.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/TableNotFoundValidationException.java
@@ -18,9 +18,12 @@
package org.apache.ignite.internal.catalog;
/**
- * Marker interface for commands executed by {@link CatalogManager}.
+ * This exception is thrown when table that going to be deleted not found in the schema.
*
- * @see CatalogManager#execute(CatalogCommand)
+ * <p>This exception is used to properly handle IF EXISTS flag in ddl command handler.
*/
-public interface CatalogCommand {
+public class TableNotFoundValidationException extends CatalogValidationException {
+ public TableNotFoundValidationException(String message) {
+ super(message);
+ }
}
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommand.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommand.java
new file mode 100644
index 0000000000..e0887ca70e
--- /dev/null
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommand.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.catalog.commands;
+
+import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateIdentifier;
+
+import org.apache.ignite.internal.catalog.CatalogValidationException;
+
+/**
+ * Abstract table-related command.
+ *
+ * <p>Every table-related command, disregard it going to create new table or modify existing one,
+ * should specify name of the table and namespace (schema) where to find existing/put new table.
+ */
+public abstract class AbstractTableCommand extends AbstractCatalogCommand {
+ protected final String schemaName;
+
+ protected final String tableName;
+
+ AbstractTableCommand(String schemaName, String tableName) throws CatalogValidationException {
+ this.schemaName = schemaName;
+ this.tableName = tableName;
+
+ validate();
+ }
+
+ private void validate() {
+ validateIdentifier(schemaName, "Name of the schema");
+ validateIdentifier(tableName, "Name of the table");
+ }
+}
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableParams.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommandBuilder.java
similarity index 55%
copy from modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableParams.java
copy to modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommandBuilder.java
index 9ae34f7d20..9de2e867d7 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableParams.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommandBuilder.java
@@ -17,21 +17,21 @@
package org.apache.ignite.internal.catalog.commands;
-/** DROP TABLE statement. */
-public class DropTableParams extends AbstractTableCommandParams {
- /** Creates parameters builder. */
- public static Builder builder() {
- return new Builder();
- }
+import org.apache.ignite.internal.catalog.CatalogCommand;
- private DropTableParams() {
- // No-op.
- }
+/**
+ * Abstract builder of table-related commands.
+ *
+ * <p>Every table-related command, disregard it going to create new table or modify existing one,
+ * should specify name of the table and namespace (schema) where to find existing/put new table.
+ */
+public interface AbstractTableCommandBuilder<T extends AbstractTableCommandBuilder<T>> {
+ /** A name of the schema a table belongs to. Should not be null or blank. */
+ T schemaName(String schemaName);
+
+ /** A name of the table. Should not be null or blank. */
+ T tableName(String tableName);
- /** Parameters builder. */
- public static class Builder extends AbstractTableBuilder<DropTableParams, Builder> {
- private Builder() {
- super(new DropTableParams());
- }
- }
+ /** Returns a command with specified parameters. */
+ CatalogCommand build();
}
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
index 63fcc508c5..d1f753ead5 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
@@ -29,6 +29,7 @@ import java.util.Set;
import java.util.stream.IntStream;
import org.apache.ignite.internal.catalog.Catalog;
import org.apache.ignite.internal.catalog.CatalogValidationException;
+import org.apache.ignite.internal.catalog.TableNotFoundValidationException;
import org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollation;
import org.apache.ignite.internal.catalog.descriptors.CatalogDataStorageDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogHashIndexDescriptor;
@@ -36,6 +37,7 @@ import org.apache.ignite.internal.catalog.descriptors.CatalogIndexColumnDescript
import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogSortedIndexDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
import org.apache.ignite.sql.ColumnType;
import org.jetbrains.annotations.Nullable;
@@ -357,6 +359,26 @@ public class CatalogUtils {
return schema;
}
+ /**
+ * Returns table with given name, or throws {@link TableNotFoundValidationException} if table with given name not exists.
+ *
+ * @param schema Schema to look up table in.
+ * @param name Name of the table of interest.
+ * @return Table with given name. Never null.
+ * @throws TableNotFoundValidationException If table with given name is not exists.
+ */
+ static CatalogTableDescriptor tableOrThrow(CatalogSchemaDescriptor schema, String name) throws TableNotFoundValidationException {
+ name = Objects.requireNonNull(name, "tableName");
+
+ CatalogTableDescriptor table = schema.table(name);
+
+ if (table == null) {
+ throw new TableNotFoundValidationException(format("Table with name '{}.{}' not found", schema.name(), name));
+ }
+
+ return table;
+ }
+
/**
* Returns zone with given name, or throws {@link CatalogValidationException} if zone with given name not exists.
*
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommand.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommand.java
index 93e6f9a035..25f17d3671 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommand.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommand.java
@@ -21,7 +21,6 @@ import static java.util.Objects.requireNonNullElse;
import static java.util.stream.Collectors.toList;
import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.ensureNoTableOrIndexExistsWithGivenName;
import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateColumnParams;
-import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateIdentifier;
import static org.apache.ignite.internal.catalog.commands.CatalogUtils.schemaOrThrow;
import static org.apache.ignite.internal.catalog.commands.CatalogUtils.zoneOrThrow;
import static org.apache.ignite.internal.util.CollectionUtils.copyOrNull;
@@ -43,17 +42,15 @@ import org.apache.ignite.internal.catalog.storage.NewIndexEntry;
import org.apache.ignite.internal.catalog.storage.NewTableEntry;
import org.apache.ignite.internal.catalog.storage.ObjectIdGenUpdateEntry;
import org.apache.ignite.internal.catalog.storage.UpdateEntry;
-import org.jetbrains.annotations.Nullable;
/**
* A command that adds a new table to the catalog.
*/
-public class CreateTableCommand extends AbstractCatalogCommand {
- /** Schema name where this new table will be created. */
- private final String schemaName;
-
- /** Table name. */
- private final String tableName;
+public class CreateTableCommand extends AbstractTableCommand {
+ /** Returns builder to create a command to create a new table. */
+ public static CreateTableCommandBuilder builder() {
+ return new Builder();
+ }
/** Primary key columns. */
private final List<String> primaryKeyColumns;
@@ -88,8 +85,8 @@ public class CreateTableCommand extends AbstractCatalogCommand {
List<ColumnParams> columns,
String zoneName
) throws CatalogValidationException {
- this.tableName = tableName;
- this.schemaName = schemaName;
+ super(schemaName, tableName);
+
this.primaryKeyColumns = copyOrNull(primaryKeyColumns);
this.colocationColumns = copyOrNull(colocationColumns);
this.columns = copyOrNull(columns);
@@ -140,9 +137,6 @@ public class CreateTableCommand extends AbstractCatalogCommand {
}
private void validate() {
- validateIdentifier(schemaName, "Name of the schema");
- validateIdentifier(tableName, "Name of the table");
-
if (nullOrEmpty(columns)) {
throw new CatalogValidationException("Table should have at least one column");
}
@@ -193,18 +187,18 @@ public class CreateTableCommand extends AbstractCatalogCommand {
/**
* Implementation of {@link CreateTableCommandBuilder}.
*/
- public static class Builder implements CreateTableCommandBuilder {
- private @Nullable List<ColumnParams> columns;
+ private static class Builder implements CreateTableCommandBuilder {
+ private List<ColumnParams> columns;
- private @Nullable String schemaName;
+ private String schemaName;
- private @Nullable String tableName;
+ private String tableName;
- private @Nullable List<String> primaryKeyColumns;
+ private List<String> primaryKeyColumns;
- private @Nullable List<String> colocationColumns;
+ private List<String> colocationColumns;
- private @Nullable String zoneName;
+ private String zoneName;
@Override
public CreateTableCommandBuilder schemaName(String schemaName) {
@@ -248,7 +242,6 @@ public class CreateTableCommand extends AbstractCatalogCommand {
return this;
}
- @SuppressWarnings("DataFlowIssue") // params are validated in constructor
@Override
public CatalogCommand build() {
String zoneName = requireNonNullElse(this.zoneName, CatalogService.DEFAULT_ZONE_NAME);
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandBuilder.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandBuilder.java
index 31cc55a2cd..c9eaaa54a9 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandBuilder.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandBuilder.java
@@ -18,7 +18,6 @@
package org.apache.ignite.internal.catalog.commands;
import java.util.List;
-import org.apache.ignite.internal.catalog.CatalogCommand;
import org.jetbrains.annotations.Nullable;
/**
@@ -28,13 +27,7 @@ import org.jetbrains.annotations.Nullable;
* to make sure invocation of {@link #build()} method doesn't cause any
* side effects on builder's state or any object created by the same builder.
*/
-public interface CreateTableCommandBuilder {
- /** A name of the schema to add new table to. Should not be null or blank. */
- CreateTableCommandBuilder schemaName(String schemaName);
-
- /** A name of the table to add. Should not be null or blank. */
- CreateTableCommandBuilder tableName(String tableName);
-
+public interface CreateTableCommandBuilder extends AbstractTableCommandBuilder<CreateTableCommandBuilder> {
/** List of columns a new table should be created with. There must be at least one column. */
CreateTableCommandBuilder columns(List<ColumnParams> columns);
@@ -52,7 +45,4 @@ public interface CreateTableCommandBuilder {
/** A name of the zone to create new table in. Should not be null or blank. */
CreateTableCommandBuilder zone(@Nullable String zoneName);
-
- /** Returns a command with specified parameters. */
- CatalogCommand build();
}
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableCommand.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableCommand.java
new file mode 100644
index 0000000000..de01a40a3d
--- /dev/null
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableCommand.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.catalog.commands;
+
+import static org.apache.ignite.internal.catalog.commands.CatalogUtils.schemaOrThrow;
+import static org.apache.ignite.internal.catalog.commands.CatalogUtils.tableOrThrow;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.apache.ignite.internal.catalog.Catalog;
+import org.apache.ignite.internal.catalog.CatalogCommand;
+import org.apache.ignite.internal.catalog.CatalogValidationException;
+import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
+import org.apache.ignite.internal.catalog.storage.DropIndexEntry;
+import org.apache.ignite.internal.catalog.storage.DropTableEntry;
+import org.apache.ignite.internal.catalog.storage.UpdateEntry;
+
+/**
+ * A command that drops table with specified name.
+ */
+public class DropTableCommand extends AbstractTableCommand {
+ /** Returns builder to create a command to drop table with specified name. */
+ public static DropTableCommandBuilder builder() {
+ return new Builder();
+ }
+
+ private DropTableCommand(String schemaName, String tableName) throws CatalogValidationException {
+ super(schemaName, tableName);
+ }
+
+ @Override
+ public List<UpdateEntry> get(Catalog catalog) {
+ CatalogSchemaDescriptor schema = schemaOrThrow(catalog, schemaName);
+
+ CatalogTableDescriptor table = tableOrThrow(schema, tableName);
+
+ List<UpdateEntry> updateEntries = new ArrayList<>();
+
+ Arrays.stream(schema.indexes())
+ .filter(index -> index.tableId() == table.id())
+ .forEach(index -> updateEntries.add(new DropIndexEntry(index.id(), index.tableId())));
+
+ updateEntries.add(new DropTableEntry(table.id()));
+
+ return updateEntries;
+ }
+
+ /**
+ * Implementation of {@link DropTableCommandBuilder}.
+ */
+ private static class Builder implements DropTableCommandBuilder {
+ private String schemaName;
+
+ private String tableName;
+
+ @Override
+ public DropTableCommandBuilder schemaName(String schemaName) {
+ this.schemaName = schemaName;
+
+ return this;
+ }
+
+ @Override
+ public DropTableCommandBuilder tableName(String tableName) {
+ this.tableName = tableName;
+
+ return this;
+ }
+
+ @Override
+ public CatalogCommand build() {
+ return new DropTableCommand(
+ schemaName,
+ tableName
+ );
+ }
+ }
+}
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableParams.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableCommandBuilder.java
similarity index 64%
rename from modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableParams.java
rename to modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableCommandBuilder.java
index 9ae34f7d20..9a154d8935 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableParams.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableCommandBuilder.java
@@ -17,21 +17,12 @@
package org.apache.ignite.internal.catalog.commands;
-/** DROP TABLE statement. */
-public class DropTableParams extends AbstractTableCommandParams {
- /** Creates parameters builder. */
- public static Builder builder() {
- return new Builder();
- }
-
- private DropTableParams() {
- // No-op.
- }
-
- /** Parameters builder. */
- public static class Builder extends AbstractTableBuilder<DropTableParams, Builder> {
- private Builder() {
- super(new DropTableParams());
- }
- }
+/**
+ * Builder of a command that drop specified table.
+ *
+ * <p>A builder is considered to be reusable, thus implementation have
+ * to make sure invocation of {@link #build()} method doesn't cause any
+ * side effects on builder's state or any object created by the same builder.
+ */
+public interface DropTableCommandBuilder extends AbstractTableCommandBuilder<DropTableCommandBuilder> {
}
diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
index 23239c547f..dff338ae27 100644
--- a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
+++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
@@ -273,7 +273,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
long beforeDropTimestamp = clock.nowLong();
- assertThat(manager.dropTable(dropTableParams(TABLE_NAME)), willBe(nullValue()));
+ assertThat(manager.execute(dropTableCommand(TABLE_NAME)), willBe(nullValue()));
// Validate catalog version from the past.
CatalogSchemaDescriptor schema = manager.schema(2);
@@ -820,7 +820,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
long beforeDropTimestamp = clock.nowLong();
- assertThat(manager.dropTable(dropTableParams(TABLE_NAME)), willBe(nullValue()));
+ assertThat(manager.execute(dropTableCommand(TABLE_NAME)), willBe(nullValue()));
// Validate catalog version from the past.
CatalogSchemaDescriptor schema = manager.schema(2);
@@ -1019,7 +1019,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
assertThat(manager.execute(simpleTable(TABLE_NAME)), willBe(nullValue()));
verify(eventListener).notify(any(CreateTableEventParameters.class), isNull());
- assertThat(manager.dropTable(dropTableParams(TABLE_NAME)), willBe(nullValue()));
+ assertThat(manager.execute(dropTableCommand(TABLE_NAME)), willBe(nullValue()));
verify(eventListener).notify(any(DropTableEventParameters.class), isNull());
verifyNoMoreInteractions(eventListener);
@@ -1060,7 +1060,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
clearInvocations(eventListener);
// Drop table with pk index.
- assertThat(manager.dropTable(dropTableParams(TABLE_NAME)), willBe(nullValue()));
+ assertThat(manager.execute(dropTableCommand(TABLE_NAME)), willBe(nullValue()));
// Try drop index once again.
assertThat(manager.dropIndex(dropIndexParams), willThrow(IndexNotFoundException.class));
@@ -1447,7 +1447,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
assertEquals(tableId, eventParameters.tableId());
// Let's delete the table.
- assertThat(manager.dropTable(dropTableParams(TABLE_NAME)), willBe(nullValue()));
+ assertThat(manager.execute(dropTableCommand(TABLE_NAME)), willBe(nullValue()));
// Let's make sure that the PK index has been deleted.
eventParameters = captor.getValue();
@@ -1634,7 +1634,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
@Test
void testDropNotExistingTable() {
- assertThat(manager.dropTable(dropTableParams(TABLE_NAME)), willThrowFast(TableNotFoundException.class));
+ assertThat(manager.execute(dropTableCommand(TABLE_NAME)), willThrowFast(CatalogValidationException.class));
}
@Test
@@ -1697,28 +1697,6 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
);
}
- @Test
- void exceptionIsThrownIfCommandIsUnknown() {
- CatalogCommand command = new CatalogCommand() {
- };
-
- assertThrows(
- IllegalArgumentException.class,
- () -> manager.execute(command)
- );
-
- assertThrows(
- IllegalArgumentException.class,
- () -> manager.execute(List.of(
- simpleTable("T1"),
- simpleTable("T2"),
- simpleTable("T3"),
- command,
- simpleTable("T4")
- ))
- );
- }
-
@Test
void bulkCommandEitherAppliedAtomicallyOrDoesntAppliedAtAll() {
String tableName1 = "TEST1";
diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerValidationTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerValidationTest.java
index 9efdb4e941..7da0846ac8 100644
--- a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerValidationTest.java
+++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerValidationTest.java
@@ -44,7 +44,6 @@ import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
import org.apache.ignite.internal.catalog.commands.CreateZoneParams;
import org.apache.ignite.internal.catalog.commands.DropIndexParams;
-import org.apache.ignite.internal.catalog.commands.DropTableParams;
import org.apache.ignite.internal.catalog.commands.DropZoneParams;
import org.apache.ignite.internal.catalog.commands.RenameZoneParams;
import org.jetbrains.annotations.Nullable;
@@ -661,14 +660,6 @@ public class CatalogManagerValidationTest extends BaseCatalogManagerTest {
);
}
- @Test
- void testValidateTableNameOnTableDrop() {
- assertThat(
- manager.dropTable(DropTableParams.builder().build()),
- willThrowFast(CatalogValidationException.class, "Name of the table can't be null or blank")
- );
- }
-
@Test
void testValidateTableNameOnDropColumn() {
assertThat(
diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AbstractCommandValidationTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AbstractCommandValidationTest.java
new file mode 100644
index 0000000000..773cab510c
--- /dev/null
+++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AbstractCommandValidationTest.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.catalog.commands;
+
+import static org.apache.ignite.sql.ColumnType.INT32;
+import static org.mockito.Mockito.mock;
+
+import java.util.List;
+import java.util.stream.Stream;
+import org.apache.ignite.internal.catalog.Catalog;
+import org.apache.ignite.internal.catalog.CatalogManager;
+import org.apache.ignite.internal.catalog.CatalogManagerImpl;
+import org.apache.ignite.internal.catalog.ClockWaiter;
+import org.apache.ignite.internal.catalog.descriptors.CatalogHashIndexDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
+import org.apache.ignite.internal.catalog.storage.UpdateLog;
+import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
+import org.junit.jupiter.params.provider.Arguments;
+
+/**
+ * Abstract test class for all command-related validation tests.
+ *
+ * <p>Provides a convenient set of utility methods to reuse in test.
+ */
+abstract class AbstractCommandValidationTest extends BaseIgniteAbstractTest {
+ static final String SCHEMA_NAME = "PUBLIC";
+ static final String ZONE_NAME = "DEFAULT";
+
+ private static final CatalogZoneDescriptor DEFAULT_ZONE = new CatalogZoneDescriptor(
+ 0, ZONE_NAME, 1, -1, -1, -1, -1, "", null
+ );
+
+ final CatalogManager manager = new CatalogManagerImpl(
+ mock(UpdateLog.class),
+ mock(ClockWaiter.class)
+ );
+
+ static Stream<Arguments> nullAndBlankStrings() {
+ return Stream.of(null, "", " ", " ").map(Arguments::of);
+ }
+
+ static Stream<Arguments> nullAndEmptyLists() {
+ return Stream.of(null, List.of()).map(Arguments::of);
+ }
+
+ static Catalog emptyCatalog() {
+ return catalog(new CatalogTableDescriptor[0], new CatalogIndexDescriptor[0]);
+ }
+
+ static Catalog catalogWithTable(String name) {
+ int tableId = 0;
+ int tableVersion = 1;
+ int zoneId = 0;
+ List<CatalogTableColumnDescriptor> columns = List.of(
+ new CatalogTableColumnDescriptor("C", INT32, false, -1, -1, -1, null)
+ );
+ List<String> pkColumns = List.of("C");
+
+ CatalogTableDescriptor table = new CatalogTableDescriptor(
+ tableId, name, zoneId, tableVersion, columns, pkColumns, pkColumns
+ );
+
+ return catalog(new CatalogTableDescriptor[]{table}, new CatalogIndexDescriptor[0]);
+ }
+
+ static Catalog catalogWithIndex(String name) {
+ CatalogIndexDescriptor index = new CatalogHashIndexDescriptor(
+ 0, name, 0, false, List.of("C"));
+
+ return catalog(new CatalogTableDescriptor[0], new CatalogIndexDescriptor[]{index});
+ }
+
+ private static Catalog catalog(CatalogTableDescriptor[] tables, CatalogIndexDescriptor[] indexes) {
+ return new Catalog(
+ 1,
+ 0L,
+ 1,
+ List.of(DEFAULT_ZONE),
+ List.of(new CatalogSchemaDescriptor(
+ 0,
+ SCHEMA_NAME,
+ tables,
+ indexes
+ ))
+ );
+ }
+}
diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandValidationTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandValidationTest.java
index 27be45bf7f..7ca8eb3fd2 100644
--- a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandValidationTest.java
+++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandValidationTest.java
@@ -17,69 +17,34 @@
package org.apache.ignite.internal.catalog.commands;
+import static org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrowsWithCause;
import static org.apache.ignite.sql.ColumnType.INT32;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.mockito.Mockito.mock;
import java.util.List;
-import java.util.stream.Stream;
import org.apache.ignite.internal.catalog.Catalog;
-import org.apache.ignite.internal.catalog.CatalogManager;
-import org.apache.ignite.internal.catalog.CatalogManagerImpl;
+import org.apache.ignite.internal.catalog.CatalogCommand;
import org.apache.ignite.internal.catalog.CatalogValidationException;
-import org.apache.ignite.internal.catalog.ClockWaiter;
-import org.apache.ignite.internal.catalog.UpdateProducer;
-import org.apache.ignite.internal.catalog.descriptors.CatalogHashIndexDescriptor;
-import org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor;
-import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
-import org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
-import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
-import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
-import org.apache.ignite.internal.catalog.storage.UpdateLog;
-import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
-import org.apache.ignite.internal.testframework.IgniteTestUtils.RunnableX;
-import org.hamcrest.Matchers;
-import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
/**
* Tests to verify validation of {@link CreateTableCommand}.
*/
-@SuppressWarnings("DataFlowIssue")
-public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
- private static final String SCHEMA_NAME = "PUBLIC";
- private static final String ZONE_NAME = "DEFAULT";
-
- private static final CatalogZoneDescriptor DEFAULT_ZONE = new CatalogZoneDescriptor(
- 0, ZONE_NAME, 1, -1, -1, -1, -1, "", null
- );
-
- private final CatalogManager manager = new CatalogManagerImpl(
- mock(UpdateLog.class),
- mock(ClockWaiter.class)
- );
-
- private static Stream<Arguments> nullAndBlankStrings() {
- return Stream.of(null, "", " ", " ").map(Arguments::of);
- }
+@SuppressWarnings({"DataFlowIssue", "ThrowableNotThrown"})
+public class CreateTableCommandValidationTest extends AbstractCommandValidationTest {
- private static Stream<Arguments> nullAndEmptyLists() {
- return Stream.of(null, List.of()).map(Arguments::of);
- }
@ParameterizedTest(name = "[{index}] ''{argumentsWithNames}''")
@MethodSource("nullAndBlankStrings")
void schemaNameMustNotBeNullOrBlank(String name) {
- CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+ CreateTableCommandBuilder builder = CreateTableCommand.builder();
builder = fillProperties(builder);
builder.schemaName(name);
- assertThrows(
+ assertThrowsWithCause(
builder::build,
CatalogValidationException.class,
"Name of the schema can't be null or blank"
@@ -89,13 +54,13 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
@ParameterizedTest(name = "[{index}] ''{argumentsWithNames}''")
@MethodSource("nullAndBlankStrings")
void tableNameMustNotBeNullOrBlank(String name) {
- CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+ CreateTableCommandBuilder builder = CreateTableCommand.builder();
builder = fillProperties(builder);
builder.tableName(name);
- assertThrows(
+ assertThrowsWithCause(
builder::build,
CatalogValidationException.class,
"Name of the table can't be null or blank"
@@ -105,13 +70,13 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
@ParameterizedTest(name = "[{index}] {argumentsWithNames}")
@MethodSource("nullAndEmptyLists")
void tableShouldHaveAtLeastOneColumn(List<ColumnParams> columns) {
- CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+ CreateTableCommandBuilder builder = CreateTableCommand.builder();
builder = fillProperties(builder);
builder.columns(columns);
- assertThrows(
+ assertThrowsWithCause(
builder::build,
CatalogValidationException.class,
"Table should have at least one column"
@@ -121,7 +86,7 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
@ParameterizedTest(name = "[{index}] ''{argumentsWithNames}''")
@MethodSource("nullAndBlankStrings")
void tableColumnNameMustNotBeNullOrBlank(String name) {
- CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+ CreateTableCommandBuilder builder = CreateTableCommand.builder();
builder = fillProperties(builder);
@@ -129,7 +94,7 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
ColumnParams.builder().name(name).build()
));
- assertThrows(
+ assertThrowsWithCause(
builder::build,
CatalogValidationException.class,
"Name of the column can't be null or blank"
@@ -138,7 +103,7 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
@Test
void tableColumnShouldHaveType() {
- CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+ CreateTableCommandBuilder builder = CreateTableCommand.builder();
builder = fillProperties(builder)
.columns(List.of(
@@ -148,7 +113,7 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
.build()
));
- assertThrows(
+ assertThrowsWithCause(
builder::build,
CatalogValidationException.class,
"Missing column type: C"
@@ -157,7 +122,7 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
@Test
void columnShouldNotHaveDuplicates() {
- CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+ CreateTableCommandBuilder builder = CreateTableCommand.builder();
ColumnParams column = ColumnParams.builder()
.name("C")
@@ -166,7 +131,7 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
builder = fillProperties(builder).columns(List.of(column, column));
- assertThrows(
+ assertThrowsWithCause(
builder::build,
CatalogValidationException.class,
"Column with name 'C' specified more than once"
@@ -176,13 +141,13 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
@ParameterizedTest(name = "[{index}] {argumentsWithNames}")
@MethodSource("nullAndEmptyLists")
void tableShouldHaveAtLeastOnePrimaryKeyColumn(List<String> columns) {
- CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+ CreateTableCommandBuilder builder = CreateTableCommand.builder();
builder = fillProperties(builder);
builder.primaryKeyColumns(columns);
- assertThrows(
+ assertThrowsWithCause(
builder::build,
CatalogValidationException.class,
"Table should have primary key"
@@ -191,12 +156,12 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
@Test
void pkColumnShouldNotHaveDuplicates() {
- CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+ CreateTableCommandBuilder builder = CreateTableCommand.builder();
builder = fillProperties(builder)
.primaryKeyColumns(List.of("C", "C"));
- assertThrows(
+ assertThrowsWithCause(
builder::build,
CatalogValidationException.class,
"PK column 'C' specified more that once"
@@ -205,12 +170,12 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
@Test
void pkColumnShouldBePresentedInColumnsList() {
- CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+ CreateTableCommandBuilder builder = CreateTableCommand.builder();
builder = fillProperties(builder)
.primaryKeyColumns(List.of("foo"));
- assertThrows(
+ assertThrowsWithCause(
builder::build,
CatalogValidationException.class,
"PK column 'foo' is not part of table"
@@ -219,12 +184,12 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
@Test
void colocationColumnsCouldNotBeEmpty() {
- CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+ CreateTableCommandBuilder builder = CreateTableCommand.builder();
builder = fillProperties(builder)
.colocationColumns(List.of());
- assertThrows(
+ assertThrowsWithCause(
builder::build,
CatalogValidationException.class,
"Colocation columns could not be empty"
@@ -233,12 +198,12 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
@Test
void colocationColumnShouldNotHaveDuplicates() {
- CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+ CreateTableCommandBuilder builder = CreateTableCommand.builder();
builder = fillProperties(builder)
.colocationColumns(List.of("C", "C"));
- assertThrows(
+ assertThrowsWithCause(
builder::build,
CatalogValidationException.class,
"Colocation column 'C' specified more that once"
@@ -247,7 +212,7 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
@Test
void colocationColumnShouldBePresentedInColumnsList() {
- CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+ CreateTableCommandBuilder builder = CreateTableCommand.builder();
ColumnParams c1 = ColumnParams.builder()
.name("C1")
@@ -264,7 +229,7 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
.primaryKeyColumns(List.of("C1"))
.colocationColumns(List.of("C2"));
- assertThrows(
+ assertThrowsWithCause(
builder::build,
CatalogValidationException.class,
"Colocation column 'C2' is not part of PK"
@@ -288,14 +253,14 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
@Test
void exceptionIsThrownIfSchemaNotExists() {
- CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+ CreateTableCommandBuilder builder = CreateTableCommand.builder();
Catalog catalog = emptyCatalog();
- UpdateProducer updateProducer = (UpdateProducer) fillProperties(builder).schemaName(SCHEMA_NAME + "_UNK").build();
+ CatalogCommand command = fillProperties(builder).schemaName(SCHEMA_NAME + "_UNK").build();
- assertThrows(
- () -> updateProducer.get(catalog),
+ assertThrowsWithCause(
+ () -> command.get(catalog),
CatalogValidationException.class,
"Schema with name 'PUBLIC_UNK' not found"
);
@@ -303,14 +268,14 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
@Test
void exceptionIsThrownIfZoneNotExists() {
- CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+ CreateTableCommandBuilder builder = CreateTableCommand.builder();
Catalog catalog = emptyCatalog();
- UpdateProducer updateProducer = (UpdateProducer) fillProperties(builder).zone(ZONE_NAME + "_UNK").build();
+ CatalogCommand command = fillProperties(builder).zone(ZONE_NAME + "_UNK").build();
- assertThrows(
- () -> updateProducer.get(catalog),
+ assertThrowsWithCause(
+ () -> command.get(catalog),
CatalogValidationException.class,
"Distribution zone with name 'DEFAULT_UNK' not found"
);
@@ -318,14 +283,14 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
@Test
void exceptionIsThrownIfTableWithGivenNameAlreadyExists() {
- CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+ CreateTableCommandBuilder builder = CreateTableCommand.builder();
Catalog catalog = catalogWithTable("TEST");
- UpdateProducer updateProducer = (UpdateProducer) fillProperties(builder).tableName("TEST").build();
+ CatalogCommand command = fillProperties(builder).tableName("TEST").build();
- assertThrows(
- () -> updateProducer.get(catalog),
+ assertThrowsWithCause(
+ () -> command.get(catalog),
CatalogValidationException.class,
"Table with name 'PUBLIC.TEST' already exists"
);
@@ -333,14 +298,14 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
@Test
void exceptionIsThrownIfIndexWithGivenNameAlreadyExists() {
- CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+ CreateTableCommandBuilder builder = CreateTableCommand.builder();
Catalog catalog = catalogWithIndex("TEST");
- UpdateProducer updateProducer = (UpdateProducer) fillProperties(builder).tableName("TEST").build();
+ CatalogCommand command = fillProperties(builder).tableName("TEST").build();
- assertThrows(
- () -> updateProducer.get(catalog),
+ assertThrowsWithCause(
+ () -> command.get(catalog),
CatalogValidationException.class,
"Index with name 'PUBLIC.TEST' already exists"
);
@@ -348,14 +313,14 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
@Test
void exceptionIsThrownIfTableWithNameSimilarToAutogeneratedPkNameAlreadyExists() {
- CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+ CreateTableCommandBuilder builder = CreateTableCommand.builder();
Catalog catalog = catalogWithTable("TEST_PK");
- UpdateProducer updateProducer = (UpdateProducer) fillProperties(builder).tableName("TEST").build();
+ CatalogCommand command = fillProperties(builder).tableName("TEST").build();
- assertThrows(
- () -> updateProducer.get(catalog),
+ assertThrowsWithCause(
+ () -> command.get(catalog),
CatalogValidationException.class,
"Table with name 'PUBLIC.TEST_PK' already exists"
);
@@ -363,63 +328,16 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
@Test
void exceptionIsThrownIfIndexWithNameSimilarToAutogeneratedPkNameAlreadyExists() {
- CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+ CreateTableCommandBuilder builder = CreateTableCommand.builder();
Catalog catalog = catalogWithIndex("TEST_PK");
- UpdateProducer updateProducer = (UpdateProducer) fillProperties(builder).tableName("TEST").build();
+ CatalogCommand command = fillProperties(builder).tableName("TEST").build();
- assertThrows(
- () -> updateProducer.get(catalog),
+ assertThrowsWithCause(
+ () -> command.get(catalog),
CatalogValidationException.class,
"Index with name 'PUBLIC.TEST_PK' already exists"
);
}
-
- private static <T extends Throwable> void assertThrows(RunnableX runnable, Class<T> expectedType, String message) {
- T ex = Assertions.assertThrows(
- expectedType,
- runnable::run
- );
-
- assertThat(
- ex.getMessage(),
- Matchers.containsString(message)
- );
- }
-
- private static Catalog emptyCatalog() {
- return catalog(new CatalogTableDescriptor[0], new CatalogIndexDescriptor[0]);
- }
-
- private static Catalog catalogWithTable(String name) {
- CatalogTableDescriptor table = new CatalogTableDescriptor(
- 0, name, 0, 1, List.of(
- new CatalogTableColumnDescriptor("C", INT32, false, -1, -1, -1, null)
- ), List.of("C"), List.of("C"));
-
- return catalog(new CatalogTableDescriptor[]{table}, new CatalogIndexDescriptor[0]);
- }
-
- private static Catalog catalogWithIndex(String name) {
- CatalogIndexDescriptor index = new CatalogHashIndexDescriptor(
- 0, name, 0, false, List.of("C"));
-
- return catalog(new CatalogTableDescriptor[0], new CatalogIndexDescriptor[]{index});
- }
-
- private static Catalog catalog(CatalogTableDescriptor[] tables, CatalogIndexDescriptor[] indexes) {
- return new Catalog(
- 1,
- 0L,
- 1,
- List.of(DEFAULT_ZONE),
- List.of(new CatalogSchemaDescriptor(
- 0,
- SCHEMA_NAME,
- tables,
- indexes
- ))
- );
- }
}
diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/DropTableCommandValidationTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/DropTableCommandValidationTest.java
new file mode 100644
index 0000000000..697f343289
--- /dev/null
+++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/DropTableCommandValidationTest.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.catalog.commands;
+
+import static org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrowsWithCause;
+
+import org.apache.ignite.internal.catalog.Catalog;
+import org.apache.ignite.internal.catalog.CatalogCommand;
+import org.apache.ignite.internal.catalog.CatalogValidationException;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+/**
+ * Tests to verify validation of {@link DropTableCommand}.
+ */
+@SuppressWarnings("ThrowableNotThrown")
+public class DropTableCommandValidationTest extends AbstractCommandValidationTest {
+ @ParameterizedTest(name = "[{index}] ''{argumentsWithNames}''")
+ @MethodSource("nullAndBlankStrings")
+ void schemaNameMustNotBeNullOrBlank(String name) {
+ DropTableCommandBuilder builder = DropTableCommand.builder();
+
+ builder.tableName("TEST")
+ .schemaName(name);
+
+ assertThrowsWithCause(
+ builder::build,
+ CatalogValidationException.class,
+ "Name of the schema can't be null or blank"
+ );
+ }
+
+ @ParameterizedTest(name = "[{index}] ''{argumentsWithNames}''")
+ @MethodSource("nullAndBlankStrings")
+ void tableNameMustNotBeNullOrBlank(String name) {
+ DropTableCommandBuilder builder = DropTableCommand.builder();
+
+ builder.schemaName("TEST")
+ .tableName(name);
+
+ assertThrowsWithCause(
+ builder::build,
+ CatalogValidationException.class,
+ "Name of the table can't be null or blank"
+ );
+ }
+
+ @Test
+ void exceptionIsThrownIfSchemaNotExists() {
+ DropTableCommandBuilder builder = DropTableCommand.builder();
+
+ Catalog catalog = emptyCatalog();
+
+ CatalogCommand command = builder
+ .schemaName(SCHEMA_NAME + "_UNK")
+ .tableName("TEST")
+ .build();
+
+ assertThrowsWithCause(
+ () -> command.get(catalog),
+ CatalogValidationException.class,
+ "Schema with name 'PUBLIC_UNK' not found"
+ );
+ }
+
+ @Test
+ void exceptionIsThrownIfTableWithGivenNameNotFound() {
+ DropTableCommandBuilder builder = DropTableCommand.builder();
+
+ Catalog catalog = emptyCatalog();
+
+ CatalogCommand command = builder
+ .schemaName(SCHEMA_NAME)
+ .tableName("TEST")
+ .build();
+
+ assertThrowsWithCause(
+ () -> command.get(catalog),
+ CatalogValidationException.class,
+ "Table with name 'PUBLIC.TEST' not found"
+ );
+ }
+}
diff --git a/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/BaseCatalogManagerTest.java b/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/BaseCatalogManagerTest.java
index 91838a6255..c48b1b7fe1 100644
--- a/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/BaseCatalogManagerTest.java
+++ b/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/BaseCatalogManagerTest.java
@@ -32,7 +32,8 @@ import org.apache.ignite.internal.catalog.commands.AlterTableDropColumnParams;
import org.apache.ignite.internal.catalog.commands.ColumnParams;
import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
-import org.apache.ignite.internal.catalog.commands.DropTableParams;
+import org.apache.ignite.internal.catalog.commands.CreateTableCommand;
+import org.apache.ignite.internal.catalog.commands.DropTableCommand;
import org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollation;
import org.apache.ignite.internal.catalog.storage.UpdateLog;
import org.apache.ignite.internal.catalog.storage.UpdateLogImpl;
@@ -157,13 +158,13 @@ public abstract class BaseCatalogManagerTest extends BaseIgniteAbstractTest {
return createSortedIndexParams(indexName, false, indexColumns, columnsCollations);
}
- protected CatalogCommand createTableCommand(
+ protected static CatalogCommand createTableCommand(
String tableName,
List<ColumnParams> columns,
List<String> primaryKeys,
@Nullable List<String> colocationColumns
) {
- return manager.createTableCommandBuilder()
+ return CreateTableCommand.builder()
.schemaName(DEFAULT_SCHEMA_NAME)
.zone(DEFAULT_ZONE_NAME)
.tableName(tableName)
@@ -189,8 +190,8 @@ public abstract class BaseCatalogManagerTest extends BaseIgniteAbstractTest {
return ColumnParams.builder().name(name).nullable(nullable).type(type);
}
- protected static DropTableParams dropTableParams(String tableName) {
- return DropTableParams.builder().schemaName(DEFAULT_SCHEMA_NAME).tableName(tableName).build();
+ protected static CatalogCommand dropTableCommand(String tableName) {
+ return DropTableCommand.builder().schemaName(DEFAULT_SCHEMA_NAME).tableName(tableName).build();
}
protected static AlterTableDropColumnParams dropColumnParams(String... columns) {
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java
index 8b79563743..6f67d6f08e 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java
@@ -21,6 +21,7 @@ import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import org.apache.ignite.internal.catalog.CatalogManager;
import org.apache.ignite.internal.catalog.TableExistsValidationException;
+import org.apache.ignite.internal.catalog.TableNotFoundValidationException;
import org.apache.ignite.internal.catalog.commands.AbstractCreateIndexCommandParams;
import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
@@ -80,15 +81,17 @@ public class DdlCommandHandlerWrapper extends DdlCommandHandler {
if (cmd instanceof CreateTableCommand) {
return ddlCommandFuture
.thenCompose(res -> catalogManager.execute(
- DdlToCatalogCommandConverter.convert(catalogManager.createTableCommandBuilder(), (CreateTableCommand) cmd))
+ DdlToCatalogCommandConverter.convert((CreateTableCommand) cmd))
.handle(handleModificationResult(
((CreateTableCommand) cmd).ifTableExists(), TableExistsValidationException.class))
).handle(handleModificationResult(((CreateTableCommand) cmd).ifTableExists(), TableAlreadyExistsException.class));
} else if (cmd instanceof DropTableCommand) {
return ddlCommandFuture
- .thenCompose(res -> catalogManager.dropTable(DdlToCatalogCommandConverter.convert((DropTableCommand) cmd))
- .handle(handleModificationResult(((DropTableCommand) cmd).ifTableExists(), TableNotFoundException.class))
- );
+ .thenCompose(res -> catalogManager.execute(
+ DdlToCatalogCommandConverter.convert((DropTableCommand) cmd))
+ .handle(handleModificationResult(
+ ((DropTableCommand) cmd).ifTableExists(), TableNotFoundValidationException.class))
+ ).handle(handleModificationResult(((DropTableCommand) cmd).ifTableExists(), TableNotFoundException.class));
} else if (cmd instanceof AlterTableAddCommand) {
AlterTableAddCommand addCommand = (AlterTableAddCommand) cmd;
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlToCatalogCommandConverter.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlToCatalogCommandConverter.java
index 7a30c40d71..739e048c3d 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlToCatalogCommandConverter.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlToCatalogCommandConverter.java
@@ -34,12 +34,10 @@ import org.apache.ignite.internal.catalog.commands.AlterZoneParams;
import org.apache.ignite.internal.catalog.commands.ColumnParams;
import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
-import org.apache.ignite.internal.catalog.commands.CreateTableCommandBuilder;
import org.apache.ignite.internal.catalog.commands.CreateZoneParams;
import org.apache.ignite.internal.catalog.commands.DataStorageParams;
import org.apache.ignite.internal.catalog.commands.DefaultValue;
import org.apache.ignite.internal.catalog.commands.DropIndexParams;
-import org.apache.ignite.internal.catalog.commands.DropTableParams;
import org.apache.ignite.internal.catalog.commands.DropZoneParams;
import org.apache.ignite.internal.catalog.commands.RenameZoneParams;
import org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollation;
@@ -63,10 +61,10 @@ import org.apache.ignite.internal.sql.engine.util.TypeUtils;
* Converter for DDL command classes to Catalog command params classes.
*/
class DdlToCatalogCommandConverter {
- static CatalogCommand convert(CreateTableCommandBuilder commandBuilder, CreateTableCommand cmd) {
+ static CatalogCommand convert(CreateTableCommand cmd) {
List<ColumnParams> columns = cmd.columns().stream().map(DdlToCatalogCommandConverter::convert).collect(Collectors.toList());
- return commandBuilder
+ return org.apache.ignite.internal.catalog.commands.CreateTableCommand.builder()
.schemaName(cmd.schemaName())
.tableName(cmd.tableName())
@@ -79,8 +77,8 @@ class DdlToCatalogCommandConverter {
.build();
}
- static DropTableParams convert(DropTableCommand cmd) {
- return DropTableParams.builder()
+ static CatalogCommand convert(DropTableCommand cmd) {
+ return org.apache.ignite.internal.catalog.commands.DropTableCommand.builder()
.schemaName(cmd.schemaName())
.tableName(cmd.tableName())
.build();
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java
index 9e90c3c4f9..ab63d6d848 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java
@@ -50,7 +50,6 @@ import java.util.function.LongFunction;
import org.apache.ignite.internal.baseline.BaselineManager;
import org.apache.ignite.internal.catalog.CatalogCommand;
import org.apache.ignite.internal.catalog.CatalogManager;
-import org.apache.ignite.internal.catalog.commands.CreateTableCommand;
import org.apache.ignite.internal.cluster.management.ClusterManagementGroupManager;
import org.apache.ignite.internal.cluster.management.topology.api.LogicalTopologySnapshot;
import org.apache.ignite.internal.configuration.ConfigurationRegistry;
@@ -294,9 +293,7 @@ public class MockedStructuresTest extends IgniteAbstractTest {
schemaManager.start();
catalogManager = mock(CatalogManager.class);
- when(catalogManager.createTableCommandBuilder()).thenReturn(new CreateTableCommand.Builder());
when(catalogManager.execute(any(CatalogCommand.class))).thenReturn(completedFuture(null));
- when(catalogManager.dropTable(any())).thenReturn(completedFuture(null));
schemaSyncService = mock(SchemaSyncService.class);
when(schemaSyncService.waitForMetadataCompleteness(any())).thenReturn(completedFuture(null));