package org.aksw.sparqlify.expr.util;
import java.util.Map;
import java.util.Set;
import org.aksw.commons.util.reflect.MultiMethod;
import org.aksw.sparqlify.core.RdfTermPattern;
import org.aksw.sparqlify.core.RdfTermPatternDerivation;
import org.apache.jena.sparql.core.Var;
import org.apache.jena.sparql.expr.E_Equals;
import org.apache.jena.sparql.expr.E_LogicalAnd;
import org.apache.jena.sparql.expr.E_LogicalNot;
import org.apache.jena.sparql.expr.E_LogicalOr;
import org.apache.jena.sparql.expr.Expr;
public class ExprPatternSatisfiability {
/**
* Given a set of views and a query such as:
* select * { ?s ?p ?o . Filter(?s = 'myconstant'). }
*
* For each view instance matching the query-triple, it must be possible tha
* ?s equals the constant, hence pattern(?s).contains(myconstant).
*
*
*/
public static void isSatisfiable(Set<Set<Expr>> dnf, Map<Var, RdfTermPattern> varToPattern) {
for(Set<Expr> clause : dnf) {
for(Expr expr : clause) {
}
}
}
public static Boolean isSatisfiable(Expr expr) {
return MultiMethod.invokeStatic(ExprPatternSatisfiability.class, "_isSatisfiable", expr);
}
public static Boolean _isSatisfiable(E_LogicalAnd expr) {
Boolean a = isSatisfiable(expr.getArg1());
if(a == false) {
return false;
}
Boolean b = isSatisfiable(expr.getArg2());
return b == true ? a : b;
}
public static Boolean _isSatisfiable(E_LogicalNot expr) {
Boolean a = isSatisfiable(expr.getArg());
return a == null ? null : !a;
}
public static Boolean _isSatisfiable(E_LogicalOr expr) {
Boolean a = isSatisfiable(expr.getArg1());
if(a == true) {
return true;
}
Boolean b = isSatisfiable(expr.getArg2());
return b == false ? a : b;
}
public static Boolean _isSatisfiable(E_Equals expr) {
RdfTermPattern a = getPattern(expr.getArg1());
RdfTermPattern b = getPattern(expr.getArg1());
RdfTermPattern intersection = RdfTermPattern.intersect(a, b);
return intersection.isSatisfiable();
}
public static RdfTermPattern getPattern(Expr expr) {
return RdfTermPatternDerivation.deriveRegex(expr);
//return MultiMethod.invokeStatic(ExprPatternSatisfiability.class, "_getPattern", expr);
}
/*
public static RdfTermPattern _getPattern(ExprVar expr) {
}
public static RdfTermPattern _getPattern(NodeValue node) {
RdfTermPatternDerivation.
}
*/
}