blob: 2e3249032e4d48fae70dbe223db3cf80e0aeb311 [file] [log] [blame]
/*
* 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.Iterator;
import java.util.Map;
import org.apache.pig.impl.util.MultiMap;
import org.apache.pig.impl.util.Pair;
public class PlanEdge extends MultiMap<Operator, Operator> {
private static final long serialVersionUID = 1L;
public PlanEdge() {
super();
}
/**
* @param size Initial size of the map
*/
public PlanEdge(int size) {
super(size);
}
/**
* Add an element to the map.
* @param key The key to store the value under. If the key already
* exists the value will be added to the collection for that key, it
* will not replace the existing value (as in a standard map).
* @param value value to store.
* @param pos position in the arraylist to store the new value at.
* Positions are zero based.
*/
public void put(Operator key, Operator value, int pos) {
ArrayList<Operator> list = mMap.get(key);
if (list == null) {
list = new ArrayList<Operator>();
if (pos != 0) {
throw new IndexOutOfBoundsException(
"First edge cannot have position greater than 1");
}
list.add(value);
mMap.put(key, list);
} else {
list.add(pos, value);
}
}
/**
* Remove one value from an existing key and return which position in
* the arraylist the value was at.. If that is the last value
* for the key, then remove the key too.
* @param key Key to remove the value from.
* @param value Value to remove.
* @return A pair containing the value being removed and an integer
* indicating the position, or null if the key or value does
* not exist. Positions are zero based.
*/
public Pair<Operator, Integer> removeWithPosition(Operator key,
Operator value) {
ArrayList<Operator> list = mMap.get(key);
if (list == null) return null;
int index = -1;
Iterator<Operator> i = list.iterator();
Operator keeper = null;
for (int j = 0; i.hasNext(); j++) {
keeper = i.next();
//if (keeper.equals(value)) {
if (keeper == value) {
i.remove();
index = j;
break;
}
}
if (index == -1) return null;
if (list.size() == 0) {
mMap.remove(key);
}
return new Pair<Operator, Integer>(keeper, index);
}
public PlanEdge shallowClone() {
// shallow clone: elements not cloned
PlanEdge result = new PlanEdge();
for (Map.Entry<Operator, ArrayList<Operator>> entry : mMap.entrySet()) {
ArrayList<Operator> list = new ArrayList<Operator>();
list.addAll(entry.getValue());
result.put(entry.getKey(), list);
}
return result;
}
}