This is an automated email from the ASF dual-hosted git repository.

alsuliman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 24e35b21e0 [ASTERIXDB-3259][MTD] Add namespace path resolver
24e35b21e0 is described below

commit 24e35b21e0180430f6412381b672dac10eabfd68
Author: Ali Alsuliman <[email protected]>
AuthorDate: Thu Oct 5 10:12:42 2023 -0700

    [ASTERIXDB-3259][MTD] Add namespace path resolver
    
    - user model changes: no
    - storage format changes: no
    - interface changes: yes
    
    Details:
    Add namespace path resolver which given a database name
    and a dataverse name will resolve the storage path to
    be used depending on whether database is enabled or not.
    
    - Pass the namespace path resolver to the data partitioning
      provider.
    
    Change-Id: I285be236fd634a8e036447dbecfd0e3039613907
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17846
    Integration-Tests: Jenkins <[email protected]>
    Tested-by: Ali Alsuliman <[email protected]>
    Reviewed-by: Ali Alsuliman <[email protected]>
    Reviewed-by: Murtadha Hubail <[email protected]>
---
 .../asterix/app/cc/CcApplicationContext.java       | 20 ++++++-
 .../apache/asterix/app/nc/NCAppRuntimeContext.java | 18 +++++++
 .../org/apache/asterix/utils/DataverseUtil.java    | 27 +++++-----
 .../asterix/app/bootstrap/TestNodeController.java  |  9 +++-
 .../org/apache/asterix/common/TestDataUtil.java    |  5 +-
 .../storage/IndexDropOperatorNodePushableTest.java |  5 +-
 .../asterix/common/api/IApplicationContext.java    |  4 ++
 .../asterix/common/api/INamespacePathResolver.java | 30 +++++++++++
 .../asterix/common/api/INamespaceResolver.java     | 28 ++++++++++
 .../apache/asterix/common/metadata/Namespace.java  | 61 ++++++++++++++++++++++
 .../common/metadata/NamespacePathResolver.java     | 42 +++++++++++++++
 .../asterix/common/metadata/NamespaceResolver.java | 39 ++++++++++++++
 .../asterix/common/utils/StoragePathUtil.java      | 23 ++++----
 .../adapter/factory/GenericAdapterFactory.java     |  9 +++-
 .../external/library/ExternalLibraryManager.java   |  7 ++-
 .../apache/asterix/external/util/FeedUtils.java    |  9 ++--
 .../asterix/metadata/api/IMetadataIndex.java       |  3 +-
 .../metadata/bootstrap/MetadataBootstrap.java      |  6 ++-
 .../asterix/metadata/bootstrap/MetadataIndex.java  |  7 +--
 .../metadata/declared/MetadataProvider.java        | 12 ++++-
 .../metadata/utils/DataPartitioningProvider.java   | 12 +++--
 .../utils/DynamicDataPartitioningProvider.java     | 10 ++--
 .../metadata/utils/SplitsAndConstraintsUtil.java   | 36 ++++++-------
 .../utils/StaticDataPartitioningProvider.java      | 13 ++---
 24 files changed, 357 insertions(+), 78 deletions(-)

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 bb7be73e31..a79eb0d9dd 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
@@ -29,6 +29,8 @@ import org.apache.asterix.common.api.IConfigValidator;
 import org.apache.asterix.common.api.IConfigValidatorFactory;
 import org.apache.asterix.common.api.ICoordinationService;
 import org.apache.asterix.common.api.IMetadataLockManager;
+import org.apache.asterix.common.api.INamespacePathResolver;
+import org.apache.asterix.common.api.INamespaceResolver;
 import org.apache.asterix.common.api.INodeJobTracker;
 import org.apache.asterix.common.api.IReceptionist;
 import org.apache.asterix.common.api.IReceptionistFactory;
@@ -55,6 +57,8 @@ import 
org.apache.asterix.common.dataflow.IDataPartitioningProvider;
 import org.apache.asterix.common.external.IAdapterFactoryService;
 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;
@@ -123,6 +127,8 @@ public class CcApplicationContext implements 
ICcApplicationContext {
     private final IDataPartitioningProvider dataPartitioningProvider;
     private final IGlobalTxManager globalTxManager;
     private final IOManager ioManager;
+    private final NamespacePathResolver namespacePathResolver;
+    private final NamespaceResolver namespaceResolver;
 
     public CcApplicationContext(ICCServiceContext ccServiceCtx, 
HyracksConnection hcc,
             Supplier<IMetadataBootstrap> metadataBootstrapSupplier, 
IGlobalRecoveryManager globalRecoveryManager,
@@ -167,9 +173,11 @@ public class CcApplicationContext implements 
ICcApplicationContext {
         requestTracker = new RequestTracker(this);
         configValidator = configValidatorFactory.create();
         this.adapterFactoryService = adapterFactoryService;
-        dataPartitioningProvider = DataPartitioningProvider.create(this);
+        this.namespacePathResolver = new 
NamespacePathResolver(isCloudDeployment());
+        this.namespaceResolver = new NamespaceResolver(isCloudDeployment());
         this.globalTxManager = globalTxManager;
         this.ioManager = ioManager;
+        dataPartitioningProvider = DataPartitioningProvider.create(this);
     }
 
     @Override
@@ -379,6 +387,16 @@ public class CcApplicationContext implements 
ICcApplicationContext {
         return dataPartitioningProvider;
     }
 
+    @Override
+    public INamespaceResolver getNamespaceResolver() {
+        return namespaceResolver;
+    }
+
+    @Override
+    public INamespacePathResolver getNamespacePathResolver() {
+        return namespacePathResolver;
+    }
+
     @Override
     public boolean isCloudDeployment() {
         return ccServiceCtx.getAppConfig().getBoolean(CLOUD_DEPLOYMENT);
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 9e796f2651..2b869fd75b 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
@@ -38,6 +38,8 @@ import org.apache.asterix.common.api.IConfigValidatorFactory;
 import org.apache.asterix.common.api.ICoordinationService;
 import org.apache.asterix.common.api.IDatasetLifecycleManager;
 import org.apache.asterix.common.api.IDiskWriteRateLimiterProvider;
+import org.apache.asterix.common.api.INamespacePathResolver;
+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.IReceptionist;
@@ -59,6 +61,8 @@ import 
org.apache.asterix.common.context.DiskWriteRateLimiterProvider;
 import org.apache.asterix.common.context.GlobalVirtualBufferCache;
 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;
@@ -169,6 +173,8 @@ public class NCAppRuntimeContext implements 
INcApplicationContext {
     private IDiskWriteRateLimiterProvider diskWriteRateLimiterProvider;
     private final CloudProperties cloudProperties;
     private IPartitionBootstrapper partitionBootstrapper;
+    private final NamespacePathResolver namespacePathResolver;
+    private final NamespaceResolver namespaceResolver;
 
     public NCAppRuntimeContext(INCServiceContext ncServiceContext, 
NCExtensionManager extensionManager,
             IPropertiesFactory propertiesFactory) {
@@ -190,6 +196,8 @@ public class NCAppRuntimeContext implements 
INcApplicationContext {
                 .createResourceIdFactory();
         persistedResourceRegistry = 
ncServiceContext.getPersistedResourceRegistry();
         cacheManager = new CacheManager();
+        namespacePathResolver = new NamespacePathResolver(isCloudDeployment());
+        namespaceResolver = new NamespaceResolver(isCloudDeployment());
     }
 
     @Override
@@ -465,6 +473,16 @@ public class NCAppRuntimeContext implements 
INcApplicationContext {
         return libraryManager;
     }
 
+    @Override
+    public INamespaceResolver getNamespaceResolver() {
+        return namespaceResolver;
+    }
+
+    @Override
+    public INamespacePathResolver getNamespacePathResolver() {
+        return namespacePathResolver;
+    }
+
     @Override
     public void initializeMetadata(boolean newUniverse, int partitionId) 
throws Exception {
         LOGGER.info("Bootstrapping ({}) metadata in partition {}", newUniverse 
? "new" : "existing", partitionId);
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/DataverseUtil.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/DataverseUtil.java
index 3b7cb00202..d132b6b295 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/DataverseUtil.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/DataverseUtil.java
@@ -31,24 +31,21 @@ public class DataverseUtil {
     private DataverseUtil() {
     }
 
-    public static JobSpecification dropDataverseJobSpec(Dataverse dataverse, 
MetadataProvider metadata) {
-        JobSpecification jobSpec = 
RuntimeUtils.createJobSpecification(metadata.getApplicationContext());
-        PartitioningProperties partitioningProperties = 
metadata.splitAndConstraints(dataverse.getDataverseName());
-        FileRemoveOperatorDescriptor frod = new 
FileRemoveOperatorDescriptor(jobSpec,
-                partitioningProperties.getSplitsProvider(), false, 
partitioningProperties.getComputeStorageMap());
-        
AlgebricksPartitionConstraintHelper.setPartitionConstraintInJobSpec(jobSpec, 
frod,
-                partitioningProperties.getConstraints());
-        jobSpec.addRoot(frod);
-        return jobSpec;
+    public static JobSpecification dropDataverseJobSpec(Dataverse dataverse, 
MetadataProvider md) {
+        PartitioningProperties pp = 
md.splitAndConstraints(dataverse.getDatabaseName(), 
dataverse.getDataverseName());
+        return dropJobSpec(md, pp);
+    }
+
+    public static JobSpecification dropDatabaseJobSpec(String database, 
MetadataProvider md) {
+        PartitioningProperties pp = md.splitAndConstraints(database);
+        return dropJobSpec(md, pp);
     }
 
-    public static JobSpecification dropDatabaseJobSpec(String database, 
MetadataProvider metadata) {
+    private static JobSpecification dropJobSpec(MetadataProvider metadata, 
PartitioningProperties pp) {
         JobSpecification jobSpec = 
RuntimeUtils.createJobSpecification(metadata.getApplicationContext());
-        PartitioningProperties partitioningProperties = 
metadata.splitAndConstraints(database);
-        FileRemoveOperatorDescriptor frod = new 
FileRemoveOperatorDescriptor(jobSpec,
-                partitioningProperties.getSplitsProvider(), false, 
partitioningProperties.getComputeStorageMap());
-        
AlgebricksPartitionConstraintHelper.setPartitionConstraintInJobSpec(jobSpec, 
frod,
-                partitioningProperties.getConstraints());
+        FileRemoveOperatorDescriptor frod =
+                new FileRemoveOperatorDescriptor(jobSpec, 
pp.getSplitsProvider(), false, pp.getComputeStorageMap());
+        
AlgebricksPartitionConstraintHelper.setPartitionConstraintInJobSpec(jobSpec, 
frod, pp.getConstraints());
         jobSpec.addRoot(frod);
         return jobSpec;
     }
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
index 63958ce2df..f9296772eb 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
@@ -37,6 +37,7 @@ import 
org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.common.dataflow.LSMInsertDeleteOperatorNodePushable;
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.metadata.MetadataUtil;
+import org.apache.asterix.common.metadata.NamespacePathResolver;
 import org.apache.asterix.common.transactions.ITransactionManager;
 import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.dataflow.data.nontagged.MissingWriterFactory;
@@ -673,8 +674,10 @@ public class TestNodeController {
             List<String> nodes = 
Collections.singletonList(ExecutionTestUtil.integrationUtil.ncs[0].getId());
             CcApplicationContext appCtx =
                     (CcApplicationContext) 
ExecutionTestUtil.integrationUtil.cc.getApplicationContext();
+            String dvPath = new 
NamespacePathResolver(false).resolve(primaryIndexInfo.dataset.getDatabaseName(),
+                    primaryIndexInfo.dataset.getDataverseName());
             FileSplit[] splits = 
SplitsAndConstraintsUtil.getIndexSplits(appCtx.getClusterStateManager(),
-                    primaryIndexInfo.dataset, secondaryIndex.getIndexName(), 
nodes);
+                    primaryIndexInfo.dataset, secondaryIndex.getIndexName(), 
nodes, dvPath);
             fileSplitProvider = new ConstantFileSplitProvider(splits);
             secondaryIndexTypeTraits = 
createSecondaryIndexTypeTraits(primaryIndexInfo.recordType,
                     primaryIndexInfo.metaType, 
primaryIndexInfo.primaryKeyTypes, secondaryIndexDetails
@@ -760,8 +763,10 @@ public class TestNodeController {
             List<String> nodes = 
Collections.singletonList(ExecutionTestUtil.integrationUtil.ncs[0].getId());
             CcApplicationContext appCtx =
                     (CcApplicationContext) 
ExecutionTestUtil.integrationUtil.cc.getApplicationContext();
+            String dvPath =
+                    new 
NamespacePathResolver(false).resolve(dataset.getDatabaseName(), 
dataset.getDataverseName());
             FileSplit[] splits = 
SplitsAndConstraintsUtil.getIndexSplits(appCtx.getClusterStateManager(), 
dataset,
-                    index.getIndexName(), nodes);
+                    index.getIndexName(), nodes, dvPath);
             fileSplitProvider = new ConstantFileSplitProvider(splits);
         }
 
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/TestDataUtil.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/TestDataUtil.java
index bbdbe827e7..ea34f482d8 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/TestDataUtil.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/TestDataUtil.java
@@ -32,6 +32,7 @@ import org.apache.asterix.common.api.IMetadataLockManager;
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.common.metadata.MetadataConstants;
+import org.apache.asterix.common.metadata.NamespacePathResolver;
 import org.apache.asterix.common.utils.Servlets;
 import org.apache.asterix.metadata.MetadataManager;
 import org.apache.asterix.metadata.MetadataTransactionContext;
@@ -251,8 +252,10 @@ public class TestDataUtil {
                 (ICcApplicationContext) 
integrationUtil.getClusterControllerService().getApplicationContext();
         final MetadataTransactionContext mdTxnCtx = 
MetadataManager.INSTANCE.beginTransaction();
         try {
+            String dvPath =
+                    new 
NamespacePathResolver(false).resolve(dataset.getDatabaseName(), 
dataset.getDataverseName());
             return SplitsAndConstraintsUtil.getIndexSplits(dataset, 
dataset.getDatasetName(), mdTxnCtx,
-                    ccAppCtx.getClusterStateManager());
+                    ccAppCtx.getClusterStateManager(), dvPath);
         } finally {
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
         }
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
index d5c84659f4..bdbdfab931 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
@@ -32,6 +32,7 @@ import 
org.apache.asterix.common.dataflow.ICcApplicationContext;
 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.NamespacePathResolver;
 import org.apache.asterix.file.StorageComponentProvider;
 import org.apache.asterix.metadata.MetadataManager;
 import org.apache.asterix.metadata.MetadataTransactionContext;
@@ -158,8 +159,10 @@ public class IndexDropOperatorNodePushableTest {
             final Dataset dataset = MetadataManager.INSTANCE.getDataset(mdTxn, 
MetadataConstants.DEFAULT_DATABASE,
                     defaultDv, datasetName);
             MetadataManager.INSTANCE.commitTransaction(mdTxn);
+            String dvPath =
+                    new 
NamespacePathResolver(false).resolve(dataset.getDatabaseName(), 
dataset.getDataverseName());
             FileSplit[] splits = 
SplitsAndConstraintsUtil.getIndexSplits(appCtx.getClusterStateManager(), 
dataset,
-                    indexName, Arrays.asList("asterix_nc1"));
+                    indexName, Arrays.asList("asterix_nc1"), dvPath);
             final ConstantFileSplitProvider constantFileSplitProvider =
                     new ConstantFileSplitProvider(Arrays.copyOfRange(splits, 
0, 1));
             IndexDataflowHelperFactory helperFactory =
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IApplicationContext.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IApplicationContext.java
index 812e2e55f1..eabebf7b3a 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IApplicationContext.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IApplicationContext.java
@@ -102,4 +102,8 @@ public interface IApplicationContext {
      * @return the cloud properties
      */
     CloudProperties getCloudProperties();
+
+    INamespaceResolver getNamespaceResolver();
+
+    INamespacePathResolver getNamespacePathResolver();
 }
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INamespacePathResolver.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INamespacePathResolver.java
new file mode 100644
index 0000000000..6f33d6f29a
--- /dev/null
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INamespacePathResolver.java
@@ -0,0 +1,30 @@
+/*
+ * 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.common.api;
+
+import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
+
+public interface INamespacePathResolver {
+
+    String resolve(Namespace namespace);
+
+    String resolve(String databaseName, DataverseName dataverseName);
+
+}
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
new file mode 100644
index 0000000000..f281280fde
--- /dev/null
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INamespaceResolver.java
@@ -0,0 +1,28 @@
+/*
+ * 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.common.api;
+
+import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
+
+public interface INamespaceResolver {
+
+    Namespace resolve(DataverseName dataverseName);
+
+}
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/Namespace.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/Namespace.java
new file mode 100644
index 0000000000..26b549ae81
--- /dev/null
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/Namespace.java
@@ -0,0 +1,61 @@
+/*
+ * 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.common.metadata;
+
+import java.util.Objects;
+
+public final class Namespace {
+
+    private final String databaseName;
+    private final DataverseName dataverseName;
+
+    public Namespace(String databaseName, DataverseName dataverseName) {
+        this.databaseName = Objects.requireNonNull(databaseName);
+        this.dataverseName = Objects.requireNonNull(dataverseName);
+    }
+
+    public String getDatabaseName() {
+        return databaseName;
+    }
+
+    public DataverseName getDataverseName() {
+        return dataverseName;
+    }
+
+    @Override
+    public String toString() {
+        return databaseName + "." + dataverseName;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(databaseName, dataverseName);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof Namespace)) {
+            return false;
+        }
+        Namespace that = (Namespace) obj;
+        return Objects.equals(databaseName, that.databaseName) && 
Objects.equals(dataverseName, that.dataverseName);
+    }
+
+}
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/NamespacePathResolver.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/NamespacePathResolver.java
new file mode 100644
index 0000000000..26d1ce06f9
--- /dev/null
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/NamespacePathResolver.java
@@ -0,0 +1,42 @@
+/*
+ * 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.common.metadata;
+
+import org.apache.asterix.common.api.INamespacePathResolver;
+import org.apache.asterix.common.utils.StoragePathUtil;
+
+public class NamespacePathResolver implements INamespacePathResolver {
+
+    private final boolean usingDatabase;
+
+    public NamespacePathResolver(boolean usingDatabase) {
+        this.usingDatabase = false;
+    }
+
+    @Override
+    public String resolve(Namespace namespace) {
+        return 
StoragePathUtil.prepareDataverseName(namespace.getDataverseName());
+    }
+
+    @Override
+    public String resolve(String databaseName, DataverseName dataverseName) {
+        return StoragePathUtil.prepareDataverseName(dataverseName);
+    }
+}
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
new file mode 100644
index 0000000000..14bba84694
--- /dev/null
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/NamespaceResolver.java
@@ -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.
+ */
+
+package org.apache.asterix.common.metadata;
+
+import org.apache.asterix.common.api.INamespaceResolver;
+
+public class NamespaceResolver implements INamespaceResolver {
+
+    private final boolean usingDatabase;
+
+    public NamespaceResolver(boolean usingDatabase) {
+        this.usingDatabase = false;
+    }
+
+    @Override
+    public Namespace resolve(DataverseName dataverseName) {
+        if (dataverseName == null) {
+            return null;
+        }
+        return new Namespace(MetadataUtil.databaseFor(dataverseName), 
dataverseName);
+    }
+}
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java
index 418e1717aa..9862be7826 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java
@@ -24,6 +24,7 @@ import static 
org.apache.asterix.common.utils.StorageConstants.STORAGE_ROOT_DIR_
 import java.io.File;
 import java.nio.file.Paths;
 import java.util.Iterator;
+import java.util.List;
 
 import org.apache.asterix.common.cluster.ClusterPartition;
 import org.apache.asterix.common.metadata.DataverseName;
@@ -46,7 +47,7 @@ public class StoragePathUtil {
 
     private static final Logger LOGGER = LogManager.getLogger();
     public static final char DATAVERSE_CONTINUATION_MARKER = '^';
-    private static String PARTITION_PATH = STORAGE_ROOT_DIR_NAME + 
File.separator + PARTITION_DIR_PREFIX;
+    private static final String PARTITION_PATH = STORAGE_ROOT_DIR_NAME + 
File.separator + PARTITION_DIR_PREFIX;
 
     private StoragePathUtil() {
     }
@@ -74,21 +75,25 @@ public class StoragePathUtil {
         return new DefaultIoDeviceFileSplit(nodeId, relativePath);
     }
 
-    public static String prepareStoragePartitionPath(int partitonId) {
-        return Paths.get(StorageConstants.STORAGE_ROOT_DIR_NAME, 
PARTITION_DIR_PREFIX + partitonId).toString();
+    public static String prepareStoragePartitionPath(int partitionId) {
+        return Paths.get(StorageConstants.STORAGE_ROOT_DIR_NAME, 
PARTITION_DIR_PREFIX + partitionId).toString();
     }
 
     public static String prepareIngestionLogPath() {
         return Paths.get(StorageConstants.INGESTION_LOGS_DIR_NAME).toString();
     }
 
-    public static String prepareDataverseIndexName(DataverseName 
dataverseName, String datasetName, String idxName,
-            long rebalanceCount) {
-        return prepareDataverseComponentName(dataverseName, 
prepareFullIndexName(datasetName, idxName, rebalanceCount));
+    public static String prepareNamespaceIndexName(String datasetName, String 
idxName, long rebalanceCount,
+            String namespacePath) {
+        return prepareNamespaceComponentName(namespacePath, 
prepareFullIndexName(datasetName, idxName, rebalanceCount));
     }
 
     public static String prepareDataverseName(DataverseName dataverseName) {
-        Iterator<String> dvParts = dataverseName.getParts().iterator();
+        List<String> parts = dataverseName.getParts();
+        if (parts.size() < 2) {
+            return parts.get(0);
+        }
+        Iterator<String> dvParts = parts.iterator();
         StringBuilder builder = new StringBuilder();
         builder.append(dvParts.next());
         while (dvParts.hasNext()) {
@@ -97,8 +102,8 @@ public class StoragePathUtil {
         return builder.toString();
     }
 
-    public static String prepareDataverseComponentName(DataverseName 
dataverseName, String component) {
-        return prepareDataverseName(dataverseName) + File.separatorChar + 
component;
+    public static String prepareNamespaceComponentName(String namespacePath, 
String component) {
+        return namespacePath + File.separatorChar + component;
     }
 
     private static String prepareFullIndexName(String datasetName, String 
idxName, long rebalanceCount) {
diff --git 
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/adapter/factory/GenericAdapterFactory.java
 
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/adapter/factory/GenericAdapterFactory.java
index 7398d0284c..759d86ee5f 100644
--- 
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/adapter/factory/GenericAdapterFactory.java
+++ 
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/adapter/factory/GenericAdapterFactory.java
@@ -27,6 +27,8 @@ import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.external.IDataSourceAdapter;
 import org.apache.asterix.common.external.IExternalFilterEvaluatorFactory;
 import org.apache.asterix.common.library.ILibraryManager;
+import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.MetadataUtil;
 import org.apache.asterix.external.api.IDataFlowController;
 import org.apache.asterix.external.api.IDataParserFactory;
 import org.apache.asterix.external.api.IExternalDataSourceFactory;
@@ -156,9 +158,12 @@ public class GenericAdapterFactory implements 
ITypedAdapterFactory {
         this.isFeed = ExternalDataUtils.isFeed(configuration);
         this.logIngestionEvents = 
ExternalDataUtils.isLogIngestionEvents(configuration);
         if (logIngestionEvents) {
+            DataverseName dataverseName = 
ExternalDataUtils.getDatasetDataverse(configuration);
+            String databaseName = MetadataUtil.databaseFor(dataverseName);
+            String namespacePath = 
appCtx.getNamespacePathResolver().resolve(databaseName, dataverseName);
             //TODO(partitioning) make this code reuse DataPartitioningProvider
-            feedLogFileSplits = 
FeedUtils.splitsForAdapter(ExternalDataUtils.getDatasetDataverse(configuration),
-                    ExternalDataUtils.getFeedName(configuration), 
dataSourceFactory.getPartitionConstraint());
+            feedLogFileSplits = FeedUtils.splitsForAdapter(namespacePath, 
ExternalDataUtils.getFeedName(configuration),
+                    dataSourceFactory.getPartitionConstraint());
         }
     }
 
diff --git 
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/ExternalLibraryManager.java
 
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/ExternalLibraryManager.java
index 050d9f0071..59b1a02cb7 100755
--- 
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/ExternalLibraryManager.java
+++ 
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/ExternalLibraryManager.java
@@ -55,6 +55,8 @@ import java.util.zip.ZipFile;
 
 import javax.net.ssl.SSLContext;
 
+import org.apache.asterix.common.api.INamespacePathResolver;
+import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.functions.ExternalFunctionLanguage;
@@ -136,17 +138,20 @@ public class ExternalLibraryManager implements 
ILibraryManager, ILifeCycleCompon
     private final FileReference trashDir;
     private final FileReference distDir;
     private final Path trashDirPath;
+    //TODO(DB): change for database
     private final Map<Pair<DataverseName, String>, ILibrary> libraries = new 
HashMap<>();
     private IPCSystem pythonIPC;
     private final ExternalFunctionResultRouter router;
     private final IIOManager ioManager;
-    private boolean sslEnabled;
+    private final INamespacePathResolver namespacePathResolver;
+    private final boolean sslEnabled;
     private Function<ILibraryManager, CloseableHttpClient> uploadClientSupp;
 
     public ExternalLibraryManager(NodeControllerService ncs, 
IPersistedResourceRegistry reg, FileReference appDir,
             IIOManager ioManager) {
         this.ncs = ncs;
         this.reg = reg;
+        namespacePathResolver = ((INcApplicationContext) 
ncs.getApplicationContext()).getNamespacePathResolver();
         baseDir = appDir.getChild(LIBRARY_MANAGER_BASE_DIR_NAME);
         storageDir = baseDir.getChild(STORAGE_DIR_NAME);
         storageDirPath = storageDir.getFile().toPath();
diff --git 
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java
 
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java
index 5baefcba47..bf924fc079 100644
--- 
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java
+++ 
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java
@@ -32,7 +32,6 @@ import 
org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.common.utils.StoragePathUtil;
 import org.apache.asterix.runtime.utils.RuntimeUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -80,8 +79,8 @@ public class FeedUtils {
     private FeedUtils() {
     }
 
-    private static FileSplit splitsForAdapter(DataverseName dataverseName, 
String feedName, String nodeName) {
-        String relPathFile = 
StoragePathUtil.prepareDataverseComponentName(dataverseName, feedName);
+    private static FileSplit splitsForAdapter(String namespacePath, String 
feedName, String nodeName) {
+        String relPathFile = 
StoragePathUtil.prepareNamespaceComponentName(namespacePath, feedName);
         String storagePartitionPath = 
StoragePathUtil.prepareIngestionLogPath();
         // Note: feed adapter instances in a single node share the feed logger
         // format: 'ingestion logs dir 
name'/dataverse_part1[^dataverse_part2[...]]/feed/node
@@ -89,7 +88,7 @@ public class FeedUtils {
         return StoragePathUtil.getDefaultIoDeviceFileSpiltForNode(nodeName, 
f.getPath());
     }
 
-    public static FileSplit[] splitsForAdapter(DataverseName dataverseName, 
String feedName,
+    public static FileSplit[] splitsForAdapter(String namespacePath, String 
feedName,
             AlgebricksPartitionConstraint partitionConstraints) throws 
AsterixException {
         if (partitionConstraints.getPartitionConstraintType() == 
PartitionConstraintType.COUNT) {
             throw new AsterixException("Can't create file splits for adapter 
with count partitioning constraints");
@@ -97,7 +96,7 @@ public class FeedUtils {
         String[] locations = ((AlgebricksAbsolutePartitionConstraint) 
partitionConstraints).getLocations();
         List<FileSplit> splits = new ArrayList<>();
         for (String nd : locations) {
-            splits.add(splitsForAdapter(dataverseName, feedName, nd));
+            splits.add(splitsForAdapter(namespacePath, feedName, nd));
         }
         return splits.toArray(new FileSplit[] {});
     }
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataIndex.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataIndex.java
index 21329accd9..082eb2f6ac 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataIndex.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataIndex.java
@@ -22,6 +22,7 @@ package org.apache.asterix.metadata.api;
 import java.io.Serializable;
 import java.util.List;
 
+import org.apache.asterix.common.api.INamespacePathResolver;
 import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.common.transactions.DatasetId;
 import org.apache.asterix.om.types.ARecordType;
@@ -67,7 +68,7 @@ public interface IMetadataIndex extends Serializable {
 
     public int[] getFieldPermutation();
 
-    public String getFileNameRelativePath();
+    public String getFileNameRelativePath(INamespacePathResolver 
namespacePathResolver);
 
     public ARecordType getPayloadRecordType();
 
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
index 4bab4c9ed9..b154287168 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
@@ -26,6 +26,7 @@ import java.util.HashMap;
 import java.util.List;
 
 import org.apache.asterix.common.api.ILSMComponentIdGeneratorFactory;
+import org.apache.asterix.common.api.INamespacePathResolver;
 import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.config.MetadataProperties;
@@ -392,9 +393,12 @@ public class MetadataBootstrap {
     public static void enlistMetadataDataset(INCServiceContext ncServiceCtx, 
IMetadataIndex index,
             MetadataIndexesProvider mdIndexesProvider) throws 
HyracksDataException {
         final int datasetId = index.getDatasetId().getId();
+        INamespacePathResolver namespacePathResolver =
+                ((INcApplicationContext) 
ncServiceCtx.getApplicationContext()).getNamespacePathResolver();
         String metadataPartitionPath =
                 
StoragePathUtil.prepareStoragePartitionPath(MetadataNode.INSTANCE.getMetadataStoragePartition());
-        String resourceName = metadataPartitionPath + File.separator + 
index.getFileNameRelativePath();
+        String resourceName =
+                metadataPartitionPath + File.separator + 
index.getFileNameRelativePath(namespacePathResolver);
         FileReference file = ioManager.resolve(resourceName);
         index.setFile(file);
         ITypeTraits[] typeTraits = index.getTypeTraits();
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataIndex.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataIndex.java
index d259643fc6..c06b878cfb 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataIndex.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataIndex.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import org.apache.asterix.common.api.INamespacePathResolver;
 import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.common.metadata.MetadataConstants;
 import org.apache.asterix.common.metadata.MetadataIndexImmutableProperties;
@@ -237,10 +238,10 @@ public class MetadataIndex implements IMetadataIndex {
     }
 
     @Override
-    public String getFileNameRelativePath() {
+    public String getFileNameRelativePath(INamespacePathResolver 
namespacePathResolver) {
         // The rebalance count for metadata dataset is always 0.
-        return StoragePathUtil.prepareDataverseIndexName(getDataverseName(), 
getIndexedDatasetName(), getIndexName(),
-                0);
+        String namespacePath = 
namespacePathResolver.resolve(getDatabaseName(), getDataverseName());
+        return 
StoragePathUtil.prepareNamespaceIndexName(getIndexedDatasetName(), 
getIndexName(), 0, namespacePath);
     }
 
     @Override
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 0ecef7d012..d1b07c5812 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
@@ -32,6 +32,7 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
+import org.apache.asterix.common.api.INamespaceResolver;
 import org.apache.asterix.common.cluster.PartitioningProperties;
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.config.DatasetConfig.IndexType;
@@ -49,6 +50,7 @@ import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.common.metadata.LockList;
 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.storage.ICompressionManager;
 import org.apache.asterix.common.transactions.ITxnIdFactory;
 import org.apache.asterix.common.transactions.TxnId;
@@ -189,6 +191,7 @@ public class MetadataProvider implements 
IMetadataProvider<DataSourceId, String>
     private boolean blockingOperatorDisabled = false;
 
     private final DataPartitioningProvider dataPartitioningProvider;
+    private final INamespaceResolver namespaceResolver;
     private IDataFormat dataFormat = FormatUtils.getDefaultFormat();
 
     public static MetadataProvider create(ICcApplicationContext appCtx, 
Dataverse defaultDataverse) {
@@ -202,6 +205,7 @@ public class MetadataProvider implements 
IMetadataProvider<DataSourceId, String>
     protected MetadataProvider(ICcApplicationContext appCtx) {
         this.appCtx = appCtx;
         this.storageComponentProvider = appCtx.getStorageComponentProvider();
+        namespaceResolver = appCtx.getNamespaceResolver();
         storageProperties = appCtx.getStorageProperties();
         functionManager = ((IFunctionExtensionManager) 
appCtx.getExtensionManager()).getFunctionManager();
         dataPartitioningProvider = (DataPartitioningProvider) 
appCtx.getDataPartitioningProvider();
@@ -959,8 +963,8 @@ public class MetadataProvider implements 
IMetadataProvider<DataSourceId, String>
         return 
dataPartitioningProvider.getPartitioningProperties(databaseName);
     }
 
-    public PartitioningProperties splitAndConstraints(DataverseName 
dataverseName) {
-        return 
dataPartitioningProvider.getPartitioningProperties(dataverseName);
+    public PartitioningProperties splitAndConstraints(String databaseName, 
DataverseName dataverseName) {
+        return 
dataPartitioningProvider.getPartitioningProperties(databaseName, dataverseName);
     }
 
     public FileSplit[] splitsForIndex(MetadataTransactionContext mdTxnCtx, 
Dataset dataset, String indexName)
@@ -1823,6 +1827,10 @@ public class MetadataProvider implements 
IMetadataProvider<DataSourceId, String>
         return storageComponentProvider;
     }
 
+    public Namespace resolve(DataverseName dataverseName) {
+        return namespaceResolver.resolve(dataverseName);
+    }
+
     public PartitioningProperties getPartitioningProperties(Index idx) throws 
AlgebricksException {
         Dataset ds = findDataset(idx.getDatabaseName(), 
idx.getDataverseName(), idx.getDatasetName());
         return getPartitioningProperties(ds, idx.getIndexName());
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DataPartitioningProvider.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DataPartitioningProvider.java
index d99aa137cf..53c5d444bc 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DataPartitioningProvider.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DataPartitioningProvider.java
@@ -22,6 +22,8 @@ import java.util.Arrays;
 import java.util.Set;
 import java.util.TreeSet;
 
+import org.apache.asterix.common.api.INamespacePathResolver;
+import org.apache.asterix.common.api.INamespaceResolver;
 import org.apache.asterix.common.cluster.IClusterStateManager;
 import org.apache.asterix.common.cluster.PartitioningProperties;
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
@@ -47,11 +49,15 @@ import 
org.apache.hyracks.dataflow.std.file.IFileSplitProvider;
 public abstract class DataPartitioningProvider implements 
IDataPartitioningProvider {
 
     protected final ICcApplicationContext appCtx;
+    protected final INamespacePathResolver namespacePathResolver;
+    protected final INamespaceResolver namespaceResolver;
     protected final ClusterStateManager clusterStateManager;
     protected final int storagePartitionsCounts;
 
     DataPartitioningProvider(ICcApplicationContext appCtx) {
         this.appCtx = appCtx;
+        this.namespacePathResolver = appCtx.getNamespacePathResolver();
+        this.namespaceResolver = appCtx.getNamespaceResolver();
         this.clusterStateManager = (ClusterStateManager) 
appCtx.getClusterStateManager();
         this.storagePartitionsCounts = 
clusterStateManager.getStoragePartitionsCount();
     }
@@ -70,7 +76,7 @@ public abstract class DataPartitioningProvider implements 
IDataPartitioningProvi
 
     public abstract PartitioningProperties getPartitioningProperties(String 
databaseName);
 
-    public abstract PartitioningProperties 
getPartitioningProperties(DataverseName dataverseName);
+    public abstract PartitioningProperties getPartitioningProperties(String 
databaseName, DataverseName dataverseName);
 
     public abstract PartitioningProperties 
getPartitioningProperties(MetadataTransactionContext mdTxnCtx, Dataset ds,
             String indexName) throws AlgebricksException;
@@ -81,8 +87,8 @@ public abstract class DataPartitioningProvider implements 
IDataPartitioningProvi
         Set<String> nodes = new 
TreeSet<>(Arrays.asList(allCluster.getLocations()));
         AlgebricksAbsolutePartitionConstraint locations =
                 new AlgebricksAbsolutePartitionConstraint(nodes.toArray(new 
String[0]));
-        FileSplit[] feedLogFileSplits =
-                FeedUtils.splitsForAdapter(feed.getDataverseName(), 
feed.getFeedName(), locations);
+        String namespacePath = 
namespacePathResolver.resolve(feed.getDatabaseName(), feed.getDataverseName());
+        FileSplit[] feedLogFileSplits = 
FeedUtils.splitsForAdapter(namespacePath, feed.getFeedName(), locations);
         Pair<IFileSplitProvider, AlgebricksPartitionConstraint> spC =
                 
StoragePathUtil.splitProviderAndPartitionConstraints(feedLogFileSplits);
         int[][] partitionsMap = 
getOneToOnePartitionsMap(getLocationsCount(spC.second));
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DynamicDataPartitioningProvider.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DynamicDataPartitioningProvider.java
index 803a53b7d9..57392db4f0 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DynamicDataPartitioningProvider.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DynamicDataPartitioningProvider.java
@@ -45,9 +45,10 @@ public class DynamicDataPartitioningProvider extends 
DataPartitioningProvider {
     }
 
     @Override
-    public PartitioningProperties getPartitioningProperties(DataverseName 
dataverseName) {
+    public PartitioningProperties getPartitioningProperties(String 
databaseName, DataverseName dataverseName) {
+        String namespacePath = namespacePathResolver.resolve(databaseName, 
dataverseName);
         Pair<IFileSplitProvider, AlgebricksPartitionConstraint> 
splitsAndConstraints = SplitsAndConstraintsUtil
-                
.getDataverseSplitProviderAndConstraints(appCtx.getClusterStateManager(), 
dataverseName);
+                
.getDataverseSplitProviderAndConstraints(appCtx.getClusterStateManager(), 
namespacePath);
         int[][] partitionsMap = 
getOneToOnePartitionsMap(getLocationsCount(splitsAndConstraints.second));
         return PartitioningProperties.of(splitsAndConstraints.first, 
splitsAndConstraints.second, partitionsMap);
     }
@@ -55,8 +56,9 @@ public class DynamicDataPartitioningProvider extends 
DataPartitioningProvider {
     @Override
     public PartitioningProperties 
getPartitioningProperties(MetadataTransactionContext mdTxnCtx, Dataset ds,
             String indexName) throws AlgebricksException {
-        FileSplit[] splits =
-                SplitsAndConstraintsUtil.getIndexSplits(ds, indexName, 
mdTxnCtx, appCtx.getClusterStateManager());
+        String namespacePath = 
namespacePathResolver.resolve(ds.getDatabaseName(), ds.getDataverseName());
+        FileSplit[] splits = SplitsAndConstraintsUtil.getIndexSplits(ds, 
indexName, mdTxnCtx,
+                appCtx.getClusterStateManager(), namespacePath);
         Pair<IFileSplitProvider, AlgebricksPartitionConstraint> 
splitsAndConstraints =
                 StoragePathUtil.splitProviderAndPartitionConstraints(splits);
         int[][] partitionsMap = 
getOneToOnePartitionsMap(getLocationsCount(splitsAndConstraints.second));
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SplitsAndConstraintsUtil.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SplitsAndConstraintsUtil.java
index 2abb4f6ad5..da7cd0d742 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SplitsAndConstraintsUtil.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SplitsAndConstraintsUtil.java
@@ -27,7 +27,6 @@ import java.util.List;
 import org.apache.asterix.common.cluster.ClusterPartition;
 import org.apache.asterix.common.cluster.IClusterStateManager;
 import org.apache.asterix.common.exceptions.MetadataException;
-import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.common.metadata.MetadataConstants;
 import org.apache.asterix.common.utils.StoragePathUtil;
 import org.apache.asterix.metadata.MetadataManager;
@@ -45,47 +44,42 @@ public class SplitsAndConstraintsUtil {
     private SplitsAndConstraintsUtil() {
     }
 
-    private static FileSplit[] getDatabaseSplits(IClusterStateManager 
clusterStateManager, String databaseName) {
-        List<FileSplit> splits = new ArrayList<>();
-        // get all partitions
-        for (ClusterPartition clusterPartition : 
clusterStateManager.getClusterPartitons()) {
-            File f = new 
File(StoragePathUtil.prepareStoragePartitionPath(clusterPartition.getPartitionId()),
-                    databaseName);
-            
splits.add(StoragePathUtil.getFileSplitForClusterPartition(clusterPartition, 
f.getPath()));
-        }
-        return splits.toArray(new FileSplit[] {});
+    private static FileSplit[] getDatabaseSplits(IClusterStateManager 
clusterStateManager, String databasePath) {
+        return getSplits(clusterStateManager, databasePath);
+    }
+
+    private static FileSplit[] getDataverseSplits(IClusterStateManager 
clusterStateManager, String dataversePath) {
+        return getSplits(clusterStateManager, dataversePath);
     }
 
-    private static FileSplit[] getDataverseSplits(IClusterStateManager 
clusterStateManager,
-            DataverseName dataverseName) {
+    private static FileSplit[] getSplits(IClusterStateManager 
clusterStateManager, String path) {
         List<FileSplit> splits = new ArrayList<>();
         // get all partitions
         for (ClusterPartition clusterPartition : 
clusterStateManager.getClusterPartitons()) {
-            File f = new 
File(StoragePathUtil.prepareStoragePartitionPath(clusterPartition.getPartitionId()),
-                    StoragePathUtil.prepareDataverseName(dataverseName));
+            File f = new 
File(StoragePathUtil.prepareStoragePartitionPath(clusterPartition.getPartitionId()),
 path);
             
splits.add(StoragePathUtil.getFileSplitForClusterPartition(clusterPartition, 
f.getPath()));
         }
         return splits.toArray(new FileSplit[] {});
     }
 
     public static FileSplit[] getIndexSplits(Dataset dataset, String 
indexName, MetadataTransactionContext mdTxnCtx,
-            IClusterStateManager csm) throws AlgebricksException {
+            IClusterStateManager csm, String namespacePath) throws 
AlgebricksException {
         try {
             NodeGroup nodeGroup = 
MetadataManager.INSTANCE.getNodegroup(mdTxnCtx, dataset.getNodeGroupName());
             if (nodeGroup == null) {
                 throw new AlgebricksException("Couldn't find node group " + 
dataset.getNodeGroupName());
             }
             List<String> nodeList = nodeGroup.getNodeNames();
-            return getIndexSplits(csm, dataset, indexName, nodeList);
+            return getIndexSplits(csm, dataset, indexName, nodeList, 
namespacePath);
         } catch (MetadataException me) {
             throw new AlgebricksException(me);
         }
     }
 
     public static FileSplit[] getIndexSplits(IClusterStateManager 
clusterStateManager, Dataset dataset,
-            String indexName, List<String> nodes) {
-        final String relPath = 
StoragePathUtil.prepareDataverseIndexName(dataset.getDataverseName(),
-                dataset.getDatasetName(), indexName, 
dataset.getRebalanceCount());
+            String indexName, List<String> nodes, String namespacePath) {
+        final String relPath = 
StoragePathUtil.prepareNamespaceIndexName(dataset.getDatasetName(), indexName,
+                dataset.getRebalanceCount(), namespacePath);
         final List<ClusterPartition> datasetPartitions = 
getDatasetPartitions(clusterStateManager, dataset, nodes);
         final List<FileSplit> splits = new ArrayList<>();
         for (ClusterPartition partition : datasetPartitions) {
@@ -102,8 +96,8 @@ public class SplitsAndConstraintsUtil {
     }
 
     public static Pair<IFileSplitProvider, AlgebricksPartitionConstraint> 
getDataverseSplitProviderAndConstraints(
-            IClusterStateManager clusterStateManager, DataverseName 
dataverseName) {
-        FileSplit[] splits = getDataverseSplits(clusterStateManager, 
dataverseName);
+            IClusterStateManager clusterStateManager, String dataversePath) {
+        FileSplit[] splits = getDataverseSplits(clusterStateManager, 
dataversePath);
         return StoragePathUtil.splitProviderAndPartitionConstraints(splits);
     }
 
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/StaticDataPartitioningProvider.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/StaticDataPartitioningProvider.java
index f8f967ad97..7206a5084a 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/StaticDataPartitioningProvider.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/StaticDataPartitioningProvider.java
@@ -58,8 +58,8 @@ public class StaticDataPartitioningProvider extends 
DataPartitioningProvider {
     }
 
     @Override
-    public PartitioningProperties getPartitioningProperties(DataverseName 
dataverseName) {
-        SplitComputeLocations dataverseSplits = 
getDataverseSplits(dataverseName);
+    public PartitioningProperties getPartitioningProperties(String 
databaseName, DataverseName dataverseName) {
+        SplitComputeLocations dataverseSplits = 
getDataverseSplits(databaseName, dataverseName);
         StorageComputePartitionsMap partitionMap = 
clusterStateManager.getStorageComputeMap();
         int[][] partitionsMap = partitionMap.getComputeToStorageMap(false);
         return PartitioningProperties.of(dataverseSplits.getSplitsProvider(), 
dataverseSplits.getConstraints(),
@@ -77,8 +77,8 @@ public class StaticDataPartitioningProvider extends 
DataPartitioningProvider {
                 partitionsMap);
     }
 
-    private SplitComputeLocations getDataverseSplits(DataverseName 
dataverseName) {
-        return getSplits(StoragePathUtil.prepareDataverseName(dataverseName));
+    private SplitComputeLocations getDataverseSplits(String databaseName, 
DataverseName dataverseName) {
+        return getSplits(namespacePathResolver.resolve(databaseName, 
dataverseName));
     }
 
     private SplitComputeLocations getSplits(String subPath) {
@@ -105,13 +105,14 @@ public class StaticDataPartitioningProvider extends 
DataPartitioningProvider {
         List<FileSplit> splits = new ArrayList<>();
         List<String> locations = new ArrayList<>();
         Set<Integer> uniqueLocations = new HashSet<>();
+        String namespacePath = 
namespacePathResolver.resolve(dataset.getDatabaseName(), 
dataset.getDataverseName());
         StorageComputePartitionsMap partitionMap = 
clusterStateManager.getStorageComputeMap();
         final int datasetPartitions = getNumberOfPartitions(dataset);
         boolean metadataDataset = 
MetadataIndexImmutableProperties.isMetadataDataset(dataset.getDatasetId());
         for (int i = 0; i < datasetPartitions; i++) {
             int storagePartition = metadataDataset ? 
StorageConstants.METADATA_PARTITION : i;
-            final String relPath = 
StoragePathUtil.prepareDataverseIndexName(dataset.getDataverseName(),
-                    dataset.getDatasetName(), indexName, 
dataset.getRebalanceCount());
+            final String relPath = 
StoragePathUtil.prepareNamespaceIndexName(dataset.getDatasetName(), indexName,
+                    dataset.getRebalanceCount(), namespacePath);
             File f = new 
File(StoragePathUtil.prepareStoragePartitionPath(storagePartition), relPath);
             ComputePartition computePartition = 
partitionMap.getComputePartition(storagePartition);
             splits.add(new MappedFileSplit(computePartition.getNodeId(), 
f.getPath(), 0));

Reply via email to