/**
* 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.engine.join.JoinKey ;
/** Hash left join.
* This code materializes the right into a probe table
* then hash joins from the left.
*/
//* This code materializes the left into a probe table
//* then hash joins from the right.
public class QueryIterHashJoin extends AbstractIterHashJoin {
/**
* Create a hashjoin QueryIterator.
* @param joinKey Join key - if null, one is guessed by snooping the input QueryIterators
* @param left
* @param right
* @param execCxt
* @return QueryIterator
*/
public static QueryIterator create(JoinKey joinKey, QueryIterator left, QueryIterator right, ExecutionContext execCxt) {
// Easy cases.
if ( ! left.hasNext() || ! right.hasNext() ) {
left.close() ;
right.close() ;
return QueryIterNullIterator.create(execCxt) ;
}
if ( joinKey != null && joinKey.length() > 1 )
Log.warn(QueryIterHashJoin.class, "Multivariable join key") ;
return new QueryIterHashJoin(joinKey, left, right, execCxt) ;
}
/**
* Create a hashjoin QueryIterator.
* @param left
* @param right
* @param execCxt
* @return QueryIterator
*/
public static QueryIterator create(QueryIterator left, QueryIterator right, ExecutionContext execCxt) {
return create(null, left, right, execCxt) ;
}
private QueryIterHashJoin(JoinKey joinKey, QueryIterator left, QueryIterator right, ExecutionContext execCxt) {
super(joinKey, left, right, execCxt) ;
}
@Override
protected Binding yieldOneResult(Binding rowCurrentProbe, Binding rowStream, Binding rowResult) {
return rowResult ;
}
@Override
protected Binding noYieldedRows(Binding rowCurrentProbe) {
return null;
}
@Override
protected QueryIterator joinFinished() {
return null;
}
}