blob: cd0cee356e90bf808c95cb5aa45ddf0195da02b0 [file] [log] [blame]
/*
* Copyright 2009-2010 by The Regents of the University of California
* Licensed 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 from
*
* 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 edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.visitors;
import java.util.Collection;
import org.apache.commons.lang3.mutable.Mutable;
import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException;
import edu.uci.ics.hyracks.algebricks.common.utils.Pair;
import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalExpression;
import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalPlan;
import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalVariable;
import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.VariableReferenceExpression;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.AggregateOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.AssignOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.DataSourceScanOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.DieOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.DistinctOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.DistributeResultOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.EmptyTupleSourceOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.ExchangeOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.ExtensionOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.GroupByOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.IndexInsertDeleteOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.InnerJoinOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.InsertDeleteOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.LeftOuterJoinOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.LimitOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.OrderOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.SelectOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.SinkOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.UnnestMapOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.UnnestOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.WriteOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.WriteResultOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.visitors.ILogicalOperatorVisitor;
public class SchemaVariableVisitor implements ILogicalOperatorVisitor<Void, Void> {
private Collection<LogicalVariable> schemaVariables;
public SchemaVariableVisitor(Collection<LogicalVariable> schemaVariables) {
this.schemaVariables = schemaVariables;
}
@Override
public Void visitAggregateOperator(AggregateOperator op, Void arg) throws AlgebricksException {
schemaVariables.addAll(op.getVariables());
return null;
}
@Override
public Void visitAssignOperator(AssignOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitDataScanOperator(DataSourceScanOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitDistinctOperator(DistinctOperator op, Void arg) throws AlgebricksException {
for (Mutable<ILogicalExpression> exprRef : op.getExpressions()) {
ILogicalExpression expr = exprRef.getValue();
if (expr.getExpressionTag() == LogicalExpressionTag.VARIABLE) {
VariableReferenceExpression varRefExpr = (VariableReferenceExpression) expr;
schemaVariables.add(varRefExpr.getVariableReference());
}
}
return null;
}
@Override
public Void visitEmptyTupleSourceOperator(EmptyTupleSourceOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitExchangeOperator(ExchangeOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitGroupByOperator(GroupByOperator op, Void arg) throws AlgebricksException {
for (ILogicalPlan p : op.getNestedPlans()) {
for (Mutable<ILogicalOperator> r : p.getRoots()) {
VariableUtilities.getLiveVariables(r.getValue(), schemaVariables);
}
}
for (Pair<LogicalVariable, Mutable<ILogicalExpression>> p : op.getGroupByList()) {
if (p.first != null) {
schemaVariables.add(p.first);
}
}
for (Pair<LogicalVariable, Mutable<ILogicalExpression>> p : op.getDecorList()) {
if (p.first != null) {
schemaVariables.add(p.first);
} else {
ILogicalExpression e = p.second.getValue();
if (e.getExpressionTag() == LogicalExpressionTag.VARIABLE) {
schemaVariables.add(((VariableReferenceExpression) e).getVariableReference());
}
}
}
return null;
}
@Override
public Void visitInnerJoinOperator(InnerJoinOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitLeftOuterJoinOperator(LeftOuterJoinOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitLimitOperator(LimitOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitDieOperator(DieOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitNestedTupleSourceOperator(NestedTupleSourceOperator op, Void arg) throws AlgebricksException {
VariableUtilities.getLiveVariables(op.getSourceOperator(), schemaVariables);
return null;
}
@Override
public Void visitOrderOperator(OrderOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitPartitioningSplitOperator(PartitioningSplitOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitProjectOperator(ProjectOperator op, Void arg) throws AlgebricksException {
schemaVariables.addAll(op.getVariables());
return null;
}
@Override
public Void visitRunningAggregateOperator(RunningAggregateOperator op, Void arg) throws AlgebricksException {
// VariableUtilities.getProducedVariables(op, schemaVariables);
standardLayout(op);
return null;
}
@Override
public Void visitScriptOperator(ScriptOperator op, Void arg) throws AlgebricksException {
schemaVariables.addAll(op.getOutputVariables());
return null;
}
@Override
public Void visitSelectOperator(SelectOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitSubplanOperator(SubplanOperator op, Void arg) throws AlgebricksException {
for (Mutable<ILogicalOperator> c : op.getInputs()) {
VariableUtilities.getLiveVariables(c.getValue(), schemaVariables);
}
VariableUtilities.getProducedVariables(op, schemaVariables);
for (ILogicalPlan p : op.getNestedPlans()) {
for (Mutable<ILogicalOperator> r : p.getRoots()) {
VariableUtilities.getLiveVariables(r.getValue(), schemaVariables);
}
}
return null;
}
@Override
public Void visitUnionOperator(UnionAllOperator op, Void arg) throws AlgebricksException {
VariableUtilities.getProducedVariables(op, schemaVariables);
return null;
}
@Override
public Void visitUnnestMapOperator(UnnestMapOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitUnnestOperator(UnnestOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitWriteOperator(WriteOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitDistributeResultOperator(DistributeResultOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitWriteResultOperator(WriteResultOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
private void standardLayout(ILogicalOperator op) throws AlgebricksException {
for (Mutable<ILogicalOperator> c : op.getInputs()) {
VariableUtilities.getLiveVariables(c.getValue(), schemaVariables);
}
VariableUtilities.getProducedVariables(op, schemaVariables);
}
@Override
public Void visitReplicateOperator(ReplicateOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitInsertDeleteOperator(InsertDeleteOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitIndexInsertDeleteOperator(IndexInsertDeleteOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitSinkOperator(SinkOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
@Override
public Void visitExtensionOperator(ExtensionOperator op, Void arg) throws AlgebricksException {
standardLayout(op);
return null;
}
}