| /* |
| * Copyright 2009-2013 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.ArrayList;
|
| import java.util.Collection;
|
| import java.util.List;
|
|
|
| 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.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 {
|
| List<LogicalVariable> allLiveVars = new ArrayList<LogicalVariable>();
|
| for (Mutable<ILogicalOperator> c : op.getInputs()) {
|
| VariableUtilities.getLiveVariables(c.getValue(), allLiveVars);
|
| }
|
| VariableUtilities.getProducedVariables(op, allLiveVars);
|
| /** put distinct vars first */
|
| schemaVariables.addAll(op.getDistinctByVarList());
|
| /** then other live vars */
|
| for (LogicalVariable var : allLiveVars) {
|
| if (!schemaVariables.contains(var)) {
|
| schemaVariables.add(var);
|
| }
|
| }
|
| 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 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;
|
| }
|
|
|
| }
|