This is an automated email from the ASF dual-hosted git repository. dlych pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit b1384e6e9908bf357b0962f6bc0358c89e786184 Author: Ali Alsuliman <[email protected]> AuthorDate: Sat Apr 10 00:33:47 2021 +0300 [NO ISSUE][OTH] Enhance the identifier mapper - user model changes: no - storage format changes: no - interface changes: no Details: Change-Id: I6a8af663b4269e549187a2592c757897cae64190 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/10984 Reviewed-by: Ali Alsuliman <[email protected]> Reviewed-by: Michael Blow <[email protected]> Integration-Tests: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> --- .../translator/LangExpressionToPlanTranslator.java | 11 +++--- .../asterix/app/function/DatasetRewriter.java | 3 +- .../apache/asterix/app/function/FeedRewriter.java | 3 +- .../asterix/app/translator/QueryTranslator.java | 5 ++- .../test/resources/runtimets/testsuite_sqlpp.xml | 2 +- .../asterix/common/api/IIdentifierMapper.java | 8 +++- .../common/config/TransactionProperties.java | 6 ++- .../common/utils/IdentifierMappingUtil.java | 43 ++++++++++++++++++++-- .../asterix/common/utils/IdentifierUtil.java | 11 +++++- .../org/apache/asterix/metadata/MetadataNode.java | 3 +- .../metadata/declared/MetadataProvider.java | 5 ++- .../InvertedIndexResourceFactoryProvider.java | 3 +- 12 files changed, 81 insertions(+), 22 deletions(-) diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java index da07acb..16d5878 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java @@ -18,6 +18,7 @@ */ package org.apache.asterix.translator; +import static org.apache.asterix.common.api.IIdentifierMapper.Modifier.PLURAL; import static org.apache.asterix.common.utils.IdentifierUtil.dataset; import java.io.IOException; @@ -209,7 +210,7 @@ abstract class LangExpressionToPlanTranslator List<List<String>> partitionKeys = targetDatasource.getDataset().getPrimaryKeys(); if (dataset.hasMetaPart()) { throw new CompilationException(ErrorCode.COMPILATION_ERROR, sourceLoc, dataset.getDatasetName() + ": load " - + dataset() + " is not supported on " + dataset() + "s with meta records"); + + dataset() + " is not supported on " + dataset(PLURAL) + " with meta records"); } LoadableDataSource lds; @@ -433,7 +434,7 @@ abstract class LangExpressionToPlanTranslator if (targetDatasource.getDataset().hasMetaPart()) { throw new CompilationException(ErrorCode.COMPILATION_ERROR, sourceLoc, targetDatasource.getDataset().getDatasetName() + ": delete from " + dataset() - + " is not supported on " + dataset() + "s with meta records"); + + " is not supported on " + dataset(PLURAL) + " with meta records"); } List<String> filterField = DatasetUtil.getFilterField(targetDatasource.getDataset()); @@ -464,7 +465,7 @@ abstract class LangExpressionToPlanTranslator if (!targetDatasource.getDataset().allow(topOp, DatasetUtil.OP_UPSERT)) { throw new CompilationException(ErrorCode.COMPILATION_ERROR, sourceLoc, targetDatasource.getDataset().getDatasetName() + ": upsert into " + dataset() - + " is not supported on " + dataset() + "s with meta records"); + + " is not supported on " + dataset(PLURAL) + " with meta records"); } ProjectOperator project = (ProjectOperator) topOp; CompiledUpsertStatement compiledUpsert = (CompiledUpsertStatement) stmt; @@ -476,7 +477,7 @@ abstract class LangExpressionToPlanTranslator if (targetDatasource.getDataset().hasMetaPart()) { if (returnExpression != null) { throw new CompilationException(ErrorCode.COMPILATION_ERROR, sourceLoc, - "Returning not allowed on " + dataset() + "s with meta records"); + "Returning not allowed on " + dataset(PLURAL) + " with meta records"); } List<LogicalVariable> metaAndKeysVars; List<Mutable<ILogicalExpression>> metaAndKeysExprs; @@ -588,7 +589,7 @@ abstract class LangExpressionToPlanTranslator if (targetDatasource.getDataset().hasMetaPart()) { throw new CompilationException(ErrorCode.COMPILATION_ERROR, sourceLoc, targetDatasource.getDataset().getDatasetName() + ": insert into " + dataset() - + " is not supported on " + dataset() + "s with meta records"); + + " is not supported on " + dataset(PLURAL) + " with meta records"); } List<String> filterField = DatasetUtil.getFilterField(targetDatasource.getDataset()); diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetRewriter.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetRewriter.java index 0d20d51..6944b25 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetRewriter.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetRewriter.java @@ -18,6 +18,7 @@ */ package org.apache.asterix.app.function; +import static org.apache.asterix.common.api.IIdentifierMapper.Modifier.PLURAL; import static org.apache.asterix.common.utils.IdentifierUtil.dataset; import java.util.ArrayList; @@ -69,7 +70,7 @@ public class DatasetRewriter implements IFunctionToDataSourceRewriter, IResultTy if (unnest.getPositionalVariable() != null) { // TODO remove this after enabling the support of positional variables in data scan throw new CompilationException(ErrorCode.COMPILATION_ERROR, unnest.getSourceLocation(), - "No positional variables are allowed over " + dataset() + "s"); + "No positional variables are allowed over " + dataset(PLURAL)); } MetadataProvider metadataProvider = (MetadataProvider) context.getMetadataProvider(); diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/FeedRewriter.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/FeedRewriter.java index b01ea65..cc1b3ea 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/FeedRewriter.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/FeedRewriter.java @@ -18,6 +18,7 @@ */ package org.apache.asterix.app.function; +import static org.apache.asterix.common.api.IIdentifierMapper.Modifier.SINGULAR; import static org.apache.asterix.common.utils.IdentifierUtil.dataset; import java.util.ArrayList; @@ -132,7 +133,7 @@ public class FeedRewriter implements IFunctionToDataSourceRewriter, IResultTypeC String metaTypeName = FeedUtils.getFeedMetaTypeName(sourceFeed.getConfiguration()); if (metaTypeName == null) { throw new AlgebricksException( - "Feed to a " + dataset() + " with metadata doesn't have meta type specified"); + "Feed to " + dataset(SINGULAR) + " with metadata doesn't have meta type specified"); } metaType = (ARecordType) metadataProvider.findType(id.getDataverseName(), metaTypeName); } 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 60a96d4..8dcb534 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 @@ -18,6 +18,7 @@ */ package org.apache.asterix.app.translator; +import static org.apache.asterix.common.api.IIdentifierMapper.Modifier.PLURAL; import static org.apache.asterix.common.utils.IdentifierUtil.dataset; import static org.apache.asterix.common.utils.IdentifierUtil.dataverse; @@ -583,7 +584,7 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen (ILSMMergePolicyFactory) Class.forName(compactionPolicyFactoryClassName).newInstance(); if (isExternalDataset && mergePolicyFactory.getName().compareTo("correlated-prefix") == 0) { throw new CompilationException(ErrorCode.COMPILATION_ERROR, sourceLoc, - "The correlated-prefix merge policy cannot be used with external " + dataset() + "s"); + "The correlated-prefix merge policy cannot be used with external " + dataset(PLURAL)); } if (compactionPolicyProperties == null) { if (mergePolicyFactory.getName().compareTo("no-merge") != 0) { @@ -3067,7 +3068,7 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen (ActiveEntityEventsListener) activeNotificationHandler.getListener(feedId); if (listener != null && listener.getState() != ActivityState.STOPPED) { throw new CompilationException(ErrorCode.COMPILATION_ERROR, sourceLoc, - "Feed " + feedId + " is currently active and connected to the following " + dataset() + "(s) \n" + "Feed " + feedId + " is currently active and connected to the following " + dataset(PLURAL) + "\n" + listener.toString()); } else if (listener != null) { listener.unregister(); diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml index 04a274a..49f4961 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml +++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml @@ -4855,7 +4855,7 @@ <test-case FilePath="dml"> <compilation-unit name="upsert-dataset-with-meta"> <output-dir compare="Text">upsert-dataset-with-meta</output-dir> - <expected-error>upsert into dataset is not supported on datasets with meta record</expected-error> + <expected-error>upsert into dataset is not supported on datasets with meta records</expected-error> </compilation-unit> </test-case> <test-case FilePath="dml"> diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IIdentifierMapper.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IIdentifierMapper.java index 8687239..b6bce47 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IIdentifierMapper.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IIdentifierMapper.java @@ -22,6 +22,12 @@ package org.apache.asterix.common.api; @FunctionalInterface public interface IIdentifierMapper { - String map(String identifier); + enum Modifier { + SINGULAR, + PLURAL, + NONE + } + + String map(String identifier, Modifier modifier); } diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/TransactionProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/TransactionProperties.java index d67e9a6..f7703fb 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/TransactionProperties.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/TransactionProperties.java @@ -18,6 +18,7 @@ */ package org.apache.asterix.common.config; +import static org.apache.asterix.common.api.IIdentifierMapper.Modifier.SINGULAR; import static org.apache.asterix.common.utils.IdentifierUtil.dataset; import static org.apache.hyracks.control.common.config.OptionTypes.BOOLEAN; import static org.apache.hyracks.control.common.config.OptionTypes.INTEGER_BYTE_UNIT; @@ -42,7 +43,8 @@ public class TransactionProperties extends AbstractProperties { TXN_DATASET_CHECKPOINT_INTERVAL( POSITIVE_INTEGER, (int) TimeUnit.MINUTES.toSeconds(60), - "The interval (in seconds) after which a " + dataset() + " is considered idle and persisted to disk"), + "The interval (in seconds) after which " + dataset(SINGULAR) + " is considered idle and persisted to " + + "disk"), TXN_LOG_BUFFER_NUMPAGES(POSITIVE_INTEGER, 8, "The number of pages in the transaction log tail"), TXN_LOG_BUFFER_PAGESIZE( INTEGER_BYTE_UNIT, @@ -66,7 +68,7 @@ public class TransactionProperties extends AbstractProperties { TXN_LOCK_ESCALATIONTHRESHOLD( NONNEGATIVE_INTEGER, 1000, - "The maximum number of entity locks to obtain before upgrading to a " + dataset() + " lock"), + "The maximum number of entity locks to obtain before upgrading to " + dataset(SINGULAR) + " lock"), TXN_LOCK_SHRINKTIMER( POSITIVE_INTEGER, 5000, diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/IdentifierMappingUtil.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/IdentifierMappingUtil.java index c52f27a..8157125 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/IdentifierMappingUtil.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/IdentifierMappingUtil.java @@ -19,11 +19,48 @@ package org.apache.asterix.common.utils; +import static org.apache.asterix.common.utils.IdentifierUtil.DATASET; +import static org.apache.asterix.common.utils.IdentifierUtil.DATAVERSE; + import org.apache.asterix.common.api.IIdentifierMapper; +import org.apache.asterix.common.api.IIdentifierMapper.Modifier; public class IdentifierMappingUtil { - private static final IIdentifierMapper DEFAULT_MAPPER = identifier -> identifier; + private static final String SINGULAR_DATASET = "a dataset"; + private static final String PLURAL_DATASET = "datasets"; + + private static final String SINGULAR_DATAVERSE = "a dataverse"; + private static final String PLURAL_DATAVERSE = "dataverses"; + + private static final IIdentifierMapper DEFAULT_MAPPER = (identifier, modifier) -> { + switch (identifier) { + case DATASET: + switch (modifier) { + case NONE: + return DATASET; + case SINGULAR: + return SINGULAR_DATASET; + case PLURAL: + return PLURAL_DATASET; + default: + throw new IllegalArgumentException("unknown modifier " + modifier); + } + case DATAVERSE: + switch (modifier) { + case NONE: + return DATAVERSE; + case SINGULAR: + return SINGULAR_DATAVERSE; + case PLURAL: + return PLURAL_DATAVERSE; + default: + throw new IllegalArgumentException("unknown modifier " + modifier); + } + default: + throw new IllegalArgumentException("unmapped identifier: " + identifier); + } + }; private static IIdentifierMapper mapper = DEFAULT_MAPPER; @@ -34,8 +71,8 @@ public class IdentifierMappingUtil { IdentifierMappingUtil.mapper = mapper; } - public static String map(String key) { - return mapper.map(key); + public static String map(String key, Modifier modifier) { + return mapper.map(key, modifier); } } diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/IdentifierUtil.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/IdentifierUtil.java index ebdd740..88b7190 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/IdentifierUtil.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/IdentifierUtil.java @@ -19,16 +19,23 @@ package org.apache.asterix.common.utils; +import static org.apache.asterix.common.api.IIdentifierMapper.Modifier; +import static org.apache.asterix.common.api.IIdentifierMapper.Modifier.NONE; + public class IdentifierUtil { public static final String DATASET = "dataset"; public static final String DATAVERSE = "dataverse"; public static String dataset() { - return IdentifierMappingUtil.map(DATASET); + return IdentifierMappingUtil.map(DATASET, NONE); + } + + public static String dataset(Modifier modifier) { + return IdentifierMappingUtil.map(DATASET, modifier); } public static String dataverse() { - return IdentifierMappingUtil.map(DATAVERSE); + return IdentifierMappingUtil.map(DATAVERSE, NONE); } } diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java index 3ec8aec..20172db 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java @@ -19,6 +19,7 @@ package org.apache.asterix.metadata; +import static org.apache.asterix.common.api.IIdentifierMapper.Modifier.PLURAL; import static org.apache.asterix.common.utils.IdentifierUtil.dataset; import java.rmi.RemoteException; @@ -689,7 +690,7 @@ public class MetadataNode implements IMetadataNode { } throw new AsterixException( org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_OBJECT_DEPENDENT_EXISTS, "node group", - nodeGroupName, dataset() + "(s)", + nodeGroupName, dataset(PLURAL), datasets.stream().map(DatasetUtil::getFullyQualifiedDisplayName).collect(Collectors.joining(", "))); } try { diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java index ec63825..dc6f08f 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java @@ -18,6 +18,7 @@ */ package org.apache.asterix.metadata.declared; +import static org.apache.asterix.common.api.IIdentifierMapper.Modifier.PLURAL; import static org.apache.asterix.common.utils.IdentifierUtil.dataset; import static org.apache.asterix.common.utils.IdentifierUtil.dataverse; import static org.apache.asterix.metadata.utils.MetadataConstants.METADATA_OBJECT_NAME_INVALID_CHARS; @@ -1002,7 +1003,7 @@ public class MetadataProvider implements IMetadataProvider<DataSourceId, String> JobSpecification jobSpec, IAType itemType, ITypedAdapterFactory adapterFactory, ITupleFilterFactory tupleFilterFactory, long outputLimit) throws AlgebricksException { if (itemType.getTypeTag() != ATypeTag.OBJECT) { - throw new AlgebricksException("Can only scan " + dataset() + "s of records."); + throw new AlgebricksException("Can only scan " + dataset(PLURAL) + "of records."); } ISerializerDeserializer<?> payloadSerde = @@ -1420,7 +1421,7 @@ public class MetadataProvider implements IMetadataProvider<DataSourceId, String> // Sanity checks. if (primaryKeys.size() > 1) { throw new AlgebricksException( - "Cannot create inverted index on " + dataset() + "s with composite primary key."); + "Cannot create inverted index on " + dataset(PLURAL) + "with composite primary key."); } // The size of secondaryKeys can be two if it receives input from its // TokenizeOperator- [token, number of token] diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/InvertedIndexResourceFactoryProvider.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/InvertedIndexResourceFactoryProvider.java index 7a57af2..d20ff53 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/InvertedIndexResourceFactoryProvider.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/InvertedIndexResourceFactoryProvider.java @@ -18,6 +18,7 @@ */ package org.apache.asterix.metadata.utils; +import static org.apache.asterix.common.api.IIdentifierMapper.Modifier.PLURAL; import static org.apache.asterix.common.utils.IdentifierUtil.dataset; import java.util.List; @@ -78,7 +79,7 @@ public class InvertedIndexResourceFactoryProvider implements IResourceFactoryPro } if (numPrimaryKeys > 1) { throw new AsterixException( - "Cannot create inverted index on " + dataset() + "s with composite primary key."); + "Cannot create inverted index on " + dataset(PLURAL) + " with composite primary key."); } if (numSecondaryKeys > 1) { throw new AsterixException("Cannot create composite inverted index on multiple fields.");
