Author: andy
Date: Sun Apr 20 12:11:04 2014
New Revision: 1588743

URL: http://svn.apache.org/r1588743
Log:
JENA-684 : Move join code out of the Table interface.

Added:
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/JoinType.java  
 (with props)
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/TableLib.java  
 (with props)
Modified:
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/Table.java
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/Table1.java
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/TableEmpty.java
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/TableN.java
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/TableUnit.java
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/iterator/QueryIterJoin.java
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/iterator/QueryIterJoinBase.java
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/iterator/QueryIterLeftJoin.java
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/ref/EvaluatorSimple.java

Added: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/JoinType.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/JoinType.java?rev=1588743&view=auto
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/JoinType.java 
(added)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/JoinType.java 
Sun Apr 20 12:11:04 2014
@@ -0,0 +1,21 @@
+/**
+ * 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 com.hp.hpl.jena.sparql.algebra;
+
+public enum JoinType { PLAIN, LEFT /*, RIGHT , /*FULL* /OUTER*/}

Propchange: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/JoinType.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/Table.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/Table.java?rev=1588743&r1=1588742&r2=1588743&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/Table.java 
(original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/Table.java 
Sun Apr 20 12:11:04 2014
@@ -26,15 +26,9 @@ import com.hp.hpl.jena.sparql.core.Var ;
 import com.hp.hpl.jena.sparql.engine.ExecutionContext ;
 import com.hp.hpl.jena.sparql.engine.QueryIterator ;
 import com.hp.hpl.jena.sparql.engine.binding.Binding ;
-import com.hp.hpl.jena.sparql.expr.ExprList ;
 
 public interface Table
 {
-    // Note - this table is the RIGHT table, and takes a LEFT binding.
-    public QueryIterator matchRightLeft(Binding bindingLeft, 
-                                        boolean includeOnNoMatch,
-                                        ExprList condition,
-                                        ExecutionContext execCxt) ;
     public void close() ;
     public List<Var> getVars() ;
     public List<String> getVarNames() ;

Added: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/TableLib.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/TableLib.java?rev=1588743&view=auto
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/TableLib.java 
(added)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/TableLib.java 
Sun Apr 20 12:11:04 2014
@@ -0,0 +1,101 @@
+/**
+ * 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 com.hp.hpl.jena.sparql.algebra;
+
+import static com.hp.hpl.jena.sparql.algebra.JoinType.* ;
+
+import java.util.ArrayList ;
+import java.util.Iterator ;
+import java.util.List ;
+
+import com.hp.hpl.jena.sparql.algebra.table.TableUnit ;
+import com.hp.hpl.jena.sparql.engine.ExecutionContext ;
+import com.hp.hpl.jena.sparql.engine.QueryIterator ;
+import com.hp.hpl.jena.sparql.engine.binding.Binding ;
+import com.hp.hpl.jena.sparql.engine.iterator.QueryIterFilterExpr ;
+import com.hp.hpl.jena.sparql.engine.iterator.QueryIterNullIterator ;
+import com.hp.hpl.jena.sparql.engine.iterator.QueryIterPlainWrapper ;
+import com.hp.hpl.jena.sparql.expr.Expr ;
+import com.hp.hpl.jena.sparql.expr.ExprList ;
+
+/** Table join - this only haoppens if the patterns can not be streamed. */  
+public class TableLib
+{
+    public static QueryIterator join(QueryIterator left, Table right, ExprList 
condition, ExecutionContext execCxt) {
+        return joinWorker(left, right, PLAIN, condition, execCxt) ;
+    }
+    
+    public static QueryIterator leftJoin(QueryIterator left, Table right, 
ExprList condition, ExecutionContext execCxt) {
+        return joinWorker(left, right, LEFT, condition, execCxt) ;
+    }
+
+    public static QueryIterator joinWorker(QueryIterator left, Table right, 
JoinType joinType, ExprList conditions, ExecutionContext execCxt) {
+        if ( right.isEmpty() ) {
+            if ( joinType == PLAIN )
+                // No rows - no match
+                return QueryIterNullIterator.create(execCxt) ;
+            else
+                return left ;
+        }
+        
+        if ( TableUnit.isTableUnit(right) ) {
+            if ( joinType == PLAIN )
+                return applyConditions(left, conditions, execCxt) ;
+            else
+                return left ;
+        }
+        return joinWorkerN(left, right, joinType, conditions, execCxt) ;
+    }
+            
+    private static QueryIterator joinWorkerN(QueryIterator left, Table right, 
JoinType joinType, ExprList conditions, ExecutionContext execCxt) {       
+        // We could hash the right except we don't know much about columns.
+        
+        List<Binding> out = new ArrayList<Binding>() ;
+        for ( ; left.hasNext() ; ) {
+            Binding bindingLeft = left.next() ;
+            int count = 0 ;
+            for (Iterator<Binding> iter = right.rows() ; iter.hasNext();) {
+                Binding bindingRight = iter.next() ;
+                Binding r = Algebra.merge(bindingLeft, bindingRight) ;
+                
+                if ( r == null )
+                    continue ;
+                // This does the conditional part. Theta-join.
+                if ( conditions == null || conditions.isSatisfied(r, execCxt) 
) {
+                    count ++ ;
+                    out.add(r) ;
+                }
+            }
+
+            if ( count == 0 && ( joinType == LEFT)  )
+                // Conditions on left?
+                out.add(bindingLeft) ;
+        }
+        
+        return new QueryIterPlainWrapper(out.iterator(), execCxt) ;
+    }
+    
+    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 ;
+    }
+}

Propchange: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/TableLib.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/Table1.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/Table1.java?rev=1588743&r1=1588742&r2=1588743&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/Table1.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/Table1.java
 Sun Apr 20 12:11:04 2014
@@ -31,9 +31,7 @@ import com.hp.hpl.jena.sparql.engine.Exe
 import com.hp.hpl.jena.sparql.engine.QueryIterator ;
 import com.hp.hpl.jena.sparql.engine.binding.Binding ;
 import com.hp.hpl.jena.sparql.engine.binding.BindingFactory ;
-import com.hp.hpl.jena.sparql.engine.iterator.QueryIterNullIterator ;
 import com.hp.hpl.jena.sparql.engine.iterator.QueryIterSingleton ;
-import com.hp.hpl.jena.sparql.expr.ExprList ;
 
 /** A table of one row of one binding */
 public class Table1 extends TableBase {
@@ -60,33 +58,6 @@ public class Table1 extends TableBase {
     }
 
     @Override
-    public QueryIterator matchRightLeft(Binding bindingLeft, boolean 
includeOnNoMatch, ExprList conditions,
-                                        ExecutionContext execContext) {
-        boolean matches = true ;
-        Node other = bindingLeft.get(var) ;
-
-        if ( other == null ) {
-            // Not present - return the merge = the other binding + this
-            // (var/value)
-            Binding mergedBinding = BindingFactory.binding(bindingLeft, var, 
value) ;
-            return QueryIterSingleton.create(mergedBinding, execContext) ;
-        }
-
-        if ( !other.equals(value) )
-            matches = false ;
-        else {
-            if ( conditions != null )
-                matches = conditions.isSatisfied(bindingLeft, execContext) ;
-        }
-
-        if ( !matches && !includeOnNoMatch )
-            return QueryIterNullIterator.create(execContext) ;
-        // Matches, or does not match and it's a left join - return the left
-        // binding.
-        return QueryIterSingleton.create(bindingLeft, execContext) ;
-    }
-
-    @Override
     public void closeTable() {}
 
     @Override

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/TableEmpty.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/TableEmpty.java?rev=1588743&r1=1588742&r2=1588743&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/TableEmpty.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/TableEmpty.java
 Sun Apr 20 12:11:04 2014
@@ -29,8 +29,6 @@ import com.hp.hpl.jena.sparql.engine.Exe
 import com.hp.hpl.jena.sparql.engine.QueryIterator ;
 import com.hp.hpl.jena.sparql.engine.binding.Binding ;
 import com.hp.hpl.jena.sparql.engine.iterator.QueryIterNullIterator ;
-import com.hp.hpl.jena.sparql.engine.iterator.QueryIterSingleton ;
-import com.hp.hpl.jena.sparql.expr.ExprList ;
 
 public class TableEmpty extends TableBase
 {
@@ -48,16 +46,6 @@ public class TableEmpty extends TableBas
     }
 
     @Override
-    public QueryIterator matchRightLeft(Binding bindingLeft, boolean 
includeOnNoMatch, ExprList conditions,
-                                        ExecutionContext execContext) {
-        if ( includeOnNoMatch )
-            return QueryIterSingleton.create(bindingLeft, execContext) ;
-        else
-            // No rows - no match
-            return QueryIterNullIterator.create(execContext) ;
-    }
-
-    @Override
     public boolean contains(Binding binding) { return false ; }
     
     @Override

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/TableN.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/TableN.java?rev=1588743&r1=1588742&r2=1588743&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/TableN.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/TableN.java
 Sun Apr 20 12:11:04 2014
@@ -22,14 +22,11 @@ import java.util.ArrayList ;
 import java.util.Iterator ;
 import java.util.List ;
 
-import com.hp.hpl.jena.sparql.algebra.Algebra ;
 import com.hp.hpl.jena.sparql.core.Var ;
 import com.hp.hpl.jena.sparql.engine.ExecutionContext ;
 import com.hp.hpl.jena.sparql.engine.QueryIterator ;
 import com.hp.hpl.jena.sparql.engine.binding.Binding ;
-import com.hp.hpl.jena.sparql.engine.iterator.QueryIterNullIterator ;
 import com.hp.hpl.jena.sparql.engine.iterator.QueryIterPlainWrapper ;
-import com.hp.hpl.jena.sparql.expr.ExprList ;
 
 public class TableN extends TableBase {
     protected List<Binding> rows = new ArrayList<Binding>() ;
@@ -79,29 +76,6 @@ public class TableN extends TableBase {
         return rows.isEmpty() ;
     }
 
-    // Note - this table is the RIGHT table, and takes a LEFT binding.
-    @Override
-    public QueryIterator matchRightLeft(Binding bindingLeft, boolean 
includeOnNoMatch, ExprList conditions,
-                                        ExecutionContext execContext) {
-        List<Binding> out = new ArrayList<Binding>() ;
-        for (Iterator<Binding> iter = rows.iterator(); iter.hasNext();) {
-            Binding bindingRight = iter.next() ;
-            Binding r = Algebra.merge(bindingLeft, bindingRight) ;
-            if ( r == null )
-                continue ;
-            // This does the conditional part. Theta-join.
-            if ( conditions == null || conditions.isSatisfied(r, execContext) )
-                out.add(r) ;
-        }
-
-        if ( out.size() == 0 && includeOnNoMatch )
-            out.add(bindingLeft) ;
-
-        if ( out.size() == 0 )
-            return QueryIterNullIterator.create(execContext) ;
-        return new QueryIterPlainWrapper(out.iterator(), execContext) ;
-    }
-
     @Override
     public Iterator<Binding> rows() {
         return rows.iterator() ;

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/TableUnit.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/TableUnit.java?rev=1588743&r1=1588742&r2=1588743&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/TableUnit.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/table/TableUnit.java
 Sun Apr 20 12:11:04 2014
@@ -31,7 +31,6 @@ import com.hp.hpl.jena.sparql.engine.Que
 import com.hp.hpl.jena.sparql.engine.binding.Binding ;
 import com.hp.hpl.jena.sparql.engine.binding.BindingFactory ;
 import com.hp.hpl.jena.sparql.engine.iterator.QueryIterSingleton ;
-import com.hp.hpl.jena.sparql.expr.ExprList ;
 
 public class TableUnit extends TableBase
 {
@@ -55,15 +54,6 @@ public class TableUnit extends TableBase
     }
 
     @Override
-    public QueryIterator matchRightLeft(Binding bindingLeft, boolean 
includeOnNoMatch,
-                                        ExprList conditions,
-                                        ExecutionContext execCxt)
-    {
-        // We are one row of no entries - joins with anything
-        return QueryIterSingleton.create(bindingLeft, execCxt) ;
-    }
-
-    @Override
     public void closeTable()    { }
 
     @Override

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/iterator/QueryIterJoin.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/iterator/QueryIterJoin.java?rev=1588743&r1=1588742&r2=1588743&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/iterator/QueryIterJoin.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/iterator/QueryIterJoin.java
 Sun Apr 20 12:11:04 2014
@@ -18,6 +18,7 @@
 
 package com.hp.hpl.jena.sparql.engine.main.iterator;
 
+import com.hp.hpl.jena.sparql.algebra.JoinType ;
 import com.hp.hpl.jena.sparql.engine.ExecutionContext ;
 import com.hp.hpl.jena.sparql.engine.QueryIterator ;
 
@@ -26,12 +27,6 @@ public class QueryIterJoin extends Query
 {
     public QueryIterJoin(QueryIterator left, QueryIterator right, 
ExecutionContext qCxt)
     {
-        super(left, right, null, qCxt) ;
-    }
-    
-    @Override
-    protected QueryIterator joinWorker()
-    {
-        return super.equiJoinWorker() ;
+        super(left, right, JoinType.PLAIN, null, qCxt) ;
     }
 }

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/iterator/QueryIterJoinBase.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/iterator/QueryIterJoinBase.java?rev=1588743&r1=1588742&r2=1588743&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/iterator/QueryIterJoinBase.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/iterator/QueryIterJoinBase.java
 Sun Apr 20 12:11:04 2014
@@ -18,124 +18,56 @@
 
 package com.hp.hpl.jena.sparql.engine.main.iterator;
 
-import com.hp.hpl.jena.sparql.ARQInternalErrorException ;
+import com.hp.hpl.jena.sparql.algebra.JoinType ;
 import com.hp.hpl.jena.sparql.algebra.Table ;
 import com.hp.hpl.jena.sparql.algebra.TableFactory ;
+import com.hp.hpl.jena.sparql.algebra.TableLib ;
 import com.hp.hpl.jena.sparql.engine.ExecutionContext ;
 import com.hp.hpl.jena.sparql.engine.QueryIterator ;
 import com.hp.hpl.jena.sparql.engine.binding.Binding ;
-import com.hp.hpl.jena.sparql.engine.iterator.QueryIter2 ;
+import com.hp.hpl.jena.sparql.engine.iterator.QueryIter ;
 import com.hp.hpl.jena.sparql.expr.ExprList ;
 
 /** Join or LeftJoin by calculating both sides, then doing the join
  *  It usually better to use substitute algorithm (not this
  *  QueryIterator in other words) as that is effectively indexing
  *  from one side into the other. */ 
-public abstract class QueryIterJoinBase extends QueryIter2
+public class QueryIterJoinBase extends QueryIter
 {
-    // Use QueryIter2LoopOnLeft
-    private QueryIterator current ;
-    protected Table tableRight ;          // Materialized iterator
-    protected ExprList exprs ;
-    private Binding nextBinding = null ;
+    // This should be converted to a hash or sort-merge join.
+    private final QueryIterator left ;
+    private final QueryIterator right ;
+    private final QueryIter result ;
     
-    public QueryIterJoinBase(QueryIterator left, QueryIterator right, ExprList 
exprs, ExecutionContext execCxt)
+    protected QueryIterJoinBase(QueryIterator left, QueryIterator right, 
JoinType joinType, ExprList exprs, ExecutionContext execCxt)
     {
-        super(left, right, execCxt) ;
-        tableRight = TableFactory.create(getRight()) ;
-        getRight().close();
-        this.exprs = exprs ;
+        super(execCxt) ;
+        this.left = left ;
+        this.right = right ;
+        this.result = (QueryIter)calc(left, right, joinType, exprs, execCxt) ; 
     }
 
-    public QueryIterJoinBase(QueryIterator left, Table right, ExprList exprs, 
ExecutionContext execCxt)
-    {
-        super(left, right.iterator(execCxt), execCxt) ;
-        this.tableRight = right ;
-        this.exprs = exprs ;
+    private static QueryIterator calc(QueryIterator left, QueryIterator right, 
JoinType joinType, ExprList exprs, ExecutionContext execCxt) {
+        Table tableRight = TableFactory.create(right) ;
+        return TableLib.joinWorker(left, tableRight, joinType, exprs, execCxt) 
;
+
     }
     
     @Override
-    protected boolean hasNextBinding()
-    {
-        if ( isFinished() )
-            return false ;
-        if ( nextBinding != null )
-            return true ;
-
-        // No nextBinding - only call to moveToNext
-        nextBinding = moveToNext() ;
-        return ( nextBinding != null ) ;
+    protected boolean hasNextBinding() {
+        return result.hasNext() ;
     }
 
     @Override
     protected Binding moveToNextBinding()
     {
-        if ( nextBinding == null )
-            throw new ARQInternalErrorException("moveToNextBinding: slot empty 
but hasNext was true)") ;
-        
-        Binding b = nextBinding ;
-        nextBinding = null ;
-        return b ;
-    }
-
-    @Override
-    protected void closeSubIterator()
-    {
-        performClose(current) ;
-        if ( tableRight != null ) tableRight.close() ;
-        tableRight = null ;
+        return result.nextBinding() ;
     }
     
-    @Override
-    protected void requestSubCancel()
-    { 
-        closeSubIterator() ;
-    }
-
-    // Move on regardless.
-    private Binding moveToNext()
-    {
 
-        while(true)
-        {
-            if ( current != null )
-            {
-                if ( current.hasNext() )
-                    return current.nextBinding() ;
-                // curent ends.
-                current.close();
-                current = null ;
-            }
-            
-            // Move to next worker
-            current = joinWorker() ;
-            if ( current == null )
-                // No next worker. 
-                return null ;
-        }
-    }
-    
-    // Null iff there is no more results.  
-    abstract protected QueryIterator joinWorker() ;
-    
-    protected QueryIterator leftJoinWorker()
-    {
-        if ( !getLeft().hasNext() )
-            return null ;
-        Binding b =  getLeft().nextBinding() ;
-        QueryIterator x = tableRight.matchRightLeft(b, true, exprs, 
getExecContext()) ;
-        return x ;
-    }
+    @Override
+    protected void closeIterator() { left.close() ; right.close() ; } 
 
-    protected QueryIterator equiJoinWorker()
-    {
-        if ( !getLeft().hasNext() )
-            return null ;
-        if ( exprs != null )
-            throw new ARQInternalErrorException("QueryIterJoinBase: expression 
not empty for equiJoin") ;
-        
-        Binding b =  getLeft().nextBinding() ;
-        QueryIterator x = tableRight.matchRightLeft(b, false, null, 
getExecContext()) ;
-        return x ;
-    }
+    @Override
+    protected void requestCancel() { left.cancel(); right.cancel(); }
 }

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/iterator/QueryIterLeftJoin.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/iterator/QueryIterLeftJoin.java?rev=1588743&r1=1588742&r2=1588743&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/iterator/QueryIterLeftJoin.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/iterator/QueryIterLeftJoin.java
 Sun Apr 20 12:11:04 2014
@@ -18,6 +18,7 @@
 
 package com.hp.hpl.jena.sparql.engine.main.iterator;
 
+import com.hp.hpl.jena.sparql.algebra.JoinType ;
 import com.hp.hpl.jena.sparql.engine.ExecutionContext ;
 import com.hp.hpl.jena.sparql.engine.QueryIterator ;
 import com.hp.hpl.jena.sparql.expr.ExprList ;
@@ -25,15 +26,7 @@ import com.hp.hpl.jena.sparql.expr.ExprL
 /** Left join by materializing the RHS */
 public class QueryIterLeftJoin extends QueryIterJoinBase
 {
-    public QueryIterLeftJoin(QueryIterator left, QueryIterator right, ExprList 
exprs, ExecutionContext qCxt)
-    {
-        super(left, right, exprs, qCxt) ;
-    }
-
-    
-    @Override
-    protected QueryIterator joinWorker()
-    {
-        return super.leftJoinWorker() ;
+    public QueryIterLeftJoin(QueryIterator left, QueryIterator right, ExprList 
exprs, ExecutionContext qCxt) {
+        super(left, right, JoinType.LEFT, exprs, qCxt) ;
     }
 }

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/ref/EvaluatorSimple.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/ref/EvaluatorSimple.java?rev=1588743&r1=1588742&r2=1588743&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/ref/EvaluatorSimple.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/ref/EvaluatorSimple.java
 Sun Apr 20 12:11:04 2014
@@ -25,9 +25,7 @@ import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.query.ResultSet ;
 import com.hp.hpl.jena.query.ResultSetFormatter ;
 import com.hp.hpl.jena.query.SortCondition ;
-import com.hp.hpl.jena.sparql.algebra.Algebra ;
-import com.hp.hpl.jena.sparql.algebra.Table ;
-import com.hp.hpl.jena.sparql.algebra.TableFactory ;
+import com.hp.hpl.jena.sparql.algebra.* ;
 import com.hp.hpl.jena.sparql.algebra.table.TableN ;
 import com.hp.hpl.jena.sparql.core.BasicPattern ;
 import com.hp.hpl.jena.sparql.core.TriplePath ;
@@ -276,18 +274,11 @@ public class EvaluatorSimple implements 
     
         // Have an iterator that yields one-by-one.
         QueryIterator left = tableLeft.iterator(execCxt) ;
-        QueryIterConcat output = new QueryIterConcat(execCxt) ;
-        for ( ; left.hasNext() ; )
-        {
-            Binding b = left.nextBinding() ;
-            QueryIterator x = tableRight.matchRightLeft(b, leftJoin, 
conditions, execCxt) ;
-            if ( x == null )
-                continue ;
-            output.add(x) ;
-        }
+        JoinType joinType = (leftJoin? JoinType.LEFT : JoinType.PLAIN ) ;
+        QueryIterator qIter = TableLib.joinWorker(left, tableRight, joinType, 
conditions, execCxt) ;
         tableLeft.close() ;
         tableRight.close() ;
-        return new TableN(output) ;
+        return new TableN(qIter) ;
     }
     
     // @@ Abstract compatibility


Reply via email to