in datafu-pig/src/main/java/datafu/pig/util/TupleDiff.java [134:196]
private boolean compare(Object oldField, Object newField, FieldSchema oldSchema, FieldSchema newSchema,
int fieldNum, StringBuilder resultBuilder, StringBuilder prefixBuilder, Set<String> ignoredFields)
throws ExecException, FrontendException {
boolean topLevel = prefixBuilder == null;
String alias = topLevel ? "" : getFieldAliasOrNumber(oldSchema, newSchema, fieldNum);
// we are not in the 2nd level and this field is meant to be ignored
if (topLevel || (prefixBuilder.length() != 0) || !ignoredFields.contains(alias)) {
if (oldField == null) {
if (newField != null) {
if (topLevel) {
resultBuilder.append(this.added);
return true;
} else {
resultBuilder.append(this.separator).append(prefixBuilder.toString()).append(alias);
}
}
} else if (newField == null) {
if (topLevel) {
resultBuilder.append(this.missing);
return true;
} else {
resultBuilder.append(this.separator).append(prefixBuilder.toString()).append(alias);
}
} else if (!newField.equals(oldField)) {
// the top level is always a tuple, regardless of whether we have a schema or not
if (topLevel || ((oldSchema != null) && (DataType.TUPLE == oldSchema.type))) {
Tuple oldTuple = (Tuple) oldField;
if (!(newField instanceof Tuple)) {
resultBuilder.append(this.separator).append(prefixBuilder.toString()).append(alias);
} else {
// drill down to show the differences within the tuple
Tuple newTuple = (Tuple) newField;
int maxNumOfFields = Math.max(oldTuple.size(), newTuple.size());
for (int innerFieldNum = 0; innerFieldNum < maxNumOfFields; innerFieldNum++) {
int lengthBeforeCall = resultBuilder.length();
compare(getField(oldTuple, innerFieldNum), getField(newTuple, innerFieldNum),
getFieldSchema(oldSchema, innerFieldNum), getFieldSchema(newSchema, innerFieldNum),
innerFieldNum, resultBuilder, topLevel ? new StringBuilder() : new StringBuilder(
prefixBuilder).append(alias).append(this.tupleStart), ignoredFields);
if (!topLevel && (resultBuilder.length() > lengthBeforeCall)) {
resultBuilder.append(this.tupleEnd);
}
}
}
} else {
resultBuilder.append(this.separator).append(prefixBuilder.toString()).append(alias);
}
}
}
return false;
}