You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@beam.apache.org by "Kenneth Knowles (Jira)" <ji...@apache.org> on 2019/10/10 17:05:00 UTC
[jira] [Assigned] (BEAM-8364) SchemaCoder inconsistent equality
behavior for POJO
[ https://issues.apache.org/jira/browse/BEAM-8364?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Kenneth Knowles reassigned BEAM-8364:
-------------------------------------
Assignee: Brian Hulette
> 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)