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/05 16:38:05 UTC
[3/3] jena git commit: JENA-1093: return multiple literals from text
query with bound subject
JENA-1093: return multiple literals from text query with bound subject
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/859fa47b
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/859fa47b
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/859fa47b
Branch: refs/heads/master
Commit: 859fa47b66c6ce0701d0b080c835955e96f30c73
Parents: 245d5ca
Author: Osma Suominen <os...@aalto.fi>
Authored: Tue Dec 22 21:01:25 2015 +0200
Committer: Osma Suominen <os...@apache.org>
Committed: Tue Jan 5 17:37:23 2016 +0200
----------------------------------------------------------------------
.../org/apache/jena/query/text/TextQueryPF.java | 38 +++++++++-----------
.../TestDatasetWithLuceneStoredLiterals.java | 27 ++++++++++++++
2 files changed, 43 insertions(+), 22 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/859fa47b/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 f4e1402..ea7bdf8 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.Iterator ;
+import java.util.LinkedList ;
import java.util.List ;
import java.util.function.Function ;
@@ -193,16 +194,17 @@ public class TextQueryPF extends PropertyFunctionBase {
return qIter ;
}
- private QueryIterator variableSubject(Binding binding, Node s, Node score, Node literal, StrMatch match, ExecutionContext execCxt) {
- Var sVar = Var.alloc(s) ;
+ private QueryIterator resultsToQueryIterator(Binding binding, Node s, Node score, Node literal, List<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) ;
- List<TextHit> r = query(match.getProperty(), match.getQueryString(), match.getLimit(), execCxt) ;
+
Function<TextHit,Binding> converter = (TextHit hit) -> {
if (score == null && literal == null)
- return BindingFactory.binding(binding, sVar, hit.getNode());
+ return sVar != null ? BindingFactory.binding(binding, sVar, hit.getNode()) : BindingFactory.binding(binding);
BindingMap bmap = BindingFactory.create(binding);
- bmap.add(sVar, hit.getNode());
+ if (sVar != null)
+ bmap.add(sVar, hit.getNode());
if (scoreVar != null)
bmap.add(scoreVar, NodeFactoryExtra.floatToNode(hit.getScore()));
if (literalVar != null)
@@ -210,44 +212,36 @@ public class TextQueryPF extends PropertyFunctionBase {
return bmap;
} ;
- Iterator<Binding> bIter = Iter.map(r.iterator(), converter);
+ Iterator<Binding> bIter = Iter.map(results.iterator(), converter);
QueryIterator qIter = new QueryIterPlainWrapper(bIter, execCxt);
return qIter ;
}
+ 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) ;
+ return resultsToQueryIterator(binding, s, score, literal, r, execCxt);
+ }
+
private QueryIterator concreteSubject(Binding binding, Node s, Node score, Node literal, StrMatch match, ExecutionContext execCxt) {
if (!s.isURI()) {
log.warn("Subject not a URI: " + s) ;
return IterLib.noResults(execCxt) ;
}
- Var scoreVar = (score==null) ? null : Var.alloc(score) ;
- Var literalVar = (literal==null) ? null : Var.alloc(literal) ;
String qs = match.getQueryString() ;
List<TextHit> x = query(match.getProperty(), match.getQueryString(), -1, execCxt) ;
if ( x == null ) // null return value - empty result
return IterLib.noResults(execCxt) ;
+ List<TextHit> r = new LinkedList();
for (TextHit hit : x ) {
if (hit.getNode().equals(s)) {
- // found the node among the hits
- if (literalVar == null) {
- return (scoreVar == null) ?
- IterLib.result(binding, execCxt) :
- IterLib.oneResult(binding, scoreVar, NodeFactoryExtra.floatToNode(hit.getScore()), execCxt);
- }
- BindingMap bmap = BindingFactory.create(binding);
- if (scoreVar != null) {
- bmap.add(scoreVar, NodeFactoryExtra.floatToNode(hit.getScore()));
- }
- bmap.add(literalVar, hit.getLiteral());
- return IterLib.result(bmap, execCxt) ;
+ r.add(hit);
}
}
- // node was not among the hits - empty result
- return IterLib.noResults(execCxt) ;
+ return resultsToQueryIterator(binding, s, score, literal, r, execCxt);
}
private List<TextHit> query(Node property, String queryString, int limit, ExecutionContext execCxt) {
http://git-wip-us.apache.org/repos/asf/jena/blob/859fa47b/jena-text/src/test/java/org/apache/jena/query/text/TestDatasetWithLuceneStoredLiterals.java
----------------------------------------------------------------------
diff --git a/jena-text/src/test/java/org/apache/jena/query/text/TestDatasetWithLuceneStoredLiterals.java b/jena-text/src/test/java/org/apache/jena/query/text/TestDatasetWithLuceneStoredLiterals.java
index 659a0dd..e60d396 100644
--- a/jena-text/src/test/java/org/apache/jena/query/text/TestDatasetWithLuceneStoredLiterals.java
+++ b/jena-text/src/test/java/org/apache/jena/query/text/TestDatasetWithLuceneStoredLiterals.java
@@ -303,4 +303,31 @@ public class TestDatasetWithLuceneStoredLiterals extends AbstractTestDatasetWith
assertTrue(literals.contains(NodeFactory.createLiteral("another nontext comment")));
}
+ @Test
+ public void testLiteralValueMultipleBoundSubject() {
+ // test capturing of multiple matching literal values in a variable, when using bound subject
+ final String testName = "testLiteralValueMultipleBoundSubject";
+ final String turtle = StrUtils.strjoinNL(
+ TURTLE_PROLOG,
+ "<" + RESOURCE_BASE + testName + ">",
+ " rdfs:comment 'a nontext comment', 'another nontext comment'",
+ "."
+ );
+ String queryString = StrUtils.strjoinNL(
+ QUERY_PROLOG,
+ "SELECT ?s ?literal",
+ "WHERE {",
+ " BIND(<" + RESOURCE_BASE + testName + "> AS ?s)",
+ " (?s ?score ?literal) text:query (rdfs:comment 'nontext') .",
+ "}"
+ );
+
+ String expectedURI = RESOURCE_BASE + testName;
+ List<Node> literals = doTestSearchWithLiteralsMultiple(turtle, queryString, expectedURI);
+
+ assertEquals(2, literals.size());
+ assertTrue(literals.contains(NodeFactory.createLiteral("a nontext comment")));
+ assertTrue(literals.contains(NodeFactory.createLiteral("another nontext comment")));
+ }
+
}