package org.aksw.jena_sparql_api.util.sparql.syntax.path;
import org.apache.jena.graph.Node;
import org.apache.jena.sparql.path.P_Alt;
import org.apache.jena.sparql.path.P_Distinct;
import org.apache.jena.sparql.path.P_FixedLength;
import org.apache.jena.sparql.path.P_Inverse;
import org.apache.jena.sparql.path.P_Link;
import org.apache.jena.sparql.path.P_Mod;
import org.apache.jena.sparql.path.P_Multi;
import org.apache.jena.sparql.path.P_NegPropSet;
import org.apache.jena.sparql.path.P_OneOrMore1;
import org.apache.jena.sparql.path.P_OneOrMoreN;
import org.apache.jena.sparql.path.P_ReverseLink;
import org.apache.jena.sparql.path.P_Seq;
import org.apache.jena.sparql.path.P_Shortest;
import org.apache.jena.sparql.path.P_ZeroOrMore1;
import org.apache.jena.sparql.path.P_ZeroOrMoreN;
import org.apache.jena.sparql.path.P_ZeroOrOne;
import org.apache.jena.sparql.path.Path;
/**
* Apply an invertion on a given path and stores the obtained path in 'result'
*
* @author raven
*
*/
public class PathVisitorInvert
implements PathVisitorRewrite
{
public static Path apply(Path path) {
PathVisitorInvert visitor = new PathVisitorInvert();
path.visit(visitor);
Path result = visitor.getResult();
return result;
}
protected Path result = null;
public Path getResult() {
return result;
}
@Override
public void visit(P_Link path) {
result = new P_ReverseLink(path.getNode());
}
@Override
public void visit(P_ReverseLink path) {
result = new P_Link(path.getNode());
}
@Override
public void visit(P_NegPropSet path) {
P_NegPropSet tmp = new P_NegPropSet();
for(Node node : path.getFwdNodes()) {
tmp.add(new P_ReverseLink(node));
}
for(Node node : path.getBwdNodes()) {
tmp.add(new P_Link(node));
}
result = tmp;
}
@Override
public void visit(P_Inverse path) {
result = path.getSubPath();
}
@Override
public void visit(P_Mod path) {
result = new P_Mod(new P_Inverse(path.getSubPath()), path.getMin(), path.getMax());
}
@Override
public void visit(P_FixedLength path) {
result = new P_FixedLength(new P_Inverse(path.getSubPath()), path.getCount());
}
@Override
public void visit(P_Distinct path) {
result = new P_Distinct(new P_Inverse(path.getSubPath()));
}
@Override
public void visit(P_Multi path) {
result = new P_Multi(new P_Inverse(path.getSubPath()));
}
@Override
public void visit(P_Shortest path) {
result = new P_Shortest(new P_Inverse(path.getSubPath()));
}
@Override
public void visit(P_ZeroOrOne path) {
result = new P_ZeroOrOne(new P_Inverse(path.getSubPath()));
}
@Override
public void visit(P_ZeroOrMore1 path) {
result = new P_ZeroOrMore1(new P_Inverse(path.getSubPath()));
}
@Override
public void visit(P_ZeroOrMoreN path) {
result = new P_ZeroOrMoreN(new P_Inverse(path.getSubPath()));
}
@Override
public void visit(P_OneOrMore1 path) {
result = new P_OneOrMore1(new P_Inverse(path.getSubPath()));
}
@Override
public void visit(P_OneOrMoreN path) {
result = new P_OneOrMoreN(new P_Inverse(path.getSubPath()));
}
@Override
public void visit(P_Alt path) {
result = new P_Alt(new P_Inverse(path.getLeft()), new P_Inverse(path.getRight()));
}
@Override
public void visit(P_Seq path) {
result = new P_Alt(new P_Inverse(path.getLeft()), new P_Inverse(path.getRight()));
}
}