blob: f4e74f6b3ff9424799c3848c4c18482d56b30b60 [file] [log] [blame]
package edu.uci.ics.hivesterix.logical.plan.visitor;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.mutable.Mutable;
import org.apache.commons.lang3.mutable.MutableObject;
import org.apache.hadoop.hive.ql.exec.UnionOperator;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
import edu.uci.ics.hivesterix.logical.plan.visitor.base.DefaultVisitor;
import edu.uci.ics.hivesterix.logical.plan.visitor.base.Translator;
import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException;
import edu.uci.ics.hyracks.algebricks.common.utils.Triple;
import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalVariable;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.visitors.VariableUtilities;
public class UnionVisitor extends DefaultVisitor {
List<Mutable<ILogicalOperator>> parents = new ArrayList<Mutable<ILogicalOperator>>();
@Override
public Mutable<ILogicalOperator> visit(UnionOperator operator,
Mutable<ILogicalOperator> AlgebricksParentOperator, Translator t)
throws AlgebricksException {
parents.add(AlgebricksParentOperator);
if (operator.getParentOperators().size() > parents.size()) {
return null;
}
List<LogicalVariable> leftVars = new ArrayList<LogicalVariable>();
List<LogicalVariable> rightVars = new ArrayList<LogicalVariable>();
VariableUtilities.getUsedVariables(parents.get(0).getValue(), leftVars);
VariableUtilities
.getUsedVariables(parents.get(1).getValue(), rightVars);
List<Triple<LogicalVariable, LogicalVariable, LogicalVariable>> triples = new ArrayList<Triple<LogicalVariable, LogicalVariable, LogicalVariable>>();
List<LogicalVariable> unionVars = new ArrayList<LogicalVariable>();
for (int i = 0; i < leftVars.size(); i++) {
LogicalVariable unionVar = t.getVariable(leftVars.get(i).getId()
+ "union" + AlgebricksParentOperator.hashCode(),
TypeInfoFactory.unknownTypeInfo);
unionVars.add(unionVar);
Triple<LogicalVariable, LogicalVariable, LogicalVariable> triple = new Triple<LogicalVariable, LogicalVariable, LogicalVariable>(
leftVars.get(i), rightVars.get(i), unionVar);
t.replaceVariable(leftVars.get(i), unionVar);
t.replaceVariable(rightVars.get(i), unionVar);
triples.add(triple);
}
ILogicalOperator currentOperator = new edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator(
triples);
for (Mutable<ILogicalOperator> parent : parents)
currentOperator.getInputs().add(parent);
t.rewriteOperatorOutputSchema(unionVars, operator);
parents.clear();
return new MutableObject<ILogicalOperator>(currentOperator);
}
}