/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.pig.newplan;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.pig.impl.logicalLayer.FrontendException;
import org.apache.pig.impl.util.Pair;
import org.apache.pig.newplan.logical.relational.LOLoad;
import org.apache.pig.newplan.logical.relational.LOStore;
/**
* Class to represent a view of a plan. The view contains a subset of the plan.
* All the operators returned from the view are the same objects to the operators
* in its base plan. It is used to represent match results.
*
*/
public class OperatorSubPlan implements OperatorPlan {
private OperatorPlan basePlan;
private List<Operator> roots;
private List<Operator> leaves;
private Set<Operator> operators;
public OperatorSubPlan(OperatorPlan base) {
basePlan = base;
roots = new ArrayList<Operator>();
leaves = new ArrayList<Operator>();
operators = new HashSet<Operator>();
}
public OperatorPlan getBasePlan() {
return basePlan;
}
@Override
public void add(Operator op) {
operators.add(op);
leaves.clear();
roots.clear();
}
@Override
public void connect(Operator from, int fromPos, Operator to, int toPos) {
throw new UnsupportedOperationException("connect() can not be called on OperatorSubPlan");
}
@Override
public void connect(Operator from, Operator to) {
throw new UnsupportedOperationException("connect() can not be called on OperatorSubPlan");
}
@Override
public Pair<Integer, Integer> disconnect(Operator from, Operator to) throws FrontendException {
throw new UnsupportedOperationException("disconnect() can not be called on OperatorSubPlan");
}
@Override
public List<Operator> getSinks() {
if (leaves.size() == 0 && operators.size() > 0) {
for (Operator op : operators) {
if (getSuccessors(op) == null) {
leaves.add(op);
}
}
}
return leaves;
}
@Override
public Iterator<Operator> getOperators() {
return operators.iterator();
}
@Override
public List<Operator> getPredecessors(Operator op) {
List<Operator> l = basePlan.getPredecessors(op);
List<Operator> list = null;
if (l != null) {
for(Operator oper: l) {
if (operators.contains(oper)) {
if (list == null) {
list = new ArrayList<Operator>();
}
list.add(oper);
}
}
}
return list;
}
@Override
public List<Operator> getSources() {
if (roots.size() == 0 && operators.size() > 0) {
for (Operator op : operators) {
if (getPredecessors(op) == null) {
roots.add(op);
}
}
}
return roots;
}
@Override
public List<Operator> getSuccessors(Operator op) {
List<Operator> l = basePlan.getSuccessors(op);
List<Operator> list = null;
if (l != null) {
for(Operator oper: l) {
if (operators.contains(oper)) {
if (list == null) {
list = new ArrayList<Operator>();
}
list.add(oper);
}
}
}
return list;
}
@Override
public void remove(Operator op) throws FrontendException {
operators.remove(op);
leaves.clear();
roots.clear();
}
@Override
public int size() {
return operators.size();
}
@Override
public boolean isEqual(OperatorPlan other) throws FrontendException {
return BaseOperatorPlan.isEqual(this, other);
}
@Override
public void createSoftLink(Operator from, Operator to) {
throw new UnsupportedOperationException("connect() can not be called on OperatorSubPlan");
}
@Override
public void removeSoftLink(Operator from, Operator to) {
throw new UnsupportedOperationException("removeSoftLink() can not be called on OperatorSubPlan");
}
@Override
public List<Operator> getSoftLinkPredecessors(Operator op) {
return basePlan.getSoftLinkPredecessors(op);
}
@Override
public List<Operator> getSoftLinkSuccessors(Operator op) {
return basePlan.getSoftLinkSuccessors(op);
}
@Override
public void insertBetween(Operator pred, Operator operatorToInsert, Operator succ)
throws FrontendException {
throw new UnsupportedOperationException("insertBetween() can not be called on OperatorSubPlan");
}
@Override
public void removeAndReconnect(Operator operatorToRemove)
throws FrontendException {
throw new UnsupportedOperationException("removeAndReconnect() can not be called on OperatorSubPlan");
}
@Override
public void replace(Operator oldOperator, Operator newOperator)
throws FrontendException {
throw new UnsupportedOperationException("replace() can not be called on OperatorSubPlan");
}
@Override
public boolean pathExists(Operator from, Operator to) {
// Not needed. Not implemented
return false;
}
}