package org.vertexium.accumulo.iterator.model;
import org.apache.hadoop.io.Text;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class EdgesWithEdgeInfo extends Edges {
// We used to use a HashMap here but that was too slow. Replaced with a List since we really don't care about duplicates anyway.
private List<Map.Entry<Text, EdgeInfo>> pairs = new ArrayList<>();
public void add(Text edgeId, EdgeInfo edgeInfo) {
pairs.add(new Pair(edgeId, edgeInfo));
}
public void add(String edgeId, EdgeInfo edgeInfo) {
add(new Text(edgeId), edgeInfo);
}
public void remove(Text edgeId) {
int i = indexOf(edgeId);
if (i >= 0) {
pairs.remove(i);
}
}
private int indexOf(Text edgeId) {
for (int i = 0; i < pairs.size(); i++) {
if (pairs.get(i).getKey().equals(edgeId)) {
return i;
}
}
return -1;
}
public void remove(String edgeId) {
remove(new Text(edgeId));
}
public void clear() {
pairs.clear();
}
public EdgeInfo get(Text edgeId) {
int i = indexOf(edgeId);
if (i >= 0) {
return pairs.get(i).getValue();
}
return null;
}
public Iterable<EdgeInfo> getEdgeInfos() {
return new Iterable<EdgeInfo>() {
@Override
public Iterator<EdgeInfo> iterator() {
final Iterator<Map.Entry<Text, EdgeInfo>> it = pairs.iterator();
return new Iterator<EdgeInfo>() {
@Override
public boolean hasNext() {
return it.hasNext();
}
@Override
public EdgeInfo next() {
return it.next().getValue();
}
@Override
public void remove() {
throw new RuntimeException("not supported");
}
};
}
};
}
public Iterable<Map.Entry<Text, EdgeInfo>> getEntries() {
return pairs;
}
private static class Pair implements Map.Entry<Text, EdgeInfo> {
private final Text edgeId;
private final EdgeInfo edgeInfo;
public Pair(Text edgeId, EdgeInfo edgeInfo) {
this.edgeId = edgeId;
this.edgeInfo = edgeInfo;
}
@Override
public Text getKey() {
return edgeId;
}
@Override
public EdgeInfo getValue() {
return edgeInfo;
}
@Override
public EdgeInfo setValue(EdgeInfo value) {
throw new RuntimeException("not supported");
}
}
}