/*********************************************************************************************************************** * Copyright (C) 2010-2013 by the Stratosphere project (http://stratosphere.eu) * * 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 at * * 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 eu.stratosphere.compiler.plan; import java.util.Collection; import eu.stratosphere.api.common.Plan; import eu.stratosphere.util.Visitable; import eu.stratosphere.util.Visitor; /** * The optimizer representation of a plan. The optimizer creates this from the user defined PACT job plan. * It works on this representation during its optimization. Finally, this plan is translated to a schedule * for the nephele runtime system. */ public class OptimizedPlan implements Visitable<PlanNode> { /** * The data sources in the plan. */ private final Collection<SourcePlanNode> dataSources; /** * The data sinks in the plan. */ private final Collection<SinkPlanNode> dataSinks; /** * All nodes in the optimizer plan. */ private final Collection<PlanNode> allNodes; /** * The original pact plan. */ private final Plan pactPlan; /** * Name of the PACT job */ private final String jobName; /** * The name of the instance type that is to be used. */ private String instanceTypeName; /** * Creates a new instance of this optimizer plan container. The plan is given and fully * described by the data sources, sinks and the collection of all nodes. * * @param sources * The nodes describing the data sources. * @param sinks * The nodes describing the data sinks. * @param allNodes * A collection containing all nodes in the plan. * @param jobName * The name of the PACT job */ public OptimizedPlan(Collection<SourcePlanNode> sources, Collection<SinkPlanNode> sinks, Collection<PlanNode> allNodes, String jobName, Plan pactPlan) { this.dataSources = sources; this.dataSinks = sinks; this.allNodes = allNodes; this.jobName = jobName; this.pactPlan = pactPlan; } /** * Gets the data sources from this OptimizedPlan. * * @return The data sources. */ public Collection<SourcePlanNode> getDataSources() { return dataSources; } /** * Gets the data sinks from this OptimizedPlan. * * @return The data sinks. */ public Collection<SinkPlanNode> getDataSinks() { return dataSinks; } /** * Gets all the nodes from this OptimizedPlan. * * @return All nodes. */ public Collection<PlanNode> getAllNodes() { return allNodes; } /** * Returns the name of the optimized PACT job. * * @return The name of the optimized PACT job. */ public String getJobName() { return this.jobName; } /** * Gets the original pact plan from which this optimized plan was created. * * @return The original pact plan. */ public Plan getOriginalPactPlan() { return this.pactPlan; } /** * Gets the name of the instance type that should be used for this PACT job. * * @return The instance-type name. */ public String getInstanceTypeName() { return instanceTypeName; } /** * Sets the name of the instance type that should be used for this PACT job. * * @param instanceTypeName * The name of the instance type. */ public void setInstanceTypeName(String instanceTypeName) { this.instanceTypeName = instanceTypeName; } // ------------------------------------------------------------------------ /** * Takes the given visitor and applies it top down to all nodes, starting at the sinks. * * @param visitor * The visitor to apply to the nodes in this plan. * @see eu.stratosphere.util.Visitable#accept(eu.stratosphere.util.Visitor) */ @Override public void accept(Visitor<PlanNode> visitor) { for (SinkPlanNode node : this.dataSinks) { node.accept(visitor); } } }