in hollow-diff-ui/src/tools/java/com/netflix/hollow/diff/ui/HistoryUITest.java [101:226]
private HollowHistory createHistoryBidirectional() throws IOException {
HollowHistory history;
HollowWriteStateEngine stateEngine;
{
schema = new HollowObjectSchema("TypeA", 2);
stateEngine = new HollowWriteStateEngine();
schema.addField("a1", HollowObjectSchema.FieldType.INT);
schema.addField("a2", HollowObjectSchema.FieldType.INT);
stateEngine.addTypeState(new HollowObjectTypeWriteState(schema));
// v0
stateEngine.addHeaderTag(CUSTOM_VERSION_TAG, "v0");
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 3, 13 });
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 4, 44 });
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 15, 150 });
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 16, 160 });
stateEngine.prepareForWrite();
ByteArrayOutputStream baos_v0 = new ByteArrayOutputStream();
HollowBlobWriter writer = new HollowBlobWriter(stateEngine);
writer.writeSnapshot(baos_v0);
stateEngine.prepareForNextCycle();
// v1
stateEngine.addHeaderTag(CUSTOM_VERSION_TAG, "v1");
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 1, 1 });
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 2, 2 });
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 3, 3 });
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 4, 4 });
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 5, 5 });
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 6, 6 });
stateEngine.prepareForWrite();
ByteArrayOutputStream baos_v1 = new ByteArrayOutputStream();
ByteArrayOutputStream baos_v0_to_v1 = new ByteArrayOutputStream();
ByteArrayOutputStream baos_v1_to_v0 = new ByteArrayOutputStream();
writer = new HollowBlobWriter(stateEngine);
writer.writeSnapshot(baos_v1);
writer.writeDelta(baos_v0_to_v1);
writer.writeReverseDelta(baos_v1_to_v0);
stateEngine.prepareForNextCycle();
// v2
stateEngine.addHeaderTag(CUSTOM_VERSION_TAG, "v2");
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 2, 7 });
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 3, 3 });
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 5, 8 });
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 6, 6 });
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 7, 9 });
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 8, 10 });
stateEngine.prepareForWrite();
ByteArrayOutputStream baos_v2 = new ByteArrayOutputStream();
ByteArrayOutputStream baos_v1_to_v2 = new ByteArrayOutputStream();
ByteArrayOutputStream baos_v2_to_v1 = new ByteArrayOutputStream();
writer.writeSnapshot(baos_v2);
writer.writeDelta(baos_v1_to_v2);
writer.writeReverseDelta(baos_v2_to_v1);
stateEngine.prepareForNextCycle();
// v3
stateEngine.addHeaderTag(CUSTOM_VERSION_TAG, "v3");
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 1, 1 });
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 2, 7 });
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 3, 11 });
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 6, 12 });
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 7, 13 });
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 8, 10 });
stateEngine.prepareForWrite();
ByteArrayOutputStream baos_v2_to_v3 = new ByteArrayOutputStream();
ByteArrayOutputStream baos_v3_to_v2 = new ByteArrayOutputStream();
writer.writeDelta(baos_v2_to_v3);
writer.writeReverseDelta(baos_v3_to_v2);
// v4
stateEngine.prepareForNextCycle();
stateEngine.addHeaderTag(CUSTOM_VERSION_TAG, "v4");
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 1, 18 }); // 0
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 2, 7 }); // 1
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 3, 19 }); // 2
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 6, 12 }); // 3
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 15, 13 }); // 4
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 8, 10 }); // 5
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 18, 10 }); // 6
addRec(stateEngine, schema, new String[] { "a1", "a2" }, new int[] { 28, 90 }); // 7
stateEngine.prepareForWrite();
ByteArrayOutputStream baos_v4 = new ByteArrayOutputStream();
ByteArrayOutputStream baos_v4_to_v3 = new ByteArrayOutputStream();
ByteArrayOutputStream baos_v3_to_v4 = new ByteArrayOutputStream();
writer.writeSnapshot(baos_v4);
writer.writeDelta(baos_v3_to_v4);
writer.writeReverseDelta(baos_v4_to_v3);
// build history bi-directionally
HollowReadStateEngine fwdReadStateEngine = new HollowReadStateEngine();
HollowReadStateEngine revReadStateEngine = new HollowReadStateEngine();
HollowBlobReader fwdReader = new HollowBlobReader(fwdReadStateEngine);
HollowBlobReader revReader = new HollowBlobReader(revReadStateEngine);
fwdReader.readSnapshot(HollowBlobInput.serial(baos_v2.toByteArray()));
System.out.println("Ordinals populated in fwdReadStateEngine: ");
exploreOrdinals(fwdReadStateEngine);
revReader.readSnapshot(HollowBlobInput.serial(baos_v2.toByteArray()));
System.out.println("Ordinals populated in revReadStateEngine (same as fwdReadStateEngine): ");
exploreOrdinals(revReadStateEngine);
history = new HollowHistory(fwdReadStateEngine, 2L, MAX_STATES, true);
history.getKeyIndex().addTypeIndex("TypeA", "a1");
history.getKeyIndex().indexTypeField("TypeA", "a1");
history.initializeReverseStateEngine(revReadStateEngine, 2L);
fwdReader.applyDelta(HollowBlobInput.serial(baos_v2_to_v3.toByteArray()));
exploreOrdinals(fwdReadStateEngine);
history.deltaOccurred(3L);
revReader.applyDelta(HollowBlobInput.serial(baos_v2_to_v1.toByteArray()));
exploreOrdinals(revReadStateEngine);
history.reverseDeltaOccurred(1L);
fwdReader.applyDelta(HollowBlobInput.serial(baos_v3_to_v4.toByteArray()));
exploreOrdinals(fwdReadStateEngine);
history.deltaOccurred(4L);
revReader.applyDelta(HollowBlobInput.serial(baos_v1_to_v0.toByteArray()));
exploreOrdinals(revReadStateEngine);
history.reverseDeltaOccurred(0L);
}
return history;
}