package org.aksw.jena_sparql_api.cache.tests; import java.util.Collection; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; import org.aksw.jena_sparql_api.concept_cache.collection.FeatureMap; import org.aksw.jena_sparql_api.concept_cache.core.SparqlCacheUtils; import org.aksw.jena_sparql_api.concept_cache.domain.ProjectedQuadFilterPattern; import org.aksw.jena_sparql_api.concept_cache.domain.QuadFilterPattern; import org.aksw.jena_sparql_api.concept_cache.domain.QuadFilterPatternCanonical; import org.aksw.jena_sparql_api.concept_cache.op.OpUtils; import org.aksw.jena_sparql_api.concept_cache.trash.OpVisitorViewCacheApplier; import org.aksw.jena_sparql_api.utils.Generator; import org.apache.jena.sparql.algebra.Algebra; import org.apache.jena.sparql.algebra.Op; import org.apache.jena.sparql.algebra.op.OpProject; import org.apache.jena.sparql.core.Var; import org.apache.jena.sparql.expr.Expr; import com.google.common.collect.Multimap; /** * * * @author raven * */ public class QfpcMap { protected FeatureMap<Expr, Void> clauseSigTo; public void add(Op cacheOp) { } /** * Performs a lookup with a qfpc * and returns * * @param queryQfpc * @return */ public Map<Object, Object> get(QuadFilterPatternCanonical queryQfpc) { Op rawOp = null; rawOp = Algebra.toQuadForm(rawOp); // TODO We could create a mapping from (op) -> (op with replaced constants) // rawOp = ReplaceConstants.replace(rawOp); Generator<Var> generator = OpUtils.freshVars(rawOp); // Extract all quad filter patterns from the op Map<Op, ProjectedQuadFilterPattern> tmpCacheableOps = OpVisitorViewCacheApplier.detectPrimitiveCachableOps(rawOp); // If the op is a projection, associate the pqfp with the sub op in order to retain the projection // TODO This is necessary, if we later expand the graph pattern; yet, I am not sure this is the best way to retain the projection Map<Op, ProjectedQuadFilterPattern> cacheableOps = tmpCacheableOps.entrySet().stream() .collect(Collectors.toMap(e -> { Op op = e.getKey(); Op r = op instanceof OpProject ? ((OpProject)op).getSubOp() : op; return r; }, Entry::getValue)); Map<QuadFilterPattern, QuadFilterPatternCanonical> qfpToCanonical = cacheableOps.entrySet().stream() .collect(Collectors.toMap(e -> e.getValue().getQuadFilterPattern(), e -> { ProjectedQuadFilterPattern pqfp = e.getValue(); QuadFilterPattern qfp = pqfp.getQuadFilterPattern(); QuadFilterPatternCanonical r = SparqlCacheUtils.canonicalize2(qfp, generator); return r; })); Collection<QuadFilterPatternCanonical> qfpcs = qfpToCanonical.values(); //qfpcs.stream(). for(QuadFilterPatternCanonical qfpc : qfpcs) { FeatureMap<Expr, Multimap<Expr, Expr>> clausesIndex = SparqlCacheUtils.indexDnf(qfpc.getFilterDnf()); for(Entry<Set<Expr>, Collection<Multimap<Expr, Expr>>> clauseSigToLiteralSigToLiteral : clausesIndex.entrySet()) { } } return null; } }