[ 
https://issues.apache.org/jira/browse/BEAM-8364?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17121858#comment-17121858
 ] 

Kenneth Knowles commented on BEAM-8364:
---------------------------------------

This issue is assigned but has not received an update in 30 days so it has been 
labeled "stale-assigned". If you are still working on the issue, please give an 
update and remove the label. If you are no longer working on the issue, please 
unassign so someone else may work on it. In 7 days the issue will be 
automatically unassigned.

> 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, sdk-java-core
>    Affects Versions: 2.16.0
>            Reporter: Neville Li
>            Assignee: Brian Hulette
>            Priority: P3
>              Labels: stale-assigned
>
> 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)

Reply via email to