package hdgl.db.store.impl.file;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import hdgl.db.exception.HdglException;
import hdgl.db.graph.Edge;
import hdgl.db.graph.LabelValue;
import hdgl.db.graph.Vertex;
import hdgl.util.IterableHelper;
import org.apache.hadoop.io.Writable;
public class FileEdge implements Edge, Writable {
long id;
String type;
long start;
long end;
Map<String, byte[] > labels = new HashMap<String, byte[]>();
FileGraphStore store;
public FileEdge(FileGraphStore store){
this.store = store;
}
public FileEdge(long id, String type, long start, long end,
Map<String, byte[]> labels, FileGraphStore store) {
super();
this.id = id;
this.type = type;
this.start = start;
this.end = end;
this.labels = labels;
this.store = store;
}
@Override
public long getId() {
return id;
}
@Override
public String getType() {
return type;
}
@Override
public Iterable<LabelValue> getLabels() {
return IterableHelper.select(labels.entrySet(), new IterableHelper.Map<Map.Entry<String,byte[]>, LabelValue>() {
@Override
public LabelValue select(final Entry<String, byte[]> element) {
return new LabelValue() {
@Override
public byte[] getValue() {
return element.getValue();
}
@Override
public String getName() {
return element.getKey();
}
};
}
});
}
@Override
public void readFields(DataInput in) throws IOException {
// out.writeLong(e.getId());
id = in.readLong();
// out.writeUTF(e.getType());
type = in.readUTF();
// out.writeLong(e.getOutVertex().getId());
end = in.readLong();
// out.writeLong(e.getInVertex().getId());
start = in.readLong();
// Iterable<LabelValue> labels = v.getLabels();
// out.writeInt(IterableHelper.count(labels));
int lcount = in.readInt();
labels.clear();
// for(LabelValue l:labels){
for(int i=0;i<lcount;i++){
// out.writeUTF(l.getName());
String name=in.readUTF();
// out.writeInt(l.getValue().length);
int size=in.readInt();
byte[] data=new byte[size];
// out.write(l.getValue());
in.readFully(data);
labels.put(name, data);
// }
}
}
@Override
public void write(DataOutput out) throws IOException {
out.writeLong(getId());
out.writeUTF(getType());
out.writeLong(end);
out.writeLong(start);
Iterable<LabelValue> labels = getLabels();
out.writeInt(IterableHelper.count(labels));
for(LabelValue l:labels){
out.writeUTF(l.getName());
out.writeInt(l.getValue().length);
out.write(l.getValue());
}
}
@Override
public Vertex getInVertex() {
return store.getVertex(start);
}
@Override
public Vertex getOutVertex() {
return store.getVertex(end);
}
@Override
public Vertex getOtherVertex(Vertex one) {
if(one.getId()==start){
return getOutVertex();
}else if(one.getId()==end){
return getInVertex();
}else{
throw new HdglException("Cannot found vertex");
}
}
@Override
public byte[] getLabel(String name) {
return labels.get(name);
}
}