>From Ali Alsuliman <[email protected]>: Ali Alsuliman has submitted this change. ( https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17836 )
Change subject: [ASTERIXDB-3259][MTD] Drop database objects when dropping DATABASE ...................................................................... [ASTERIXDB-3259][MTD] Drop database objects when dropping DATABASE - user model changes: no - storage format changes: no - interface changes: no Details: Drop all metadata objects of a database from the metadata collections when dropping the database. - include the database name when checking dependency of metadata objects. Change-Id: Ifd629b9d324716ea1e903292494120e6e768c172 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17836 Integration-Tests: Jenkins <[email protected]> Reviewed-by: Ali Alsuliman <[email protected]> Reviewed-by: Murtadha Hubail <[email protected]> Tested-by: Ali Alsuliman <[email protected]> --- M asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java 1 file changed, 368 insertions(+), 15 deletions(-) Approvals: Murtadha Hubail: Looks good to me, approved Ali Alsuliman: Looks good to me, but someone else must approve; Verified Anon. E. Moose #1000171: Jenkins: Verified 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 e895465..3871ffb 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 @@ -699,7 +699,95 @@ @Override public void dropDatabase(TxnId txnId, String databaseName) throws AlgebricksException, RemoteException { try { - //TODO(DB): delete from other metadata collections + //TODO(DB): review + confirmDatabaseCanBeDeleted(txnId, databaseName); + + // Drop all feeds and connections in this database. + // Feeds may depend on datatypes and adapters + List<Feed> databaseFeeds = getDatabaseFeeds(txnId, databaseName); + for (Feed feed : databaseFeeds) { + List<FeedConnection> feedConnections = + getFeedConnections(txnId, databaseName, feed.getDataverseName(), feed.getFeedName()); + for (FeedConnection feedConnection : feedConnections) { + dropFeedConnection(txnId, databaseName, feedConnection.getDataverseName(), feed.getFeedName(), + feedConnection.getDatasetName()); + } + dropFeed(txnId, databaseName, feed.getDataverseName(), feed.getFeedName()); + } + + // Drop all feed ingestion policies in this database. + List<FeedPolicyEntity> feedPolicies = getDatabaseFeedPolicies(txnId, databaseName); + for (FeedPolicyEntity feedPolicy : feedPolicies) { + dropFeedPolicy(txnId, databaseName, feedPolicy.getDataverseName(), feedPolicy.getPolicyName()); + } + + // Drop all functions in this database. + // Functions may depend on libraries, datasets, functions, datatypes, synonyms + // As a side effect, acquires an S lock on the 'Function' dataset on behalf of txnId. + List<Function> databaseFunctions = getDatabaseFunctions(txnId, databaseName); + for (Function function : databaseFunctions) { + dropFunction(txnId, function.getSignature(), true); + } + + // Drop all adapters in this database. + // Adapters depend on libraries. + // As a side effect, acquires an S lock on the 'Adapter' dataset on behalf of txnId. + List<DatasourceAdapter> databaseAdapters = getDatabaseAdapters(txnId, databaseName); + for (DatasourceAdapter adapter : databaseAdapters) { + dropAdapter(txnId, databaseName, adapter.getAdapterIdentifier().getDataverseName(), + adapter.getAdapterIdentifier().getName()); + } + + // Drop all libraries in this database. + List<Library> databaseLibraries = getDatabaseLibraries(txnId, databaseName); + for (Library lib : databaseLibraries) { + dropLibrary(txnId, lib.getDatabaseName(), lib.getDataverseName(), lib.getName()); + } + + // Drop all synonyms in this database. + List<Synonym> databaseSynonyms = getDatabaseSynonyms(txnId, databaseName); + for (Synonym synonym : databaseSynonyms) { + dropSynonym(txnId, databaseName, synonym.getDataverseName(), synonym.getSynonymName(), true); + } + + // Drop all datasets and indexes in this database. + // Datasets depend on datatypes + List<Dataset> databaseDatasets = getDatabaseDatasets(txnId, databaseName); + for (Dataset ds : databaseDatasets) { + dropDataset(txnId, databaseName, ds.getDataverseName(), ds.getDatasetName(), true); + } + + // Drop full-text configs in this database. + // Note that full-text configs are utilized by the index, and we need to always drop index first + // and then full-text config + List<FullTextConfigMetadataEntity> configMetadataEntities = getDatabaseFullTextConfigs(txnId, databaseName); + for (FullTextConfigMetadataEntity configMetadataEntity : configMetadataEntities) { + dropFullTextConfigDescriptor(txnId, databaseName, + configMetadataEntity.getFullTextConfig().getDataverseName(), + configMetadataEntity.getFullTextConfig().getName(), true); + } + + // Drop full-text filters in this database. + // Note that full-text filters are utilized by the full-text configs, + // and we need to always drop full-text configs first + // and then full-text filter + List<FullTextFilterMetadataEntity> filters = getDatabaseFullTextFilters(txnId, databaseName); + for (FullTextFilterMetadataEntity filter : filters) { + dropFullTextFilterDescriptor(txnId, databaseName, filter.getFullTextFilter().getDataverseName(), + filter.getFullTextFilter().getName(), true); + } + + // Drop all types in this database. + // As a side effect, acquires an S lock on the 'datatype' dataset on behalf of txnId. + List<Datatype> databaseDatatypes = getDatabaseDatatypes(txnId, databaseName); + for (Datatype dataType : databaseDatatypes) { + forceDropDatatype(txnId, databaseName, dataType.getDataverseName(), dataType.getDatatypeName()); + } + + List<Dataverse> databaseDataverses = getDatabaseDataverses(txnId, databaseName); + for (Dataverse dataverse : databaseDataverses) { + forceDropDataverse(txnId, databaseName, dataverse.getDataverseName()); + } // delete the database entry from the 'Database' collection // as a side effect, acquires an S lock on the 'Database' collection on behalf of txnId @@ -805,10 +893,7 @@ // Delete the dataverse entry from the 'dataverse' dataset. // As a side effect, acquires an S lock on the 'dataverse' dataset on behalf of txnId. - ITupleReference searchKey = createTuple(database, dataverseName); - ITupleReference tuple = - getTupleToBeDeleted(txnId, mdIndexesProvider.getDataverseEntity().getIndex(), searchKey); - deleteTupleFromIndex(txnId, mdIndexesProvider.getDataverseEntity().getIndex(), tuple); + forceDropDataverse(txnId, database, dataverseName); } catch (HyracksDataException e) { if (e.matches(ErrorCode.UPDATE_OR_DELETE_NON_EXISTENT_KEY)) { throw new AsterixException(org.apache.asterix.common.exceptions.ErrorCode.UNKNOWN_DATAVERSE, e, @@ -819,6 +904,14 @@ } } + private void forceDropDataverse(TxnId txnId, String database, DataverseName dataverseName) + throws AlgebricksException, HyracksDataException { + ITupleReference searchKey = createTuple(database, dataverseName); + ITupleReference tuple = + getTupleToBeDeleted(txnId, mdIndexesProvider.getDataverseEntity().getIndex(), searchKey); + deleteTupleFromIndex(txnId, mdIndexesProvider.getDataverseEntity().getIndex(), tuple); + } + @Override public boolean isDataverseNotEmpty(TxnId txnId, String database, DataverseName dataverseName) throws AlgebricksException { @@ -1077,6 +1170,32 @@ } } + private List<Dataverse> getDatabaseDataverses(TxnId txnId, String database) throws AlgebricksException { + try { + ITupleReference searchKey = createTuple(database); + DataverseTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getDataverseTupleTranslator(false); + IValueExtractor<Dataverse> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter); + List<Dataverse> results = new ArrayList<>(); + searchIndex(txnId, mdIndexesProvider.getDataverseEntity().getIndex(), searchKey, valueExtractor, results); + return results; + } catch (HyracksDataException e) { + throw new AlgebricksException(e); + } + } + + private List<Dataset> getDatabaseDatasets(TxnId txnId, String database) throws AlgebricksException { + try { + ITupleReference searchKey = createTuple(database); + DatasetTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getDatasetTupleTranslator(false); + IValueExtractor<Dataset> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter); + List<Dataset> results = new ArrayList<>(); + searchIndex(txnId, mdIndexesProvider.getDatasetEntity().getIndex(), searchKey, valueExtractor, results); + return results; + } catch (HyracksDataException e) { + throw new AlgebricksException(e); + } + } + @Override public List<Feed> getDataverseFeeds(TxnId txnId, String database, DataverseName dataverseName) throws AlgebricksException { @@ -1092,6 +1211,19 @@ } } + private List<Feed> getDatabaseFeeds(TxnId txnId, String database) throws AlgebricksException { + try { + ITupleReference searchKey = createTuple(database); + FeedTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFeedTupleTranslator(false); + IValueExtractor<Feed> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter); + List<Feed> results = new ArrayList<>(); + searchIndex(txnId, mdIndexesProvider.getFeedEntity().getIndex(), searchKey, valueExtractor, results); + return results; + } catch (HyracksDataException e) { + throw new AlgebricksException(e); + } + } + @Override public List<Library> getDataverseLibraries(TxnId txnId, String database, DataverseName dataverseName) throws AlgebricksException { @@ -1107,6 +1239,19 @@ } } + private List<Library> getDatabaseLibraries(TxnId txnId, String database) throws AlgebricksException { + try { + ITupleReference searchKey = createTuple(database); + LibraryTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getLibraryTupleTranslator(false); + IValueExtractor<Library> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter); + List<Library> results = new ArrayList<>(); + searchIndex(txnId, mdIndexesProvider.getLibraryEntity().getIndex(), searchKey, valueExtractor, results); + return results; + } catch (HyracksDataException e) { + throw new AlgebricksException(e); + } + } + private List<Datatype> getDataverseDatatypes(TxnId txnId, String database, DataverseName dataverseName) throws AlgebricksException { try { @@ -1122,6 +1267,20 @@ } } + private List<Datatype> getDatabaseDatatypes(TxnId txnId, String database) throws AlgebricksException { + try { + ITupleReference searchKey = createTuple(database); + DatatypeTupleTranslator tupleReaderWriter = + tupleTranslatorProvider.getDataTypeTupleTranslator(txnId, this, false); + IValueExtractor<Datatype> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter); + List<Datatype> results = new ArrayList<>(); + searchIndex(txnId, mdIndexesProvider.getDatatypeEntity().getIndex(), searchKey, valueExtractor, results); + return results; + } catch (HyracksDataException e) { + throw new AlgebricksException(e); + } + } + private List<FullTextConfigMetadataEntity> getDataverseFullTextConfigs(TxnId txnId, String database, DataverseName dataverseName) throws AlgebricksException { ITupleReference searchKey = createTuple(database, dataverseName); @@ -1139,6 +1298,23 @@ return results; } + private List<FullTextConfigMetadataEntity> getDatabaseFullTextConfigs(TxnId txnId, String database) + throws AlgebricksException { + ITupleReference searchKey = createTuple(database); + FullTextConfigMetadataEntityTupleTranslator tupleReaderWriter = + tupleTranslatorProvider.getFullTextConfigTupleTranslator(true); + IValueExtractor<FullTextConfigMetadataEntity> valueExtractor = + new MetadataEntityValueExtractor<>(tupleReaderWriter); + List<FullTextConfigMetadataEntity> results = new ArrayList<>(); + try { + searchIndex(txnId, mdIndexesProvider.getFullTextConfigEntity().getIndex(), searchKey, valueExtractor, + results); + } catch (HyracksDataException e) { + throw new AlgebricksException(e); + } + return results; + } + private List<FullTextFilterMetadataEntity> getDataverseFullTextFilters(TxnId txnId, String database, DataverseName dataverseName) throws AlgebricksException { ITupleReference searchKey = createTuple(database, dataverseName); @@ -1156,6 +1332,23 @@ return results; } + private List<FullTextFilterMetadataEntity> getDatabaseFullTextFilters(TxnId txnId, String database) + throws AlgebricksException { + ITupleReference searchKey = createTuple(database); + FullTextFilterMetadataEntityTupleTranslator tupleReaderWriter = + tupleTranslatorProvider.getFullTextFilterTupleTranslator(true); + IValueExtractor<FullTextFilterMetadataEntity> valueExtractor = + new MetadataEntityValueExtractor<>(tupleReaderWriter); + List<FullTextFilterMetadataEntity> results = new ArrayList<>(); + try { + searchIndex(txnId, mdIndexesProvider.getFullTextFilterEntity().getIndex(), searchKey, valueExtractor, + results); + } catch (HyracksDataException e) { + throw new AlgebricksException(e); + } + return results; + } + @Override public Dataset getDataset(TxnId txnId, String database, DataverseName dataverseName, String datasetName) throws AlgebricksException { @@ -1230,6 +1423,84 @@ } } + private void confirmDatabaseCanBeDeleted(TxnId txnId, String database) throws AlgebricksException { + // if a dataset from a DIFFERENT database uses a type from this database throw an error + List<Dataset> datasets = getAllDatasets(txnId); + for (Dataset otherDataset : datasets) { + if (otherDataset.getDatabaseName().equals(database)) { + continue; + } + if (otherDataset.getItemTypeDatabaseName().equals(database)) { + throw new AsterixException( + org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_DATAVERSE_DEPENDENT_EXISTS, "type", + TypeUtil.getFullyQualifiedDisplayName(otherDataset.getItemTypeDataverseName(), + otherDataset.getItemTypeName()), + dataset(), DatasetUtil.getFullyQualifiedDisplayName(otherDataset)); + } + if (otherDataset.hasMetaPart() && otherDataset.getMetaItemTypeDatabaseName().equals(database)) { + throw new AsterixException( + org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_DATAVERSE_DEPENDENT_EXISTS, "type", + TypeUtil.getFullyQualifiedDisplayName(otherDataset.getMetaItemTypeDataverseName(), + otherDataset.getMetaItemTypeName()), + dataset(), DatasetUtil.getFullyQualifiedDisplayName(otherDataset)); + } + if (otherDataset.getDatasetType() == DatasetType.VIEW) { + ViewDetails viewDetails = (ViewDetails) otherDataset.getDatasetDetails(); + List<DependencyKind> dependenciesSchema = ViewDetails.DEPENDENCIES_SCHEMA; + List<List<DependencyFullyQualifiedName>> dependencies = viewDetails.getDependencies(); + for (int i = 0, n = dependencies.size(); i < n; i++) { + for (DependencyFullyQualifiedName dependency : dependencies.get(i)) { + if (dependency.getDatabaseName().equals(database)) { + DependencyKind dependencyKind = dependenciesSchema.get(i); + throw new AsterixException( + org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_DATAVERSE_DEPENDENT_EXISTS, + dependencyKind, dependencyKind.getDependencyDisplayName(dependency), "view", + DatasetUtil.getFullyQualifiedDisplayName(otherDataset)); + } + } + } + } + } + + // if a function from a DIFFERENT database uses datasets, functions, datatypes, or synonyms from this database + // throw an error + List<Function> functions = getAllFunctions(txnId); + for (Function otherFunction : functions) { + if (otherFunction.getDatabaseName().equals(database)) { + continue; + } + List<DependencyKind> dependenciesSchema = Function.DEPENDENCIES_SCHEMA; + List<List<DependencyFullyQualifiedName>> dependencies = otherFunction.getDependencies(); + for (int i = 0, n = dependencies.size(); i < n; i++) { + for (DependencyFullyQualifiedName dependency : dependencies.get(i)) { + if (dependency.getDatabaseName().equals(database)) { + DependencyKind dependencyKind = dependenciesSchema.get(i); + throw new AsterixException( + org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_DATAVERSE_DEPENDENT_EXISTS, + dependencyKind, dependencyKind.getDependencyDisplayName(dependency), "function", + otherFunction.getSignature()); + } + } + } + } + + // if a feed connection from a DIFFERENT database applies a function from this database then throw an error + List<FeedConnection> feedConnections = getAllFeedConnections(txnId); + for (FeedConnection feedConnection : feedConnections) { + if (database.equals(feedConnection.getDatabaseName())) { + continue; + } + for (FunctionSignature functionSignature : feedConnection.getAppliedFunctions()) { + if (database.equals(functionSignature.getDatabaseName())) { + throw new AsterixException( + org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_DATAVERSE_DEPENDENT_EXISTS, + "function", functionSignature, "feed connection", MetadataUtil.getFullyQualifiedDisplayName( + feedConnection.getDataverseName(), feedConnection.getFeedName())); + } + } + } + } + private void confirmDataverseCanBeDeleted(TxnId txnId, String database, DataverseName dataverseName) throws AlgebricksException { // If a dataset from a DIFFERENT dataverse uses a type from this dataverse throw an error @@ -1238,14 +1509,16 @@ if (dataset.getDataverseName().equals(dataverseName) && dataset.getDatabaseName().equals(database)) { continue; } - if (dataset.getItemTypeDataverseName().equals(dataverseName)) { + if (dataset.getItemTypeDataverseName().equals(dataverseName) + && dataset.getItemTypeDatabaseName().equals(database)) { throw new AsterixException( org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_DATAVERSE_DEPENDENT_EXISTS, "type", TypeUtil.getFullyQualifiedDisplayName(dataset.getItemTypeDataverseName(), dataset.getItemTypeName()), dataset(), DatasetUtil.getFullyQualifiedDisplayName(dataset)); } - if (dataset.hasMetaPart() && dataset.getMetaItemTypeDataverseName().equals(dataverseName)) { + if (dataset.hasMetaPart() && dataset.getMetaItemTypeDataverseName().equals(dataverseName) + && dataset.getMetaItemTypeDatabaseName().equals(database)) { throw new AsterixException( org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_DATAVERSE_DEPENDENT_EXISTS, "type", TypeUtil.getFullyQualifiedDisplayName(dataset.getMetaItemTypeDataverseName(), @@ -1258,7 +1531,8 @@ List<List<DependencyFullyQualifiedName>> dependencies = viewDetails.getDependencies(); for (int i = 0, n = dependencies.size(); i < n; i++) { for (DependencyFullyQualifiedName dependency : dependencies.get(i)) { - if (dependency.getDataverseName().equals(dataverseName)) { + if (dependency.getDataverseName().equals(dataverseName) + && dependency.getDatabaseName().equals(database)) { DependencyKind dependencyKind = dependenciesSchema.get(i); throw new AsterixException( org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_DATAVERSE_DEPENDENT_EXISTS, @@ -1274,14 +1548,15 @@ // throw an error List<Function> functions = getAllFunctions(txnId); for (Function function : functions) { - if (function.getDataverseName().equals(dataverseName)) { + if (function.getDataverseName().equals(dataverseName) && function.getDatabaseName().equals(database)) { continue; } List<DependencyKind> dependenciesSchema = Function.DEPENDENCIES_SCHEMA; List<List<DependencyFullyQualifiedName>> dependencies = function.getDependencies(); for (int i = 0, n = dependencies.size(); i < n; i++) { for (DependencyFullyQualifiedName dependency : dependencies.get(i)) { - if (dependency.getDataverseName().equals(dataverseName)) { + if (dependency.getDataverseName().equals(dataverseName) + && dependency.getDatabaseName().equals(database)) { DependencyKind dependencyKind = dependenciesSchema.get(i); throw new AsterixException( org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_DATAVERSE_DEPENDENT_EXISTS, @@ -1295,11 +1570,13 @@ // If a feed connection from a DIFFERENT dataverse applies a function from this dataverse then throw an error List<FeedConnection> feedConnections = getAllFeedConnections(txnId); for (FeedConnection feedConnection : feedConnections) { - if (dataverseName.equals(feedConnection.getDataverseName())) { + if (dataverseName.equals(feedConnection.getDataverseName()) + && database.equals(feedConnection.getDatabaseName())) { continue; } for (FunctionSignature functionSignature : feedConnection.getAppliedFunctions()) { - if (dataverseName.equals(functionSignature.getDataverseName())) { + if (dataverseName.equals(functionSignature.getDataverseName()) + && database.equals(functionSignature.getDatabaseName())) { throw new AsterixException( org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_DATAVERSE_DEPENDENT_EXISTS, "function", functionSignature, "feed connection", MetadataUtil.getFullyQualifiedDisplayName( @@ -1362,6 +1639,7 @@ if (functionObjectDependencies != null) { for (DependencyFullyQualifiedName dependency : functionObjectDependencies) { if (dependency.getDataverseName().equals(dataverseName) + && dependency.getDatabaseName().equals(database) && dependency.getSubName1().equals(objectName) && (objectArg == null || objectArg.equals(dependency.getSubName2()))) { throw new AsterixException( @@ -1400,6 +1678,7 @@ if (viewObjectDependencies != null) { for (DependencyFullyQualifiedName dependency : viewObjectDependencies) { if (dependency.getDataverseName().equals(dataverseName) + && dependency.getDatabaseName().equals(database) && dependency.getSubName1().equals(objectName) && (objectArg == null || objectArg.equals(dependency.getSubName2()))) { throw new AsterixException( @@ -1434,7 +1713,8 @@ if (Index.IndexCategory.of(index.getIndexType()) == Index.IndexCategory.TEXT) { String indexConfigName = ((Index.TextIndexDetails) index.getIndexDetails()).getFullTextConfigName(); if (index.getDataverseName().equals(dataverseNameFullTextConfig) - && !Strings.isNullOrEmpty(indexConfigName) && indexConfigName.equals(configName)) { + && index.getDatabaseName().equals(database) && !Strings.isNullOrEmpty(indexConfigName) + && indexConfigName.equals(configName)) { throw new AsterixException( org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_OBJECT_DEPENDENT_EXISTS, "full-text config", @@ -1514,8 +1794,10 @@ for (Dataset dataset : datasets) { if ((dataset.getItemTypeName().equals(datatypeName) && dataset.getItemTypeDataverseName().equals(dataverseName)) + && dataset.getItemTypeDatabaseName().equals(database) || ((dataset.hasMetaPart() && dataset.getMetaItemTypeName().equals(datatypeName) - && dataset.getMetaItemTypeDataverseName().equals(dataverseName)))) { + && dataset.getMetaItemTypeDataverseName().equals(dataverseName) + && dataset.getMetaItemTypeDatabaseName().equals(database)))) { throw new AsterixException( org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_OBJECT_DEPENDENT_EXISTS, "type", TypeUtil.getFullyQualifiedDisplayName(dataverseName, datatypeName), dataset(), @@ -1539,8 +1821,9 @@ IAType typeToBeDropped = dataTypeToBeDropped.getDatatype(); List<Datatype> datatypes = getAllDatatypes(txnId); for (Datatype dataType : datatypes) { + // skip types in different dataverses as well as the type to be dropped itself - if (!dataType.getDataverseName().equals(dataverseName) + if (!dataType.getDataverseName().equals(dataverseName) || !dataType.getDatabaseName().equals(database) || dataType.getDatatype().getTypeName().equals(datatypeName)) { continue; } @@ -1706,6 +1989,10 @@ return getFunctionsImpl(txnId, createTuple(database, dataverseName)); } + private List<Function> getDatabaseFunctions(TxnId txnId, String database) throws AlgebricksException { + return getFunctionsImpl(txnId, createTuple(database)); + } + private List<Function> getFunctionsImpl(TxnId txnId, ITupleReference searchKey) throws AlgebricksException { try { FunctionTupleTranslator tupleReaderWriter = @@ -2123,6 +2410,21 @@ } } + private List<DatasourceAdapter> getDatabaseAdapters(TxnId txnId, String database) throws AlgebricksException { + try { + ITupleReference searchKey = createTuple(database); + DatasourceAdapterTupleTranslator tupleReaderWriter = + tupleTranslatorProvider.getAdapterTupleTranslator(false); + IValueExtractor<DatasourceAdapter> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter); + List<DatasourceAdapter> results = new ArrayList<>(); + searchIndex(txnId, mdIndexesProvider.getDatasourceAdapterEntity().getIndex(), searchKey, valueExtractor, + results); + return results; + } catch (HyracksDataException e) { + throw new AlgebricksException(e); + } + } + @Override public void addLibrary(TxnId txnId, Library library) throws AlgebricksException { try { @@ -2398,6 +2700,19 @@ } } + private List<FeedPolicyEntity> getDatabaseFeedPolicies(TxnId txnId, String database) throws AlgebricksException { + try { + ITupleReference searchKey = createTuple(database); + FeedPolicyTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFeedPolicyTupleTranslator(false); + IValueExtractor<FeedPolicyEntity> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter); + List<FeedPolicyEntity> results = new ArrayList<>(); + searchIndex(txnId, mdIndexesProvider.getFeedPolicyEntity().getIndex(), searchKey, valueExtractor, results); + return results; + } catch (HyracksDataException e) { + throw new AlgebricksException(e); + } + } + @Override public void addExternalFile(TxnId txnId, ExternalFile externalFile) throws AlgebricksException { try { @@ -2619,6 +2934,19 @@ } } + private List<Synonym> getDatabaseSynonyms(TxnId txnId, String database) throws AlgebricksException { + try { + ITupleReference searchKey = createTuple(database); + SynonymTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getSynonymTupleTranslator(false); + IValueExtractor<Synonym> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter); + List<Synonym> results = new ArrayList<>(); + searchIndex(txnId, mdIndexesProvider.getSynonymEntity().getIndex(), searchKey, valueExtractor, results); + return results; + } catch (HyracksDataException e) { + throw new AlgebricksException(e); + } + } + @Override public void updateDataset(TxnId txnId, Dataset dataset) throws AlgebricksException { try { -- To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17836 To unsubscribe, or for help writing mail filters, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Change-Id: Ifd629b9d324716ea1e903292494120e6e768c172 Gerrit-Change-Number: 17836 Gerrit-PatchSet: 3 Gerrit-Owner: Ali Alsuliman <[email protected]> Gerrit-Reviewer: Ali Alsuliman <[email protected]> Gerrit-Reviewer: Anon. E. Moose #1000171 Gerrit-Reviewer: Jenkins <[email protected]> Gerrit-Reviewer: Michael Blow <[email protected]> Gerrit-Reviewer: Murtadha Hubail <[email protected]> Gerrit-CC: Till Westmann <[email protected]> Gerrit-MessageType: merged
