Neville Li created BEAM-8364: -------------------------------- Summary: SchemaCoder inconsistent equality behavior for POJO Key: BEAM-8364 URL: https://issues.apache.org/jira/browse/BEAM-8364 Project: Beam Issue Type: Bug Components: dsl-sql Affects Versions: 2.16.0 Reporter: Neville Li
One can create a {{SchemaCoder}} for arbitrary type {{T}} with {{SchemaCoder.of(schema, toRowFunction, fromRowFunction)}}. However, in cases where {{T}} lacks proper equality behavior, i.e. POJO, the result coder still returns true for {{consistentWithEquals}} and {{structuralValue}}s that fail equality check. This test reproduces the issue. {code:java} import org.apache.beam.sdk.schemas.Schema; import org.apache.beam.sdk.schemas.SchemaCoder; import org.apache.beam.sdk.values.Row; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.nio.charset.Charset; import static org.junit.Assert.*; @RunWith(JUnit4.class) public class SchemaCoderTest { public static class Pojo { private final byte[] bytes; private final String id; public Pojo(byte[] bytes, String id) { this.bytes = bytes; this.id = id; } public byte[] getBytes() { return bytes; } public String getId() { return id; } } @Test public void testCoder() { Schema schema = Schema.builder().addByteArrayField("bytes").addStringField("id").build(); SchemaCoder<Pojo> coder = SchemaCoder.<Pojo>of( schema, t -> Row.withSchema(schema).addValues(t.getBytes(), t.getId()).build(), r -> new Pojo(r.getBytes("bytes"), r.getString("id"))); Pojo p1 = new Pojo("hello".getBytes(Charset.forName("UTF-8")), "world"); Pojo p2 = new Pojo("hello".getBytes(Charset.forName("UTF-8")), "world"); assertNotEquals(p1, p2); // EXPECTED, p1.equals(p2) == false assertFalse(coder.consistentWithEquals()); // FAIL, returns true assertEquals(coder.structuralValue(p1), coder.structuralValue(p2)); // FAIL } } {code} -- This message was sent by Atlassian Jira (v8.3.4#803005)