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 FollowPosVisitor implements Visitor<_void, _void> {
Map<Entity, Integer> idsMap;
Map<Integer, Entity> idsRevMap;
Map<Expression, Boolean> nullable;
Map<Expression, Set<Integer>> firstpos;
Map<Expression, Set<Integer>> lastpos;
Map<Entity, Set<Integer>> followpos = new HashMap<Entity, Set<Integer>>();
public FollowPosVisitor(Map<Entity, Integer> idsMap, Map<Integer, Entity> idsRevMap,
Map<Expression, Boolean> nullable,
Map<Expression, Set<Integer>> firstpos,
Map<Expression, Set<Integer>> lastpos) {
super();
this.idsMap = idsMap;
this.nullable = nullable;
this.firstpos = firstpos;
this.lastpos = lastpos;
this.idsRevMap = idsRevMap;
}
public Map<Entity, Set<Integer>> getFollowPos(){
return followpos;
}
@Override
public _void visitQuery(Query query,
_void... arguments) {
query.getExpression().accept(this);
Set<Integer> first = lastpos.get(query.getExpression());
Set<Integer> c2 = firstpos.get(query.getEOF());
for(Integer c1:first){
Entity e = idsRevMap.get(c1);
Set<Integer> follow;
if(!followpos.containsKey(e)){
follow = new HashSet<Integer>();
followpos.put(e, follow);
}else{
follow = followpos.get(e);
}
follow.addAll(c2);
}
return null;
}
@Override
public _void visitVertex(Vertex vertex,
_void... arguments) {
return null;
}
@Override
public _void visitEdge(Edge edge,
_void... arguments) {
return null;
}
@Override
public _void visitAsteriskQuantifier(
AsteriskQuantifier quantifier,
_void... arguments) {
quantifier.getQuantified().accept(this);
Set<Integer> first = lastpos.get(quantifier.getQuantified());
Set<Integer> c2 = firstpos.get(quantifier.getQuantified());
for(Integer c1:first){
Entity e = idsRevMap.get(c1);
Set<Integer> follow;
if(!followpos.containsKey(e)){
follow = new HashSet<Integer>();
followpos.put(e, follow);
}else{
follow = followpos.get(e);
}
follow.addAll(c2);
}
return null;
}
@Override
public _void visitQuestionQuantifier(
QuestionQuantifier quantifier,
_void... arguments) {
quantifier.getQuantified().accept(this);
return null;
}
@Override
public _void visitPlusQuantifier(
PlusQuantifier quantifier,
_void... arguments) {
quantifier.getQuantified().accept(this);
Set<Integer> first = lastpos.get(quantifier.getQuantified());
Set<Integer> c2 = firstpos.get(quantifier.getQuantified());
for(Integer c1:first){
Entity e = idsRevMap.get(c1);
Set<Integer> follow;
if(!followpos.containsKey(e)){
follow = new HashSet<Integer>();
followpos.put(e, follow);
}else{
follow = followpos.get(e);
}
follow.addAll(c2);
}
return null;
}
@Override
public _void visitConcat(Concat concat,
_void... arguments) {
concat.getFirst().accept(this);
concat.getSecond().accept(this);
Set<Integer> first = lastpos.get(concat.getFirst());
Set<Integer> c2 = firstpos.get(concat.getSecond());
for(Integer c1:first){
Entity e = idsRevMap.get(c1);
Set<Integer> follow;
if(!followpos.containsKey(e)){
follow = new HashSet<Integer>();
followpos.put(e, follow);
}else{
follow = followpos.get(e);
}
follow.addAll(c2);
}
return null;
}
@Override
public _void visitCondition(Condition cond,
_void... arguments) {
return null;
}
@Override
public _void visitOrder(Order order,
_void... arguments) {
return null;
}
@Override
public _void visitParallel(Parallel parallel,
_void... arguments) {
parallel.getFirst().accept(this);
parallel.getSecond().accept(this);
return null;
}
}