private boolean compare()

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;
	}