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.HashSet;
import java.util.Map;
import java.util.Set;
public class FirstPosVisitor implements Visitor<Set<Integer>, _void> {
Map<Entity, Integer> idsMap;
Map<Expression, Boolean> nullable;
Map<Expression, Set<Integer>> firstpos = new HashMap<Expression, Set<Integer>>();
public FirstPosVisitor(Map<Entity, Integer> idsMap,
Map<Expression, Boolean> nullable){
this.idsMap = idsMap;
this.nullable = nullable;
}
public Map<Expression, Set<Integer>> getFirstPos(){
return firstpos;
}
@Override
public Set<Integer> visitQuery(Query query, _void... arguments) {
Set<Integer> i = query.getExpression().accept(this);
Set<Integer> n = new HashSet<Integer>();
n.addAll(i);
firstpos.put(query, n);
Set<Integer> hash = new HashSet<Integer>();
hash.add(idsMap.get(query.getEOF()));
firstpos.put(query.getEOF(), hash);
return n;
}
@Override
public Set<Integer> visitVertex(Vertex vertex, _void... arguments) {
Set<Integer> set = new HashSet<Integer>();
set.add(idsMap.get(vertex));
firstpos.put(vertex, set);
return set;
}
@Override
public Set<Integer> visitEdge(Edge edge, _void... arguments) {
Set<Integer> set = new HashSet<Integer>();
set.add(idsMap.get(edge));
firstpos.put(edge, set);
return set;
}
@Override
public Set<Integer> visitAsteriskQuantifier(AsteriskQuantifier quantifier,
_void... arguments) {
Set<Integer> n = new HashSet<Integer>();
Set<Integer> sub = quantifier.getQuantified().accept(this);
n.addAll(sub);
firstpos.put(quantifier, n);
return n;
}
@Override
public Set<Integer> visitQuestionQuantifier(QuestionQuantifier quantifier,
_void... arguments) {
Set<Integer> n = new HashSet<Integer>();
Set<Integer> sub = quantifier.getQuantified().accept(this);
n.addAll(sub);
firstpos.put(quantifier, n);
return n;
}
@Override
public Set<Integer> visitPlusQuantifier(PlusQuantifier quantifier,
_void... arguments) {
Set<Integer> n = new HashSet<Integer>();
Set<Integer> sub = quantifier.getQuantified().accept(this);
n.addAll(sub);
firstpos.put(quantifier, n);
return n;
}
@Override
public Set<Integer> visitConcat(Concat concat, _void... arguments) {
Set<Integer> n = new HashSet<Integer>();
Set<Integer> first = concat.getFirst().accept(this);
Set<Integer> last = concat.getSecond().accept(this);
if(nullable.get(concat.getFirst())){
n.addAll(first);
n.addAll(last);
}else{
n.addAll(first);
}
firstpos.put(concat, n);
return n;
}
@Override
public Set<Integer> visitCondition(Condition cond, _void... arguments) {
return null;
}
@Override
public Set<Integer> visitOrder(Order order, _void... arguments) {
return null;
}
@Override
public Set<Integer> visitParallel(Parallel parallel, _void... arguments) {
Set<Integer> n = new HashSet<Integer>();
Set<Integer> first = parallel.getFirst().accept(this);
Set<Integer> last = parallel.getSecond().accept(this);
n.addAll(first);
n.addAll(last);
firstpos.put(parallel, n);
return n;
}
}