You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by am...@apache.org on 2023/05/17 19:39:36 UTC
[ignite-3] 01/01: Add create index command. Add drop index command.
This is an automated email from the ASF dual-hosted git repository.
amashenkov pushed a commit to branch ignite-19460
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit 59e66e2156a947c09fead9e6adf11f47fc802df7
Author: amashenkov <an...@gmail.com>
AuthorDate: Wed May 17 22:39:25 2023 +0300
Add create index command.
Add drop index command.
---
.../ignite/internal/catalog/CatalogManager.java | 18 ++++
.../internal/catalog/CatalogServiceImpl.java | 53 +++++++++++
...Params.java => AbstractIndexCommandParams.java} | 51 ++++-------
.../commands/AbstractTableCommandParams.java | 31 ++-----
.../internal/catalog/commands/CatalogUtils.java | 33 +++++++
.../catalog/commands/CreateIndexParams.java | 94 +++++++++++++++++++
.../internal/catalog/commands/DropIndexParams.java | 36 ++++++++
.../internal/catalog/storage/DropIndexEntry.java | 49 ++++++++++
.../internal/catalog/storage/NewIndexEntry.java | 101 +++++++++++++++++++++
.../engine/exec/ddl/DdlCommandHandlerWrapper.java | 14 +++
.../exec/ddl/DdlToCatalogCommandConverter.java | 45 +++++++++
11 files changed, 469 insertions(+), 56 deletions(-)
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 2724d5d965..72da2432d1 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
@@ -20,7 +20,9 @@ package org.apache.ignite.internal.catalog;
import java.util.concurrent.CompletableFuture;
import org.apache.ignite.internal.catalog.commands.AlterTableAddColumnParams;
import org.apache.ignite.internal.catalog.commands.AlterTableDropColumnParams;
+import org.apache.ignite.internal.catalog.commands.CreateIndexParams;
import org.apache.ignite.internal.catalog.commands.CreateTableParams;
+import org.apache.ignite.internal.catalog.commands.DropIndexParams;
import org.apache.ignite.internal.catalog.commands.DropTableParams;
import org.apache.ignite.internal.manager.IgniteComponent;
@@ -59,4 +61,20 @@ public interface CatalogManager extends IgniteComponent, CatalogService {
* @return Operation future.
*/
CompletableFuture<Void> dropColumn(AlterTableDropColumnParams params);
+
+ /**
+ * Creates new index.
+ *
+ * @param params Parameters.
+ * @return Operation future.
+ */
+ CompletableFuture<Void> createIndex(CreateIndexParams params);
+
+ /**
+ * Drops index.
+ *
+ * @param params Parameters.
+ * @return Operation future.
+ */
+ CompletableFuture<Void> dropIndex(DropIndexParams params);
}
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java
index 4920647d4a..781df21e99 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java
@@ -32,7 +32,9 @@ import java.util.concurrent.ConcurrentSkipListMap;
import org.apache.ignite.internal.catalog.commands.AlterTableAddColumnParams;
import org.apache.ignite.internal.catalog.commands.AlterTableDropColumnParams;
import org.apache.ignite.internal.catalog.commands.CatalogUtils;
+import org.apache.ignite.internal.catalog.commands.CreateIndexParams;
import org.apache.ignite.internal.catalog.commands.CreateTableParams;
+import org.apache.ignite.internal.catalog.commands.DropIndexParams;
import org.apache.ignite.internal.catalog.commands.DropTableParams;
import org.apache.ignite.internal.catalog.descriptors.IndexDescriptor;
import org.apache.ignite.internal.catalog.descriptors.SchemaDescriptor;
@@ -41,7 +43,9 @@ import org.apache.ignite.internal.catalog.events.CatalogEvent;
import org.apache.ignite.internal.catalog.events.CatalogEventParameters;
import org.apache.ignite.internal.catalog.events.CreateTableEventParameters;
import org.apache.ignite.internal.catalog.events.DropTableEventParameters;
+import org.apache.ignite.internal.catalog.storage.DropIndexEntry;
import org.apache.ignite.internal.catalog.storage.DropTableEntry;
+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;
@@ -55,6 +59,8 @@ import org.apache.ignite.internal.util.ArrayUtils;
import org.apache.ignite.internal.util.PendingComparableValuesTracker;
import org.apache.ignite.lang.ErrorGroups.Common;
import org.apache.ignite.lang.IgniteInternalException;
+import org.apache.ignite.lang.IndexAlreadyExistsException;
+import org.apache.ignite.lang.IndexNotFoundException;
import org.apache.ignite.lang.TableAlreadyExistsException;
import org.apache.ignite.lang.TableNotFoundException;
import org.jetbrains.annotations.Nullable;
@@ -214,6 +220,53 @@ public class CatalogServiceImpl extends Producer<CatalogEvent, CatalogEventParam
return failedFuture(new UnsupportedOperationException("Not implemented yet."));
}
+ /** {@inheritDoc} */
+ @Override
+ public CompletableFuture<Void> createIndex(CreateIndexParams params) {
+ return saveUpdate(catalog -> {
+ String schemaName = Objects.requireNonNullElse(params.schemaName(), CatalogService.PUBLIC);
+
+ SchemaDescriptor schema = Objects.requireNonNull(catalog.schema(schemaName), "No schema found: " + schemaName);
+
+ if (schema.index(params.indexName()) != null) {
+ throw new IndexAlreadyExistsException(schemaName, params.indexName());
+ }
+
+ TableDescriptor table = schema.table(params.tableName());
+
+ if (table == null) {
+ throw new TableNotFoundException(schemaName, params.tableName());
+ }
+
+ IndexDescriptor index = CatalogUtils.fromParams(catalog.objectIdGenState(), table.id(), params);
+
+ return List.of(
+ new NewIndexEntry(index),
+ new ObjectIdGenUpdateEntry(1)
+ );
+ });
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public CompletableFuture<Void> dropIndex(DropIndexParams params) {
+ return saveUpdate(catalog -> {
+ String schemaName = Objects.requireNonNullElse(params.schemaName(), CatalogService.PUBLIC);
+
+ SchemaDescriptor schema = Objects.requireNonNull(catalog.schema(schemaName), "No schema found: " + schemaName);
+
+ IndexDescriptor index = schema.index(params.indexName());
+
+ if (index == null) {
+ throw new IndexNotFoundException(schemaName, params.indexName());
+ }
+
+ return List.of(
+ new DropIndexEntry(index.id())
+ );
+ });
+ }
+
private void registerCatalog(Catalog newCatalog) {
catalogByVer.put(newCatalog.version(), newCatalog);
catalogByTs.put(newCatalog.time(), newCatalog);
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommandParams.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractIndexCommandParams.java
similarity index 65%
copy from modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommandParams.java
copy to modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractIndexCommandParams.java
index 0aa2b8ecfc..ed3d56b6cc 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommandParams.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractIndexCommandParams.java
@@ -18,37 +18,33 @@
package org.apache.ignite.internal.catalog.commands;
/**
- * Abstract table ddl command.
+ * Abstract index ddl command.
*/
-public class AbstractTableCommandParams implements DdlCommandParams {
- /** Table name. */
- protected String tableName;
+public class AbstractIndexCommandParams implements DdlCommandParams {
+ /** Index name. */
+ protected String indexName;
- /** Quietly ignore this command if table is not exists. */
- protected boolean ifTableExists;
-
- /** Schema name where this new table will be created. */
+ /** Schema name where this new index will be created. */
protected String schema;
- public String tableName() {
- return tableName;
- }
-
- public String schemaName() {
- return schema;
+ /**
+ * Returns index simple name.
+ */
+ public String indexName() {
+ return indexName;
}
/**
- * Quietly ignore if table is not exist.
+ * Returns schema name.
*/
- public boolean ifTableExists() {
- return ifTableExists;
+ public String schemaName() {
+ return schema;
}
/**
* Parameters builder.
*/
- protected abstract static class AbstractBuilder<ParamT extends AbstractTableCommandParams, BuilderT> {
+ protected abstract static class AbstractBuilder<ParamT extends AbstractIndexCommandParams, BuilderT> {
protected ParamT params;
AbstractBuilder(ParamT params) {
@@ -67,24 +63,13 @@ public class AbstractTableCommandParams implements DdlCommandParams {
}
/**
- * Sets table schema.
+ * Sets index simple name.
*
- * @param tableName Table name.
+ * @param indexName Index simple name.
* @return {@code this}.
*/
- public BuilderT tableName(String tableName) {
- params.tableName = tableName;
- return (BuilderT) this;
- }
-
- /**
- * Set quietly ignore flag.
- *
- * @param ifTableNotExists Flag.
- */
- public BuilderT ifTableExists(boolean ifTableNotExists) {
- params.ifTableExists = ifTableNotExists;
-
+ public BuilderT indexName(String indexName) {
+ params.indexName = indexName;
return (BuilderT) this;
}
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommandParams.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommandParams.java
index 0aa2b8ecfc..67c7a588e8 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommandParams.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommandParams.java
@@ -24,25 +24,21 @@ public class AbstractTableCommandParams implements DdlCommandParams {
/** Table name. */
protected String tableName;
- /** Quietly ignore this command if table is not exists. */
- protected boolean ifTableExists;
-
/** Schema name where this new table will be created. */
protected String schema;
+ /**
+ * Returns table simple name.
+ */
public String tableName() {
return tableName;
}
- public String schemaName() {
- return schema;
- }
-
/**
- * Quietly ignore if table is not exist.
+ * Returns schema name.
*/
- public boolean ifTableExists() {
- return ifTableExists;
+ public String schemaName() {
+ return schema;
}
/**
@@ -67,9 +63,9 @@ public class AbstractTableCommandParams implements DdlCommandParams {
}
/**
- * Sets table schema.
+ * Sets table simple name.
*
- * @param tableName Table name.
+ * @param tableName Table simple name.
* @return {@code this}.
*/
public BuilderT tableName(String tableName) {
@@ -77,17 +73,6 @@ public class AbstractTableCommandParams implements DdlCommandParams {
return (BuilderT) this;
}
- /**
- * Set quietly ignore flag.
- *
- * @param ifTableNotExists Flag.
- */
- public BuilderT ifTableExists(boolean ifTableNotExists) {
- params.ifTableExists = ifTableNotExists;
-
- return (BuilderT) this;
- }
-
/**
* Builds parameters.
*
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 1ead944291..a09a2d5393 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
@@ -17,7 +17,13 @@
package org.apache.ignite.internal.catalog.commands;
+import java.util.List;
import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import org.apache.ignite.internal.catalog.descriptors.HashIndexDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.IndexColumnDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.IndexDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.SortedIndexDescriptor;
import org.apache.ignite.internal.catalog.descriptors.TableColumnDescriptor;
import org.apache.ignite.internal.catalog.descriptors.TableDescriptor;
@@ -41,6 +47,33 @@ public class CatalogUtils {
);
}
+ /**
+ * Converts CreateIndex command params to descriptor.
+ *
+ * @param id Index id.
+ * @param tableId Table id.
+ * @param params Parameters.
+ * @return Index descriptor.
+ */
+ public static IndexDescriptor fromParams(int id, int tableId, CreateIndexParams params) {
+ switch (params.type()) {
+ case HASH:
+ return new HashIndexDescriptor(id,
+ params.indexName(),
+ tableId,
+ params.columns()
+ );
+ case SORTED:
+ List<IndexColumnDescriptor> columnDescriptors = IntStream.range(0, params.collations().size())
+ .mapToObj(i -> new IndexColumnDescriptor(params.columns().get(i), params.collations().get(i)))
+ .collect(Collectors.toList());
+ return new SortedIndexDescriptor(id, params.indexName(), tableId, columnDescriptors);
+ default:
+ throw new IllegalArgumentException("Unsupported index type: " + params.type());
+ }
+
+ }
+
private static TableColumnDescriptor fromParams(ColumnParams params) {
return new TableColumnDescriptor(params.name(), params.type(), params.nullable(), params.defaultValueDefinition());
}
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateIndexParams.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateIndexParams.java
new file mode 100644
index 0000000000..d0a6012c42
--- /dev/null
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateIndexParams.java
@@ -0,0 +1,94 @@
+/*
+ * 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 java.util.List;
+import org.apache.ignite.internal.catalog.descriptors.ColumnCollation;
+
+/**
+ * CREATE INDEX statement.
+ */
+public class CreateIndexParams extends AbstractIndexCommandParams {
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ /** Type of the index to create. */
+ public enum Type {
+ SORTED, HASH
+ }
+
+ /** Table name. */
+ private String tableName;
+
+ private Type type;
+
+ private List<String> columns;
+
+ private List<ColumnCollation> collations;
+
+ public List<String> columns() {
+ return columns;
+ }
+
+ public List<ColumnCollation> collations() {
+ return collations;
+ }
+
+ public Type type() {
+ return type;
+ }
+
+ public String tableName() {
+ return tableName;
+ }
+
+ /**
+ * Parameters builder.
+ */
+ public static class Builder extends AbstractIndexCommandParams.AbstractBuilder<CreateIndexParams, CreateIndexParams.Builder> {
+ private Builder() {
+ super(new CreateIndexParams());
+ }
+
+ public Builder type(Type type) {
+ params.type = type;
+
+ return this;
+ }
+
+ public Builder tableName(String tblName) {
+ params.tableName = tblName;
+
+ return this;
+ }
+
+ public Builder columns(List<String> columns) {
+ params.columns = columns;
+
+ return this;
+ }
+
+ public Builder collations(List<ColumnCollation> collations) {
+ params.collations = collations;
+
+ return this;
+ }
+
+ }
+}
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropIndexParams.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropIndexParams.java
new file mode 100644
index 0000000000..aeefaabb1c
--- /dev/null
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropIndexParams.java
@@ -0,0 +1,36 @@
+/*
+ * 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;
+
+/**
+ * DROP INDEX statement.
+ */
+public class DropIndexParams extends AbstractIndexCommandParams {
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ /**
+ * Parameters builder.
+ */
+ public static class Builder extends AbstractBuilder<DropIndexParams, Builder> {
+ Builder() {
+ super(new DropIndexParams());
+ }
+ }
+}
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/DropIndexEntry.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/DropIndexEntry.java
new file mode 100644
index 0000000000..6ec3b63f9e
--- /dev/null
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/DropIndexEntry.java
@@ -0,0 +1,49 @@
+/*
+ * 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.storage;
+
+import org.apache.ignite.internal.tostring.S;
+
+/**
+ * Describes deletion of a index.
+ */
+public class DropIndexEntry implements UpdateEntry {
+ private static final long serialVersionUID = -604729846502020728L;
+
+ private final int indexId;
+
+ /**
+ * Constructs the object.
+ *
+ * @param IndexId An id of a index to drop.
+ */
+ public DropIndexEntry(int IndexId) {
+ this.indexId = IndexId;
+ }
+
+ /** Returns an id of a index to drop. */
+ public int indexId() {
+ return indexId;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public String toString() {
+ return S.toString(this);
+ }
+}
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/NewIndexEntry.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/NewIndexEntry.java
new file mode 100644
index 0000000000..40d622aa8f
--- /dev/null
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/NewIndexEntry.java
@@ -0,0 +1,101 @@
+/*
+ * 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.
+ */
+
+/*
+ * 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.
+ */
+
+/*
+ * 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.
+ */
+
+/*
+ * 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.storage;
+
+import org.apache.ignite.internal.catalog.descriptors.IndexDescriptor;
+import org.apache.ignite.internal.tostring.S;
+
+/**
+ * Describes addition of a new index.
+ */
+public class NewIndexEntry implements UpdateEntry {
+ private static final long serialVersionUID = 6717363577013237711L;
+
+ private final IndexDescriptor descriptor;
+
+ /**
+ * Constructs the object.
+ *
+ * @param descriptor A descriptor of a index to add.
+ */
+ public NewIndexEntry(IndexDescriptor descriptor) {
+ this.descriptor = descriptor;
+ }
+
+ /** Returns descriptor of a index to add. */
+ public IndexDescriptor descriptor() {
+ return descriptor;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public String toString() {
+ return S.toString(this);
+ }
+}
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 21f39ea169..2a427d4619 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
@@ -22,11 +22,15 @@ import java.util.concurrent.CompletableFuture;
import org.apache.ignite.internal.catalog.CatalogManager;
import org.apache.ignite.internal.distributionzones.DistributionZoneManager;
import org.apache.ignite.internal.index.IndexManager;
+import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateIndexCommand;
import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateTableCommand;
import org.apache.ignite.internal.sql.engine.prepare.ddl.DdlCommand;
+import org.apache.ignite.internal.sql.engine.prepare.ddl.DropIndexCommand;
import org.apache.ignite.internal.sql.engine.prepare.ddl.DropTableCommand;
import org.apache.ignite.internal.storage.DataStorageManager;
import org.apache.ignite.internal.table.distributed.TableManager;
+import org.apache.ignite.lang.IndexAlreadyExistsException;
+import org.apache.ignite.lang.IndexNotFoundException;
import org.apache.ignite.lang.TableAlreadyExistsException;
import org.apache.ignite.lang.TableNotFoundException;
@@ -70,6 +74,16 @@ public class DdlCommandHandlerWrapper extends DdlCommandHandler {
.thenCompose(res -> catalogManager.dropTable(DdlToCatalogCommandConverter.convert((DropTableCommand) cmd))
.handle(handleModificationResult(((DropTableCommand) cmd).ifTableExists(), TableNotFoundException.class))
);
+ } else if (cmd instanceof CreateIndexCommand) {
+ return ddlCommandFuture
+ .thenCompose(res -> catalogManager.createIndex(DdlToCatalogCommandConverter.convert((CreateIndexCommand) cmd))
+ .handle(handleModificationResult(((CreateIndexCommand) cmd).ifNotExists(), IndexAlreadyExistsException.class))
+ );
+ } else if (cmd instanceof DropIndexCommand) {
+ return ddlCommandFuture
+ .thenCompose(res -> catalogManager.dropIndex(DdlToCatalogCommandConverter.convert((DropIndexCommand) cmd))
+ .handle(handleModificationResult(((DropIndexCommand) cmd).ifNotExists(), IndexNotFoundException.class))
+ );
}
return ddlCommandFuture;
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 e0e9f4f520..4a4cc96d82 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
@@ -20,13 +20,20 @@ package org.apache.ignite.internal.sql.engine.exec.ddl;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.ignite.internal.catalog.commands.ColumnParams;
+import org.apache.ignite.internal.catalog.commands.CreateIndexParams;
import org.apache.ignite.internal.catalog.commands.CreateTableParams;
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.descriptors.ColumnCollation;
import org.apache.ignite.internal.sql.engine.prepare.ddl.ColumnDefinition;
+import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateIndexCommand;
+import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateIndexCommand.Type;
import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateTableCommand;
import org.apache.ignite.internal.sql.engine.prepare.ddl.DefaultValueDefinition;
+import org.apache.ignite.internal.sql.engine.prepare.ddl.DropIndexCommand;
import org.apache.ignite.internal.sql.engine.prepare.ddl.DropTableCommand;
+import org.apache.ignite.internal.sql.engine.schema.IgniteIndex;
import org.apache.ignite.internal.sql.engine.util.TypeUtils;
/**
@@ -56,6 +63,29 @@ class DdlToCatalogCommandConverter {
.build();
}
+ static CreateIndexParams convert(CreateIndexCommand cmd) {
+ List<ColumnCollation> collations = cmd.collations() == null ? null
+ : cmd.collations().stream().map(DdlToCatalogCommandConverter::convert).collect(Collectors.toList());
+
+ return CreateIndexParams.builder()
+ .schemaName(cmd.schemaName())
+ .indexName(cmd.indexName())
+
+ .tableName(cmd.tableName())
+ .type(convert(cmd.type()))
+ .columns(cmd.columns())
+ .collations(collations)
+
+ .build();
+ }
+
+ static DropIndexParams convert(DropIndexCommand cmd) {
+ return DropIndexParams.builder()
+ .schemaName(cmd.schemaName())
+ .indexName(cmd.indexName())
+ .build();
+ }
+
private static ColumnParams convert(ColumnDefinition def) {
return new ColumnParams(def.name(), TypeUtils.columnType(def.type()), convert(def.defaultValueDefinition()), def.nullable());
}
@@ -72,4 +102,19 @@ class DdlToCatalogCommandConverter {
throw new IllegalArgumentException("Default value definition: " + def.type());
}
}
+
+ private static CreateIndexParams.Type convert(Type type) {
+ switch (type) {
+ case SORTED:
+ return CreateIndexParams.Type.SORTED;
+ case HASH:
+ return CreateIndexParams.Type.HASH;
+ default:
+ throw new IllegalArgumentException("Unsupported index type: " + type);
+ }
+ }
+
+ private static ColumnCollation convert(IgniteIndex.Collation collation) {
+ return ColumnCollation.get(collation.asc, collation.nullsFirst);
+ }
}