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) ;
