[ASTERIXDB-3324][COMP] Create column dataset validations
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
When creating a dataset
- Ensure 'storage-format' is valid
When creating a columnar dataset:
- Disallow correlated-prefix merge policy
- Disallow LSM-filters
Secondary indexes:
- Disallow RTree and inverted indexes
Change-Id: I032e534f6ec716e13ea359334eee3ea227054efe
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18004
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Wail Alkowaileet <wael.y.k@gmail.com>
Reviewed-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/EnsureColumnarSupportedTypesRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/EnsureColumnarSupportedTypesRule.java
index 8840c8f..ef53480 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/EnsureColumnarSupportedTypesRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/EnsureColumnarSupportedTypesRule.java
@@ -18,7 +18,7 @@
*/
package org.apache.asterix.optimizer.rules;
-import org.apache.asterix.column.metadata.schema.visitor.ColumnSupportedTypesValidator;
+import org.apache.asterix.column.validation.ColumnSupportedTypesValidator;
import org.apache.asterix.common.config.DatasetConfig;
import org.apache.asterix.common.metadata.DataverseName;
import org.apache.asterix.metadata.declared.DataSource;
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
index 20da442..8071fd8 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
@@ -64,7 +64,8 @@
import org.apache.asterix.app.result.fields.ResultHandlePrinter;
import org.apache.asterix.app.result.fields.ResultsPrinter;
import org.apache.asterix.app.result.fields.StatusPrinter;
-import org.apache.asterix.column.metadata.schema.visitor.ColumnSupportedTypesValidator;
+import org.apache.asterix.column.validation.ColumnPropertiesValidationUtil;
+import org.apache.asterix.column.validation.ColumnSupportedTypesValidator;
import org.apache.asterix.common.api.IApplicationContext;
import org.apache.asterix.common.api.IClientRequest;
import org.apache.asterix.common.api.IMetadataLockManager;
@@ -981,7 +982,9 @@
compactionPolicyProperties = StorageConstants.DEFAULT_COMPACTION_POLICY_PROPERTIES;
}
boolean isDatasetWithoutTypeSpec = aRecordType.getFieldNames().length == 0 && metaRecType == null;
-
+ // Validate dataset properties if the format is COLUMN
+ ColumnPropertiesValidationUtil.validate(sourceLoc, datasetFormatInfo.getFormat(), compactionPolicy,
+ filterField);
datasetDetails = new InternalDatasetDetails(InternalDatasetDetails.FileStructure.BTREE,
InternalDatasetDetails.PartitioningStrategy.HASH, partitioningExprs, partitioningExprs,
keySourceIndicators, partitioningTypes, autogenerated, filterSourceIndicator, filterField,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/validation/00-merge-policy.00.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/validation/00-merge-policy.00.ddl.sqlpp
new file mode 100644
index 0000000..a11941f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/validation/00-merge-policy.00.ddl.sqlpp
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+
+DROP DATAVERSE test if exists;
+CREATE DATAVERSE test;
+USE test;
+
+CREATE TYPE ColumnType AS {
+ id: int
+};
+
+CREATE DATASET ColumnDataset(ColumnType)
+PRIMARY KEY id
+WITH {
+ "storage-format": {"format" : "column"},
+ "merge-policy": {
+ "name": "correlated-prefix",
+ "parameters": {
+ "max-mergable-component-size": 16384,
+ "max-tolerance-component-count": 3
+ }
+ }
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/validation/01-lsm-filter.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/validation/01-lsm-filter.01.ddl.sqlpp
new file mode 100644
index 0000000..72c9334
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/validation/01-lsm-filter.01.ddl.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ */
+
+DROP DATAVERSE test if exists;
+CREATE DATAVERSE test;
+USE test;
+
+CREATE TYPE ColumnType AS {
+ id: int,
+ my_timestamp: int
+};
+
+CREATE DATASET ColumnDataset(ColumnType)
+PRIMARY KEY id
+WITH FILTER ON my_timestamp
+WITH {
+ "storage-format": {"format" : "column"}
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/validation/02-unsupported-storage-format.02.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/validation/02-unsupported-storage-format.02.ddl.sqlpp
new file mode 100644
index 0000000..7d39cd9
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/validation/02-unsupported-storage-format.02.ddl.sqlpp
@@ -0,0 +1,32 @@
+/*
+ * 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.
+ */
+
+DROP DATAVERSE test if exists;
+CREATE DATAVERSE test;
+USE test;
+
+CREATE TYPE ColumnType AS {
+ id: int
+};
+
+CREATE DATASET ColumnDataset(ColumnType)
+PRIMARY KEY id
+WITH {
+ "storage-format": {"format" : "col"}
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/validation/03-unsupported-index.03.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/validation/03-unsupported-index.03.ddl.sqlpp
new file mode 100644
index 0000000..83e16fd
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/validation/03-unsupported-index.03.ddl.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ */
+
+DROP DATAVERSE test if exists;
+CREATE DATAVERSE test;
+USE test;
+
+CREATE TYPE ColumnType AS {
+ id: int
+};
+
+CREATE DATASET ColumnDataset(ColumnType)
+PRIMARY KEY id
+WITH {
+ "storage-format": {"format" : "column"}
+};
+
+CREATE INDEX rtree_idx ON ColumnDataset(my_geo: point?) TYPE RTREE ENFORCED;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/validation/03-unsupported-index.04.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/validation/03-unsupported-index.04.ddl.sqlpp
new file mode 100644
index 0000000..1cdec55
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/validation/03-unsupported-index.04.ddl.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ */
+
+DROP DATAVERSE test if exists;
+CREATE DATAVERSE test;
+USE test;
+
+CREATE TYPE ColumnType AS {
+ id: int
+};
+
+CREATE DATASET ColumnDataset(ColumnType)
+PRIMARY KEY id
+WITH {
+ "storage-format": {"format" : "column"}
+};
+
+CREATE INDEX ngram_idx ON ColumnDataset(my_text: string?) TYPE NGRAM(3) ENFORCED;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/validation/03-unsupported-index.05.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/validation/03-unsupported-index.05.ddl.sqlpp
new file mode 100644
index 0000000..86c95c3
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/validation/03-unsupported-index.05.ddl.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ */
+
+DROP DATAVERSE test if exists;
+CREATE DATAVERSE test;
+USE test;
+
+CREATE TYPE ColumnType AS {
+ id: int
+};
+
+CREATE DATASET ColumnDataset(ColumnType)
+PRIMARY KEY id
+WITH {
+ "storage-format": {"format" : "column"}
+};
+
+CREATE INDEX ngram_idx ON ColumnDataset(my_text: string?) TYPE KEYWORD ENFORCED;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
index 90444fb..c6fe190 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
@@ -16448,6 +16448,18 @@
<source-location>false</source-location>
</compilation-unit>
</test-case>
+ <test-case FilePath="column">
+ <compilation-unit name="validation">
+ <output-dir compare="Text">validation</output-dir>
+ <expected-error>ASX1191: Merge policy 'correlated-prefix' is not supported with columnar storage format</expected-error>
+ <expected-error>ASX1192: Filters are not supported with columnar storage format</expected-error>
+ <expected-error>ASX1193: Unknown storage format 'col'</expected-error>
+ <expected-error>ASX1194: Index type 'RTREE' is not supported with columnar storage format</expected-error>
+ <expected-error>ASX1194: Index type 'LENGTH_PARTITIONED_NGRAM_INVIX' is not supported with columnar storage format</expected-error>
+ <expected-error>ASX1194: Index type 'LENGTH_PARTITIONED_WORD_INVIX' is not supported with columnar storage format</expected-error>
+ <source-location>false</source-location>
+ </compilation-unit>
+ </test-case>
</test-group>
<test-group name="copy-from">
<test-case FilePath="copy-from">
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/validation/ColumnPropertiesValidationUtil.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/validation/ColumnPropertiesValidationUtil.java
new file mode 100644
index 0000000..3fe6907
--- /dev/null
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/validation/ColumnPropertiesValidationUtil.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.asterix.column.validation;
+
+import java.util.List;
+
+import org.apache.asterix.common.config.DatasetConfig;
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.common.utils.StorageConstants;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.api.exceptions.SourceLocation;
+
+public class ColumnPropertiesValidationUtil {
+ private ColumnPropertiesValidationUtil() {
+ }
+
+ public static void validate(SourceLocation sourceLocation, DatasetConfig.DatasetFormat format, String mergePolicy,
+ List<String> filterFields) throws AlgebricksException {
+ if (format != DatasetConfig.DatasetFormat.COLUMN) {
+ return;
+ }
+
+ if (!StorageConstants.DEFAULT_COMPACTION_POLICY_NAME.equals(mergePolicy)) {
+ throw CompilationException.create(ErrorCode.UNSUPPORTED_COLUMN_MERGE_POLICY, sourceLocation, mergePolicy);
+ }
+
+ if (filterFields != null && !filterFields.isEmpty()) {
+ throw CompilationException.create(ErrorCode.UNSUPPORTED_COLUMN_LSM_FILTER, sourceLocation);
+ }
+ }
+
+}
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/ColumnSupportedTypesValidator.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/validation/ColumnSupportedTypesValidator.java
similarity index 98%
rename from asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/ColumnSupportedTypesValidator.java
rename to asterixdb/asterix-column/src/main/java/org/apache/asterix/column/validation/ColumnSupportedTypesValidator.java
index 76ea58f..90a58d4 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/ColumnSupportedTypesValidator.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/validation/ColumnSupportedTypesValidator.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.asterix.column.metadata.schema.visitor;
+package org.apache.asterix.column.validation;
import static org.apache.asterix.column.util.ColumnValuesUtil.getNormalizedTypeTag;
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/DatasetConfig.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/DatasetConfig.java
index 3f15eef..dbdddad 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/DatasetConfig.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/DatasetConfig.java
@@ -21,6 +21,9 @@
import java.util.HashMap;
import java.util.Map;
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+
public class DatasetConfig {
/*
@@ -108,8 +111,13 @@
return formats;
}
- public static DatasetFormat getFormat(String format) {
- return FORMATS.get(format.trim().toLowerCase());
+ public static DatasetFormat getFormat(String format) throws CompilationException {
+ DatasetFormat formatEnum = FORMATS.get(format.trim().toLowerCase());
+ if (formatEnum == null) {
+ throw CompilationException.create(ErrorCode.UNKNOWN_STORAGE_FORMAT, format);
+ }
+
+ return formatEnum;
}
}
}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
index a49ca55..e5c137e 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
@@ -291,6 +291,10 @@
UNSUPPORTED_WRITING_ADAPTER(1188),
UNSUPPORTED_WRITING_FORMAT(1189),
COMPUTED_FIELD_CONFLICTING_TYPE(1190),
+ UNSUPPORTED_COLUMN_MERGE_POLICY(1191),
+ UNSUPPORTED_COLUMN_LSM_FILTER(1192),
+ UNKNOWN_STORAGE_FORMAT(1193),
+ UNSUPPORTED_INDEX_IN_COLUMNAR_FORMAT(1194),
// Feed errors
DATAFLOW_ILLEGAL_STATE(3001),
diff --git a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
index f97b7b6..d6ff691 100644
--- a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
+++ b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
@@ -293,6 +293,10 @@
1188 = Unsupported writing adapter '%1$s'. Supported adapters: %2$s
1189 = Unsupported writing format '%1$s'. Supported formats: %2$s
1190 = A computed field cannot have more than one type. '%1$s' is both '%2$s' and 'object'.
+1191 = Merge policy '%1$s' is not supported with columnar storage format
+1192 = Filters are not supported with columnar storage format
+1193 = Unknown storage format '%1$s'
+1194 = Index type '%1$s' is not supported with columnar storage format
# Feed Errors
3001 = Illegal state.
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java
index a8d3113..ab6097b 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java
@@ -154,7 +154,7 @@
}
public DatasetFormatInfo getDatasetFormatInfo(String defaultFormat, int defaultMaxTupleCount,
- double defaultFreeSpaceTolerance, int defaultMaxLeafNodeSize) {
+ double defaultFreeSpaceTolerance, int defaultMaxLeafNodeSize) throws CompilationException {
if (datasetType != DatasetType.INTERNAL) {
return DatasetFormatInfo.SYSTEM_DEFAULT;
}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryIndexOperationsHelper.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryIndexOperationsHelper.java
index 88fa983..276f22b 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryIndexOperationsHelper.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryIndexOperationsHelper.java
@@ -26,6 +26,7 @@
import java.util.function.Supplier;
import org.apache.asterix.common.cluster.PartitioningProperties;
+import org.apache.asterix.common.config.DatasetConfig;
import org.apache.asterix.common.config.DatasetConfig.DatasetType;
import org.apache.asterix.common.config.OptimizationConfUtil;
import org.apache.asterix.common.exceptions.CompilationException;
@@ -163,7 +164,8 @@
MetadataProvider metadataProvider, SourceLocation sourceLoc) throws AlgebricksException {
ISecondaryIndexOperationsHelper indexOperationsHelper;
- switch (index.getIndexType()) {
+ DatasetConfig.IndexType indexType = index.getIndexType();
+ switch (indexType) {
case ARRAY:
indexOperationsHelper =
new SecondaryArrayIndexBTreeOperationsHelper(dataset, index, metadataProvider, sourceLoc);
@@ -172,12 +174,14 @@
indexOperationsHelper = new SecondaryBTreeOperationsHelper(dataset, index, metadataProvider, sourceLoc);
break;
case RTREE:
+ ensureNotColumnar(dataset, indexType, sourceLoc);
indexOperationsHelper = new SecondaryRTreeOperationsHelper(dataset, index, metadataProvider, sourceLoc);
break;
case SINGLE_PARTITION_WORD_INVIX:
case SINGLE_PARTITION_NGRAM_INVIX:
case LENGTH_PARTITIONED_WORD_INVIX:
case LENGTH_PARTITIONED_NGRAM_INVIX:
+ ensureNotColumnar(dataset, indexType, sourceLoc);
indexOperationsHelper =
new SecondaryInvertedIndexOperationsHelper(dataset, index, metadataProvider, sourceLoc);
break;
@@ -192,6 +196,21 @@
return indexOperationsHelper;
}
+ /**
+ * Ensure only supported secondary indexes can be created against dataset
+ * in {@link DatasetConfig.DatasetFormat#COLUMN} format
+ *
+ * @param dataset primary index
+ * @param indexType secondary index type
+ * @param sourceLoc source location
+ */
+ private static void ensureNotColumnar(Dataset dataset, DatasetConfig.IndexType indexType, SourceLocation sourceLoc)
+ throws AlgebricksException {
+ if (dataset.getDatasetFormatInfo().getFormat() == DatasetConfig.DatasetFormat.COLUMN) {
+ throw CompilationException.create(ErrorCode.UNSUPPORTED_INDEX_IN_COLUMNAR_FORMAT, indexType, sourceLoc);
+ }
+ }
+
@Override
public abstract JobSpecification buildCreationJobSpec() throws AlgebricksException;