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) {

Reply via email to