package org.aksw.jena_sparql_api.views.index;
import java.util.function.Function;
import org.apache.jena.query.Query;
import org.apache.jena.sparql.algebra.Algebra;
import org.apache.jena.sparql.algebra.Op;
import org.apache.jena.sparql.algebra.OpAsQuery;
/**
* Rewrite a query by rewriting its algebra
*
* @author raven
*
*/
public class QueryRewriterOpRewrite
implements QueryRewriter
{
protected Function<Query, Op> queryToOp;
protected Function<Op, Op> opRewriter;
protected Function<Op, Query> opToQuery;
public QueryRewriterOpRewrite(Function<Query, Op> queryToOp, Function<Op, Op> opRewriter,
Function<Op, Query> opToQuery) {
super();
this.queryToOp = queryToOp;
this.opRewriter = opRewriter;
this.opToQuery = opToQuery;
}
public Function<Query, Op> getQueryToOp() {
return queryToOp;
}
public Function<Op, Op> getOpRewriter() {
return opRewriter;
}
public Function<Op, Query> getOpToQuery() {
return opToQuery;
}
@Override
public Query rewrite(Query query) {
Op op = queryToOp.apply(query);
Op rewrite = opRewriter.apply(op);
Query result = opToQuery.apply(rewrite);
return result;
}
public static QueryRewriterOpRewrite createDefault(Function<Op, Op> opRewriter) {
QueryRewriterOpRewrite result = new QueryRewriterOpRewrite(Algebra::compile, opRewriter, OpAsQuery::asQuery);
return result;
}
/**
* Compiles to quad form
*
* @param opRewriter
* @return
*/
public static QueryRewriterOpRewrite createDefaultQuadForm(Function<Op, Op> opRewriter) {
QueryRewriterOpRewrite result = new QueryRewriterOpRewrite(
(op) -> Algebra.toQuadForm(Algebra.compile(op)),
opRewriter,
OpAsQuery::asQuery);
return result;
}
}