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)