store Multimaps in the cache for more efficient retrieval of known subject URIs
Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/8e24f26a Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/8e24f26a Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/8e24f26a Branch: refs/heads/JENA-507 Commit: 8e24f26a3879936fe8fa40a70c3c06c31cc2aedd Parents: e287354 Author: Osma Suominen <[email protected]> Authored: Tue Jan 5 22:34:02 2016 +0200 Committer: Osma Suominen <[email protected]> Committed: Mon Jan 11 09:27:13 2016 +0200 ---------------------------------------------------------------------- .../org/apache/jena/query/text/TextQueryPF.java | 27 ++++++++++++-------- 1 file changed, 17 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/8e24f26a/jena-text/src/main/java/org/apache/jena/query/text/TextQueryPF.java ---------------------------------------------------------------------- diff --git a/jena-text/src/main/java/org/apache/jena/query/text/TextQueryPF.java b/jena-text/src/main/java/org/apache/jena/query/text/TextQueryPF.java index 679a0e3..c6fa84f 100644 --- a/jena-text/src/main/java/org/apache/jena/query/text/TextQueryPF.java +++ b/jena-text/src/main/java/org/apache/jena/query/text/TextQueryPF.java @@ -18,18 +18,20 @@ package org.apache.jena.query.text ; +import java.util.Collection ; import java.util.Iterator ; import java.util.LinkedHashMap ; import java.util.List ; import java.util.Map ; import java.util.function.Function ; -import java.util.stream.Collectors ; import org.apache.jena.atlas.iterator.Iter ; import org.apache.jena.atlas.logging.Log ; import org.apache.jena.datatypes.RDFDatatype ; import org.apache.jena.datatypes.xsd.XSDDatatype ; import org.apache.jena.graph.Node ; +import org.apache.jena.ext.com.google.common.collect.LinkedListMultimap; +import org.apache.jena.ext.com.google.common.collect.ListMultimap; import org.apache.jena.query.QueryBuildException ; import org.apache.jena.query.QueryExecException ; import org.apache.jena.sparql.core.* ; @@ -199,7 +201,7 @@ public class TextQueryPF extends PropertyFunctionBase { return qIter ; } - private QueryIterator resultsToQueryIterator(Binding binding, Node s, Node score, Node literal, List<TextHit> results, ExecutionContext execCxt) { + private QueryIterator resultsToQueryIterator(Binding binding, Node s, Node score, Node literal, Collection<TextHit> results, ExecutionContext execCxt) { Var sVar = Var.isVar(s) ? Var.alloc(s) : null ; Var scoreVar = (score==null) ? null : Var.alloc(score) ; Var literalVar = (literal==null) ? null : Var.alloc(literal) ; @@ -223,7 +225,8 @@ public class TextQueryPF extends PropertyFunctionBase { } private QueryIterator variableSubject(Binding binding, Node s, Node score, Node literal, StrMatch match, ExecutionContext execCxt) { - List<TextHit> r = query(match.getProperty(), match.getQueryString(), match.getLimit(), execCxt) ; + ListMultimap<String,TextHit> results = query(match.getProperty(), match.getQueryString(), match.getLimit(), execCxt) ; + Collection<TextHit> r = results.values(); return resultsToQueryIterator(binding, s, score, literal, r, execCxt); } @@ -234,17 +237,17 @@ public class TextQueryPF extends PropertyFunctionBase { } String qs = match.getQueryString() ; - List<TextHit> x = query(match.getProperty(), match.getQueryString(), -1, execCxt) ; + ListMultimap<String,TextHit> x = query(match.getProperty(), match.getQueryString(), -1, execCxt) ; if ( x == null ) // null return value - empty result return IterLib.noResults(execCxt) ; - List<TextHit> r = x.stream().filter(hit -> hit.getNode().equals(s)).collect(Collectors.toList()); + List<TextHit> r = x.get(s.getURI()); return resultsToQueryIterator(binding, s, score, literal, r, execCxt); } - private List<TextHit> query(Node property, String queryString, int limit, ExecutionContext execCxt) { + private ListMultimap<String,TextHit> query(Node property, String queryString, int limit, ExecutionContext execCxt) { // use the graph information in the text index if possible if (textIndex.getDocDef().getGraphField() != null && execCxt.getActiveGraph() instanceof GraphView) { @@ -275,16 +278,20 @@ public class TextQueryPF extends PropertyFunctionBase { log.debug("Text query: {} ({})", queryString,limit) ; String cacheKey = limit + " " + property + " " + queryString ; - Map<String,List<TextHit>> queryCache = - (Map<String,List<TextHit>>) execCxt.getContext().get(cacheSymbol); + Map<String,ListMultimap<String,TextHit>> queryCache = + (Map<String,ListMultimap<String,TextHit>>) execCxt.getContext().get(cacheSymbol); if (queryCache == null) { /* doesn't yet exist, need to create it */ queryCache = new LinkedHashMap(); execCxt.getContext().put(cacheSymbol, queryCache); } - List<TextHit> results = queryCache.get(cacheKey) ; + ListMultimap<String,TextHit> results = queryCache.get(cacheKey) ; if (results == null) { /* cache miss */ - results = textIndex.query(property, queryString, limit) ; + List<TextHit> resultList = textIndex.query(property, queryString, limit) ; + results = LinkedListMultimap.create(); + for (TextHit result : resultList) { + results.put(result.getNode().getURI(), result); + } queryCache.put(cacheKey, results) ; } return results;
