This is an automated email from the ASF dual-hosted git repository. mblow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit f8ae504a12572f397b3e35f5c359a5cb3ab180d7 Author: Dmitry Lychagin <[email protected]> AuthorDate: Fri May 8 09:24:28 2020 -0700 [NO ISSUE][COMP] Introduce QueryTranslator.validateIndexType() - user model changes: no - storage format changes: no - interface changes: no Details: - Introduce QueryTranslator.validateIndexType() that can be overriden by product extensions to customize supported index types. Change-Id: I000ba078579b8e0a96d0219cefad137f41abf791 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/6204 Reviewed-by: Murtadha Hubail <[email protected]> Integration-Tests: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> --- .../asterix/app/translator/QueryTranslator.java | 42 +++++++++++++--------- 1 file changed, 25 insertions(+), 17 deletions(-) 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 3906bd5..818fbd4 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 @@ -878,13 +878,14 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen String dataverseName = getActiveDataverse(stmtCreateIndex.getDataverseName()); String datasetName = stmtCreateIndex.getDatasetName().getValue(); String indexName = stmtCreateIndex.getIndexName().getValue(); + IndexType indexType = stmtCreateIndex.getIndexType(); List<Integer> keySourceIndicators = stmtCreateIndex.getFieldSourceIndicators(); MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction(); metadataProvider.setMetadataTxnContext(mdTxnCtx); String datasetFullyQualifiedName = dataverseName + "." + datasetName; boolean isSecondaryPrimary = stmtCreateIndex.getFieldExprs().isEmpty(); - Dataset ds = null; - Index index = null; + Dataset ds; + Index index; MetadataLockUtil.createIndexBegin(lockManager, metadataProvider.getLocks(), dataverseName, datasetFullyQualifiedName); try { @@ -894,6 +895,9 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen dataverseName); } + DatasetType datasetType = ds.getDatasetType(); + validateIndexType(datasetType, indexType, isSecondaryPrimary, sourceLoc); + index = MetadataManager.INSTANCE.getIndex(metadataProvider.getMetadataTxnContext(), dataverseName, datasetName, indexName); if (index != null) { @@ -904,14 +908,11 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen throw new CompilationException(ErrorCode.INDEX_EXISTS, sourceLoc, indexName); } } + // find keySourceIndicators for secondary primary index since the parser isn't aware of them - if (isSecondaryPrimary && ds.getDatasetType() == DatasetType.INTERNAL) { + if (isSecondaryPrimary && datasetType == DatasetType.INTERNAL) { keySourceIndicators = ((InternalDatasetDetails) ds.getDatasetDetails()).getKeySourceIndicator(); } - // disable creating secondary primary index on an external dataset - if (isSecondaryPrimary && ds.getDatasetType() == DatasetType.EXTERNAL) { - throw new AsterixException(ErrorCode.CANNOT_CREATE_SEC_PRIMARY_IDX_ON_EXT_DATASET); - } // disable creating an index on meta fields (fields with source indicator == 1 are meta fields) if (keySourceIndicators.stream().anyMatch(fieldSource -> fieldSource == 1) && !isSecondaryPrimary) { throw new AsterixException(ErrorCode.COMPILATION_ERROR, sourceLoc, @@ -956,9 +957,8 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen if (fieldExpr.second == null) { fieldType = subType.getSubFieldType(fieldExpr.first.subList(i, fieldExpr.first.size())); } else { - if (!stmtCreateIndex.isEnforced() && stmtCreateIndex.getIndexType() != IndexType.BTREE) { - throw new AsterixException(ErrorCode.INDEX_ILLEGAL_NON_ENFORCED_TYPED, sourceLoc, - stmtCreateIndex.getIndexType()); + if (!stmtCreateIndex.isEnforced() && indexType != IndexType.BTREE) { + throw new AsterixException(ErrorCode.INDEX_ILLEGAL_NON_ENFORCED_TYPED, sourceLoc, indexType); } if (stmtCreateIndex.isEnforced() && !fieldExpr.second.isUnknownable()) { throw new AsterixException(ErrorCode.INDEX_ILLEGAL_ENFORCED_NON_OPTIONAL, sourceLoc, @@ -1012,10 +1012,10 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen // Currently, we do not support this. Therefore, as a temporary solution, we // print an // error message and stop. - if (stmtCreateIndex.getIndexType() == IndexType.SINGLE_PARTITION_WORD_INVIX - || stmtCreateIndex.getIndexType() == IndexType.SINGLE_PARTITION_NGRAM_INVIX - || stmtCreateIndex.getIndexType() == IndexType.LENGTH_PARTITIONED_WORD_INVIX - || stmtCreateIndex.getIndexType() == IndexType.LENGTH_PARTITIONED_NGRAM_INVIX) { + if (indexType == IndexType.SINGLE_PARTITION_WORD_INVIX + || indexType == IndexType.SINGLE_PARTITION_NGRAM_INVIX + || indexType == IndexType.LENGTH_PARTITIONED_WORD_INVIX + || indexType == IndexType.LENGTH_PARTITIONED_NGRAM_INVIX) { List<List<String>> partitioningKeys = ds.getPrimaryKeys(); for (List<String> partitioningKey : partitioningKeys) { IAType keyType = aRecordType.getSubFieldType(partitioningKey); @@ -1032,9 +1032,9 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen } } - Index newIndex = new Index(dataverseName, datasetName, indexName, stmtCreateIndex.getIndexType(), - indexFields, keySourceIndicators, indexFieldTypes, stmtCreateIndex.getGramLength(), - overridesFieldTypes, stmtCreateIndex.isEnforced(), false, MetadataUtil.PENDING_ADD_OP); + Index newIndex = new Index(dataverseName, datasetName, indexName, indexType, indexFields, + keySourceIndicators, indexFieldTypes, stmtCreateIndex.getGramLength(), overridesFieldTypes, + stmtCreateIndex.isEnforced(), false, MetadataUtil.PENDING_ADD_OP); doCreateIndex(hcc, metadataProvider, ds, newIndex, jobFlags, sourceLoc); } finally { metadataProvider.getLocks().unlock(); @@ -1285,6 +1285,14 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen } } + protected void validateIndexType(DatasetType datasetType, IndexType indexType, boolean isSecondaryPrimaryIndex, + SourceLocation sourceLoc) throws AlgebricksException { + // disable creating secondary primary index on an external dataset + if (datasetType == DatasetType.EXTERNAL && isSecondaryPrimaryIndex) { + throw new CompilationException(ErrorCode.CANNOT_CREATE_SEC_PRIMARY_IDX_ON_EXT_DATASET); + } + } + protected void validateIndexKeyFields(CreateIndexStatement stmtCreateIndex, List<Integer> keySourceIndicators, ARecordType aRecordType, ARecordType metaRecordType, List<List<String>> indexFields, List<IAType> indexFieldTypes) throws AlgebricksException {
