package com.github.anno4j.querying.evaluation.ldpath;
import com.github.anno4j.querying.evaluation.LDPathEvaluatorConfiguration;
import com.github.anno4j.querying.evaluation.VarIDGenerator;
import com.github.anno4j.querying.extension.QueryEvaluator;
import com.github.anno4j.annotations.Evaluator;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.sparql.core.Var;
import com.hp.hpl.jena.sparql.expr.nodevalue.NodeValueNode;
import com.hp.hpl.jena.sparql.syntax.*;
import org.apache.marmotta.ldpath.api.selectors.NodeSelector;
import org.apache.marmotta.ldpath.model.selectors.UnionSelector;
/**
* Evaluates an UnionSelector. More precisely, it creates the UNION part of the SPARQL query.
*/
@Evaluator(UnionSelector.class)
public class UnionSelectorEvaluator implements QueryEvaluator {
@Override
public Var evaluate(NodeSelector nodeSelector, ElementGroup elementGroup, Var var, LDPathEvaluatorConfiguration evaluatorConfiguration) {
UnionSelector unionSelector = (UnionSelector) nodeSelector;
NodeSelector nodeSelectorLeft = unionSelector.getLeft();
NodeSelector nodeSelectorRight = unionSelector.getRight();
ElementGroup leftGroup = new ElementGroup();
ElementGroup rightGroup = new ElementGroup();
Var leftVar = LDPathEvaluator.evaluate(nodeSelectorLeft, leftGroup, var, evaluatorConfiguration);
Var rightVar = LDPathEvaluator.evaluate(nodeSelectorRight, rightGroup, var, evaluatorConfiguration);
Var subVar = Var.alloc(VarIDGenerator.createID());
Query leftSubQuery = new Query();
leftGroup.addElement(new ElementBind(subVar, new NodeValueNode(leftVar.asNode())));
leftSubQuery.setQueryPattern(leftGroup);
leftSubQuery.addResultVar(var);
leftSubQuery.addResultVar(subVar);
leftSubQuery.setQuerySelectType();
ElementSubQuery leftESubQuery = new ElementSubQuery(leftSubQuery);
Query rightSubQuery = new Query();
rightGroup.addElement(new ElementBind(subVar, new NodeValueNode(rightVar.asNode())));
rightSubQuery.setQueryPattern(rightGroup);
rightSubQuery.addResultVar(var);
rightSubQuery.addResultVar(subVar);
rightSubQuery.setQuerySelectType();
ElementSubQuery rightESubQuery = new ElementSubQuery(rightSubQuery);
ElementUnion elementUnion = new ElementUnion();
elementUnion.addElement(leftESubQuery);
elementUnion.addElement(rightESubQuery);
elementGroup.addElement(elementUnion);
return subVar;
}
}