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 8acbdb04f3 [ASTERIXDB-3259][MTD] Add 'database' entity & tuple
translator
8acbdb04f3 is described below
commit 8acbdb04f3ffb290583bf48e7cf988dd92ce959b
Author: Ali Alsuliman <[email protected]>
AuthorDate: Mon Sep 18 22:36:08 2023 -0700
[ASTERIXDB-3259][MTD] Add 'database' entity & tuple translator
- user model changes: no
- storage format changes: no
- interface changes: yes
Details:
- add 'database' entity
- add 'database' tuple translator
- add 'database' drop/add methods to:
metadata node APIs, metadata manager APIs
metadata cache, MetadataTransactionContext
- insert the initial databases on bootstrap:
"System" and "Default"
Change-Id: Idfdfded43ad8695676c10eda6af73cfc8bed8f7e
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17788
Integration-Tests: Jenkins <[email protected]>
Tested-by: Jenkins <[email protected]>
Reviewed-by: Murtadha Hubail <[email protected]>
---
.../org/apache/asterix/metadata/MetadataCache.java | 44 ++++++++-
.../apache/asterix/metadata/MetadataManager.java | 21 +++++
.../org/apache/asterix/metadata/MetadataNode.java | 24 +++++
.../metadata/MetadataTransactionContext.java | 12 +++
.../asterix/metadata/api/IMetadataManager.java | 5 +
.../apache/asterix/metadata/api/IMetadataNode.java | 5 +
.../asterix/metadata/bootstrap/DatabaseEntity.java | 14 +--
.../metadata/bootstrap/MetadataBootstrap.java | 11 ++-
.../bootstrap/MetadataBuiltinEntities.java | 8 ++
.../bootstrap/MetadataIndexesProvider.java | 30 ++++--
.../apache/asterix/metadata/entities/Database.java | 84 +++++++++++++++++
.../DatabaseTupleTranslator.java | 104 +++++++++++++++++++++
.../MetadataTupleTranslatorProvider.java | 4 +
.../asterix/metadata/utils/MetadataConstants.java | 4 +
14 files changed, 350 insertions(+), 20 deletions(-)
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataCache.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataCache.java
index 6602666d14..a8d57ce0e0 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataCache.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataCache.java
@@ -30,6 +30,7 @@ import org.apache.asterix.common.functions.FunctionSignature;
import org.apache.asterix.common.metadata.DataverseName;
import org.apache.asterix.metadata.api.IMetadataEntity;
import org.apache.asterix.metadata.entities.CompactionPolicy;
+import org.apache.asterix.metadata.entities.Database;
import org.apache.asterix.metadata.entities.Dataset;
import org.apache.asterix.metadata.entities.DatasourceAdapter;
import org.apache.asterix.metadata.entities.Datatype;
@@ -51,10 +52,11 @@ import
org.apache.asterix.runtime.fulltext.FullTextConfigDescriptor;
* Caches metadata entities such that the MetadataManager does not have to
* contact the MetadataNode. The cache is updated transactionally via logical
* logging in the MetadataTransactionContext. Note that transaction abort is
- * simply ignored, i.e., updates are not not applied to the cache.
+ * simply ignored, i.e., updates are not applied to the cache.
*/
public class MetadataCache {
+ protected final Map<String, Database> databases = new HashMap<>();
// Key is dataverse name.
protected final Map<DataverseName, Dataverse> dataverses = new HashMap<>();
// Key is dataverse name. Key of value map is dataset name.
@@ -152,6 +154,16 @@ public class MetadataCache {
}
}
+ public Database addDatabaseIfNotExists(Database database) {
+ synchronized (databases) {
+ String databaseName = database.getDatabaseName();
+ if (!databases.containsKey(databaseName)) {
+ return databases.put(databaseName, database);
+ }
+ return null;
+ }
+ }
+
public Dataverse addDataverseIfNotExists(Dataverse dataverse) {
synchronized (dataverses) {
synchronized (datasets) {
@@ -244,6 +256,36 @@ public class MetadataCache {
}
}
+ public Database dropDatabase(Database database) {
+ synchronized (databases) {
+ synchronized (dataverses) {
+ synchronized (datasets) {
+ synchronized (indexes) {
+ synchronized (datatypes) {
+ synchronized (functions) {
+ synchronized (fullTextConfigs) {
+ synchronized (fullTextFilters) {
+ synchronized (adapters) {
+ synchronized (libraries) {
+ synchronized (feeds) {
+ synchronized
(compactionPolicies) {
+ synchronized
(synonyms) {
+ return
databases.remove(database.getDatabaseName());
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
public Dataverse dropDataverse(Dataverse dataverse) {
synchronized (dataverses) {
synchronized (datasets) {
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
index 547be91f38..b75fc3a12c 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
@@ -42,6 +42,7 @@ import
org.apache.asterix.metadata.api.IExtensionMetadataSearchKey;
import org.apache.asterix.metadata.api.IMetadataManager;
import org.apache.asterix.metadata.api.IMetadataNode;
import org.apache.asterix.metadata.entities.CompactionPolicy;
+import org.apache.asterix.metadata.entities.Database;
import org.apache.asterix.metadata.entities.Dataset;
import org.apache.asterix.metadata.entities.DatasourceAdapter;
import org.apache.asterix.metadata.entities.Datatype;
@@ -168,6 +169,26 @@ public abstract class MetadataManager implements
IMetadataManager {
}
}
+ @Override
+ public void addDatabase(MetadataTransactionContext ctx, Database database)
throws AlgebricksException {
+ try {
+ metadataNode.addDatabase(ctx.getTxnId(), database);
+ } catch (RemoteException e) {
+ throw new
MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
+ }
+ ctx.addDatabase(database);
+ }
+
+ @Override
+ public void dropDatabase(MetadataTransactionContext ctx, String
databaseName) throws AlgebricksException {
+ try {
+ metadataNode.dropDatabase(ctx.getTxnId(), databaseName);
+ } catch (RemoteException e) {
+ throw new
MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
+ }
+ ctx.dropDatabase(databaseName);
+ }
+
@Override
public void addDataverse(MetadataTransactionContext ctx, Dataverse
dataverse) throws AlgebricksException {
try {
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
index b8d12037ff..a8bbd45766 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
@@ -63,6 +63,7 @@ import org.apache.asterix.metadata.api.IMetadataNode;
import org.apache.asterix.metadata.api.IValueExtractor;
import org.apache.asterix.metadata.bootstrap.MetadataIndexesProvider;
import org.apache.asterix.metadata.entities.CompactionPolicy;
+import org.apache.asterix.metadata.entities.Database;
import org.apache.asterix.metadata.entities.Dataset;
import org.apache.asterix.metadata.entities.DatasourceAdapter;
import org.apache.asterix.metadata.entities.Datatype;
@@ -82,6 +83,7 @@ import org.apache.asterix.metadata.entities.NodeGroup;
import org.apache.asterix.metadata.entities.Synonym;
import org.apache.asterix.metadata.entities.ViewDetails;
import
org.apache.asterix.metadata.entitytupletranslators.CompactionPolicyTupleTranslator;
+import
org.apache.asterix.metadata.entitytupletranslators.DatabaseTupleTranslator;
import
org.apache.asterix.metadata.entitytupletranslators.DatasetTupleTranslator;
import
org.apache.asterix.metadata.entitytupletranslators.DatasourceAdapterTupleTranslator;
import
org.apache.asterix.metadata.entitytupletranslators.DatatypeTupleTranslator;
@@ -349,6 +351,28 @@ public class MetadataNode implements IMetadataNode {
return index;
}
+ @Override
+ public void addDatabase(TxnId txnId, Database database) throws
AlgebricksException, RemoteException {
+ try {
+ DatabaseTupleTranslator tupleReaderWriter =
tupleTranslatorProvider.getDatabaseTupleTranslator(true);
+ ITupleReference tuple =
tupleReaderWriter.getTupleFromMetadataEntity(database);
+ insertTupleIntoIndex(txnId,
mdIndexesProvider.getDatabaseEntity().getIndex(), tuple);
+ } catch (HyracksDataException e) {
+ if (e.matches(ErrorCode.DUPLICATE_KEY)) {
+ //TODO(DB): change to database
+ throw new
AsterixException(org.apache.asterix.common.exceptions.ErrorCode.DATAVERSE_EXISTS,
e,
+ database.getDatabaseName());
+ } else {
+ throw new AlgebricksException(e);
+ }
+ }
+ }
+
+ @Override
+ public void dropDatabase(TxnId txnId, String databaseName) throws
AlgebricksException, RemoteException {
+ //TODO(DB): implement
+ }
+
@Override
public void addDataverse(TxnId txnId, Dataverse dataverse) throws
AlgebricksException {
try {
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
index 48fb450b2a..54bc0bc99a 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
@@ -27,6 +27,7 @@ import org.apache.asterix.common.metadata.DataverseName;
import org.apache.asterix.common.transactions.TxnId;
import org.apache.asterix.external.dataset.adapter.AdapterIdentifier;
import org.apache.asterix.metadata.entities.CompactionPolicy;
+import org.apache.asterix.metadata.entities.Database;
import org.apache.asterix.metadata.entities.Dataset;
import org.apache.asterix.metadata.entities.DatasourceAdapter;
import org.apache.asterix.metadata.entities.Datatype;
@@ -86,6 +87,11 @@ public class MetadataTransactionContext extends
MetadataCache {
return txnId;
}
+ public void addDatabase(Database database) {
+ droppedCache.dropDatabase(database);
+ logAndApply(new MetadataLogicalOperation(database, true));
+ }
+
public void addDataverse(Dataverse dataverse) {
droppedCache.dropDataverse(dataverse);
logAndApply(new MetadataLogicalOperation(dataverse, true));
@@ -150,6 +156,12 @@ public class MetadataTransactionContext extends
MetadataCache {
logAndApply(new MetadataLogicalOperation(index, false));
}
+ public void dropDatabase(String databaseName) {
+ Database database = new Database(databaseName, false,
MetadataUtil.PENDING_NO_OP);
+ droppedCache.addDatabaseIfNotExists(database);
+ logAndApply(new MetadataLogicalOperation(database, false));
+ }
+
public void dropDataverse(DataverseName dataverseName) {
Dataverse dataverse = new Dataverse(dataverseName, null,
MetadataUtil.PENDING_NO_OP);
droppedCache.addDataverseIfNotExists(dataverse);
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java
index a109785236..074a5cde60 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java
@@ -29,6 +29,7 @@ import org.apache.asterix.common.metadata.IMetadataBootstrap;
import org.apache.asterix.external.indexing.ExternalFile;
import org.apache.asterix.metadata.MetadataTransactionContext;
import org.apache.asterix.metadata.entities.CompactionPolicy;
+import org.apache.asterix.metadata.entities.Database;
import org.apache.asterix.metadata.entities.Dataset;
import org.apache.asterix.metadata.entities.DatasourceAdapter;
import org.apache.asterix.metadata.entities.Datatype;
@@ -89,6 +90,10 @@ public interface IMetadataManager extends IMetadataBootstrap
{
*/
void abortTransaction(MetadataTransactionContext ctx) throws
ACIDException, RemoteException;
+ void addDatabase(MetadataTransactionContext ctx, Database database) throws
AlgebricksException;
+
+ void dropDatabase(MetadataTransactionContext ctx, String databaseName)
throws AlgebricksException;
+
/**
* Inserts a new dataverse into the metadata.
*
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java
index 60f457fbfb..c167dd6064 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java
@@ -29,6 +29,7 @@ import org.apache.asterix.common.metadata.DataverseName;
import org.apache.asterix.common.transactions.TxnId;
import org.apache.asterix.external.indexing.ExternalFile;
import org.apache.asterix.metadata.entities.CompactionPolicy;
+import org.apache.asterix.metadata.entities.Database;
import org.apache.asterix.metadata.entities.Dataset;
import org.apache.asterix.metadata.entities.DatasourceAdapter;
import org.apache.asterix.metadata.entities.Datatype;
@@ -78,6 +79,10 @@ public interface IMetadataNode extends Remote, Serializable {
*/
void abortTransaction(TxnId txnId) throws RemoteException;
+ void addDatabase(TxnId txnId, Database database) throws
AlgebricksException, RemoteException;
+
+ void dropDatabase(TxnId txnId, String databaseName) throws
AlgebricksException, RemoteException;
+
/**
* Inserts a new dataverse into the metadata, acquiring local locks on
behalf of
* the given transaction id.
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/DatabaseEntity.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/DatabaseEntity.java
index 4982dc201c..0a14c2499e 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/DatabaseEntity.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/DatabaseEntity.java
@@ -20,7 +20,6 @@
package org.apache.asterix.metadata.bootstrap;
import static
org.apache.asterix.metadata.bootstrap.MetadataPrimaryIndexes.PROPERTIES_DATABASE;
-import static
org.apache.asterix.metadata.bootstrap.MetadataRecordTypes.FIELD_NAME_DATABASE_ID;
import static
org.apache.asterix.metadata.bootstrap.MetadataRecordTypes.FIELD_NAME_DATABASE_NAME;
import static
org.apache.asterix.metadata.bootstrap.MetadataRecordTypes.FIELD_NAME_PENDING_OP;
import static
org.apache.asterix.metadata.bootstrap.MetadataRecordTypes.FIELD_NAME_SYSTEM_DATABASE;
@@ -44,7 +43,6 @@ public final class DatabaseEntity {
private final int payloadPosition;
private final MetadataIndex index;
private final int databaseNameIndex;
- private final int databaseIdIndex;
private final int systemDatabaseIndex;
private final int timestampIndex;
private final int pendingOpIndex;
@@ -53,7 +51,6 @@ public final class DatabaseEntity {
this.index = index;
this.payloadPosition = payloadPosition;
this.databaseNameIndex = startIndex++;
- this.databaseIdIndex = startIndex++;
this.systemDatabaseIndex = startIndex++;
this.timestampIndex = startIndex++;
this.pendingOpIndex = startIndex++;
@@ -79,10 +76,6 @@ public final class DatabaseEntity {
return databaseNameIndex;
}
- public int databaseIdIndex() {
- return databaseIdIndex;
- }
-
public int systemDatabaseIndex() {
return systemDatabaseIndex;
}
@@ -100,11 +93,10 @@ public final class DatabaseEntity {
// RecordTypeName
RECORD_NAME_DATABASE,
// FieldNames
- new String[] { FIELD_NAME_DATABASE_NAME,
FIELD_NAME_DATABASE_ID, FIELD_NAME_SYSTEM_DATABASE,
- FIELD_NAME_TIMESTAMP, FIELD_NAME_PENDING_OP },
+ new String[] { FIELD_NAME_DATABASE_NAME,
FIELD_NAME_SYSTEM_DATABASE, FIELD_NAME_TIMESTAMP,
+ FIELD_NAME_PENDING_OP },
// FieldTypes
- new IAType[] { BuiltinType.ASTRING, BuiltinType.AINT32,
BuiltinType.ABOOLEAN, BuiltinType.ASTRING,
- BuiltinType.AINT32 },
+ new IAType[] { BuiltinType.ASTRING, BuiltinType.ABOOLEAN,
BuiltinType.ASTRING, BuiltinType.AINT32 },
//IsOpen?
true);
}
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 1e84287041..d3a75356df 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
@@ -156,6 +156,7 @@ public class MetadataBootstrap {
"Finished enlistment of metadata B-trees in " +
(isNewUniverse ? "new" : "old") + " universe");
}
if (isNewUniverse) {
+ insertInitialDatabases(mdTxnCtx, mdIndexesProvider);
insertInitialDataverses(mdTxnCtx);
insertMetadataDatasets(mdTxnCtx, PRIMARY_INDEXES);
insertMetadataDatatypes(mdTxnCtx);
@@ -190,6 +191,14 @@ public class MetadataBootstrap {
}
}
+ private static void insertInitialDatabases(MetadataTransactionContext
mdTxnCtx,
+ MetadataIndexesProvider mdIndexesProvider) throws
AlgebricksException {
+ if (mdIndexesProvider.isUsingDatabase()) {
+ MetadataManager.INSTANCE.addDatabase(mdTxnCtx,
MetadataBuiltinEntities.SYSTEM_DATABASE);
+ MetadataManager.INSTANCE.addDatabase(mdTxnCtx,
MetadataBuiltinEntities.DEFAULT_DATABASE);
+ }
+ }
+
private static void insertInitialDataverses(MetadataTransactionContext
mdTxnCtx) throws AlgebricksException {
MetadataManager.INSTANCE.addDataverse(mdTxnCtx,
MetadataBuiltinEntities.METADATA_DATAVERSE);
MetadataManager.INSTANCE.addDataverse(mdTxnCtx,
MetadataBuiltinEntities.DEFAULT_DATAVERSE);
@@ -213,7 +222,7 @@ public class MetadataBootstrap {
new Dataset(indexes[i].getDataverseName(),
indexes[i].getIndexedDatasetName(),
indexes[i].getDataverseName(),
indexes[i].getPayloadRecordType().getTypeName(),
indexes[i].getNodeGroupName(),
StorageConstants.DEFAULT_COMPACTION_POLICY_NAME,
-
StorageConstants.DEFAULT_COMPACTION_POLICY_PROPERTIES, id, new HashMap<String,
String>(),
+
StorageConstants.DEFAULT_COMPACTION_POLICY_PROPERTIES, id, new HashMap<>(),
DatasetType.INTERNAL,
indexes[i].getDatasetId().getId(), MetadataUtil.PENDING_NO_OP));
}
if (LOGGER.isInfoEnabled()) {
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBuiltinEntities.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBuiltinEntities.java
index 05b7c963df..4077573444 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBuiltinEntities.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBuiltinEntities.java
@@ -19,6 +19,7 @@
package org.apache.asterix.metadata.bootstrap;
import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.metadata.entities.Database;
import org.apache.asterix.metadata.entities.Datatype;
import org.apache.asterix.metadata.entities.Dataverse;
import org.apache.asterix.metadata.utils.MetadataConstants;
@@ -27,6 +28,13 @@ import org.apache.asterix.om.utils.RecordUtil;
import org.apache.asterix.runtime.formats.NonTaggedDataFormat;
public class MetadataBuiltinEntities {
+
+ //--------------------------------------- Databases
----------------------------------------//
+ public static final Database SYSTEM_DATABASE =
+ new Database(MetadataConstants.SYSTEM_DATABASE, true,
MetadataUtil.PENDING_NO_OP);
+ public static final Database DEFAULT_DATABASE =
+ new Database(MetadataConstants.DEFAULT_DATABASE, false,
MetadataUtil.PENDING_NO_OP);
+
//--------------------------------------- Dataverses
----------------------------------------//
public static final Dataverse METADATA_DATAVERSE = new
Dataverse(MetadataConstants.METADATA_DATAVERSE_NAME,
NonTaggedDataFormat.NON_TAGGED_DATA_FORMAT,
MetadataUtil.PENDING_NO_OP);
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 f7bf610b88..8c195052bd 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
@@ -31,6 +31,10 @@ public class MetadataIndexesProvider {
cloudDeployment =
ncServiceCtx.getAppConfig().getBoolean(CLOUD_DEPLOYMENT);
}
+ public DatabaseEntity getDatabaseEntity() {
+ return DatabaseEntity.of(cloudDeployment);
+ }
+
public DataverseEntity getDataverseEntity() {
return DataverseEntity.of(cloudDeployment);
}
@@ -100,13 +104,25 @@ public class MetadataIndexesProvider {
}
public IMetadataIndex[] getMetadataIndexes() {
- return new IMetadataIndex[] { getDataverseEntity().getIndex(),
getDatasetEntity().getIndex(),
- getDatatypeEntity().getIndex(), getIndexEntity().getIndex(),
getSynonymEntity().getIndex(),
- getNodeEntity().getIndex(), getNodeGroupEntity().getIndex(),
getFunctionEntity().getIndex(),
- getDatasourceAdapterEntity().getIndex(),
getFeedEntity().getIndex(), getFeedPolicyEntity().getIndex(),
- getLibraryEntity().getIndex(),
getCompactionPolicyEntity().getIndex(),
- getExternalFileEntity().getIndex(),
getFeedConnectionEntity().getIndex(),
- getFullTextConfigEntity().getIndex(),
getFullTextFilterEntity().getIndex() };
+ if (isUsingDatabase()) {
+ return new IMetadataIndex[] { getDatabaseEntity().getIndex(),
getDataverseEntity().getIndex(),
+ getDatasetEntity().getIndex(),
getDatatypeEntity().getIndex(), getIndexEntity().getIndex(),
+ getSynonymEntity().getIndex(), getNodeEntity().getIndex(),
getNodeGroupEntity().getIndex(),
+ getFunctionEntity().getIndex(),
getDatasourceAdapterEntity().getIndex(), getFeedEntity().getIndex(),
+ getFeedPolicyEntity().getIndex(),
getLibraryEntity().getIndex(),
+ getCompactionPolicyEntity().getIndex(),
getExternalFileEntity().getIndex(),
+ getFeedConnectionEntity().getIndex(),
getFullTextConfigEntity().getIndex(),
+ getFullTextFilterEntity().getIndex() };
+ } else {
+ return new IMetadataIndex[] { getDataverseEntity().getIndex(),
getDatasetEntity().getIndex(),
+ getDatatypeEntity().getIndex(),
getIndexEntity().getIndex(), getSynonymEntity().getIndex(),
+ getNodeEntity().getIndex(),
getNodeGroupEntity().getIndex(), getFunctionEntity().getIndex(),
+ getDatasourceAdapterEntity().getIndex(),
getFeedEntity().getIndex(),
+ getFeedPolicyEntity().getIndex(),
getLibraryEntity().getIndex(),
+ getCompactionPolicyEntity().getIndex(),
getExternalFileEntity().getIndex(),
+ getFeedConnectionEntity().getIndex(),
getFullTextConfigEntity().getIndex(),
+ getFullTextFilterEntity().getIndex() };
+ }
}
public boolean isUsingDatabase() {
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Database.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Database.java
new file mode 100644
index 0000000000..8be93e3ccb
--- /dev/null
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Database.java
@@ -0,0 +1,84 @@
+/*
+ * 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.metadata.entities;
+
+import java.util.Objects;
+
+import org.apache.asterix.metadata.MetadataCache;
+import org.apache.asterix.metadata.api.IMetadataEntity;
+
+/**
+ * Metadata describing a database.
+ */
+public class Database implements IMetadataEntity<Database> {
+
+ private static final long serialVersionUID = 1L;
+
+ private final String databaseName;
+ private final boolean isSystemDatabase;
+ private final int pendingOp;
+
+ public Database(String databaseName, boolean isSystemDatabase, int
pendingOp) {
+ this.databaseName = databaseName;
+ this.isSystemDatabase = isSystemDatabase;
+ this.pendingOp = pendingOp;
+ }
+
+ public String getDatabaseName() {
+ return databaseName;
+ }
+
+ public boolean isSystemDatabase() {
+ return isSystemDatabase;
+ }
+
+ public int getPendingOp() {
+ return pendingOp;
+ }
+
+ @Override
+ public Database addToCache(MetadataCache cache) {
+ return cache.addDatabaseIfNotExists(this);
+ }
+
+ @Override
+ public Database dropFromCache(MetadataCache cache) {
+ return cache.dropDatabase(this);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + ":" + databaseName;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof Database)) {
+ return false;
+ }
+ Database other = (Database) o;
+ return Objects.equals(databaseName, other.databaseName);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(databaseName);
+ }
+}
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatabaseTupleTranslator.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatabaseTupleTranslator.java
new file mode 100644
index 0000000000..9752dc8655
--- /dev/null
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatabaseTupleTranslator.java
@@ -0,0 +1,104 @@
+/*
+ * 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.metadata.entitytupletranslators;
+
+import java.util.Calendar;
+
+import org.apache.asterix.metadata.bootstrap.DatabaseEntity;
+import org.apache.asterix.metadata.entities.Database;
+import org.apache.asterix.om.base.ABoolean;
+import org.apache.asterix.om.base.AInt32;
+import org.apache.asterix.om.base.AMutableInt32;
+import org.apache.asterix.om.base.ARecord;
+import org.apache.asterix.om.base.AString;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
+
+/**
+ * Translates a Database metadata entity to an ITupleReference and vice versa.
+ */
+public class DatabaseTupleTranslator extends AbstractTupleTranslator<Database>
{
+
+ private final DatabaseEntity databaseEntity;
+ private AMutableInt32 aInt32;
+
+ protected DatabaseTupleTranslator(boolean getTuple, DatabaseEntity
databaseEntity) {
+ super(getTuple, databaseEntity.getIndex(),
databaseEntity.payloadPosition());
+ this.databaseEntity = databaseEntity;
+ if (getTuple) {
+ aInt32 = new AMutableInt32(-1);
+ }
+ }
+
+ @Override
+ protected Database createMetadataEntityFromARecord(ARecord databaseRecord)
throws AlgebricksException {
+ String databaseName =
+ ((AString)
databaseRecord.getValueByPos(databaseEntity.databaseNameIndex())).getStringValue();
+ boolean isSystemDatabase =
+ ((ABoolean)
databaseRecord.getValueByPos(databaseEntity.systemDatabaseIndex())).getBoolean();
+ int pendingOp = ((AInt32)
databaseRecord.getValueByPos(databaseEntity.pendingOpIndex())).getIntegerValue();
+ return new Database(databaseName, isSystemDatabase, pendingOp);
+ }
+
+ @Override
+ public ITupleReference getTupleFromMetadataEntity(Database database)
throws HyracksDataException {
+ tupleBuilder.reset();
+
+ // write the database name key in the first field of the tuple
+ aString.setValue(database.getDatabaseName());
+ stringSerde.serialize(aString, tupleBuilder.getDataOutput());
+ tupleBuilder.addFieldEndOffset();
+
+ // write the payload in the second field of the tuple
+ recordBuilder.reset(databaseEntity.getRecordType());
+
+ // write "DatabaseName" at index 0
+ fieldValue.reset();
+ aString.setValue(database.getDatabaseName());
+ stringSerde.serialize(aString, fieldValue.getDataOutput());
+ recordBuilder.addField(databaseEntity.databaseNameIndex(), fieldValue);
+
+ // write "SystemDatabase" at index 1
+ fieldValue.reset();
+ booleanSerde.serialize(database.isSystemDatabase() ? ABoolean.TRUE :
ABoolean.FALSE,
+ fieldValue.getDataOutput());
+ recordBuilder.addField(databaseEntity.systemDatabaseIndex(),
fieldValue);
+
+ // write "Timestamp" at index 2
+ fieldValue.reset();
+ aString.setValue(Calendar.getInstance().getTime().toString());
+ stringSerde.serialize(aString, fieldValue.getDataOutput());
+ recordBuilder.addField(databaseEntity.timestampIndex(), fieldValue);
+
+ // write "PendingOp" at index 3
+ fieldValue.reset();
+ aInt32.setValue(database.getPendingOp());
+ int32Serde.serialize(aInt32, fieldValue.getDataOutput());
+ recordBuilder.addField(databaseEntity.pendingOpIndex(), fieldValue);
+
+ // write the payload record
+ recordBuilder.write(tupleBuilder.getDataOutput(), true);
+ tupleBuilder.addFieldEndOffset();
+
+ tuple.reset(tupleBuilder.getFieldEndOffsets(),
tupleBuilder.getByteArray());
+ return tuple;
+ }
+}
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/MetadataTupleTranslatorProvider.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/MetadataTupleTranslatorProvider.java
index 3560e9f9e0..42e4d9d77c 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/MetadataTupleTranslatorProvider.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/MetadataTupleTranslatorProvider.java
@@ -47,6 +47,10 @@ public class MetadataTupleTranslatorProvider {
return new DatatypeTupleTranslator(txnId, metadataNode, getTuple,
mdIndexesProvider.getDatatypeEntity());
}
+ public DatabaseTupleTranslator getDatabaseTupleTranslator(boolean
getTuple) {
+ return new DatabaseTupleTranslator(getTuple,
mdIndexesProvider.getDatabaseEntity());
+ }
+
public DataverseTupleTranslator getDataverseTupleTranslator(boolean
getTuple) {
return new DataverseTupleTranslator(getTuple,
mdIndexesProvider.getDataverseEntity());
}
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataConstants.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataConstants.java
index 60d97d6fa3..1c5774b299 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataConstants.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataConstants.java
@@ -34,6 +34,10 @@ public class MetadataConstants {
public static final Pattern METADATA_OBJECT_NAME_INVALID_CHARS =
Pattern.compile(SystemUtils.IS_OS_WINDOWS ?
"[\u0000-\u001F\u007F\"*/:<>\\\\|+,;=\\[\\]\n]" : "[\u0000/]");
+ // Pre-defined databases
+ public static final String SYSTEM_DATABASE = "System";
+ public static final String DEFAULT_DATABASE = "Default";
+
// Name of the dataverse the metadata lives in.
public static final DataverseName METADATA_DATAVERSE_NAME =
DataverseName.createBuiltinDataverseName("Metadata");
// Name of the node group where metadata is stored on.