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 2015/09/08 19:11:49 UTC

[07/20] jena git commit: Correct naming. Expand javadoc.

Correct naming. Expand javadoc.

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

Branch: refs/heads/master
Commit: 723daa258a26c96c20115c725f9e4b72796cc4e3
Parents: c6288c3
Author: Andy Seaborne <an...@apache.org>
Authored: Tue Sep 8 14:17:52 2015 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Tue Sep 8 14:17:52 2015 +0100

----------------------------------------------------------------------
 .../apache/jena/sparql/engine/join/Join.java    | 89 ++++++++++++++++----
 1 file changed, 74 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/723daa25/jena-arq/src/main/java/org/apache/jena/sparql/engine/join/Join.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/join/Join.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/join/Join.java
index 68536bf..4d4523f 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/join/Join.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/join/Join.java
@@ -19,7 +19,7 @@
 package org.apache.jena.sparql.engine.join;
 
 import static org.apache.jena.sparql.algebra.JoinType.LEFT ;
-import static org.apache.jena.sparql.algebra.JoinType.PLAIN ;
+import static org.apache.jena.sparql.algebra.JoinType.INNER ;
 
 import java.util.List ;
 
@@ -32,15 +32,22 @@ import org.apache.jena.sparql.algebra.TableFactory ;
 import org.apache.jena.sparql.engine.ExecutionContext ;
 import org.apache.jena.sparql.engine.QueryIterator ;
 import org.apache.jena.sparql.engine.binding.Binding ;
+import org.apache.jena.sparql.engine.iterator.QueryIterFilterExpr ;
 import org.apache.jena.sparql.engine.iterator.QueryIterPlainWrapper ;
 import org.apache.jena.sparql.engine.main.OpExecutor ;
 import org.apache.jena.sparql.engine.ref.TableJoin ;
+import org.apache.jena.sparql.expr.Expr ;
 import org.apache.jena.sparql.expr.ExprList ;
 
 /** API to various join algorithms */
 public class Join {
     // See also package org.apache.jena.sparql.engine.index
+    // The anti-join code for MINUS
 
+    // *******************
+    // USES OLD TableJoin CODE AT THE MOMENT
+    // *******************
+    
     /**
      * Standard entry point to a join of two streams.
      * This is not a substitution/index join.
@@ -51,7 +58,7 @@ public class Join {
      * @return QueryIterator
      */
     public static QueryIterator join(QueryIterator left, QueryIterator right, ExecutionContext execCxt) {
-        return joinWorker(left, right, PLAIN, null, execCxt) ;
+        return joinWorker(left, right, INNER, null, execCxt) ;
     }
    
     /** Standard entry point to a left join of two streams.
@@ -106,8 +113,32 @@ public class Join {
     }
     
     
+    /** Inner loop join.
+     *  Cancellable.
+     * @param left      Left hand side
+     * @param right     Right hand side
+     * @param cxt       ExecutionContext
+     * @return          QueryIterator
+     */ 
+    public static QueryIterator nestedLoopJoin(QueryIterator left, QueryIterator right, ExecutionContext cxt) {
+        return new QueryIterNestedLoopJoin(left, right, cxt) ;
+    }
+
+    /** Inner loop join.
+     *  Cancellable.
+     * @param left      Left hand side
+     * @param right     Right hand side
+     * @param cxt       ExecutionContext
+     * @return          QueryIterator
+     */ 
+    public static QueryIterator nestedLoopLeftJoin(QueryIterator left, QueryIterator right, ExprList conditions, ExecutionContext cxt) {
+        return new QueryIterNestedLoopLeftJoin(left, right, conditions, cxt) ;
+    }
+
+
     /** Evaluate a hash join.  This code materializes the left into a probe table
      * then hash joins from the right.  
+     *  No cancelation, no stats.
      * 
      * @param joinKey   The key for the probe table.
      * @param left      Left hand side
@@ -119,10 +150,14 @@ public class Join {
         return new QueryIterHashJoin(joinKey, left, right, cxt) ;
     }
 
-    /** Very simple, materializing version - useful for debugging. 
-     * Does <b>not</b> scale. 
+    /** Very simple, materializing version - useful for debugging.
+     *  Builds output early. Materializes left, streams right.
+     *  Does <b>not</b> scale. 
+     *  No cancelation, no stats.
+     * 
+     * @see #nestedLoopJoin
      */
-    public static QueryIterator innerLoopJoinBasic(QueryIterator left, QueryIterator right, ExecutionContext cxt) {
+    public static QueryIterator nestedLoopJoinBasic(QueryIterator left, QueryIterator right, ExecutionContext cxt) {
         List<Binding> leftRows = Iter.toList(left) ;
         List<Binding> output = DS.list() ;
         for ( ; right.hasNext() ; ) {
@@ -136,16 +171,40 @@ public class Join {
         return new QueryIterPlainWrapper(output.iterator(), cxt) ;
     }
 
-    /** Inner loops join.  This code materializes the left ino the inner loop tabole and
-     *  then streams on the right.
-     *  
-     * @param left      Left hand side
-     * @param right     Right hand side
-     * @param cxt       ExecutionContext
-     * @return          QueryIterator
-     */ 
-    public static QueryIterator innerLoopJoin(QueryIterator left, QueryIterator right, ExecutionContext cxt) {
-        return new QueryIterNestedLoopJoin(left, right, cxt) ;
+    /** Very simple, materializing version for leftjoin - useful for debugging.
+     *  Builds output early. Materializes right, streams left.
+     *  Does <b>not</b> scale. 
+     */
+    public static QueryIterator nestedLoopLeftJoinBasic(QueryIterator left, QueryIterator right, ExprList condition, ExecutionContext cxt) {
+        // Stream from left, materialize right.
+        List<Binding> rightRows = Iter.toList(right) ;
+        List<Binding> output = DS.list() ;
+        long count = 0 ;
+        for ( ; left.hasNext() ; ) {
+            Binding row1 = left.next() ;
+            boolean match = false ;
+            for ( Binding row2 : rightRows ) {
+                Binding r = Algebra.merge(row1, row2) ;
+                if ( r != null ) {
+                    output.add(r) ;
+                    match = true ;
+                }
+            }
+            if ( ! match )
+                output.add(row1) ;
+        }
+        QueryIterator qIter = new QueryIterPlainWrapper(output.iterator(), cxt) ;
+        qIter = applyConditions(qIter, condition, cxt) ;
+        return qIter ;
+    }
+
+    // apply conditions.
+    private static QueryIterator applyConditions(QueryIterator qIter, ExprList conditions, ExecutionContext execCxt) {
+        if ( conditions == null )
+            return qIter ;
+        for (Expr expr : conditions)
+            qIter = new QueryIterFilterExpr(qIter, expr, execCxt) ;
+        return qIter ;
     }
 }