diff --git a/helper/helper-common/src/main/java/com/linkedin/avroutil1/compatibility/SchemaComparisonConfiguration.java b/helper/helper-common/src/main/java/com/linkedin/avroutil1/compatibility/SchemaComparisonConfiguration.java index 677b91734..eb08dec92 100644 --- a/helper/helper-common/src/main/java/com/linkedin/avroutil1/compatibility/SchemaComparisonConfiguration.java +++ b/helper/helper-common/src/main/java/com/linkedin/avroutil1/compatibility/SchemaComparisonConfiguration.java @@ -15,16 +15,16 @@ public class SchemaComparisonConfiguration { * behaves like avro <= 1.7.2 - non-string props on fields or types are ignored */ public static final SchemaComparisonConfiguration PRE_1_7_3 = new SchemaComparisonConfiguration( - true, false, false, false, true, false, Collections.emptySet() + true, false, false, false, true, false, false, Collections.emptySet() ); /** * same as {@link #STRICT} but allows int default values to match (round) float default values */ public static final SchemaComparisonConfiguration LOOSE_NUMERICS = new SchemaComparisonConfiguration( - true, true, true, true, true, true, Collections.emptySet() + true, true, true, true, true, true, true, Collections.emptySet() ); public static final SchemaComparisonConfiguration STRICT = new SchemaComparisonConfiguration( - true, true, true, false, true, true, Collections.emptySet() + true, true, true, false, true, true, true, Collections.emptySet() ); private final boolean compareStringJsonProps; @@ -33,6 +33,7 @@ public class SchemaComparisonConfiguration { private final boolean compareIntToFloatDefaults; private final boolean compareFieldOrder; private final boolean compareFieldLogicalTypes; + private final boolean compareFieldDocs; private final Set jsonPropNamesToIgnore; public SchemaComparisonConfiguration( @@ -41,7 +42,7 @@ public SchemaComparisonConfiguration( boolean compareAliases, boolean compareIntToFloatDefaults, boolean compareFieldOrder, - boolean compareFieldLogicalTypes, + boolean compareFieldLogicalTypes, boolean compareFieldDocs, Set jsonPropNamesToIgnore ) { this.compareStringJsonProps = compareStringJsonProps; @@ -50,6 +51,7 @@ public SchemaComparisonConfiguration( this.compareIntToFloatDefaults = compareIntToFloatDefaults; this.compareFieldOrder = compareFieldOrder; this.compareFieldLogicalTypes = compareFieldLogicalTypes; + this.compareFieldDocs = compareFieldDocs; this.jsonPropNamesToIgnore = jsonPropNamesToIgnore; } @@ -77,6 +79,10 @@ public boolean isCompareFieldLogicalTypes() { return compareFieldLogicalTypes; } + public boolean isCompareFieldDocs() { + return compareFieldDocs; + } + public Set getJsonPropNamesToIgnore() { return jsonPropNamesToIgnore; } @@ -89,6 +95,7 @@ public SchemaComparisonConfiguration compareStringJsonProps(boolean compare) { compareIntToFloatDefaults, compareFieldOrder, compareFieldLogicalTypes, + compareFieldDocs, jsonPropNamesToIgnore ); } @@ -101,6 +108,7 @@ public SchemaComparisonConfiguration compareNonStringJsonProps(boolean compare) compareIntToFloatDefaults, compareFieldOrder, compareFieldLogicalTypes, + compareFieldDocs, jsonPropNamesToIgnore ); } @@ -113,6 +121,7 @@ public SchemaComparisonConfiguration compareAliases(boolean compare) { compareIntToFloatDefaults, compareFieldOrder, compareFieldLogicalTypes, + compareFieldDocs, jsonPropNamesToIgnore ); } @@ -125,6 +134,7 @@ public SchemaComparisonConfiguration compareIntToFloatDefaults(boolean compare) compare, compareFieldOrder, compareFieldLogicalTypes, + compareFieldDocs, jsonPropNamesToIgnore ); } @@ -137,6 +147,7 @@ public SchemaComparisonConfiguration compareFieldOrder(boolean compare) { compareIntToFloatDefaults, compare, compareFieldLogicalTypes, + compareFieldDocs, jsonPropNamesToIgnore ); } @@ -149,6 +160,7 @@ public SchemaComparisonConfiguration compareFieldLogicalTypes(boolean compare) { compareIntToFloatDefaults, compareFieldOrder, compare, + compareFieldDocs, jsonPropNamesToIgnore ); } @@ -161,6 +173,7 @@ public SchemaComparisonConfiguration jsonPropNamesToIgnore(Set jsonPropN compareIntToFloatDefaults, compareFieldOrder, compareFieldLogicalTypes, + compareFieldDocs, jsonPropNamesToIgnore ); } diff --git a/helper/helper/src/main/java/com/linkedin/avroutil1/compatibility/ConfigurableSchemaComparator.java b/helper/helper/src/main/java/com/linkedin/avroutil1/compatibility/ConfigurableSchemaComparator.java index 23aa7b74a..09b88d45f 100644 --- a/helper/helper/src/main/java/com/linkedin/avroutil1/compatibility/ConfigurableSchemaComparator.java +++ b/helper/helper/src/main/java/com/linkedin/avroutil1/compatibility/ConfigurableSchemaComparator.java @@ -52,6 +52,7 @@ private static boolean equals(Schema a, Schema b, SchemaComparisonConfiguration boolean considerJsonNonStringProps = config.isCompareNonStringJsonProps(); boolean considerAliases = config.isCompareAliases(); boolean considerJsonProps = considerJsonStringProps || considerJsonNonStringProps; + boolean considerDocs = config.isCompareFieldDocs(); Set jsonPropNamesToIgnore = config.getJsonPropNamesToIgnore(); if (considerJsonProps && !hasSameObjectProps(a, b, considerJsonStringProps, considerJsonNonStringProps, @@ -59,6 +60,10 @@ private static boolean equals(Schema a, Schema b, SchemaComparisonConfiguration return false; } + if (considerDocs && !Objects.equals(a.getDoc(), b.getDoc())) { + return false; + } + switch (type) { //all of these have nothing more to compare by beyond their type and props case NULL: @@ -125,6 +130,7 @@ private static boolean recordSchemaEquals(Schema a, Schema b, SchemaComparisonCo boolean considerAliases = config.isCompareAliases(); boolean considerJsonProps = considerJsonStringProps || considerJsonNonStringProps; boolean compareIntToFloatDefaults = config.isCompareIntToFloatDefaults(); + boolean compareDocs = config.isCompareFieldDocs(); Set jsonPropNamesToIgnore = config.getJsonPropNamesToIgnore(); try { @@ -171,6 +177,9 @@ private static boolean recordSchemaEquals(Schema a, Schema b, SchemaComparisonCo if (considerAliases && !hasSameAliases(aField, bField)) { return false; } + if (compareDocs && !aField.doc().equals(bField.doc())) { + return false; + } } return true; } finally { diff --git a/helper/tests/helper-tests-allavro/src/test/java/com/linkedin/avroutil1/compatibility/ConfigurableSchemaComparatorTest.java b/helper/tests/helper-tests-allavro/src/test/java/com/linkedin/avroutil1/compatibility/ConfigurableSchemaComparatorTest.java index 10e3f2a70..2f6270d0f 100644 --- a/helper/tests/helper-tests-allavro/src/test/java/com/linkedin/avroutil1/compatibility/ConfigurableSchemaComparatorTest.java +++ b/helper/tests/helper-tests-allavro/src/test/java/com/linkedin/avroutil1/compatibility/ConfigurableSchemaComparatorTest.java @@ -71,6 +71,7 @@ public void testExceptionOnTryingToCompareNonStringsUnderOldAvro() throws Except true, true, true, + false, Collections.emptySet() ); switch (runtimeAvroVersion) { @@ -393,7 +394,7 @@ public void testDefaultValuesModernAvro() { default: Assert.assertTrue(ConfigurableSchemaComparator.equals(schemaA, schemaB, new SchemaComparisonConfiguration(false, false, true, - SchemaComparisonConfiguration.STRICT.isCompareIntToFloatDefaults(), true, true, + SchemaComparisonConfiguration.STRICT.isCompareIntToFloatDefaults(), true, true, false, Collections.emptySet()))); } diff --git a/parser/src/test/java/com/linkedin/avroutil1/util/ConfigurableAvroSchemaComparatorTest.java b/parser/src/test/java/com/linkedin/avroutil1/util/ConfigurableAvroSchemaComparatorTest.java index 3f6cdd5ac..b62e04af6 100644 --- a/parser/src/test/java/com/linkedin/avroutil1/util/ConfigurableAvroSchemaComparatorTest.java +++ b/parser/src/test/java/com/linkedin/avroutil1/util/ConfigurableAvroSchemaComparatorTest.java @@ -57,7 +57,7 @@ public void testEquals(String path1, String path2, boolean expectedResult) throw AvroRecordSchema recordSchema2 = (AvroRecordSchema) validateAndGetAvroRecordSchema(path2); SchemaComparisonConfiguration comparisonConfiguration = - new SchemaComparisonConfiguration(true, false, false, false, true, false, new HashSet( + new SchemaComparisonConfiguration(true, false, false, false, true, false, false, new HashSet( Arrays.asList("li.data.proto.numberFieldType", "li.data.proto.fieldNumber", "li.data.proto.fullyQualifiedName", "li.data.proto.enumValueNumbers")));