package hdgl.db.store.impl.cache; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; 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 MemoryVertexImpl implements Vertex, Writable { long id; String type; Map<String, byte[] > labels = new HashMap<String, byte[]>(); Set<Long> inedges = new HashSet<Long>(); Set<Long> outedges = new HashSet<Long>(); MemoryGraphStore store; public MemoryVertexImpl(MemoryGraphStore store){ this.store = store; } public MemoryVertexImpl(long id, String type, Map<String, byte[]> labels, Set<Long> inedges, Set<Long> outedges, MemoryGraphStore store) { super(); this.id = id; this.type = type; this.labels = labels; this.inedges = inedges; this.outedges = outedges; 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(v.getId()); id=in.readLong(); // out.writeUTF(v.getType()); type=in.readUTF(); // Iterable<Edge> outedges = v.getOutEdges(); // out.writeInt(IterableHelper.count(outedges)); int ocount=in.readInt(); outedges.clear(); // for(Edge e:outedges){ for(int i=0;i<ocount;i++){ // out.writeLong(e.getId()); outedges.add(in.readLong()); // } } // Iterable<Edge> inedges = v.getInEdges(); // out.writeInt(IterableHelper.count(inedges)); int icount = in.readInt(); inedges.clear(); // for(Edge e:inedges){ for(int i=0;i<icount;i++){ // out.writeLong(e.getId()); inedges.add(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(id); out.writeUTF(type); out.writeInt(IterableHelper.count(outedges)); for(long e:outedges){ out.writeLong(e); } out.writeInt(IterableHelper.count(inedges)); for(long e:inedges){ out.writeLong(e); } 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 Iterable<Edge> getOutEdges() { return IterableHelper.select(outedges, new IterableHelper.Map<Long, Edge>() { @Override public Edge select(Long element) { return store.getEdge(element); } }); } @Override public Iterable<Edge> getInEdges() { return IterableHelper.select(inedges, new IterableHelper.Map<Long, Edge>() { @Override public Edge select(Long element) { return store.getEdge(element); } }); } @Override public Iterable<Edge> getEdges() { return IterableHelper.select( IterableHelper.concat(outedges, inedges), new IterableHelper.Map<Long, Edge>() { @Override public Edge select(Long element) { return store.getEdge(element); } }); } @Override public byte[] getLabel(String name) { return labels.get(name); } }