You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by os...@apache.org on 2016/01/11 08:28:02 UTC

[2/6] jena git commit: store Multimaps in the cache for more efficient retrieval of known subject URIs

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/master
Commit: 8e24f26a3879936fe8fa40a70c3c06c31cc2aedd
Parents: e287354
Author: Osma Suominen <os...@apache.org>
Authored: Tue Jan 5 22:34:02 2016 +0200
Committer: Osma Suominen <os...@apache.org>
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;