/* | |
* 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; | |
} | |
} |