package org.aksw.jena_sparql_api.unsorted; import java.util.AbstractMap.SimpleEntry; import java.util.Map.Entry; import java.util.Set; import org.aksw.combinatorics.algos.CartesianProductUtils; import org.aksw.combinatorics.collections.Combination; import org.aksw.commons.collections.CartesianProduct; import org.aksw.jena_sparql_api.utils.ExprUtils; import org.apache.jena.sparql.core.Var; import org.apache.jena.sparql.expr.E_StrStartsWith; import org.apache.jena.sparql.expr.Expr; import org.apache.jena.sparql.expr.NodeValue; public class ExprMatcher { /** * The query expr must subsume the cache expr. * * @param cache * @param query * @return */ public static Expr match(Expr cache, Expr query) { System.out.println("MATCHING " + cache + " WITH " + query); Expr result = NodeValue.FALSE; if(cache.equals(query)) { result = NodeValue.TRUE; } else { // Implementation for dealing with subsumption of strStartsWith expressions Entry<E_StrStartsWith, E_StrStartsWith> e = getIfOfSameType(E_StrStartsWith.class, cache, query); if(e != null) { Entry<Var, NodeValue> pa = ExprUtils.extractVarConstant(e.getKey()); Entry<Var, NodeValue> pb = ExprUtils.extractVarConstant(e.getKey()); // TODO Replace by a predicate function boolean canMatch = pa.getKey().equals(pb.getKey()) && pa.getValue().isString() && pb.getValue().isString(); if(canMatch) { String sa = pa.getValue().asString(); String sb = pa.getValue().asString(); if(sb.startsWith(sa)) { result = e.getValue(); } } } } return result; } public static <T> Entry<T, T> getIfOfSameType(Class<T> clazz, Expr a, Expr b) { @SuppressWarnings("unchecked") Entry<T, T> result = clazz.isAssignableFrom(a.getClass()) && clazz.isAssignableFrom(b.getClass()) ? new SimpleEntry<T, T>((T)a, (T)b) : null; return result; } public static CartesianProduct<Combination<Expr, Expr, Expr>> match(Set<Expr> cacheConjection, Set<Expr> queryConjunction) { CartesianProduct<Combination<Expr, Expr, Expr>> result = CartesianProductUtils.createOnDemandCartesianProduct( cacheConjection, queryConjunction, ExprMatcher::match, x -> x.equals(NodeValue.FALSE)); return result; } //public static // public static Collection<Expr> addContribution(Collection<Expr> clause, Expr expr) { // Expr result; // if(expr.equals(NodeValue.FALSE)) { // result = NodeValue.FALSE; // } else if(expr.equals(NodeValue.TRUE)) { // result = clause; // } // } }