Repository: nifi Updated Branches: refs/heads/master 5cf58b42e -> a9045d54a
NIFI-5800: Do not recursively call hashCode on child schema for Record Field Types Signed-off-by: Pierre Villard <pierre.villard...@gmail.com> This closes #3157. Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/a9045d54 Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/a9045d54 Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/a9045d54 Branch: refs/heads/master Commit: a9045d54a143dac984c545d0f14627e4151af713 Parents: 5cf58b4 Author: Mark Payne <marka...@hotmail.com> Authored: Wed Nov 7 17:00:51 2018 -0500 Committer: Pierre Villard <pierre.villard...@gmail.com> Committed: Thu Nov 8 09:36:47 2018 +0100 ---------------------------------------------------------------------- .../nifi/serialization/SimpleRecordSchema.java | 8 +++++- .../record/type/RecordDataType.java | 2 +- .../serialization/TestSimpleRecordSchema.java | 30 +++++++++++++++++--- 3 files changed, 34 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/a9045d54/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/SimpleRecordSchema.java ---------------------------------------------------------------------- diff --git a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/SimpleRecordSchema.java b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/SimpleRecordSchema.java index ba507e9..7f78448 100644 --- a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/SimpleRecordSchema.java +++ b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/SimpleRecordSchema.java @@ -40,6 +40,7 @@ public class SimpleRecordSchema implements RecordSchema { private final SchemaIdentifier schemaIdentifier; private String schemaName; private String schemaNamespace; + private volatile int hashCode; public SimpleRecordSchema(final List<RecordField> fields) { this(fields, createText(fields), null, false, SchemaIdentifier.EMPTY); @@ -171,7 +172,12 @@ public class SimpleRecordSchema implements RecordSchema { @Override public int hashCode() { - return 143 + 3 * fields.hashCode(); + int computed = this.hashCode; + if (computed == 0) { + computed = this.hashCode = 143 + 3 * fields.hashCode(); + } + + return computed; } private static String createText(final List<RecordField> fields) { http://git-wip-us.apache.org/repos/asf/nifi/blob/a9045d54/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/type/RecordDataType.java ---------------------------------------------------------------------- diff --git a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/type/RecordDataType.java b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/type/RecordDataType.java index fc6993f..f7e9631 100644 --- a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/type/RecordDataType.java +++ b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/type/RecordDataType.java @@ -42,7 +42,7 @@ public class RecordDataType extends DataType { @Override public int hashCode() { - return 31 + 41 * getFieldType().hashCode() + 41 * (childSchema == null ? 0 : childSchema.hashCode()); + return 31 + 41 * getFieldType().hashCode(); } @Override http://git-wip-us.apache.org/repos/asf/nifi/blob/a9045d54/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/TestSimpleRecordSchema.java ---------------------------------------------------------------------- diff --git a/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/TestSimpleRecordSchema.java b/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/TestSimpleRecordSchema.java index 5a61275..204cb67 100644 --- a/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/TestSimpleRecordSchema.java +++ b/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/TestSimpleRecordSchema.java @@ -17,15 +17,18 @@ package org.apache.nifi.serialization; +import org.apache.nifi.serialization.record.RecordField; +import org.apache.nifi.serialization.record.RecordFieldType; +import org.apache.nifi.serialization.record.SchemaIdentifier; +import org.junit.Assert; +import org.junit.Test; + import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; -import org.apache.nifi.serialization.record.RecordField; -import org.apache.nifi.serialization.record.RecordFieldType; -import org.junit.Assert; -import org.junit.Test; +import static org.junit.Assert.assertTrue; public class TestSimpleRecordSchema { @@ -68,6 +71,25 @@ public class TestSimpleRecordSchema { } } + @Test + public void testHashCodeAndEqualsWithSelfReferencingSchema() { + final SimpleRecordSchema schema = new SimpleRecordSchema(SchemaIdentifier.EMPTY); + + final List<RecordField> personFields = new ArrayList<>(); + personFields.add(new RecordField("name", RecordFieldType.STRING.getDataType())); + personFields.add(new RecordField("sibling", RecordFieldType.RECORD.getRecordDataType(schema))); + + schema.setFields(personFields); + + schema.hashCode(); + assertTrue(schema.equals(schema)); + + final SimpleRecordSchema secondSchema = new SimpleRecordSchema(SchemaIdentifier.EMPTY); + secondSchema.setFields(personFields); + assertTrue(schema.equals(secondSchema)); + assertTrue(secondSchema.equals(schema)); + } + private Set<String> set(final String... values) { final Set<String> set = new HashSet<>(); for (final String value : values) {