You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2018/11/23 14:37:07 UTC
[1/3] jena git commit: JENA-1633: MINUS when the LHS has an unbound
but mentioned variable.
Repository: jena
Updated Branches:
refs/heads/master 35c1c3655 -> 204060b98
JENA-1633: MINUS when the LHS has an unbound but mentioned variable.
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/66dbb0a9
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/66dbb0a9
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/66dbb0a9
Branch: refs/heads/master
Commit: 66dbb0a9898aa5ee25dbce01751973bbf8ca9ad7
Parents: ba6b878
Author: Andy Seaborne <an...@apache.org>
Authored: Wed Nov 21 18:47:48 2018 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Wed Nov 21 18:47:48 2018 +0000
----------------------------------------------------------------------
.../sparql/engine/index/HashIndexTable.java | 33 +++---
.../jena/sparql/engine/index/IndexTable.java | 5 +
.../jena/sparql/engine/index/LinearIndex.java | 5 +
.../jena/sparql/engine/index/SetIndexTable.java | 14 ++-
.../sparql/engine/iterator/QueryIterMinus.java | 2 +-
.../jena/sparql/engine/index/TS_Minus.java | 31 ++++++
.../jena/sparql/engine/index/TestMinus.java | 111 +++++++++++++++++++
7 files changed, 182 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/66dbb0a9/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/HashIndexTable.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/HashIndexTable.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/HashIndexTable.java
index 4d0d414..a956f62 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/HashIndexTable.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/HashIndexTable.java
@@ -37,12 +37,12 @@ import org.apache.jena.sparql.engine.binding.Binding ;
public class HashIndexTable implements IndexTable {
// Contribution from P Gearon (@quoll)
final private Set<Key> table ;
- private Map<Var,Integer> varColumns ;
+ final private Map<Var,Integer> varColumns ;
private boolean missingValue ;
public HashIndexTable(Set<Var> commonVars, QueryIterator data) throws MissingBindingException
{
- initColumnMappings(commonVars) ;
+ varColumns = initColumnMappings(commonVars) ;
if ( commonVars.size() == 0 )
{
table = null ;
@@ -61,6 +61,11 @@ public class HashIndexTable implements IndexTable {
}
@Override
+ public String toString() {
+ return "HashIndexTable: "+varColumns+" "+table+ "("+missingValue+")";
+ }
+
+ @Override
public boolean containsCompatibleWithSharedDomain(Binding binding)
{
// no shared variables means no shared domain, and should be ignored
@@ -74,7 +79,7 @@ public class HashIndexTable implements IndexTable {
return true ;
if ( anyUnbound(indexKey) )
- return exhaustiveSearch(indexKey) ;
+ return matchAnyCompatible(indexKey) ;
return false ;
}
@@ -88,12 +93,13 @@ public class HashIndexTable implements IndexTable {
return false ;
}
- private void initColumnMappings(Set<Var> commonVars)
+ private static Map<Var,Integer> initColumnMappings(Set<Var> commonVars)
{
- varColumns = new HashMap<>() ;
+ Map<Var,Integer> varColumns = new HashMap<>() ;
int c = 0 ;
for ( Var var: commonVars )
varColumns.put(var, c++) ;
+ return varColumns;
}
private void addBindingToTable(Binding binding) throws MissingBindingException
@@ -118,7 +124,7 @@ public class HashIndexTable implements IndexTable {
return new Key(indexKey) ;
}
- private boolean exhaustiveSearch(Key mappedBindingLeft)
+ private boolean matchAnyCompatible(Key mappedBindingLeft)
{
for ( Key mappedBindingRight: table )
{
@@ -198,20 +204,21 @@ public class HashIndexTable implements IndexTable {
{
Node[] nodesRight = mappedBindingR.getNodes() ;
- boolean sharedDomain = false ;
for ( int c = 0 ; c < nodes.length ; c++ )
{
Node nLeft = nodes[c] ;
Node nRight = nodesRight[c] ;
- if ( nLeft != null && nRight != null )
- {
+ if ( nLeft != null && nRight != null ) {
+ // Shared domain - both left and right have a value.
+ // Compatible?
if ( nLeft.equals(nRight) )
- return false ;
- sharedDomain = true ;
- }
+ return true ;
+ }
+
}
- return sharedDomain ;
+ // No compatible slot or didn't find shared domain.
+ return false ;
}
}
}
http://git-wip-us.apache.org/repos/asf/jena/blob/66dbb0a9/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/IndexTable.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/IndexTable.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/IndexTable.java
index 5aa6e8a..bfd432e 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/IndexTable.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/IndexTable.java
@@ -28,5 +28,10 @@ import org.apache.jena.sparql.engine.binding.Binding ;
*/
public interface IndexTable {
// Contribution from P Gearon
+ /**
+ * Is there a binding in the table that has a shared domain (variables in common) and
+ * is join-compatible? This is teh condition for MINUS to exclude the argument
+ * binding.
+ */
public abstract boolean containsCompatibleWithSharedDomain(Binding binding);
}
http://git-wip-us.apache.org/repos/asf/jena/blob/66dbb0a9/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/LinearIndex.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/LinearIndex.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/LinearIndex.java
index 56267bb..b6630a5 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/LinearIndex.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/LinearIndex.java
@@ -108,5 +108,10 @@ public class LinearIndex implements IndexTable {
}
return b ;
}
+
+ @Override
+ public String toString() {
+ return "LinearIndex: "+commonVars+" "+table;
+ }
}
http://git-wip-us.apache.org/repos/asf/jena/blob/66dbb0a9/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/SetIndexTable.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/SetIndexTable.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/SetIndexTable.java
index 28f9620..dc4fbab 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/SetIndexTable.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/index/SetIndexTable.java
@@ -27,9 +27,8 @@ import org.apache.jena.sparql.engine.QueryIterator ;
import org.apache.jena.sparql.engine.binding.Binding ;
/**
- * An {@link IndexTable} implementation optimized for the case where there is
- * only a single common variable
- *
+ * An {@link IndexTable} implementation optimized for the case where there is only a
+ * single common variable
*/
public class SetIndexTable implements IndexTable {
@@ -62,9 +61,14 @@ public class SetIndexTable implements IndexTable {
@Override
public boolean containsCompatibleWithSharedDomain(Binding binding) {
Node value = binding.get(this.var);
- if (value == null)
- return true;
+ if ( value == null )
+ // No shared domain.
+ return false;
return this.values.contains(value);
}
+ @Override
+ public String toString() {
+ return "SetIndexTable: "+var+" "+values;
+ }
}
http://git-wip-us.apache.org/repos/asf/jena/blob/66dbb0a9/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterMinus.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterMinus.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterMinus.java
index 2ae1ce1..a3211e9 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterMinus.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterMinus.java
@@ -34,7 +34,7 @@ public class QueryIterMinus extends QueryIter2 {
public static QueryIterator create(QueryIterator left, QueryIterator right, Set<Var> commonVars, ExecutionContext qCxt) {
if ( ! right.hasNext() )
- // Empty MINUS left
+ // Empty MINUS -> return left
return left ;
return new QueryIterMinus(left, right, commonVars, qCxt) ;
}
http://git-wip-us.apache.org/repos/asf/jena/blob/66dbb0a9/jena-arq/src/test/java/org/apache/jena/sparql/engine/index/TS_Minus.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/engine/index/TS_Minus.java b/jena-arq/src/test/java/org/apache/jena/sparql/engine/index/TS_Minus.java
new file mode 100644
index 0000000..9c59641
--- /dev/null
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/engine/index/TS_Minus.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.sparql.engine.index;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+
+@RunWith(Suite.class)
+@SuiteClasses( {
+ TestIndexTable.class
+ , TestMinus.class
+})
+public class TS_Minus {}
+
http://git-wip-us.apache.org/repos/asf/jena/blob/66dbb0a9/jena-arq/src/test/java/org/apache/jena/sparql/engine/index/TestMinus.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/engine/index/TestMinus.java b/jena-arq/src/test/java/org/apache/jena/sparql/engine/index/TestMinus.java
new file mode 100644
index 0000000..d392e92
--- /dev/null
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/engine/index/TestMinus.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.sparql.engine.index;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.apache.jena.atlas.iterator.Iter;
+import org.apache.jena.atlas.lib.ListUtils;
+import org.apache.jena.atlas.lib.StrUtils;
+import org.apache.jena.query.ARQ;
+import org.apache.jena.query.Query;
+import org.apache.jena.query.QueryFactory;
+import org.apache.jena.sparql.core.DatasetGraph;
+import org.apache.jena.sparql.core.DatasetGraphZero;
+import org.apache.jena.sparql.engine.QueryEngineFactory;
+import org.apache.jena.sparql.engine.binding.Binding;
+import org.apache.jena.sparql.engine.binding.BindingRoot;
+import org.apache.jena.sparql.engine.main.QueryEngineMain;
+import org.apache.jena.sparql.engine.ref.QueryEngineRef;
+import org.junit.Test;
+
+// More tests for MINUS (JENA-1633)
+public class TestMinus {
+ // These tests evaluate the query twice, once with the ref engine and once with the
+ // main engine. These two engines have completely different evaluation code.
+
+ // Need multi row left test case.
+ @Test
+ public void minus_x1() {
+ // Uses HashIndexTable
+ // Unbound but var is mentioned.
+ String x1 = StrUtils.strjoinNL
+ ("SELECT ?x ?undef {"
+ ," VALUES ( ?x ?undef ) { ( 3 UNDEF ) ( 2 UNDEF ) }"
+ ," MINUS {"
+ ," BIND(2 AS ?x)"
+ ," BIND(1 AS ?undef)"
+ ," }"
+ ,"}"
+ );
+ test(x1);
+ }
+
+ @Test
+ public void minus_x2() {
+ //SetIndexTable
+ // Check "in common" includes ?undef
+ String x2 = StrUtils.strjoinNL
+ ("SELECT ?x ?undef {"
+ ," VALUES ( ?x ?undef ) { ( 99 UNDEF ) }"
+ ," MINUS {"
+ ," BIND(1 AS ?undef)"
+ ," }"
+ ,"}"
+ );
+ test(x2);
+ }
+
+ @Test
+ public void minus_x3() {
+ String x3 = StrUtils.strjoinNL
+ ("SELECT ?x ?undef {"
+ ," VALUES ( ?x ) { ( 3 ) }"
+ //Not mentioned: ?undef
+ ," MINUS {"
+ ," BIND(2 AS ?x)"
+ ," BIND(1 AS ?undef)"
+ ," }"
+ ,"}"
+ );
+ test(x3);
+ }
+
+ private static DatasetGraph dsgzero = new DatasetGraphZero();
+
+ private void test(String queryStr) {
+ Query ast = QueryFactory.create(queryStr);
+ List<Binding> x1 = exec(queryStr, QueryEngineRef.getFactory());
+ List<Binding> x2 = exec(queryStr, QueryEngineMain.getFactory());
+ boolean b = ListUtils.equalsUnordered(x1, x2);
+// if ( !b ) {
+// System.out.println("Ref: "+x1);
+// System.out.println("Main: "+x2);
+// }
+ assertTrue("Ref != main", b);
+ }
+
+ private static List<Binding> exec(String queryStr, QueryEngineFactory factory) {
+ Query ast = QueryFactory.create(queryStr);
+ return Iter.toList(factory.create(ast, dsgzero, BindingRoot.create(), ARQ.getContext()).iterator());
+ }
+
+}
[2/3] jena git commit: Make sure all test suites are run.
Posted by an...@apache.org.
Make sure all test suites are run.
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/dd5d59ab
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/dd5d59ab
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/dd5d59ab
Branch: refs/heads/master
Commit: dd5d59ab9e28b0f6fafb345a8c022a0cfa2bc78b
Parents: 66dbb0a
Author: Andy Seaborne <an...@apache.org>
Authored: Wed Nov 21 18:48:22 2018 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Wed Nov 21 18:48:22 2018 +0000
----------------------------------------------------------------------
jena-arq/src/test/java/org/apache/jena/sparql/TC_General.java | 4 ++++
.../src/test/java/org/apache/jena/sparql/engine/TS_Engine.java | 2 --
2 files changed, 4 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/dd5d59ab/jena-arq/src/test/java/org/apache/jena/sparql/TC_General.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/TC_General.java b/jena-arq/src/test/java/org/apache/jena/sparql/TC_General.java
index 594ba60..5e82657 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/TC_General.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/TC_General.java
@@ -27,6 +27,8 @@ import org.apache.jena.sparql.core.TS_Core ;
import org.apache.jena.sparql.core.assembler.TS_Assembler ;
import org.apache.jena.sparql.core.mem.TS_DatasetTxnMem ;
import org.apache.jena.sparql.engine.TS_Engine ;
+import org.apache.jena.sparql.engine.index.TS_Minus;
+import org.apache.jena.sparql.engine.iterator.TS_QueryIterators;
import org.apache.jena.sparql.engine.join.TS_Join ;
import org.apache.jena.sparql.expr.E_Function ;
import org.apache.jena.sparql.expr.NodeValue ;
@@ -70,6 +72,8 @@ import org.junit.runners.Suite ;
, TS_Solver.class
, TS_Algebra.class
, TS_Join.class
+ , TS_Minus.class
+ , TS_QueryIterators.class
, TS_Optimization.class
, TS_ResultSet.class
, TS_Syntax.class
http://git-wip-us.apache.org/repos/asf/jena/blob/dd5d59ab/jena-arq/src/test/java/org/apache/jena/sparql/engine/TS_Engine.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/engine/TS_Engine.java b/jena-arq/src/test/java/org/apache/jena/sparql/engine/TS_Engine.java
index c1ff26f..30ae911 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/engine/TS_Engine.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/engine/TS_Engine.java
@@ -21,7 +21,6 @@ package org.apache.jena.sparql.engine;
import org.apache.jena.sparql.engine.binding.TestBindingStreams ;
import org.apache.jena.sparql.engine.http.TestQueryEngineHTTP ;
import org.apache.jena.sparql.engine.http.TestService ;
-import org.apache.jena.sparql.engine.iterator.TS_QueryIterators ;
import org.apache.jena.sparql.engine.ref.TestTableJoin ;
import org.junit.runner.RunWith ;
import org.junit.runners.Suite ;
@@ -30,7 +29,6 @@ import org.junit.runners.Suite ;
@Suite.SuiteClasses( {
TestBindingStreams.class
, TestTableJoin.class
- , TS_QueryIterators.class
, TestService.class
, TestQueryEngineHTTP.class
, TestQueryEngineMultiThreaded.class
[3/3] jena git commit: JENA-1633: Merge commit 'refs/pull/493/head'
of https://github.com/apache/jena
Posted by an...@apache.org.
JENA-1633: Merge commit 'refs/pull/493/head' of https://github.com/apache/jena
This closes #493.
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/204060b9
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/204060b9
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/204060b9
Branch: refs/heads/master
Commit: 204060b98d1c190c831612ef2563eddc38c3fcbd
Parents: 35c1c36 dd5d59a
Author: Andy Seaborne <an...@apache.org>
Authored: Fri Nov 23 14:36:09 2018 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Fri Nov 23 14:36:09 2018 +0000
----------------------------------------------------------------------
.../sparql/engine/index/HashIndexTable.java | 33 +++---
.../jena/sparql/engine/index/IndexTable.java | 5 +
.../jena/sparql/engine/index/LinearIndex.java | 5 +
.../jena/sparql/engine/index/SetIndexTable.java | 14 ++-
.../sparql/engine/iterator/QueryIterMinus.java | 2 +-
.../java/org/apache/jena/sparql/TC_General.java | 4 +
.../apache/jena/sparql/engine/TS_Engine.java | 2 -
.../jena/sparql/engine/index/TS_Minus.java | 31 ++++++
.../jena/sparql/engine/index/TestMinus.java | 111 +++++++++++++++++++
9 files changed, 186 insertions(+), 21 deletions(-)
----------------------------------------------------------------------