package exp.cornercases; import org.aksw.jena_sparql_api.views.ExprEvaluator; import org.aksw.jena_sparql_api.views.SparqlifyConstants; import org.aksw.jena_sparql_api.views.SqlTranslationUtils; import org.apache.jena.sparql.expr.Expr; import org.apache.jena.sparql.function.FunctionRegistry; import org.apache.jena.sparql.util.ExprUtils; import org.junit.Test; /** * TODO: If we use Expr for both SPARQL and SQL expressions, how can we distingiush between them? * This is might be really simple: Just look at the root node whether it has become an SQL expression. * NOTE But this would mean, we would need operators such as +_sql, -sql and such. * * * Essentially, this depends on the set of function symbols/iris used. * E.g. if all functions are in the sql: namespace, then the expression can be converted to SQL. * * Maybe we could use the ExprFactorizer (or whatever I called this), which returns * the "top-level" SPARQL expressions that references variables that map to SQL exprs. * * This way we can tell whether the whole expression could be pushed. * * * @author Claus Stadler <cstadler@informatik.uni-leipzig.de> * */ public class EvalTest { @Test public void FunctionTest() { FunctionRegistry registry = FunctionRegistry.get(); //registry.put("http://ex.org/func", funcClass); String testStrs[] = new String[] { "<http://ex.org/func>(1 + 3, lang(<" + SparqlifyConstants.rdfTermLabel + ">(1 + 1, concat('http://foo', '/bar', concat('', ?x)), 'en', '')), lang('test'@fr) + ?a + 4 + ?b)", "<" + SparqlifyConstants.rdfTermLabel + ">(1, concat('foo', 'bar', ?a), '', '') = <" + SparqlifyConstants.rdfTermLabel + ">(1, concat('foobar', ?b), '', '')" }; String str = testStrs[1]; System.out.println(str); Expr expr = ExprUtils.parse(str); /* Chicken-egg problem: the evaluator may needs to perform transformations, but transformation * may need to apply evaluations. * * So for now, we use a "transformer proxy" which is passed to the evaluator, * but wichi is only initialized later. * */ /* ExprTransformerMap exprTransformer = new ExprTransformerMap(); ExprEvaluatorPartial evaluator = new ExprEvaluatorPartial(registry, exprTransformer); Map<String, ExprTransformer> transMap = exprTransformer.getTransformerMap(); transMap.put("concat", new ExprTransformerConcatNested()); transMap.put("lang", new ExprTransformerLang()); transMap.put("=", new ExprTransformerRdfTermComparator(evaluator)); transMap.put("&&", new ExprTransformerLogicalAnd()); */ ExprEvaluator evaluator = SqlTranslationUtils.createDefaultEvaluator(); //exprTransformer.put(SparqlifyConstants.rdfTermLabel, new ExprTransformer()); //VarBinding binding = new VarBinding(); Expr result = evaluator.eval(expr, null); //binding); System.out.println("Result: "+ result); //Expr e = ExprUtils.eval(expr); //System.out.println(e); } }