This is an automated email from the ASF dual-hosted git repository.
wenchen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/master by this push:
new d2bb359 [SPARK-36526][SQL] DSV2 Index Support: Add supportsIndex
interface
d2bb359 is described below
commit d2bb359338f51d3c808d08e2c64849f2457b8db9
Author: Huaxin Gao <[email protected]>
AuthorDate: Wed Sep 29 10:49:29 2021 +0800
[SPARK-36526][SQL] DSV2 Index Support: Add supportsIndex interface
### What changes were proposed in this pull request?
Indexes are database objects created on one or more columns of a table.
Indexes are used to improve query performance. A detailed explanation of
database index is here https://en.wikipedia.org/wiki/Database_index
This PR adds `supportsIndex` interface that provides APIs to work with
indexes.
### Why are the changes needed?
Many data sources support index to improvement query performance. In order
to take advantage of the index support in data source, this `supportsIndex`
interface is added to let user to create/drop an index, list indexes, etc.
### Does this PR introduce _any_ user-facing change?
yes, the following new APIs are added:
- createIndex
- dropIndex
- indexExists
- listIndexes
New SQL syntax:
```
CREATE [index_type] INDEX [index_name] ON [TABLE] table_name
(column_index_property_list)[OPTIONS indexPropertyList]
column_index_property_list: column_name [OPTIONS(indexPropertyList)] [
, . . . ]
indexPropertyList: index_property_name = index_property_value [ , . .
. ]
DROP INDEX index_name
```
### How was this patch tested?
only interface is added for now. Tests will be added when doing the
implementation
Closes #33754 from huaxingao/index_interface.
Authored-by: Huaxin Gao <[email protected]>
Signed-off-by: Wenchen Fan <[email protected]>
---
.../sql/connector/catalog/index/SupportsIndex.java | 75 ++++++++++++++++++++
.../sql/connector/catalog/index/TableIndex.java | 79 ++++++++++++++++++++++
.../catalyst/analysis/AlreadyExistException.scala | 3 +
.../catalyst/analysis/NoSuchItemException.scala | 3 +
4 files changed, 160 insertions(+)
diff --git
a/sql/catalyst/src/main/java/org/apache/spark/sql/connector/catalog/index/SupportsIndex.java
b/sql/catalyst/src/main/java/org/apache/spark/sql/connector/catalog/index/SupportsIndex.java
new file mode 100644
index 0000000..a8d55fb
--- /dev/null
+++
b/sql/catalyst/src/main/java/org/apache/spark/sql/connector/catalog/index/SupportsIndex.java
@@ -0,0 +1,75 @@
+/*
+ * 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.spark.sql.connector.catalog.index;
+
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.spark.annotation.Evolving;
+import org.apache.spark.sql.catalyst.analysis.IndexAlreadyExistsException;
+import org.apache.spark.sql.catalyst.analysis.NoSuchIndexException;
+import org.apache.spark.sql.connector.catalog.Table;
+import org.apache.spark.sql.connector.expressions.NamedReference;
+
+/**
+ * Table methods for working with index
+ *
+ * @since 3.3.0
+ */
+@Evolving
+public interface SupportsIndex extends Table {
+
+ /**
+ * Creates an index.
+ *
+ * @param indexName the name of the index to be created
+ * @param indexType the IndexType of the index to be created
+ * @param columns the columns on which index to be created
+ * @param columnProperties the properties of the columns on which index to
be created
+ * @param properties the properties of the index to be created
+ * @throws IndexAlreadyExistsException If the index already exists (optional)
+ */
+ void createIndex(String indexName,
+ String indexType,
+ NamedReference[] columns,
+ Map<NamedReference, Properties>[] columnProperties,
+ Properties properties)
+ throws IndexAlreadyExistsException;
+
+ /**
+ * Drops the index with the given name.
+ *
+ * @param indexName the name of the index to be dropped.
+ * @return true if the index is dropped
+ * @throws NoSuchIndexException If the index does not exist (optional)
+ */
+ boolean dropIndex(String indexName) throws NoSuchIndexException;
+
+ /**
+ * Checks whether an index exists in this table.
+ *
+ * @param indexName the name of the index
+ * @return true if the index exists, false otherwise
+ */
+ boolean indexExists(String indexName);
+
+ /**
+ * Lists all the indexes in this table.
+ */
+ TableIndex[] listIndexes();
+}
diff --git
a/sql/catalyst/src/main/java/org/apache/spark/sql/connector/catalog/index/TableIndex.java
b/sql/catalyst/src/main/java/org/apache/spark/sql/connector/catalog/index/TableIndex.java
new file mode 100644
index 0000000..99fce80
--- /dev/null
+++
b/sql/catalyst/src/main/java/org/apache/spark/sql/connector/catalog/index/TableIndex.java
@@ -0,0 +1,79 @@
+/*
+ * 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.spark.sql.connector.catalog.index;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.spark.annotation.Evolving;
+import org.apache.spark.sql.connector.expressions.NamedReference;
+
+/**
+ * Index in a table
+ *
+ * @since 3.3.0
+ */
+@Evolving
+public final class TableIndex {
+ private String indexName;
+ private String indexType;
+ private NamedReference[] columns;
+ private Map<NamedReference, Properties> columnProperties =
Collections.emptyMap();
+ private Properties properties;
+
+ public TableIndex(
+ String indexName,
+ String indexType,
+ NamedReference[] columns,
+ Map<NamedReference, Properties> columnProperties,
+ Properties properties) {
+ this.indexName = indexName;
+ this.indexType = indexType;
+ this.columns = columns;
+ this.columnProperties = columnProperties;
+ this.properties = properties;
+ }
+
+ /**
+ * @return the Index name.
+ */
+ String indexName() { return indexName; }
+
+ /**
+ * @return the indexType of this Index.
+ */
+ String indexType() { return indexType; }
+
+ /**
+ * @return the column(s) this Index is on. Could be multi columns (a
multi-column index).
+ */
+ NamedReference[] columns() { return columns; }
+
+ /**
+ * @return the map of column and column property map.
+ */
+ Map<NamedReference, Properties> columnProperties() { return
columnProperties; }
+
+ /**
+ * Returns the index properties.
+ */
+ Properties properties() {
+ return properties;
+ }
+}
diff --git
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/AlreadyExistException.scala
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/AlreadyExistException.scala
index 70f821d..ce48cfa 100644
---
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/AlreadyExistException.scala
+++
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/AlreadyExistException.scala
@@ -78,3 +78,6 @@ class PartitionsAlreadyExistException(message: String)
extends AnalysisException
class FunctionAlreadyExistsException(db: String, func: String)
extends AnalysisException(s"Function '$func' already exists in database
'$db'")
+
+class IndexAlreadyExistsException(indexName: String, table: Identifier)
+ extends AnalysisException(s"Index '$indexName' already exists in table
${table.quoted}")
diff --git
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/NoSuchItemException.scala
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/NoSuchItemException.scala
index 9c924e9..500121c 100644
---
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/NoSuchItemException.scala
+++
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/NoSuchItemException.scala
@@ -107,3 +107,6 @@ case class NoSuchPartitionsException(override val message:
String)
case class NoSuchTempFunctionException(func: String)
extends AnalysisException(s"Temporary function '$func' not found")
+
+class NoSuchIndexException(indexName: String)
+ extends AnalysisException(s"Index '$indexName' not found")
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]