blob: 4b58d8e1ca842b5c4e5a94b0f7af495d7b21524e [file] [log] [blame]
/**
* 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.join;
import org.apache.jena.atlas.logging.Log ;
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.QueryIterNullIterator ;
import org.apache.jena.sparql.expr.ExprList ;
/**
* Hash left join.
*
* This code materializes the right hand side into a probe table then hash joins
* from the left.
*
* See {@link QueryIterHashLeftJoin_Left} for one that uses the right hand side
* to make the probe table.
*/
//* This code materializes the left into a probe table
//* then hash joins from the right.
public class QueryIterHashLeftJoin_Right extends AbstractIterHashJoin {
// Left join conditions
private final ExprList conditions;
/**
* Create a hashjoin QueryIterator.
* @param joinKey Join key - if null, one is guessed by snooping the input QueryIterators
* @param left
* @param right
* @param conditions
* @param execCxt
* @return QueryIterator
*/
public static QueryIterator create(JoinKey joinKey, QueryIterator left, QueryIterator right, ExprList conditions, ExecutionContext execCxt) {
// Easy cases.
if ( ! left.hasNext() ) {
left.close() ;
right.close() ;
return QueryIterNullIterator.create(execCxt) ;
}
if ( ! right.hasNext() ) {
right.close() ;
return left ;
}
if ( joinKey != null && joinKey.length() > 1 )
Log.warn(QueryIterHashLeftJoin_Right.class, "Multivariable join key") ;
return new QueryIterHashLeftJoin_Right(joinKey, left, right, conditions, execCxt) ;
}
/**
* Create a hashjoin QueryIterator.
* @param left
* @param right
* @param execCxt
* @return QueryIterator
*/
public static QueryIterator create(QueryIterator left, QueryIterator right, ExprList conditions, ExecutionContext execCxt) {
return create(null, left, right, conditions, execCxt) ;
}
private QueryIterHashLeftJoin_Right(JoinKey joinKey, QueryIterator left, QueryIterator right, ExprList conditions, ExecutionContext execCxt) {
// NB Right. Left
super(joinKey, right, left, execCxt) ;
this.conditions = conditions ;
}
@Override
protected Binding yieldOneResult(Binding rowCurrentProbe, Binding rowStream, Binding rowResult) {
if ( conditions != null && ! conditions.isSatisfied(rowResult, getExecContext()) )
return null ;
return rowResult ;
}
@Override
protected Binding noYieldedRows(Binding rowCurrentProbe) {
return rowCurrentProbe;
}
@Override
protected QueryIterator joinFinished() {
return null ;
}
}