package com.github.anno4j.querying.evaluation;
import com.github.anno4j.querying.Comparison;
import com.github.anno4j.querying.Criteria;
import com.hp.hpl.jena.sparql.core.Var;
import com.hp.hpl.jena.sparql.expr.*;
import com.hp.hpl.jena.sparql.expr.nodevalue.NodeValueDouble;
import com.hp.hpl.jena.sparql.syntax.ElementFilter;
import com.hp.hpl.jena.sparql.syntax.ElementGroup;
/**
* Created by schlegel on 03/06/15.
*/
public class EvalComparison {
public static void evaluate(ElementGroup elementGroup, Criteria criteria, Var variable) {
if (criteria.isNaN()) {
String constraint = "";
// Setting the boundaries (\b) to the RegExp, according to the comparison type
if (Comparison.EQ.equals(criteria.getComparison())) {
constraint = "^" + criteria.getConstraint() + "$";
} else if (Comparison.CONTAINS.equals(criteria.getComparison())) {
constraint = criteria.getConstraint();
} else if (Comparison.STARTS_WITH.equals(criteria.getComparison())) {
constraint = "^" + criteria.getConstraint();
} else if (Comparison.ENDS_WITH.equals(criteria.getComparison())) {
constraint = criteria.getConstraint() + "$";
} else {
throw new IllegalStateException(criteria.getComparison() + " is only allowed on Numbers.");
}
if (!constraint.equals("")) {
elementGroup.addElementFilter(new ElementFilter(new E_Regex(new E_Str(new ExprVar(variable.asNode())), constraint , "")));
}
} else {
Expr expr;
if (criteria.getComparison().equals(Comparison.GT)) {
expr = new E_GreaterThan(new ExprVar(variable.asNode()), new NodeValueDouble(Double.parseDouble(criteria.getConstraint())));
} else if (criteria.getComparison().equals(Comparison.GTE)) {
expr = new E_GreaterThanOrEqual(new ExprVar(variable.asNode()), new NodeValueDouble(Double.parseDouble(criteria.getConstraint())));
} else if (criteria.getComparison().equals(Comparison.LT)) {
expr = new E_LessThan(new ExprVar(variable.asNode()), new NodeValueDouble(Double.parseDouble(criteria.getConstraint())));
} else if (criteria.getComparison().equals(Comparison.LTE)) {
expr = new E_LessThanOrEqual(new ExprVar(variable.asNode()), new NodeValueDouble(Double.parseDouble(criteria.getConstraint())));
} else if (criteria.getComparison().equals(Comparison.EQ)) {
expr = new E_Equals(new ExprVar(variable.asNode()), new ExprVar(criteria.getConstraint()));
} else {
throw new IllegalStateException(criteria.getComparison() + " is not allowed on Numbers.");
}
if(expr != null) {
elementGroup.addElementFilter(new ElementFilter(expr));
}
}
}
}