[ https://issues.apache.org/jira/browse/BEAM-8364?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Kenneth Knowles updated BEAM-8364: ---------------------------------- Status: Open (was: Triage Needed) > 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 > Assignee: Brian Hulette > Priority: Minor > > 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)