/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.query.processor.relational;
import java.util.ArrayList;
import java.util.List;
import org.teiid.common.buffer.BufferManager.BufferReserveMode;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidProcessingException;
public abstract class JoinStrategy {
protected JoinNode joinNode;
protected SourceState leftSource;
protected SourceState rightSource;
protected int reserved;
public void close() {
if (joinNode == null) {
return;
}
joinNode.getBufferManager().releaseBuffers(reserved);
reserved = 0;
try {
if (leftSource != null) {
leftSource.close();
}
} finally {
try {
if (rightSource != null) {
rightSource.close();
}
} finally {
leftSource = null;
rightSource = null;
}
}
}
public void initialize(JoinNode joinNode) {
this.joinNode = joinNode;
this.leftSource = new SourceState(joinNode.getChildren()[0], joinNode.getLeftExpressions());
this.leftSource.markExpressionsDistinct(this.joinNode.isLeftDistinct());
this.rightSource = new SourceState(joinNode.getChildren()[1], joinNode.getRightExpressions());
this.rightSource.markExpressionsDistinct(this.joinNode.isRightDistinct());
}
protected void loadLeft() throws TeiidComponentException, TeiidProcessingException {
}
protected void loadRight() throws TeiidComponentException, TeiidProcessingException {
}
/**
* Output a combined, projected tuple based on tuple parts from the left and right.
* @param leftTuple Left tuple part
* @param rightTuple Right tuple part
* @throws TeiidComponentException
*/
protected List outputTuple(List leftTuple, List rightTuple) {
List combinedRow = new ArrayList(this.joinNode.getCombinedElementMap().size());
combinedRow.addAll(leftTuple);
combinedRow.addAll(rightTuple);
return combinedRow;
}
protected abstract void process() throws TeiidComponentException, TeiidProcessingException;
public abstract JoinStrategy clone();
protected void openLeft() throws TeiidComponentException, TeiidProcessingException {
if (!this.leftSource.open) {
leftSource.getSource().open();
this.leftSource.open = true;
}
}
protected void openRight() throws TeiidComponentException, TeiidProcessingException {
if (!this.rightSource.open) {
if (reserved == 0) {
reserved = joinNode.getBufferManager().reserveBuffers(joinNode.getBufferManager().getSchemaSize(joinNode.getOutputElements()), BufferReserveMode.FORCE);
}
rightSource.getSource().open();
this.rightSource.open = true;
}
}
}