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