package org.aksw.jena_sparql_api.shape.syntax;
import java.util.List;
import org.aksw.jena_sparql_api.concepts.Relation;
import org.aksw.jena_sparql_api.shape.algebra.op.Op;
import org.aksw.jena_sparql_api.shape.algebra.op.OpAnd;
import org.aksw.jena_sparql_api.shape.algebra.op.OpConcept;
import org.aksw.jena_sparql_api.shape.algebra.op.OpEnumeration;
import org.aksw.jena_sparql_api.shape.algebra.op.OpExists;
import org.aksw.jena_sparql_api.shape.algebra.op.OpFilter;
import org.aksw.jena_sparql_api.shape.algebra.op.OpFocus;
import org.aksw.jena_sparql_api.shape.algebra.op.OpForAll;
import org.aksw.jena_sparql_api.shape.algebra.op.OpTop;
import org.aksw.jena_sparql_api.shape.algebra.op.OpType;
public class ElementVisitorSparql
implements ElementVisitor<Op>
{
@Override
public OpType visit(ElementType el) {
OpType result = new OpType(el.getType());
return result;
}
@Override
public OpConcept visit(ElementSparqlConcept el) {
OpConcept result = new OpConcept(el.getConcept());
return result;
}
@Override
public Op visit(ElementDifference el) {
// TODO Auto-generated method stub
return null;
}
@Override
public Op visit(ElementUnion el) {
// TODO Auto-generated method stub
return null;
}
@Override
public Op visit(ElementValue el) {
// TODO Auto-generated method stub
return null;
}
@Override
public Op visit(ElementEnumeration el) {
Op result = new OpEnumeration(el.getValues());
return result;
}
@Override
public Op visit(ElementFocus el) {
return null;
}
@Override
public Op visit(ElementGroup el) {
List<Element> members = el.getMembers();
// List<ElementFilter> filters = new ArrayList<>();
// List<Element> concepts = new ArrayList<>();
Op result = new OpTop();
for(Element e : members) {
if(e instanceof ElementFilter) {
//filters.add((ElementFilter) e);
result = new OpFilter(result, ((ElementFilter) e).getExpr());
} else if(e instanceof ElementFocus) {
result = new OpFocus(result, ((ElementFocus) e).getPath());
} else {
Op x = e.accept(this);
result = new OpAnd(result, x);
}
}
// Op result = concepts.stream()
// .map(e -> e.accept(this))
// .reduce(new OpTop(), (a, b) -> new OpAnd(a, b));
//
// result = filters.stream()
// .map(e -> e.getExpr())
// .reduce(result, (a, b) -> new OpFilter(a, b), (a, b) -> b);
return result;
}
@Override
public Op visit(ElementAlias el) {
// TODO Auto-generated method stub
return null;
}
@Override
public Op visit(ElementBind el) {
// TODO Auto-generated method stub
return null;
}
@Override
public Op visit(ElementService el) {
// TODO Auto-generated method stub
return null;
}
@Override
public Op visit(ElementFilter el) {
Op result = new OpFilter(new OpTop(), el.getExpr());
return result;
}
@Override
public OpExists visit(ElementExists el) {
Relation relation = Relation.create(el.getPath());
Op op = el.getFiller().accept(this);
OpExists result = new OpExists(relation, op);
return result;
}
@Override
public Op visit(ElementForAll el) {
Relation relation = Relation.create(el.getPath());
Op op = el.getFiller().accept(this);
OpForAll result = new OpForAll(relation, op);
return result;
}
}