add IntermediateNodeWritable and KmerListWritable
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/IntermediateNodeWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/IntermediateNodeWritable.java
new file mode 100644
index 0000000..4684a06
--- /dev/null
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/IntermediateNodeWritable.java
@@ -0,0 +1,141 @@
+package edu.uci.ics.genomix.type;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.io.Serializable;
+
+import org.apache.hadoop.io.WritableComparable;
+
+public class IntermediateNodeWritable implements WritableComparable<IntermediateNodeWritable>, Serializable{
+
+    private static final long serialVersionUID = 1L;
+    public static final IntermediateNodeWritable EMPTY_NODE = new IntermediateNodeWritable();
+    
+    private KmerListWritable forwardForwardList;
+    private KmerListWritable forwardReverseList;
+    private KmerListWritable reverseForwardList;
+    private KmerListWritable reverseReverseList;
+    private long uuid;
+    
+    public IntermediateNodeWritable(){
+        forwardForwardList = new KmerListWritable();
+        forwardReverseList = new KmerListWritable();
+        reverseForwardList = new KmerListWritable();
+        reverseReverseList = new KmerListWritable();
+        uuid = 0L;
+    }
+    
+    public IntermediateNodeWritable(KmerListWritable FFList, KmerListWritable FRList,
+            KmerListWritable RFList, KmerListWritable RRList, long uuid) {
+        this();
+        set(FFList, FRList, RFList, RRList, uuid);
+    }
+    
+    public void set(IntermediateNodeWritable node){
+        set(node.forwardForwardList, node.forwardReverseList, node.reverseForwardList, 
+                node.reverseReverseList, node.uuid);
+    }
+    
+    public void set(KmerListWritable FFList, KmerListWritable FRList,
+            KmerListWritable RFList, KmerListWritable RRList, long uuid) {
+        this.forwardForwardList.set(FFList);
+        this.forwardReverseList.set(FRList);
+        this.reverseForwardList.set(RFList);
+        this.reverseReverseList.set(RRList);
+        this.uuid = uuid;
+    }
+
+    public void reset(int kmerSize) {
+        forwardForwardList.reset();
+        forwardReverseList.reset();
+        reverseForwardList.reset();
+        reverseReverseList.reset();
+        uuid = 0;
+    }
+    
+    public KmerListWritable getFFList() {
+        return forwardForwardList;
+    }
+
+    public void setFFList(KmerListWritable forwardForwardList) {
+        this.forwardForwardList = forwardForwardList;
+    }
+
+    public KmerListWritable getFReList() {
+        return forwardReverseList;
+    }
+
+    public void setFRList(KmerListWritable forwardReverseList) {
+        this.forwardReverseList = forwardReverseList;
+    }
+
+    public KmerListWritable getRFList() {
+        return reverseForwardList;
+    }
+
+    public void setRFList(KmerListWritable reverseForwardList) {
+        this.reverseForwardList = reverseForwardList;
+    }
+
+    public KmerListWritable getRRList() {
+        return reverseReverseList;
+    }
+
+    public void setRRList(KmerListWritable reverseReverseList) {
+        this.reverseReverseList = reverseReverseList;
+    }
+
+    @Override
+    public void readFields(DataInput in) throws IOException {
+        this.forwardForwardList.readFields(in);
+        this.forwardReverseList.readFields(in);
+        this.reverseForwardList.readFields(in);
+        this.reverseReverseList.readFields(in);
+        this.uuid = in.readLong();
+    }
+
+    @Override
+    public void write(DataOutput out) throws IOException {
+        this.forwardForwardList.write(out);
+        this.forwardReverseList.write(out);
+        this.reverseForwardList.write(out);
+        this.reverseReverseList.write(out);
+        out.writeLong(this.uuid);
+    }
+
+    @Override
+    public int compareTo(IntermediateNodeWritable other) {
+        // TODO Auto-generated method stub
+        return this.uuid > other.uuid ? 1 : ((this.uuid == other.uuid) ? 0 : -1);
+    }
+    
+    @Override
+    public int hashCode() {
+        return Long.valueOf(this.uuid).hashCode(); 
+    }
+    
+    @Override
+    public boolean equals(Object o) {
+        if (o instanceof IntermediateNodeWritable) {
+            IntermediateNodeWritable nw = (IntermediateNodeWritable) o;
+            return (this.forwardForwardList.equals(nw.forwardForwardList)
+                    && this.forwardReverseList.equals(nw.forwardReverseList)
+                    && this.reverseForwardList.equals(nw.reverseForwardList)
+                    && this.reverseReverseList.equals(nw.reverseReverseList) && (this.uuid == nw.uuid));
+        }
+        return false;
+    }
+    
+    @Override
+    public String toString() {
+        StringBuilder sbuilder = new StringBuilder();
+        sbuilder.append('(');
+        sbuilder.append(forwardForwardList.toString()).append('\t');
+        sbuilder.append(forwardReverseList.toString()).append('\t');
+        sbuilder.append(reverseForwardList.toString()).append('\t');
+        sbuilder.append(reverseReverseList.toString()).append('\t');
+        sbuilder.append(uuid).append(')');
+        return sbuilder.toString();
+    }
+}
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerListWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerListWritable.java
index c4a6865..4240b1d 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerListWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerListWritable.java
@@ -87,6 +87,18 @@
         return posIter;
     }
     
+    public void set(KmerListWritable otherList) {
+        set(otherList.valueCount, otherList.storage, otherList.offset);
+    }
+
+    public void set(int valueCount, byte[] newData, int offset) {
+        this.valueCount = valueCount;
+        setSize(valueCount * KMER_LENGTH);
+        if (valueCount > 0) {
+            System.arraycopy(newData, offset, storage, this.offset, valueCount * KMER_LENGTH);
+        }
+    }
+    
     @Override
     public Iterator<KmerBytesWritable> iterator() {
         Iterator<KmerBytesWritable> it = new Iterator<KmerBytesWritable>() {
diff --git a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/newgraph/dataflow/ReadsKeyValueParserFactory.java b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/newgraph/dataflow/ReadsKeyValueParserFactory.java
index ae511e8..2b7dd81 100644
--- a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/newgraph/dataflow/ReadsKeyValueParserFactory.java
+++ b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/newgraph/dataflow/ReadsKeyValueParserFactory.java
@@ -26,7 +26,9 @@
 
 import edu.uci.ics.genomix.hyracks.data.primitive.PositionReference;
 import edu.uci.ics.genomix.type.GeneCode;
+import edu.uci.ics.genomix.type.IntermediateNodeWritable;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
+import edu.uci.ics.genomix.type.KmerListWritable;
 import edu.uci.ics.hyracks.api.comm.IFrameWriter;
 import edu.uci.ics.hyracks.api.context.IHyracksTaskContext;
 import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer;
@@ -69,8 +71,11 @@
         return new IKeyValueParser<LongWritable, Text>() {
 
             private KmerBytesWritable kmer = new KmerBytesWritable(kmerSize);
+            private KmerBytesWritable nextKmer = new KmerBytesWritable(kmerSize);
             private PositionReference pos = new PositionReference();
-
+            private KmerListWritable kmerList = new KmerListWritable();
+            private IntermediateNodeWritable interMediateNode = new IntermediateNodeWritable();
+            
             @Override
             public void parse(LongWritable key, Text value, IFrameWriter writer) throws HyracksDataException {
                 String[] geneLine = value.toString().split("\\t"); // Read the Real Gene Line
@@ -103,6 +108,10 @@
                     return;
                 }
                 kmer.setByRead(array, 0);
+                nextKmer.set(kmer);
+                nextKmer.shiftKmerWithNextChar(array[kmerSize]);
+                kmerList.append(nextKmer);
+                interMediateNode.setFFList(kmerList);
                 InsertToFrame(kmer, readID, 1, writer);
 
                 /** middle kmer */