Repository: jena
Updated Branches:
  refs/heads/jena-text-cache [created] 45081fabe


JENA-999 Added a branch with nea-text search results stored in a cache in the 
query context.  This is a branch because it is pretty much a hack.  The cache 
should not really be in the context object.


Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/45081fab
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/45081fab
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/45081fab

Branch: refs/heads/jena-text-cache
Commit: 45081fabe012c56b3fc7ae6a92b4518245779eb2
Parents: 7442161
Author: Stephen Allen <[email protected]>
Authored: Thu Aug 6 19:57:49 2015 -0400
Committer: Stephen Allen <[email protected]>
Committed: Thu Aug 6 19:57:49 2015 -0400

----------------------------------------------------------------------
 .../org/apache/jena/query/text/TextQueryPF.java | 29 ++++++++++++++++----
 1 file changed, 23 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/45081fab/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 ab297e0..70a7c20 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
@@ -19,6 +19,7 @@
 package org.apache.jena.query.text;
 
 import java.util.Collection ;
+import java.util.HashMap ;
 import java.util.Iterator ;
 import java.util.LinkedHashMap ;
 import java.util.List ;
@@ -182,16 +183,34 @@ public class TextQueryPF implements PropertyFunction
         Map<String,TextHit> textResults = null;
         StrMatch match = objectToStruct(argObject, execCxt, false);
         if (null != match) {
-            List<TextHit> hits = query(match.getProperty(), 
match.getQueryString(), match.getLimit(), execCxt);
-            textResults = new LinkedHashMap<String,TextHit>();
-            for (TextHit hit : hits) {
-                textResults.putIfAbsent(hit.getNode().getURI(), hit);
+            // Check the context cache first
+            final String key = buildCacheKey(match);
+            Map<String,Map<String,TextHit>> cache = 
(Map<String,Map<String,TextHit>>)execCxt.getContext().get(cacheSymbol);
+            if (null == cache) {
+                cache = new HashMap<String,Map<String,TextHit>>();
+                execCxt.getContext().put(cacheSymbol, cache);
+            }
+            textResults = cache.get(key);
+            if (null == textResults) {
+                List<TextHit> hits = query(match.getProperty(), 
match.getQueryString(), match.getLimit(), execCxt);
+                textResults = new LinkedHashMap<String,TextHit>();
+                for (TextHit hit : hits) {
+                    textResults.putIfAbsent(hit.getNode().getURI(), hit);
+                }
+                cache.put(key, textResults);
             }
         }
         
         return new RepeatApplyIteratorTextQuery(input, argSubject, predicate, 
argObject, execCxt, textResults) ;
     }
     
+    private static final Symbol cacheSymbol = 
Symbol.create("TextQueryPF.cache");
+    
+    private static String buildCacheKey(StrMatch match) {
+        String prop = match.getProperty() != null ? 
match.getProperty().getURI() : "null";
+        return "prop:<<" + prop + ">> limit:<<" + match.getLimit() + ">> 
query:<<" + match.getQueryString() + ">>";
+    }
+    
     
     private QueryIterator exec(Binding binding, PropFuncArg argSubject, Node 
predicate, PropFuncArg argObject, ExecutionContext execCxt, Map<String,TextHit> 
textResults) {
         DatasetGraph dsg = execCxt.getDataset() ;
@@ -252,8 +271,6 @@ public class TextQueryPF implements PropertyFunction
         return qIter ;
     }
     
-    private static final Symbol cacheSymbol = 
Symbol.create("TextQueryPF.cache");
-    
     private QueryIterator concreteSubject(Binding binding, Node s, Node score, 
Node literal, StrMatch match, ExecutionContext execCxt, Map<String,TextHit> 
textResults) {
         if (!s.isURI()) {
             log.warn("Subject not a URI: " + s) ;

Reply via email to