package hdgl.db.query.visitor;
import hdgl.db.query.expression.AsteriskQuantifier;
import hdgl.db.query.expression.Concat;
import hdgl.db.query.expression.Condition;
import hdgl.db.query.expression.Edge;
import hdgl.db.query.expression.Entity;
import hdgl.db.query.expression.Expression;
import hdgl.db.query.expression.Order;
import hdgl.db.query.expression.Parallel;
import hdgl.db.query.expression.PlusQuantifier;
import hdgl.db.query.expression.Query;
import hdgl.db.query.expression.QuestionQuantifier;
import hdgl.db.query.expression.Vertex;
import hdgl.db.query.visitor.Visitor._void;
import java.util.HashMap;
import java.util.Map;
public class NullableVisitor implements Visitor<Boolean, _void> {
Map<Entity, Integer> idsMap;
Map<Expression, Boolean> nullable = new HashMap<Expression, Boolean>();
public Map<Expression, Boolean> getNullableMap(){
return nullable;
}
public NullableVisitor(Map<Entity, Integer> idsMap){
this.idsMap = idsMap;
}
@Override
public Boolean visitQuery(Query query, _void... arguments) {
boolean n = query.getExpression().accept(this);
nullable.put(query, n);
nullable.put(query.getEOF(), false);
return n;
}
@Override
public Boolean visitVertex(Vertex vertex, _void... arguments) {
nullable.put(vertex, false);
return false;
}
@Override
public Boolean visitEdge(Edge edge, _void... arguments) {
nullable.put(edge, false);
return false;
}
@Override
public Boolean visitAsteriskQuantifier(AsteriskQuantifier quantifier,
_void... arguments) {
quantifier.getQuantified().accept(this);
nullable.put(quantifier, true);
return true;
}
@Override
public Boolean visitQuestionQuantifier(QuestionQuantifier quantifier,
_void... arguments) {
quantifier.getQuantified().accept(this);
nullable.put(quantifier, true);
return true;
}
@Override
public Boolean visitPlusQuantifier(PlusQuantifier quantifier,
_void... arguments) {
boolean n = quantifier.getQuantified().accept(this);
nullable.put(quantifier, n);
return n;
}
@Override
public Boolean visitConcat(Concat concat, _void... arguments) {
boolean n1=concat.getFirst().accept(this);
boolean n2=concat.getSecond().accept(this);
nullable.put(concat, n1 && n2);
return n1 && n2;
}
@Override
public Boolean visitCondition(Condition cond, _void... arguments) {
return null;
}
@Override
public Boolean visitOrder(Order order, _void... arguments) {
return null;
}
@Override
public Boolean visitParallel(Parallel parallel, _void... arguments) {
boolean n1=parallel.getFirst().accept(this);
boolean n2=parallel.getSecond().accept(this);
nullable.put(parallel, n1 || n2);
return n1 || n2;
}
}