Fixed Rejected Messages, Calculating correct size
[iotcloud.git] / version2 / src / java / iotcloud / Commit.java
index c43fcfd27f15e79ec093a243963caedbc065b790..7084d0e7100abeba58281eb32d172f511fce0966 100644 (file)
@@ -94,7 +94,6 @@ class Commit {
         return transactionSequenceNumber;
     }
 
-
     public Map<Integer, CommitPart> getParts() {
         return parts;
     }
@@ -243,4 +242,44 @@ class Commit {
 
         return bbEncode.array();
     }
+
+    private void setKVsMap(Map<IoTString, KeyValue> newKVs) {
+        keyValueUpdateSet.clear();
+        liveKeys.clear();
+
+        keyValueUpdateSet.addAll(newKVs.values());
+        liveKeys.addAll(newKVs.keySet());
+
+    }
+
+
+    public static Commit merge(Commit newer, Commit older, long newSequenceNumber) {
+
+        if (older == null) {
+            return newer;
+        } else if (newer == null) {
+            return older;
+        }
+
+        Map<IoTString, KeyValue> kvSet = new HashMap<IoTString, KeyValue>();
+        for (KeyValue kv : older.getKeyValueUpdateSet()) {
+            kvSet.put(kv.getKey(), kv);
+        }
+
+        for (KeyValue kv : newer.getKeyValueUpdateSet()) {
+            kvSet.put(kv.getKey(), kv);
+        }
+
+        long transactionSequenceNumber = newer.getTransactionSequenceNumber();
+
+        if (transactionSequenceNumber == -1) {
+            transactionSequenceNumber = older.getTransactionSequenceNumber();
+        }
+
+        Commit newCommit = new Commit(newSequenceNumber, newer.getMachineId(), transactionSequenceNumber);
+
+        newCommit.setKVsMap(kvSet);
+
+        return newCommit;
+    }
 }
\ No newline at end of file