package org.aksw.jena_sparql_api.sparql_path2;
import java.util.Collections;
import java.util.Set;
import java.util.function.Function;
import org.apache.jena.sparql.path.P_Inverse;
import org.apache.jena.sparql.path.P_Link;
import org.apache.jena.sparql.path.P_NegPropSet;
import org.apache.jena.sparql.path.P_ReverseLink;
import org.apache.jena.sparql.path.Path;
import org.jgrapht.DirectedGraph;
import org.jgrapht.VertexFactory;
public class PathVisitorNfaCompilerImpl<V, E, D>
extends PathVisitorNfaCompilerBase<V, E, D>
{
protected Function<Path, D> primitivePathMapper;
public PathVisitorNfaCompilerImpl(
DirectedGraph<V, E> graph,
VertexFactory<V> vertexFactory,
EdgeLabelAccessor<E, D> edgeLabelAccessor,
Function<Path, D> primitivePathMapper) {
super(graph, vertexFactory, edgeLabelAccessor);
this.primitivePathMapper = primitivePathMapper;
}
public void processPrimitivePath(Path path) {
D edgeLabel = primitivePathMapper.apply(path);
V s = vertexFactory.createVertex();
graph.addVertex(s);
PartialNfa<V, D> partialNfa = PartialNfa.create(s, Collections.singletonList(new HalfEdge<V, D>(s, edgeLabel)));
stack.push(partialNfa);
}
@Override
public void visit(P_Link path) {
processPrimitivePath(path);
}
@Override
public void visit(P_ReverseLink path) {
processPrimitivePath(path);
}
@Override
public void visit(P_NegPropSet path) {
processPrimitivePath(path);
}
@Override
public void visit(P_Inverse path) {
processPrimitivePath(path);
}
public Nfa<V, E> complete() {
PartialNfa<V, D> partialNfa = this.peek();
V finalVertex = vertexFactory.createVertex();
graph.addVertex(finalVertex);
for(HalfEdge<V, D> looseEnd : partialNfa.getLooseEnds()) {
V v = looseEnd.getStartVertex();
D label = looseEnd.getEdgeLabel();
E edge = graph.addEdge(v, finalVertex);
edgeLabelAccessor.setLabel(edge, label);
}
Set<V> startStates = Collections.singleton(partialNfa.getStartVertex());
Set<V> finalStates = Collections.singleton(finalVertex);
NfaImpl<V, E> result = new NfaImpl<V, E>(graph, startStates, finalStates);
return result;
}
//public Nfa()
}