@Override
public void dropDatatype(TxnId txnId, String dataverseName, String datatypeName)
throws AlgebricksException, RemoteException {
confirmDatatypeIsUnused(txnId, dataverseName, datatypeName);
try {
ITupleReference searchKey = createTuple(dataverseName, datatypeName);
ITupleReference tuple = getTupleToBeDeleted(txnId, MetadataPrimaryIndexes.DATATYPE_DATASET, searchKey);
List<String> nestedTypes = getNestedComplexDatatypeNamesForThisDatatype(txnId, dataverseName, datatypeName);
deleteTupleFromIndex(txnId, MetadataPrimaryIndexes.DATATYPE_DATASET, tuple);
for (String nestedType : nestedTypes) {
Datatype dt = getDatatype(txnId, dataverseName, nestedType);
if (dt != null && dt.getIsAnonymous()) {
dropDatatype(txnId, dataverseName, dt.getDatatypeName());
}
}
} catch (HyracksDataException e) {
if (e.getComponent().equals(ErrorCode.HYRACKS)
&& e.getErrorCode() == ErrorCode.UPDATE_OR_DELETE_NON_EXISTENT_KEY) {
throw new AlgebricksException("Cannot drop type '" + datatypeName + "' because it doesn't exist", e);
} else {
throw new AlgebricksException(e);
}
}
}