[ASTERIXDB-3259][MTD] Make SQLPP parser use namespace resolver
- user model changes: no
- storage format changes: no
- interface changes: yes
Details:
Make SQLPP parser use namespace resolver.
Change-Id: Ief85be9686ec950a158456008b2a712cc9c5c1d2
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17851
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
Reviewed-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/base/ILangExtension.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/base/ILangExtension.java
index bf812b3..6f39959 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/base/ILangExtension.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/base/ILangExtension.java
@@ -20,6 +20,7 @@
package org.apache.asterix.algebra.base;
import org.apache.asterix.common.api.IExtension;
+import org.apache.asterix.common.api.INamespaceResolver;
import org.apache.asterix.compiler.provider.ILangCompilationProvider;
import org.apache.asterix.om.functions.IFunctionManager;
@@ -37,7 +38,7 @@
return ExtensionKind.LANG;
}
- ILangCompilationProvider getLangCompilationProvider(Language lang);
+ ILangCompilationProvider getLangCompilationProvider(Language lang, INamespaceResolver namespaceResolver);
default IFunctionManager getFunctionManager() {
return null;
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/compiler/provider/SqlppCompilationProvider.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/compiler/provider/SqlppCompilationProvider.java
index 72807a2..4469dbd 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/compiler/provider/SqlppCompilationProvider.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/compiler/provider/SqlppCompilationProvider.java
@@ -23,6 +23,7 @@
import org.apache.asterix.algebra.base.ILangExpressionToPlanTranslatorFactory;
import org.apache.asterix.algebra.base.ILangExtension;
+import org.apache.asterix.common.api.INamespaceResolver;
import org.apache.asterix.common.config.CompilerProperties;
import org.apache.asterix.external.feed.watch.FeedActivityDetails;
import org.apache.asterix.lang.common.base.IAstPrintVisitorFactory;
@@ -44,6 +45,12 @@
public class SqlppCompilationProvider implements ILangCompilationProvider {
+ protected final INamespaceResolver namespaceResolver;
+
+ public SqlppCompilationProvider(INamespaceResolver namespaceResolver) {
+ this.namespaceResolver = namespaceResolver;
+ }
+
@Override
public ILangExtension.Language getLanguage() {
return ILangExtension.Language.SQLPP;
@@ -51,7 +58,7 @@
@Override
public IParserFactory getParserFactory() {
- return new SqlppParserFactory();
+ return new SqlppParserFactory(namespaceResolver);
}
@Override
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/cc/CCExtensionManager.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/cc/CCExtensionManager.java
index 63c0341..f2c282b 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/cc/CCExtensionManager.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/cc/CCExtensionManager.java
@@ -29,6 +29,7 @@
import org.apache.asterix.app.translator.DefaultStatementExecutorFactory;
import org.apache.asterix.common.api.ExtensionId;
import org.apache.asterix.common.api.IExtension;
+import org.apache.asterix.common.api.INamespaceResolver;
import org.apache.asterix.common.cluster.IGlobalRecoveryManager;
import org.apache.asterix.common.config.AsterixExtension;
import org.apache.asterix.common.context.IStorageComponentProvider;
@@ -68,13 +69,14 @@
* Initialize {@link org.apache.asterix.app.cc.CCExtensionManager} from configuration
*
* @param list
- * a list of extensions
+ * a list of extensions
+ * @param namespaceResolver
* @throws InstantiationException
* @throws IllegalAccessException
* @throws ClassNotFoundException
* @throws HyracksDataException
*/
- public CCExtensionManager(List<AsterixExtension> list)
+ public CCExtensionManager(List<AsterixExtension> list, INamespaceResolver namespaceResolver)
throws InstantiationException, IllegalAccessException, ClassNotFoundException, HyracksDataException {
Pair<ExtensionId, ILangCompilationProvider> sqlppcp = null;
Pair<ExtensionId, IFunctionManager> fm = null;
@@ -95,7 +97,8 @@
break;
case LANG:
ILangExtension le = (ILangExtension) extension;
- sqlppcp = ExtensionUtil.extendLangCompilationProvider(Language.SQLPP, sqlppcp, le);
+ sqlppcp = ExtensionUtil.extendLangCompilationProvider(Language.SQLPP, sqlppcp, le,
+ namespaceResolver);
fm = ExtensionUtil.extendFunctionManager(fm, le);
break;
case RECOVERY:
@@ -109,7 +112,8 @@
}
}
this.statementExecutorExtension = see;
- this.sqlppCompilationProvider = sqlppcp == null ? new SqlppCompilationProvider() : sqlppcp.second;
+ this.sqlppCompilationProvider =
+ sqlppcp == null ? new SqlppCompilationProvider(namespaceResolver) : sqlppcp.second;
this.functionManager =
fm == null ? new FunctionManager(FunctionCollection.createDefaultFunctionCollection()) : fm.second;
this.globalRecoveryExtension = gre;
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/cc/CcApplicationContext.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/cc/CcApplicationContext.java
index a79eb0d..24b4856 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/cc/CcApplicationContext.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/cc/CcApplicationContext.java
@@ -58,7 +58,6 @@
import org.apache.asterix.common.metadata.IMetadataBootstrap;
import org.apache.asterix.common.metadata.IMetadataLockUtil;
import org.apache.asterix.common.metadata.NamespacePathResolver;
-import org.apache.asterix.common.metadata.NamespaceResolver;
import org.apache.asterix.common.replication.INcLifecycleCoordinator;
import org.apache.asterix.common.storage.ICompressionManager;
import org.apache.asterix.common.transactions.IResourceIdManager;
@@ -128,7 +127,7 @@
private final IGlobalTxManager globalTxManager;
private final IOManager ioManager;
private final NamespacePathResolver namespacePathResolver;
- private final NamespaceResolver namespaceResolver;
+ private final INamespaceResolver namespaceResolver;
public CcApplicationContext(ICCServiceContext ccServiceCtx, HyracksConnection hcc,
Supplier<IMetadataBootstrap> metadataBootstrapSupplier, IGlobalRecoveryManager globalRecoveryManager,
@@ -137,7 +136,8 @@
IMetadataLockUtil mdLockUtil, IReceptionistFactory receptionistFactory,
IConfigValidatorFactory configValidatorFactory, Object extensionManager,
IAdapterFactoryService adapterFactoryService, IGlobalTxManager globalTxManager, IOManager ioManager,
- CloudProperties cloudProperties) throws AlgebricksException, IOException {
+ CloudProperties cloudProperties, INamespaceResolver namespaceResolver)
+ throws AlgebricksException, IOException {
this.ccServiceCtx = ccServiceCtx;
this.hcc = hcc;
this.activeLifeCycleListener = activeLifeCycleListener;
@@ -174,7 +174,7 @@
configValidator = configValidatorFactory.create();
this.adapterFactoryService = adapterFactoryService;
this.namespacePathResolver = new NamespacePathResolver(isCloudDeployment());
- this.namespaceResolver = new NamespaceResolver(isCloudDeployment());
+ this.namespaceResolver = namespaceResolver;
this.globalTxManager = globalTxManager;
this.ioManager = ioManager;
dataPartitioningProvider = DataPartitioningProvider.create(this);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
index 2b869fd..ab6a62a 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
@@ -62,7 +62,6 @@
import org.apache.asterix.common.context.IStorageComponentProvider;
import org.apache.asterix.common.library.ILibraryManager;
import org.apache.asterix.common.metadata.NamespacePathResolver;
-import org.apache.asterix.common.metadata.NamespaceResolver;
import org.apache.asterix.common.replication.IReplicationChannel;
import org.apache.asterix.common.replication.IReplicationManager;
import org.apache.asterix.common.replication.IReplicationStrategyFactory;
@@ -174,10 +173,10 @@
private final CloudProperties cloudProperties;
private IPartitionBootstrapper partitionBootstrapper;
private final NamespacePathResolver namespacePathResolver;
- private final NamespaceResolver namespaceResolver;
+ private final INamespaceResolver namespaceResolver;
public NCAppRuntimeContext(INCServiceContext ncServiceContext, NCExtensionManager extensionManager,
- IPropertiesFactory propertiesFactory) {
+ IPropertiesFactory propertiesFactory, INamespaceResolver namespaceResolver) {
this.ncServiceContext = ncServiceContext;
compilerProperties = propertiesFactory.newCompilerProperties();
externalProperties = propertiesFactory.newExternalProperties();
@@ -197,7 +196,7 @@
persistedResourceRegistry = ncServiceContext.getPersistedResourceRegistry();
cacheManager = new CacheManager();
namespacePathResolver = new NamespacePathResolver(isCloudDeployment());
- namespaceResolver = new NamespaceResolver(isCloudDeployment());
+ this.namespaceResolver = namespaceResolver;
}
@Override
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCExtensionManager.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCExtensionManager.java
index 6c037d2..339b8d7 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCExtensionManager.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCExtensionManager.java
@@ -25,6 +25,7 @@
import org.apache.asterix.algebra.base.ILangExtension;
import org.apache.asterix.common.api.ExtensionId;
import org.apache.asterix.common.api.IExtension;
+import org.apache.asterix.common.api.INamespaceResolver;
import org.apache.asterix.common.config.AsterixExtension;
import org.apache.asterix.common.exceptions.ACIDException;
import org.apache.asterix.compiler.provider.ILangCompilationProvider;
@@ -54,7 +55,6 @@
*
* @param list
* list of user configured extensions
- * @param ncServiceCtx
* @throws InstantiationException
* if an extension couldn't be created
* @throws IllegalAccessException
@@ -64,12 +64,12 @@
* @throws HyracksDataException
* if two extensions conlict with each other
*/
- public NCExtensionManager(List<AsterixExtension> list, INCServiceContext ncServiceCtx)
+ public NCExtensionManager(List<AsterixExtension> list, boolean usingDatabase, INamespaceResolver namespaceResolver)
throws InstantiationException, IllegalAccessException, ClassNotFoundException, HyracksDataException {
Pair<ExtensionId, ILangCompilationProvider> sqlppcp = null;
IMetadataExtension tupleTranslatorProviderExtension = null;
mdExtensions = new ArrayList<>();
- MetadataIndexesProvider mdIndexesProvider = new MetadataIndexesProvider(ncServiceCtx);
+ MetadataIndexesProvider mdIndexesProvider = new MetadataIndexesProvider(usingDatabase);
if (list != null) {
for (AsterixExtension extensionConf : list) {
IExtension extension = (IExtension) Class.forName(extensionConf.getClassName()).newInstance();
@@ -77,8 +77,8 @@
switch (extension.getExtensionKind()) {
case LANG:
ILangExtension le = (ILangExtension) extension;
- sqlppcp =
- ExtensionUtil.extendLangCompilationProvider(ILangExtension.Language.SQLPP, sqlppcp, le);
+ sqlppcp = ExtensionUtil.extendLangCompilationProvider(ILangExtension.Language.SQLPP, sqlppcp,
+ le, namespaceResolver);
break;
case METADATA:
IMetadataExtension mde = (IMetadataExtension) extension;
@@ -92,12 +92,13 @@
}
}
}
- this.sqlppCompilationProvider = sqlppcp == null ? new SqlppCompilationProvider() : sqlppcp.second;
+ this.sqlppCompilationProvider =
+ sqlppcp == null ? new SqlppCompilationProvider(namespaceResolver) : sqlppcp.second;
if (tupleTranslatorProviderExtension == null) {
this.metadataIndexesProvider = mdIndexesProvider;
this.tupleTranslatorProvider = new MetadataTupleTranslatorProvider(metadataIndexesProvider);
} else {
- this.metadataIndexesProvider = tupleTranslatorProviderExtension.getMetadataIndexesProvider(ncServiceCtx);
+ this.metadataIndexesProvider = tupleTranslatorProviderExtension.getMetadataIndexesProvider(usingDatabase);
this.tupleTranslatorProvider =
tupleTranslatorProviderExtension.getMetadataTupleTranslatorProvider(metadataIndexesProvider);
}
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 c47eb58..455567d 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
@@ -67,6 +67,7 @@
import org.apache.asterix.common.api.IApplicationContext;
import org.apache.asterix.common.api.IClientRequest;
import org.apache.asterix.common.api.IMetadataLockManager;
+import org.apache.asterix.common.api.INamespaceResolver;
import org.apache.asterix.common.api.IRequestTracker;
import org.apache.asterix.common.api.IResponsePrinter;
import org.apache.asterix.common.cluster.IClusterStateManager;
@@ -95,6 +96,7 @@
import org.apache.asterix.common.metadata.IMetadataLockUtil;
import org.apache.asterix.common.metadata.MetadataConstants;
import org.apache.asterix.common.metadata.MetadataUtil;
+import org.apache.asterix.common.metadata.Namespace;
import org.apache.asterix.common.utils.JobUtils;
import org.apache.asterix.common.utils.JobUtils.ProgressState;
import org.apache.asterix.common.utils.StorageConstants;
@@ -300,6 +302,7 @@
protected final WarningCollector warningCollector;
protected final ReentrantReadWriteLock compilationLock;
protected final IGlobalTxManager globalTxManager;
+ protected final INamespaceResolver namespaceResolver;
public QueryTranslator(ICcApplicationContext appCtx, List<Statement> statements, SessionOutput output,
ILangCompilationProvider compilationProvider, ExecutorService executorService,
@@ -323,6 +326,7 @@
this.jobFlags.add(JobFlag.ENFORCE_CONTRACT);
}
this.globalTxManager = appCtx.getGlobalTxManager();
+ this.namespaceResolver = appCtx.getNamespaceResolver();
}
public SessionOutput getSessionOutput() {
@@ -563,8 +567,8 @@
if (requestDataverseName == null) {
return null;
}
- DataverseName dvName = DataverseName.createFromCanonicalForm(requestDataverseName);
- return new DataverseDecl(dvName, true);
+ Namespace requestNamespace = namespaceResolver.resolve(requestDataverseName);
+ return new DataverseDecl(requestNamespace, true);
}
protected void handleSetStatement(Statement stmt, Map<String, String> config) throws CompilationException {
@@ -588,7 +592,7 @@
throws Exception {
DataverseDecl dvd = (DataverseDecl) stmt;
DataverseName dvName = dvd.getDataverseName();
- String database = MetadataUtil.resolveDatabase(null, dvName);
+ String database = dvd.getDatabaseName();
metadataProvider.validateDataverseName(dvName, dvd.getSourceLocation());
//TODO(DB): read lock on database
lockManager.acquireDataverseReadLock(metadataProvider.getLocks(), database, dvName);
@@ -605,7 +609,7 @@
metadataProvider.setMetadataTxnContext(mdTxnCtx);
try {
DataverseName dvName = stmtUseDataverse.getDataverseName();
- String database = MetadataUtil.resolveDatabase(null, dvName);
+ String database = stmtUseDataverse.getDatabaseName();
Dataverse dv =
MetadataManager.INSTANCE.getDataverse(metadataProvider.getMetadataTxnContext(), database, dvName);
if (dv == null) {
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/drivers/AsterixClientDriver.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/drivers/AsterixClientDriver.java
index a5d99fb..4b5261b 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/drivers/AsterixClientDriver.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/drivers/AsterixClientDriver.java
@@ -23,6 +23,7 @@
import org.apache.asterix.api.common.AsterixClientConfig;
import org.apache.asterix.api.java.AsterixJavaClient;
import org.apache.asterix.app.translator.DefaultStatementExecutorFactory;
+import org.apache.asterix.common.metadata.NamespaceResolver;
import org.apache.asterix.compiler.provider.ILangCompilationProvider;
import org.apache.asterix.compiler.provider.SqlppCompilationProvider;
import org.apache.asterix.file.StorageComponentProvider;
@@ -62,7 +63,7 @@
private static AsterixJavaClient compileQuery(IHyracksClientConnection hcc, String filename, boolean optimize,
boolean onlyPhysical, boolean createBinaryRuntime) throws Exception {
- ILangCompilationProvider compilationProvider = new SqlppCompilationProvider();
+ ILangCompilationProvider compilationProvider = new SqlppCompilationProvider(new NamespaceResolver(false));
FileReader reader = new FileReader(filename);
AsterixJavaClient q = new AsterixJavaClient(null, hcc, reader, compilationProvider,
new DefaultStatementExecutorFactory(), new StorageComponentProvider());
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java
index 38bf230..de3cb82 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java
@@ -64,6 +64,7 @@
import org.apache.asterix.cloud.CloudManagerProvider;
import org.apache.asterix.common.api.AsterixThreadFactory;
import org.apache.asterix.common.api.IConfigValidatorFactory;
+import org.apache.asterix.common.api.INamespaceResolver;
import org.apache.asterix.common.api.INodeJobTracker;
import org.apache.asterix.common.api.IReceptionistFactory;
import org.apache.asterix.common.cluster.IGlobalRecoveryManager;
@@ -81,6 +82,7 @@
import org.apache.asterix.common.external.IAdapterFactoryService;
import org.apache.asterix.common.library.ILibraryManager;
import org.apache.asterix.common.metadata.IMetadataLockUtil;
+import org.apache.asterix.common.metadata.NamespaceResolver;
import org.apache.asterix.common.replication.INcLifecycleCoordinator;
import org.apache.asterix.common.utils.Servlets;
import org.apache.asterix.external.adapter.factory.AdapterFactoryService;
@@ -165,7 +167,9 @@
new ReplicationProperties(PropertiesAccessor.getInstance(ccServiceCtx.getAppConfig()));
INcLifecycleCoordinator lifecycleCoordinator = createNcLifeCycleCoordinator(repProp.isReplicationEnabled());
componentProvider = new StorageComponentProvider();
- ccExtensionManager = new CCExtensionManager(new ArrayList<>(getExtensions()));
+ boolean cloudDeployment = ccServiceCtx.getAppConfig().getBoolean(CLOUD_DEPLOYMENT);
+ INamespaceResolver namespaceResolver = new NamespaceResolver(cloudDeployment);
+ ccExtensionManager = new CCExtensionManager(new ArrayList<>(getExtensions()), namespaceResolver);
IGlobalRecoveryManager globalRecoveryManager = createGlobalRecoveryManager();
final CCConfig ccConfig = controllerService.getCCConfig();
@@ -173,14 +177,14 @@
devices.add(new IODeviceHandle(new File(ccConfig.getGlobalTxLogDir()), "."));
IOManager ioManager = new IOManager(devices, new DefaultDeviceResolver(), 1, 10);
CloudProperties cloudProperties = null;
- if (ccServiceCtx.getAppConfig().getBoolean(CLOUD_DEPLOYMENT)) {
+ if (cloudDeployment) {
cloudProperties = new CloudProperties(PropertiesAccessor.getInstance(ccServiceCtx.getAppConfig()));
- ioManager = (IOManager) CloudManagerProvider.createIOManager(cloudProperties, ioManager);;
+ ioManager = (IOManager) CloudManagerProvider.createIOManager(cloudProperties, ioManager);
}
IGlobalTxManager globalTxManager = createGlobalTxManager(ioManager);
appCtx = createApplicationContext(null, globalRecoveryManager, lifecycleCoordinator, Receptionist::new,
ConfigValidator::new, ccExtensionManager, new AdapterFactoryService(), globalTxManager, ioManager,
- cloudProperties);
+ cloudProperties, namespaceResolver);
if (System.getProperty("java.rmi.server.hostname") == null) {
System.setProperty("java.rmi.server.hostname", ccConfig.getClusterPublicAddress());
}
@@ -228,12 +232,12 @@
IGlobalRecoveryManager globalRecoveryManager, INcLifecycleCoordinator lifecycleCoordinator,
IReceptionistFactory receptionistFactory, IConfigValidatorFactory configValidatorFactory,
CCExtensionManager ccExtensionManager, IAdapterFactoryService adapterFactoryService,
- IGlobalTxManager globalTxManager, IOManager ioManager, CloudProperties cloudProperties)
- throws AlgebricksException, IOException {
+ IGlobalTxManager globalTxManager, IOManager ioManager, CloudProperties cloudProperties,
+ INamespaceResolver namespaceResolver) throws AlgebricksException, IOException {
return new CcApplicationContext(ccServiceCtx, hcc, () -> MetadataManager.INSTANCE, globalRecoveryManager,
lifecycleCoordinator, new ActiveNotificationHandler(), componentProvider, new MetadataLockManager(),
createMetadataLockUtil(), receptionistFactory, configValidatorFactory, ccExtensionManager,
- adapterFactoryService, globalTxManager, ioManager, cloudProperties);
+ adapterFactoryService, globalTxManager, ioManager, cloudProperties, namespaceResolver);
}
protected IGlobalRecoveryManager createGlobalRecoveryManager() throws Exception {
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
index b15ae3e..eea87d8 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
@@ -25,6 +25,7 @@
import static org.apache.asterix.common.utils.Servlets.QUERY_STATUS;
import static org.apache.asterix.common.utils.Servlets.UDF;
import static org.apache.asterix.common.utils.Servlets.UDF_RECOVERY;
+import static org.apache.hyracks.control.common.controllers.ControllerConfig.Option.CLOUD_DEPLOYMENT;
import java.io.File;
import java.io.IOException;
@@ -54,6 +55,7 @@
import org.apache.asterix.app.replication.message.RegistrationTasksRequestMessage;
import org.apache.asterix.common.api.AsterixThreadFactory;
import org.apache.asterix.common.api.IConfigValidatorFactory;
+import org.apache.asterix.common.api.INamespaceResolver;
import org.apache.asterix.common.api.INcApplicationContext;
import org.apache.asterix.common.api.IPropertiesFactory;
import org.apache.asterix.common.api.IReceptionistFactory;
@@ -68,6 +70,7 @@
import org.apache.asterix.common.config.PropertiesFactory;
import org.apache.asterix.common.config.StorageProperties;
import org.apache.asterix.common.exceptions.AsterixException;
+import org.apache.asterix.common.metadata.NamespaceResolver;
import org.apache.asterix.common.replication.IReplicationStrategyFactory;
import org.apache.asterix.common.replication.ReplicationStrategyFactory;
import org.apache.asterix.common.transactions.Checkpoint;
@@ -154,8 +157,12 @@
}
MetadataBuiltinFunctions.init();
- ncExtensionManager = new NCExtensionManager(new ArrayList<>(getExtensions()), ncServiceCtx);
- runtimeContext = createNCApplicationContext(ncServiceCtx, ncExtensionManager, getPropertiesFactory());
+ boolean cloudDeployment = ncServiceCtx.getAppConfig().getBoolean(CLOUD_DEPLOYMENT);
+ NamespaceResolver namespaceResolver = new NamespaceResolver(cloudDeployment);
+ ncExtensionManager =
+ new NCExtensionManager(new ArrayList<>(getExtensions()), cloudDeployment, namespaceResolver);
+ runtimeContext =
+ createNCApplicationContext(ncServiceCtx, ncExtensionManager, getPropertiesFactory(), namespaceResolver);
MetadataProperties metadataProperties = runtimeContext.getMetadataProperties();
if (!metadataProperties.getNodeNames().contains(this.ncServiceCtx.getNodeId())) {
if (LOGGER.isInfoEnabled()) {
@@ -188,9 +195,9 @@
}
protected INcApplicationContext createNCApplicationContext(INCServiceContext ncServiceCtx,
- NCExtensionManager ncExtensionManager, IPropertiesFactory propertiesFactory)
- throws IOException, AsterixException {
- return new NCAppRuntimeContext(ncServiceCtx, ncExtensionManager, propertiesFactory);
+ NCExtensionManager ncExtensionManager, IPropertiesFactory propertiesFactory,
+ INamespaceResolver namespaceResolver) throws IOException, AsterixException {
+ return new NCAppRuntimeContext(ncServiceCtx, ncExtensionManager, propertiesFactory, namespaceResolver);
}
protected IRecoveryManagerFactory getRecoveryManagerFactory() {
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/ExtensionUtil.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/ExtensionUtil.java
index d29a37c..4374f01 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/ExtensionUtil.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/ExtensionUtil.java
@@ -22,6 +22,7 @@
import org.apache.asterix.algebra.base.ILangExtension.Language;
import org.apache.asterix.app.cc.IStatementExecutorExtension;
import org.apache.asterix.common.api.ExtensionId;
+import org.apache.asterix.common.api.INamespaceResolver;
import org.apache.asterix.common.exceptions.ErrorCode;
import org.apache.asterix.common.exceptions.RuntimeDataException;
import org.apache.asterix.compiler.provider.ILangCompilationProvider;
@@ -53,8 +54,9 @@
* if there was a conflict between two extensions
*/
public static Pair<ExtensionId, ILangCompilationProvider> extendLangCompilationProvider(Language lang,
- Pair<ExtensionId, ILangCompilationProvider> cp, ILangExtension le) throws RuntimeDataException {
- ILangCompilationProvider lecp = le.getLangCompilationProvider(lang);
+ Pair<ExtensionId, ILangCompilationProvider> cp, ILangExtension le, INamespaceResolver namespaceResolver)
+ throws RuntimeDataException {
+ ILangCompilationProvider lecp = le.getLangCompilationProvider(lang, namespaceResolver);
if (cp != null && lecp != null) {
throw new RuntimeDataException(ErrorCode.EXTENSION_COMPONENT_CONFLICT, le.getId(), cp.first,
lang.toString());
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FeedOperations.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FeedOperations.java
index 6e1ecdc..11ca118 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FeedOperations.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FeedOperations.java
@@ -27,8 +27,6 @@
import java.util.Map;
import java.util.Map.Entry;
-import org.apache.asterix.app.result.ResponsePrinter;
-import org.apache.asterix.app.translator.DefaultStatementExecutorFactory;
import org.apache.asterix.common.cluster.PartitioningProperties;
import org.apache.asterix.common.dataflow.ICcApplicationContext;
import org.apache.asterix.common.dataflow.LSMTreeInsertDeleteOperatorDescriptor;
@@ -37,7 +35,6 @@
import org.apache.asterix.common.functions.FunctionSignature;
import org.apache.asterix.common.metadata.DataverseName;
import org.apache.asterix.common.transactions.TxnId;
-import org.apache.asterix.compiler.provider.SqlppCompilationProvider;
import org.apache.asterix.external.api.ITypedAdapterFactory;
import org.apache.asterix.external.feed.management.FeedConnectionId;
import org.apache.asterix.external.feed.policy.FeedPolicyAccessor;
@@ -47,7 +44,6 @@
import org.apache.asterix.external.operators.FeedMetaOperatorDescriptor;
import org.apache.asterix.external.util.ExternalDataUtils;
import org.apache.asterix.external.util.FeedUtils.FeedRuntimeType;
-import org.apache.asterix.file.StorageComponentProvider;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.IParser;
import org.apache.asterix.lang.common.base.IParserFactory;
@@ -85,7 +81,6 @@
import org.apache.asterix.runtime.utils.RuntimeUtils;
import org.apache.asterix.translator.CompiledStatements;
import org.apache.asterix.translator.IStatementExecutor;
-import org.apache.asterix.translator.SessionOutput;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
@@ -178,7 +173,8 @@
return argExprs;
}
- private static Query makeConnectionQuery(FeedConnection feedConnection) throws AlgebricksException {
+ private static Query makeConnectionQuery(FeedConnection feedConnection, MetadataProvider md)
+ throws AlgebricksException {
// Construct from clause
VarIdentifier fromVarId = SqlppVariableUtil.toInternalVariableIdentifier(feedConnection.getFeedName());
VariableExpr fromTermLeftExpr = new VariableExpr(fromVarId);
@@ -193,7 +189,7 @@
WhereClause whereClause = null;
if (feedConnection.getWhereClauseBody().length() != 0) {
String whereClauseExpr = feedConnection.getWhereClauseBody() + ";";
- IParserFactory sqlppParserFactory = new SqlppParserFactory();
+ IParserFactory sqlppParserFactory = new SqlppParserFactory(md.getNamespaceResolver());
IParser sqlppParser = sqlppParserFactory.createParser(whereClauseExpr);
List<Statement> stmts = sqlppParser.parse();
if (stmts.size() != 1) {
@@ -224,7 +220,7 @@
IStatementExecutor statementExecutor, IHyracksClientConnection hcc, Boolean insertFeed)
throws AlgebricksException, RemoteException, ACIDException {
metadataProvider.getConfig().put(FeedActivityDetails.FEED_POLICY_NAME, feedConn.getPolicyName());
- Query feedConnQuery = makeConnectionQuery(feedConn);
+ Query feedConnQuery = makeConnectionQuery(feedConn, metadataProvider);
CompiledStatements.ICompiledDmlStatement clfrqs;
if (insertFeed) {
InsertStatement stmtUpsert = new InsertStatement(feedConn.getDataverseName(), feedConn.getDatasetName(),
@@ -421,15 +417,6 @@
return jobSpec;
}
- private static IStatementExecutor getSQLPPTranslator(MetadataProvider metadataProvider,
- SessionOutput sessionOutput) {
- List<Statement> stmts = new ArrayList<>();
- DefaultStatementExecutorFactory qtFactory = new DefaultStatementExecutorFactory();
- IStatementExecutor translator = qtFactory.create(metadataProvider.getApplicationContext(), stmts, sessionOutput,
- new SqlppCompilationProvider(), new StorageComponentProvider(), new ResponsePrinter(sessionOutput));
- return translator;
- }
-
public static Pair<JobSpecification, AlgebricksAbsolutePartitionConstraint> buildStartFeedJob(
MetadataProvider metadataProvider, Feed feed, List<FeedConnection> feedConnections,
IStatementExecutor statementExecutor, IHyracksClientConnection hcc) throws Exception {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dml/DmlTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dml/DmlTest.java
index e015ffc..93f513d 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dml/DmlTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dml/DmlTest.java
@@ -30,6 +30,7 @@
import org.apache.asterix.app.translator.DefaultStatementExecutorFactory;
import org.apache.asterix.common.dataflow.ICcApplicationContext;
import org.apache.asterix.common.exceptions.AsterixException;
+import org.apache.asterix.common.metadata.NamespaceResolver;
import org.apache.asterix.compiler.provider.SqlppCompilationProvider;
import org.apache.asterix.file.StorageComponentProvider;
import org.apache.asterix.test.base.AsterixTestHelper;
@@ -64,7 +65,8 @@
new BufferedReader(new InputStreamReader(new FileInputStream(LOAD_FOR_ENLIST_FILE), "UTF-8"));
AsterixJavaClient asterixLoad =
new AsterixJavaClient((ICcApplicationContext) integrationUtil.cc.getApplicationContext(),
- integrationUtil.getHyracksClientConnection(), loadReader, ERR, new SqlppCompilationProvider(),
+ integrationUtil.getHyracksClientConnection(), loadReader, ERR,
+ new SqlppCompilationProvider(new NamespaceResolver(false)),
new DefaultStatementExecutorFactory(), new StorageComponentProvider());
try {
asterixLoad.compile(true, false, false, false, false, true, false);
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/AbstractOptimizerTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/AbstractOptimizerTest.java
index 8126d1e..e24eb98 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/AbstractOptimizerTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/AbstractOptimizerTest.java
@@ -31,6 +31,7 @@
import org.apache.asterix.app.translator.DefaultStatementExecutorFactory;
import org.apache.asterix.common.config.GlobalConfig;
import org.apache.asterix.common.context.IStorageComponentProvider;
+import org.apache.asterix.common.metadata.NamespaceResolver;
import org.apache.asterix.compiler.provider.ILangCompilationProvider;
import org.apache.asterix.compiler.provider.SqlppCompilationProvider;
import org.apache.asterix.external.util.ExternalDataConstants;
@@ -71,7 +72,8 @@
protected static final ArrayList<String> ignore = AsterixTestHelper.readTestListFile(FILENAME_IGNORE, PATH_BASE);
protected static final ArrayList<String> only = AsterixTestHelper.readTestListFile(FILENAME_ONLY, PATH_BASE);
protected static String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf";
- protected static final ILangCompilationProvider sqlppCompilationProvider = new SqlppCompilationProvider();
+ protected static final ILangCompilationProvider sqlppCompilationProvider =
+ new SqlppCompilationProvider(new NamespaceResolver(false));
protected static ILangCompilationProvider extensionLangCompilationProvider = null;
protected static IStatementExecutorFactory statementExecutorFactory = new DefaultStatementExecutorFactory();
protected static IStorageComponentProvider storageComponentProvider = new StorageComponentProvider();
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/DataverseNameParserTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/DataverseNameParserTest.java
index 0d4d611..9d03abf 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/DataverseNameParserTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/DataverseNameParserTest.java
@@ -23,6 +23,7 @@
import org.apache.asterix.common.metadata.DataverseName;
import org.apache.asterix.common.metadata.DataverseNameTest;
+import org.apache.asterix.common.metadata.NamespaceResolver;
import org.apache.asterix.lang.common.base.IParser;
import org.apache.asterix.lang.common.base.IParserFactory;
import org.apache.asterix.lang.sqlpp.parser.SqlppParserFactory;
@@ -30,7 +31,7 @@
public class DataverseNameParserTest extends DataverseNameTest {
- private final IParserFactory parserFactory = new SqlppParserFactory();
+ private final IParserFactory parserFactory = new SqlppParserFactory(new NamespaceResolver(false));
@Override
protected void testDataverseNameImpl(DataverseName dataverseName, List<String> parts, String expectedCanonicalForm,
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java
index e9278d0..3b0e977 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java
@@ -43,6 +43,7 @@
import org.apache.asterix.common.metadata.DataverseName;
import org.apache.asterix.common.metadata.MetadataConstants;
import org.apache.asterix.common.metadata.MetadataUtil;
+import org.apache.asterix.common.metadata.NamespaceResolver;
import org.apache.asterix.lang.common.base.IParser;
import org.apache.asterix.lang.common.base.IParserFactory;
import org.apache.asterix.lang.common.base.IQueryRewriter;
@@ -79,7 +80,7 @@
public class ParserTestExecutor extends TestExecutor {
- private IParserFactory sqlppParserFactory = new SqlppParserFactory();
+ private IParserFactory sqlppParserFactory = new SqlppParserFactory(new NamespaceResolver(false));
private IRewriterFactory sqlppRewriterFactory = new SqlppRewriterFactory(sqlppParserFactory);
private Set<FunctionSignature> createdFunctions = new HashSet<>();
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_01/feeds_01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_01/feeds_01.3.query.sqlpp
index f4862f2..3b2c900 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_01/feeds_01.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_01/feeds_01.3.query.sqlpp
@@ -21,8 +21,12 @@
* Expected Res : Success
* Date : 24th Dec 2012
*/
+-- compareunorderedarray=true
-select element x
+select element y
from `Metadata`.`Feed` as x
+let y = OBJECT_CONCAT( { "AdapterConfiguration" : to_array(x.AdapterConfiguration)},
+ OBJECT_REMOVE(x, "AdapterConfiguration")
+ )
where ((x.DataverseName = 'feeds') and (x.FeedName = 'TweetFeed'))
;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/feeds/feeds_01/feeds_01.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/feeds/feeds_01/feeds_01.1.adm
deleted file mode 100644
index f932438a..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/feeds/feeds_01/feeds_01.1.adm
+++ /dev/null
@@ -1 +0,0 @@
-{ "DataverseName": "feeds", "FeedName": "TweetFeed", "AdapterConfiguration": {{ { "Name": "dataset-dataverse", "Value": "feeds" }, { "Name": "path", "Value": "asterix_nc1://data/twitter/obamatweets.adm" }, { "Name": "feed", "Value": "TweetFeed" }, { "Name": "log-ingestion-events", "Value": "true" }, { "Name": "dataset-database", "Value": "Default" }, { "Name": "adapter-name", "Value": "localfs" }, { "Name": "is-feed", "Value": "true" }, { "Name": "parser", "Value": "adm" }, { "Name": "reader", "Value": "localfs" }, { "Name": "format", "Value": "adm" }, { "Name": "tuple-interval", "Value": "10" }, { "Name": "type-name", "Value": "TweetType" } }}, "Timestamp": "Mon May 08 20:53:16 PDT 2023" }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/feeds/feeds_01/feeds_01.1.regexjson b/asterixdb/asterix-app/src/test/resources/runtimets/results/feeds/feeds_01/feeds_01.1.regexjson
new file mode 100644
index 0000000..c3356bc
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/feeds/feeds_01/feeds_01.1.regexjson
@@ -0,0 +1,56 @@
+{
+ "DataverseName": "feeds",
+ "FeedName": "TweetFeed",
+ "AdapterConfiguration":
+ [
+ {
+ "Name": "dataset-dataverse",
+ "Value": "feeds"
+ },
+ {
+ "Name": "path",
+ "Value": "asterix_nc1://data/twitter/obamatweets.adm"
+ },
+ {
+ "Name": "feed",
+ "Value": "TweetFeed"
+ },
+ {
+ "Name": "log-ingestion-events",
+ "Value": "true"
+ },
+ {
+ "Name": "dataset-database",
+ "Value": "Default"
+ },
+ {
+ "Name": "adapter-name",
+ "Value": "localfs"
+ },
+ {
+ "Name": "is-feed",
+ "Value": "true"
+ },
+ {
+ "Name": "parser",
+ "Value": "adm"
+ },
+ {
+ "Name": "reader",
+ "Value": "localfs"
+ },
+ {
+ "Name": "format",
+ "Value": "adm"
+ },
+ {
+ "Name": "tuple-interval",
+ "Value": "10"
+ },
+ {
+ "Name": "type-name",
+ "Value": "TweetType"
+ }
+ ],
+ "Timestamp": "R{.*}"
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/feeds/feeds_01/feeds_01.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/feeds/feeds_01/feeds_01.1.adm
deleted file mode 100644
index 751025d..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/feeds/feeds_01/feeds_01.1.adm
+++ /dev/null
@@ -1 +0,0 @@
-{ "DatabaseName": "Default", "DataverseName": "feeds", "FeedName": "TweetFeed", "AdapterConfiguration": {{ { "Name": "dataset-dataverse", "Value": "feeds" }, { "Name": "path", "Value": "asterix_nc1://data/twitter/obamatweets.adm" }, { "Name": "feed", "Value": "TweetFeed" }, { "Name": "log-ingestion-events", "Value": "true" }, { "Name": "dataset-database", "Value": "Default" }, { "Name": "adapter-name", "Value": "localfs" }, { "Name": "is-feed", "Value": "true" }, { "Name": "parser", "Value": "adm" }, { "Name": "reader", "Value": "localfs" }, { "Name": "format", "Value": "adm" }, { "Name": "tuple-interval", "Value": "10" }, { "Name": "type-name", "Value": "TweetType" } }}, "Timestamp": "Fri Oct 06 12:58:13 PDT 2023" }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/feeds/feeds_01/feeds_01.1.regexjson b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/feeds/feeds_01/feeds_01.1.regexjson
new file mode 100644
index 0000000..7505f53
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/feeds/feeds_01/feeds_01.1.regexjson
@@ -0,0 +1,57 @@
+{
+ "DatabaseName": "Default",
+ "DataverseName": "feeds",
+ "FeedName": "TweetFeed",
+ "AdapterConfiguration":
+ [
+ {
+ "Name": "dataset-dataverse",
+ "Value": "feeds"
+ },
+ {
+ "Name": "path",
+ "Value": "asterix_nc1://data/twitter/obamatweets.adm"
+ },
+ {
+ "Name": "feed",
+ "Value": "TweetFeed"
+ },
+ {
+ "Name": "log-ingestion-events",
+ "Value": "true"
+ },
+ {
+ "Name": "dataset-database",
+ "Value": "Default"
+ },
+ {
+ "Name": "adapter-name",
+ "Value": "localfs"
+ },
+ {
+ "Name": "is-feed",
+ "Value": "true"
+ },
+ {
+ "Name": "parser",
+ "Value": "adm"
+ },
+ {
+ "Name": "reader",
+ "Value": "localfs"
+ },
+ {
+ "Name": "format",
+ "Value": "adm"
+ },
+ {
+ "Name": "tuple-interval",
+ "Value": "10"
+ },
+ {
+ "Name": "type-name",
+ "Value": "TweetType"
+ }
+ ],
+ "Timestamp": "R{.*}"
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INamespaceResolver.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INamespaceResolver.java
index f281280..a552dfb 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INamespaceResolver.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INamespaceResolver.java
@@ -18,11 +18,15 @@
*/
package org.apache.asterix.common.api;
-import org.apache.asterix.common.metadata.DataverseName;
+import java.util.List;
+
+import org.apache.asterix.common.exceptions.AsterixException;
import org.apache.asterix.common.metadata.Namespace;
public interface INamespaceResolver {
- Namespace resolve(DataverseName dataverseName);
+ Namespace resolve(List<String> multiIdentifier) throws AsterixException;
+
+ Namespace resolve(String namespace) throws AsterixException;
}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/NamespaceResolver.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/NamespaceResolver.java
index 14bba84..011432b 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/NamespaceResolver.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/NamespaceResolver.java
@@ -19,7 +19,10 @@
package org.apache.asterix.common.metadata;
+import java.util.List;
+
import org.apache.asterix.common.api.INamespaceResolver;
+import org.apache.asterix.common.exceptions.AsterixException;
public class NamespaceResolver implements INamespaceResolver {
@@ -30,10 +33,17 @@
}
@Override
- public Namespace resolve(DataverseName dataverseName) {
- if (dataverseName == null) {
+ public Namespace resolve(List<String> multiIdentifier) throws AsterixException {
+ if (multiIdentifier == null) {
return null;
}
+ DataverseName dataverseName = DataverseName.create(multiIdentifier);
+ return new Namespace(MetadataUtil.databaseFor(dataverseName), dataverseName);
+ }
+
+ @Override
+ public Namespace resolve(String namespace) throws AsterixException {
+ DataverseName dataverseName = DataverseName.createFromCanonicalForm(namespace);
return new Namespace(MetadataUtil.databaseFor(dataverseName), dataverseName);
}
}
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDecl.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDecl.java
index b901819..dd22950 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDecl.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDecl.java
@@ -18,29 +18,36 @@
*/
package org.apache.asterix.lang.common.statement;
+import java.util.Objects;
+
import org.apache.asterix.common.exceptions.CompilationException;
import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
import org.apache.asterix.lang.common.base.AbstractStatement;
import org.apache.asterix.lang.common.base.Statement;
import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
public class DataverseDecl extends AbstractStatement {
- private DataverseName dataverseName;
+ private final Namespace namespace;
- private boolean ifExists;
+ private final boolean ifExists;
- public DataverseDecl(DataverseName dataverseName) {
- this(dataverseName, false);
+ public DataverseDecl(Namespace namespace) {
+ this(namespace, false);
}
- public DataverseDecl(DataverseName dataverseName, boolean ifExists) {
- this.dataverseName = dataverseName;
+ public DataverseDecl(Namespace namespace, boolean ifExists) {
+ this.namespace = Objects.requireNonNull(namespace);
this.ifExists = ifExists;
}
public DataverseName getDataverseName() {
- return dataverseName;
+ return namespace.getDataverseName();
+ }
+
+ public String getDatabaseName() {
+ return namespace.getDatabaseName();
}
public boolean getIfExists() {
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/parser/SqlppParserFactory.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/parser/SqlppParserFactory.java
index 5b724f2..98c53d6 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/parser/SqlppParserFactory.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/parser/SqlppParserFactory.java
@@ -20,6 +20,7 @@
import java.io.Reader;
+import org.apache.asterix.common.api.INamespaceResolver;
import org.apache.asterix.lang.common.base.IParser;
import org.apache.asterix.lang.common.base.IParserFactory;
@@ -28,14 +29,20 @@
// WARNING: This value is stored in function metadata. Do not modify.
public static final String SQLPP = "SQLPP";
+ protected final INamespaceResolver namespaceResolver;
+
+ public SqlppParserFactory(INamespaceResolver namespaceResolver) {
+ this.namespaceResolver = namespaceResolver;
+ }
+
@Override
public IParser createParser(String query) {
- return new SQLPPParser(query);
+ return new SQLPPParser(query, namespaceResolver);
}
@Override
public IParser createParser(Reader reader) {
- return new SQLPPParser(reader);
+ return new SQLPPParser(reader, namespaceResolver);
}
@Override
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
index 732c4e8..b5dd4c4 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
+++ b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
@@ -67,6 +67,7 @@
import org.apache.asterix.common.annotations.SpatialJoinAnnotation;
import org.apache.asterix.common.annotations.TypeDataGen;
import org.apache.asterix.common.annotations.UndeclaredFieldsDataGen;
+import org.apache.asterix.common.api.INamespaceResolver;
import org.apache.asterix.common.config.DatasetConfig.DatasetType;
import org.apache.asterix.common.config.DatasetConfig.IndexType;
import org.apache.asterix.common.exceptions.AsterixException;
@@ -79,6 +80,8 @@
import org.apache.asterix.common.metadata.DatasetFullyQualifiedName;
import org.apache.asterix.common.metadata.MetadataConstants;
import org.apache.asterix.common.metadata.MetadataUtil;
+import org.apache.asterix.common.metadata.Namespace;
+import org.apache.asterix.common.metadata.NamespaceResolver;
import org.apache.asterix.external.dataset.adapter.AdapterIdentifier;
import org.apache.asterix.lang.common.base.AbstractClause;
import org.apache.asterix.lang.common.base.AbstractLangExpression;
@@ -290,6 +293,8 @@
private final Map<SourceLocation, String> hintCollector = new HashMap<SourceLocation, String>();
+ private INamespaceResolver namespaceResolver;
+
private static class IndexParams {
public IndexType type;
public int gramLength;
@@ -361,15 +366,22 @@
}
}
- public SQLPPParser(String s) {
+ public SQLPPParser(String s, INamespaceResolver namespaceResolver) {
this(new StringReader(s));
super.setInput(s);
+ this.namespaceResolver = namespaceResolver;
+ }
+
+ public SQLPPParser(Reader is, INamespaceResolver namespaceResolver) {
+ this(is);
+ this.namespaceResolver = namespaceResolver;
}
public static void main(String[] args) throws ParseException, TokenMgrError, IOException, FileNotFoundException, CompilationException {
File file = new File(args[0]);
Reader fis = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
SQLPPParser parser = new SQLPPParser(fis);
+ parser.namespaceResolver = new NamespaceResolver(false);
List<Statement> st = parser.parse();
//st.accept(new SQLPPPrintVisitor(), 0);
}
@@ -394,8 +406,8 @@
});
}
- private static Expression parseExpression(String text) throws CompilationException {
- return new SQLPPParser(text).parseExpression();
+ private static Expression parseExpression(String text, INamespaceResolver nsr) throws CompilationException {
+ return new SQLPPParser(text, nsr).parseExpression();
}
@Override
@@ -417,8 +429,8 @@
});
}
- private static List<String> parseParenthesizedIdentifierList(String text) throws CompilationException {
- return new SQLPPParser(text).parseParenthesizedIdentifierList();
+ private static List<String> parseParenthesizedIdentifierList(String text, INamespaceResolver nsr) throws CompilationException {
+ return new SQLPPParser(text, nsr).parseParenthesizedIdentifierList();
}
private Pair<HashJoinExpressionAnnotation.BuildOrProbe, String> parseHashJoinParams() throws CompilationException {
@@ -430,8 +442,8 @@
});
}
- private static Pair<HashJoinExpressionAnnotation.BuildOrProbe, String> parseHashJoinParams(String text) throws CompilationException {
- return new SQLPPParser(text).parseHashJoinParams();
+ private static Pair<HashJoinExpressionAnnotation.BuildOrProbe, String> parseHashJoinParams(String text, INamespaceResolver nsr) throws CompilationException {
+ return new SQLPPParser(text, nsr).parseHashJoinParams();
}
private String parseBroadcastJoinParams() throws CompilationException {
@@ -443,8 +455,8 @@
});
}
- private static String parseBroadcastJoinParams(String text) throws CompilationException {
- return new SQLPPParser(text).parseBroadcastJoinParams();
+ private static String parseBroadcastJoinParams(String text, INamespaceResolver nsr) throws CompilationException {
+ return new SQLPPParser(text, nsr).parseBroadcastJoinParams();
}
private List<Literal> parseParenthesizedLiteralList() throws CompilationException {
@@ -456,8 +468,8 @@
});
}
- private static List<Literal> parseParenthesizedLiteralList(String text) throws CompilationException {
- return new SQLPPParser(text).parseParenthesizedLiteralList();
+ private static List<Literal> parseParenthesizedLiteralList(String text, INamespaceResolver nsr) throws CompilationException {
+ return new SQLPPParser(text, nsr).parseParenthesizedLiteralList();
}
@Override
@@ -754,7 +766,7 @@
}
else {
// if parameter parsing fails then ignore this hint.
- String name = parseBroadcastJoinParams(hintToken.hintParams);
+ String name = parseBroadcastJoinParams(hintToken.hintParams, this.namespaceResolver);
return new BroadcastExpressionAnnotation(name);
}
case HASH_JOIN_HINT:
@@ -763,7 +775,7 @@
}
else {
// if parameter parsing fails then ignore this hint.
- Pair<HashJoinExpressionAnnotation.BuildOrProbe, String> pair = parseHashJoinParams(hintToken.hintParams);
+ Pair<HashJoinExpressionAnnotation.BuildOrProbe, String> pair = parseHashJoinParams(hintToken.hintParams, this.namespaceResolver);
return new HashJoinExpressionAnnotation(pair);
}
case INDEXED_NESTED_LOOP_JOIN_HINT:
@@ -772,11 +784,11 @@
} else {
// if parameter parsing fails then return hint annotation without parameters
onParseErrorReturn = IndexedNLJoinExpressionAnnotation.INSTANCE_ANY_INDEX;
- List<String> indexNames = parseParenthesizedIdentifierList(hintToken.hintParams);
+ List<String> indexNames = parseParenthesizedIdentifierList(hintToken.hintParams, this.namespaceResolver);
return IndexedNLJoinExpressionAnnotation.newInstance(indexNames);
}
case RANGE_HINT:
- Expression rangeExpr = parseExpression(hintToken.hintParams);
+ Expression rangeExpr = parseExpression(hintToken.hintParams, this.namespaceResolver);
RangeMap rangeMap = RangeMapBuilder.parseHint(rangeExpr);
return new RangeAnnotation(rangeMap);
case SKIP_SECONDARY_INDEX_SEARCH_HINT:
@@ -784,11 +796,11 @@
return SkipSecondaryIndexSearchExpressionAnnotation.INSTANCE_ANY_INDEX;
} else {
// if parameter parsing fails then ignore this hint
- List<String> indexNames = parseParenthesizedIdentifierList(hintToken.hintParams);
+ List<String> indexNames = parseParenthesizedIdentifierList(hintToken.hintParams, this.namespaceResolver);
return SkipSecondaryIndexSearchExpressionAnnotation.newInstance(indexNames);
}
case SPATIAL_JOIN_HINT:
- List<Literal> hintValues = parseParenthesizedLiteralList(hintToken.hintParams);
+ List<Literal> hintValues = parseParenthesizedLiteralList(hintToken.hintParams, this.namespaceResolver);
// Handle exceptions
if (hintValues.size() != 6) {
@@ -833,7 +845,7 @@
throw new SqlppParseException(getSourceLocation(hintToken), "Expected index name(s)");
} else {
// if parameter parsing fails then ignore this hint
- List<String> indexNames = parseParenthesizedIdentifierList(hintToken.hintParams);
+ List<String> indexNames = parseParenthesizedIdentifierList(hintToken.hintParams, this.namespaceResolver);
return SecondaryIndexSearchPreferenceAnnotation.newInstance(indexNames);
}
default:
@@ -887,6 +899,16 @@
}
}
+ private Namespace createNamespace(List<String> parts, Token startToken) throws SqlppParseException {
+ try {
+ return namespaceResolver.resolve(parts);
+ } catch (AsterixException e) {
+ SqlppParseException pe = new SqlppParseException(getSourceLocation(startToken), e.getMessage());
+ pe.initCause(e);
+ throw pe;
+ }
+ }
+
private void validatePKFields(Object primaryKeyFields, Token startToken) throws SqlppParseException {
if (primaryKeyFields == null) {
throw new SqlppParseException(getSourceLocation(startToken), "Invalid primary key specification.");
@@ -968,14 +990,16 @@
DataverseDecl DataverseDeclaration() throws ParseException:
{
Token startToken = null;
- DataverseName dvName = null;
+ Namespace ns = null;
+ Triple<List<String>, Token, Token> ident = null;
}
{
- <USE> { startToken = token; } dvName = DataverseName()
+ <USE> { startToken = token; } ident = MultipartIdentifier()
{
- defaultDataverse = dvName;
- defaultDatabase = MetadataUtil.databaseFor(dvName);
- DataverseDecl dvDecl = new DataverseDecl(defaultDataverse);
+ ns = createNamespace(ident.first, ident.second);
+ defaultDataverse = ns.getDataverseName();
+ defaultDatabase = ns.getDatabaseName();
+ DataverseDecl dvDecl = new DataverseDecl(ns);
return addSourceLocation(dvDecl, startToken);
}
}
@@ -5337,7 +5361,7 @@
break;
case RANGE_HINT:
try {
- Expression rangeExpr = parseExpression(hintToken.hintParams);
+ Expression rangeExpr = parseExpression(hintToken.hintParams, this.namespaceResolver);
RangeMap rangeMap = RangeMapBuilder.parseHint(rangeExpr);
oc.setRangeMap(rangeMap);
} catch (CompilationException e) {
diff --git a/asterixdb/asterix-lang-sqlpp/src/test/java/org/apache/asterix/lang/sqlpp/parser/ParserTest.java b/asterixdb/asterix-lang-sqlpp/src/test/java/org/apache/asterix/lang/sqlpp/parser/ParserTest.java
index 8413c38..256f644 100644
--- a/asterixdb/asterix-lang-sqlpp/src/test/java/org/apache/asterix/lang/sqlpp/parser/ParserTest.java
+++ b/asterixdb/asterix-lang-sqlpp/src/test/java/org/apache/asterix/lang/sqlpp/parser/ParserTest.java
@@ -19,6 +19,7 @@
package org.apache.asterix.lang.sqlpp.parser;
import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.metadata.NamespaceResolver;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.IParser;
import org.apache.asterix.lang.common.base.IParserFactory;
@@ -30,7 +31,7 @@
public class ParserTest {
protected void assertParseError(String query, int expectedErrorLine) throws Exception {
- IParserFactory factory = new SqlppParserFactory();
+ IParserFactory factory = new SqlppParserFactory(new NamespaceResolver(false));
IParser parser = factory.createParser(query);
try {
parser.parse();
@@ -64,7 +65,7 @@
@Test
public void testMultipleStatements() throws Exception {
String query = "use x;\nselect 1;";
- IParserFactory factory = new SqlppParserFactory();
+ IParserFactory factory = new SqlppParserFactory(new NamespaceResolver(false));
IParser parser = factory.createParser(query);
parser.parse();
query = "use x;\n use x;;;;\n use x;\n select 1;";
@@ -85,7 +86,7 @@
@Test
public void testEmptyStatement() throws Exception {
String query = "";
- IParserFactory factory = new SqlppParserFactory();
+ IParserFactory factory = new SqlppParserFactory(new NamespaceResolver(false));
IParser parser = factory.createParser(query);
parser.parse();
@@ -117,7 +118,7 @@
String[] prefixes = new String[] { "", "E" };
String[] quotes = new String[] { "'", "\"" };
- IParserFactory factory = new SqlppParserFactory();
+ IParserFactory factory = new SqlppParserFactory(new NamespaceResolver(false));
StringBuilder qb = new StringBuilder();
for (String p : prefixes) {
@@ -142,7 +143,7 @@
String[] prefixesRest = new String[] { "", "E", " ", "\n" };
String[] quotes = new String[] { "'", "\"" };
- IParserFactory factory = new SqlppParserFactory();
+ IParserFactory factory = new SqlppParserFactory(new NamespaceResolver(false));
StringBuilder qb = new StringBuilder();
for (String p1 : prefixesStart) {
for (String q1 : quotes) {
diff --git a/asterixdb/asterix-lang-sqlpp/src/test/java/org/apache/asterix/lang/sqlpp/parser/SqlppGroupingSetsParserTest.java b/asterixdb/asterix-lang-sqlpp/src/test/java/org/apache/asterix/lang/sqlpp/parser/SqlppGroupingSetsParserTest.java
index 42ba8bc..9549b5d 100644
--- a/asterixdb/asterix-lang-sqlpp/src/test/java/org/apache/asterix/lang/sqlpp/parser/SqlppGroupingSetsParserTest.java
+++ b/asterixdb/asterix-lang-sqlpp/src/test/java/org/apache/asterix/lang/sqlpp/parser/SqlppGroupingSetsParserTest.java
@@ -30,6 +30,7 @@
import org.apache.asterix.common.exceptions.CompilationException;
import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.common.metadata.NamespaceResolver;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.ILangExpression;
import org.apache.asterix.lang.common.base.IParser;
@@ -219,7 +220,7 @@
@Test
public void test() throws Exception {
- SqlppParserFactory parserFactory = new SqlppParserFactory();
+ SqlppParserFactory parserFactory = new SqlppParserFactory(new NamespaceResolver(false));
String groupbyClause = "GROUP BY " + groupbyInput;
String query = "SELECT COUNT(*) FROM test " + groupbyClause + ";";
// parse 2 queries so we can test calling rewrite() multiple times on the same instance
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataExtension.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataExtension.java
index 8831214..d9037cc 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataExtension.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataExtension.java
@@ -48,7 +48,7 @@
*/
MetadataTupleTranslatorProvider getMetadataTupleTranslatorProvider(MetadataIndexesProvider metadataIndexesProvider);
- MetadataIndexesProvider getMetadataIndexesProvider(INCServiceContext ncServiceCtx);
+ MetadataIndexesProvider getMetadataIndexesProvider(boolean usingDatabase);
/**
* @return A list of additional extension instances of {@code IMetadataIndex} that are introduced by the extension
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataIndexesProvider.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataIndexesProvider.java
index 7dadde3..18857a3 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataIndexesProvider.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataIndexesProvider.java
@@ -18,17 +18,14 @@
*/
package org.apache.asterix.metadata.bootstrap;
-import static org.apache.hyracks.control.common.controllers.ControllerConfig.Option.CLOUD_DEPLOYMENT;
-
import org.apache.asterix.metadata.api.IMetadataIndex;
-import org.apache.hyracks.api.application.INCServiceContext;
public class MetadataIndexesProvider {
protected final boolean usingDatabase;
- public MetadataIndexesProvider(INCServiceContext ncServiceCtx) {
- usingDatabase = ncServiceCtx.getAppConfig().getBoolean(CLOUD_DEPLOYMENT);
+ public MetadataIndexesProvider(boolean usingDatabase) {
+ this.usingDatabase = usingDatabase;
}
public DatabaseEntity getDatabaseEntity() {
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 8dcfeaf..f37e79e 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
@@ -336,6 +336,10 @@
this.dataFormat = dataFormat;
}
+ public INamespaceResolver getNamespaceResolver() {
+ return namespaceResolver;
+ }
+
public StorageProperties getStorageProperties() {
return storageProperties;
}
@@ -1826,8 +1830,8 @@
return storageComponentProvider;
}
- public Namespace resolve(DataverseName dataverseName) {
- return namespaceResolver.resolve(dataverseName);
+ public Namespace resolve(List<String> multiIdent) throws AsterixException {
+ return namespaceResolver.resolve(multiIdent);
}
public PartitioningProperties getPartitioningProperties(Index idx) throws AlgebricksException {
diff --git a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/datagen/AdmDataGen.java b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/datagen/AdmDataGen.java
index aa86916..e9dc549 100644
--- a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/datagen/AdmDataGen.java
+++ b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/datagen/AdmDataGen.java
@@ -46,6 +46,7 @@
import org.apache.asterix.common.annotations.TypeDataGen;
import org.apache.asterix.common.annotations.UndeclaredFieldsDataGen;
import org.apache.asterix.common.exceptions.ACIDException;
+import org.apache.asterix.common.metadata.NamespaceResolver;
import org.apache.asterix.common.transactions.TxnId;
import org.apache.asterix.lang.common.base.IParser;
import org.apache.asterix.lang.common.base.IParserFactory;
@@ -927,7 +928,7 @@
private Map<TypeSignature, IAType> typeMap;
private Map<TypeSignature, TypeDataGen> typeAnnotMap;
private DataGeneratorContext dgCtx;
- private final IParserFactory parserFactory = new SqlppParserFactory();
+ private final IParserFactory parserFactory = new SqlppParserFactory(new NamespaceResolver(false));
public AdmDataGen(File schemaFile, File outputDir) {
this.schemaFile = schemaFile;