blob: a908363810ff48793fcb9a04f2b36de692254fff [file] [log] [blame]
package edu.uci.ics.asterix.translator;
import java.util.Map;
import edu.uci.ics.asterix.aql.base.Statement;
import edu.uci.ics.asterix.aql.expression.DataverseDropStatement;
import edu.uci.ics.asterix.aql.expression.DropStatement;
import edu.uci.ics.asterix.aql.expression.FunctionDropStatement;
import edu.uci.ics.asterix.aql.expression.NodeGroupDropStatement;
import edu.uci.ics.asterix.common.exceptions.AsterixException;
import edu.uci.ics.asterix.common.functions.FunctionSignature;
import edu.uci.ics.asterix.metadata.bootstrap.MetadataConstants;
import edu.uci.ics.asterix.metadata.entities.AsterixBuiltinArtifactMap;
import edu.uci.ics.asterix.metadata.entities.AsterixBuiltinArtifactMap.ARTIFACT_KIND;
import edu.uci.ics.asterix.metadata.entities.AsterixBuiltinTypeMap;
import edu.uci.ics.asterix.metadata.entities.Dataverse;
import edu.uci.ics.asterix.om.types.BuiltinType;
import edu.uci.ics.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
public abstract class AbstractAqlTranslator {
protected static final Map<String, BuiltinType> builtinTypeMap = AsterixBuiltinTypeMap.getBuiltinTypes();
public void validateOperation(Dataverse dataverse, Statement stmt) throws AsterixException {
String dataverseName = dataverse != null ? dataverse.getDataverseName() : null;
if (dataverseName != null && dataverseName.equals(MetadataConstants.METADATA_DATAVERSE_NAME)) {
boolean invalidOperation = false;
String message = null;
switch (stmt.getKind()) {
case INSERT:
case UPDATE:
case DELETE:
invalidOperation = true;
message = " Operation " + stmt.getKind() + " not permitted in system dataverse " + "'"
+ MetadataConstants.METADATA_DATAVERSE_NAME + "'";
break;
case FUNCTION_DROP:
FunctionSignature signature = ((FunctionDropStatement) stmt).getFunctionSignature();
FunctionIdentifier fId = new FunctionIdentifier(signature.getNamespace(), signature.getName(),
signature.getArity());
if (dataverseName.equals(MetadataConstants.METADATA_DATAVERSE_NAME)
&& AsterixBuiltinArtifactMap.isSystemProtectedArtifact(ARTIFACT_KIND.FUNCTION, fId)) {
invalidOperation = true;
message = "Cannot drop function " + signature + " (protected by system)";
}
break;
case NODEGROUP_DROP:
NodeGroupDropStatement nodeGroupDropStmt = (NodeGroupDropStatement) stmt;
String nodegroupName = nodeGroupDropStmt.getNodeGroupName().getValue();
if (AsterixBuiltinArtifactMap.isSystemProtectedArtifact(ARTIFACT_KIND.NODEGROUP, nodegroupName)) {
message = "Cannot drop nodegroup " + nodegroupName + " (protected by system)";
invalidOperation = true;
}
break;
case DATAVERSE_DROP:
DataverseDropStatement dvDropStmt = (DataverseDropStatement) stmt;
String dvName = dvDropStmt.getDataverseName().getValue();
if (dvName.equals(MetadataConstants.METADATA_DATAVERSE_NAME)) {
message = "Cannot drop dataverse " + dvName + " (protected by system)";
invalidOperation = true;
}
break;
case DATASET_DROP:
DropStatement dropStmt = (DropStatement) stmt;
String datasetName = dropStmt.getDatasetName().getValue();
if (AsterixBuiltinArtifactMap.isSystemProtectedArtifact(ARTIFACT_KIND.DATASET, datasetName)) {
invalidOperation = true;
message = "Cannot drop dataset " + datasetName + " (protected by system)";
}
break;
}
if (invalidOperation) {
throw new AsterixException(message);
}
}
}
}