in hollow/src/main/java/com/netflix/hollow/core/write/objectmapper/flatrecords/traversal/FlatRecordTraversalObjectNodeEquality.java [80:139]
private static void extractCommonObjectSchema(FlatRecordTraversalNode left, FlatRecordTraversalNode right) {
if (left == null || right == null) {
return ;
}
if (!left.getSchema().getName().equals(right.getSchema().getName())) {
return ;
}
if(left instanceof FlatRecordTraversalObjectNode && right instanceof FlatRecordTraversalObjectNode) {
FlatRecordTraversalObjectNode leftObjectNode = (FlatRecordTraversalObjectNode) left;
FlatRecordTraversalObjectNode rightObjectNode = (FlatRecordTraversalObjectNode) right;
HollowObjectSchema commonSchema = leftObjectNode.getSchema().findCommonSchema(rightObjectNode.getSchema());
assert leftObjectNode.getSchema().getName().equals(rightObjectNode.getSchema().getName());
commonSchemaCache.put(left.getSchema().getName(), commonSchema);
for(int i=0;i<commonSchema.numFields();i++) {
String fieldName = commonSchema.getFieldName(i);
// same fieldType and equal to reference
if(leftObjectNode.getSchema().getFieldType(fieldName).equals(HollowObjectSchema.FieldType.REFERENCE)) {
FlatRecordTraversalNode leftChildNode = leftObjectNode.getFieldNode(fieldName);
FlatRecordTraversalNode rightChildNode = rightObjectNode.getFieldNode(fieldName);
extractCommonObjectSchema(leftChildNode, rightChildNode);
}
}
}
else if (left instanceof FlatRecordTraversalSetNode && right instanceof FlatRecordTraversalSetNode) {
FlatRecordTraversalSetNode leftSetNode = (FlatRecordTraversalSetNode) left;
FlatRecordTraversalSetNode rightSetNode = (FlatRecordTraversalSetNode) right;
Iterator<FlatRecordTraversalNode> leftIterator = leftSetNode.iterator();
Iterator<FlatRecordTraversalNode> rightIterator = rightSetNode.iterator();
if (leftIterator.hasNext() && rightIterator.hasNext()) {
FlatRecordTraversalNode leftChildNode = leftIterator.next();
FlatRecordTraversalNode rightChildNode = rightIterator.next();
extractCommonObjectSchema(leftChildNode, rightChildNode);
}
}
else if (left instanceof FlatRecordTraversalListNode && right instanceof FlatRecordTraversalListNode) {
FlatRecordTraversalListNode leftListNode = (FlatRecordTraversalListNode) left;
FlatRecordTraversalListNode rightListNode = (FlatRecordTraversalListNode) right;
Iterator<FlatRecordTraversalNode> leftIterator = leftListNode.iterator();
Iterator<FlatRecordTraversalNode> rightIterator = rightListNode.iterator();
if (leftIterator.hasNext() && rightIterator.hasNext()) {
FlatRecordTraversalNode leftChildNode = leftIterator.next();
FlatRecordTraversalNode rightChildNode = rightIterator.next();
extractCommonObjectSchema(leftChildNode, rightChildNode);
}
}
else if (left instanceof FlatRecordTraversalMapNode && right instanceof FlatRecordTraversalMapNode) {
FlatRecordTraversalMapNode leftMapNode = (FlatRecordTraversalMapNode) left;
FlatRecordTraversalMapNode rightMapNode = (FlatRecordTraversalMapNode) right;
Iterator<Map.Entry<FlatRecordTraversalNode, FlatRecordTraversalNode>> leftIterator = leftMapNode.entrySet().iterator();
Iterator<Map.Entry<FlatRecordTraversalNode, FlatRecordTraversalNode>> rightIterator = rightMapNode.entrySet().iterator();
if (leftIterator.hasNext() && rightIterator.hasNext()) {
Map.Entry<FlatRecordTraversalNode, FlatRecordTraversalNode> leftEntry = leftIterator.next();
Map.Entry<FlatRecordTraversalNode, FlatRecordTraversalNode> rightEntry = rightIterator.next();
extractCommonObjectSchema(leftEntry.getKey(), rightEntry.getKey());
extractCommonObjectSchema(leftEntry.getValue(), rightEntry.getValue());
}
}
}