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