Repository: arrow Updated Branches: refs/heads/master 2406d4eed -> bf2acf6cb
ARROW-454: pojo.Field doesn't implement hashCode() Author: Julien Le Dem <[email protected]> Closes #423 from julienledem/field_hashcode and squashes the following commits: 192a689 [Julien Le Dem] ARROW-454: pojo.Field doesn't implement hashCode() Project: http://git-wip-us.apache.org/repos/asf/arrow/repo Commit: http://git-wip-us.apache.org/repos/asf/arrow/commit/bf2acf6c Tree: http://git-wip-us.apache.org/repos/asf/arrow/tree/bf2acf6c Diff: http://git-wip-us.apache.org/repos/asf/arrow/diff/bf2acf6c Branch: refs/heads/master Commit: bf2acf6cb22b8d2bf6d0fb98a6117e78e92b81fe Parents: 2406d4e Author: Julien Le Dem <[email protected]> Authored: Wed Mar 22 23:07:05 2017 -0400 Committer: Wes McKinney <[email protected]> Committed: Wed Mar 22 23:07:05 2017 -0400 ---------------------------------------------------------------------- .../src/main/codegen/templates/ArrowType.java | 2 +- .../apache/arrow/vector/types/pojo/Field.java | 29 +++++++++++--------- .../arrow/vector/types/pojo/TestSchema.java | 22 +++++++++++++++ 3 files changed, 39 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/arrow/blob/bf2acf6c/java/vector/src/main/codegen/templates/ArrowType.java ---------------------------------------------------------------------- diff --git a/java/vector/src/main/codegen/templates/ArrowType.java b/java/vector/src/main/codegen/templates/ArrowType.java index 85ea389..91cbe98 100644 --- a/java/vector/src/main/codegen/templates/ArrowType.java +++ b/java/vector/src/main/codegen/templates/ArrowType.java @@ -164,7 +164,7 @@ public abstract class ArrowType { @Override public int hashCode() { - return Objects.hash(<#list type.fields as field>${field.name}<#if field_has_next>, </#if></#list>); + return java.util.Arrays.deepHashCode(new Object[] {<#list type.fields as field>${field.name}<#if field_has_next>, </#if></#list>}); } @Override http://git-wip-us.apache.org/repos/asf/arrow/blob/bf2acf6c/java/vector/src/main/java/org/apache/arrow/vector/types/pojo/Field.java ---------------------------------------------------------------------- diff --git a/java/vector/src/main/java/org/apache/arrow/vector/types/pojo/Field.java b/java/vector/src/main/java/org/apache/arrow/vector/types/pojo/Field.java index bbbd559..c310b90 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/types/pojo/Field.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/types/pojo/Field.java @@ -24,14 +24,6 @@ import static org.apache.arrow.vector.types.pojo.ArrowType.getTypeForField; import java.util.List; import java.util.Objects; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableList; -import com.google.flatbuffers.FlatBufferBuilder; - import org.apache.arrow.memory.BufferAllocator; import org.apache.arrow.vector.FieldVector; import org.apache.arrow.vector.schema.TypeLayout; @@ -40,6 +32,14 @@ import org.apache.arrow.vector.types.Types; import org.apache.arrow.vector.types.Types.MinorType; import org.apache.arrow.vector.types.pojo.ArrowType.Int; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.base.Joiner; +import com.google.common.collect.ImmutableList; +import com.google.flatbuffers.FlatBufferBuilder; + public class Field { private final String name; private final boolean nullable; @@ -177,18 +177,21 @@ public class Field { } @Override + public int hashCode() { + return Objects.hash(name, nullable, type, dictionary, children); + } + + @Override public boolean equals(Object obj) { if (!(obj instanceof Field)) { return false; } Field that = (Field) obj; return Objects.equals(this.name, that.name) && - Objects.equals(this.nullable, that.nullable) && - Objects.equals(this.type, that.type) && + Objects.equals(this.nullable, that.nullable) && + Objects.equals(this.type, that.type) && Objects.equals(this.dictionary, that.dictionary) && - (Objects.equals(this.children, that.children) || - (this.children == null || this.children.size() == 0) && - (that.children == null || that.children.size() == 0)); + Objects.equals(this.children, that.children); } @Override http://git-wip-us.apache.org/repos/asf/arrow/blob/bf2acf6c/java/vector/src/test/java/org/apache/arrow/vector/types/pojo/TestSchema.java ---------------------------------------------------------------------- diff --git a/java/vector/src/test/java/org/apache/arrow/vector/types/pojo/TestSchema.java b/java/vector/src/test/java/org/apache/arrow/vector/types/pojo/TestSchema.java index 5b74c54..a7d1cce 100644 --- a/java/vector/src/test/java/org/apache/arrow/vector/types/pojo/TestSchema.java +++ b/java/vector/src/test/java/org/apache/arrow/vector/types/pojo/TestSchema.java @@ -22,6 +22,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.IOException; +import java.util.List; import org.apache.arrow.vector.types.FloatingPointPrecision; import org.apache.arrow.vector.types.IntervalUnit; @@ -125,6 +126,27 @@ public class TestSchema { Schema actual = Schema.fromJSON(json); assertEquals(schema.toJson(), actual.toJson()); assertEquals(schema, actual); + validateFieldsHashcode(schema.getFields(), actual.getFields()); + assertEquals(schema.hashCode(), actual.hashCode()); + } + + private void validateFieldsHashcode(List<Field> schemaFields, List<Field> actualFields) { + assertEquals(schemaFields.size(), actualFields.size()); + if (schemaFields.size() == 0) { + return; + } + for (int i = 0; i < schemaFields.size(); i++) { + Field schemaField = schemaFields.get(i); + Field actualField = actualFields.get(i); + validateFieldsHashcode(schemaField.getChildren(), actualField.getChildren()); + validateHashCode(schemaField.getType(), actualField.getType()); + validateHashCode(schemaField, actualField); + } + } + + private void validateHashCode(Object o1, Object o2) { + assertEquals(o1, o2); + assertEquals(o1 + " == " + o2, o1.hashCode(), o2.hashCode()); } private void contains(Schema schema, String... s) throws IOException {
