You are viewing a plain text version of this content. The canonical link for it is here.
Posted to github@beam.apache.org by GitBox <gi...@apache.org> on 2022/06/04 14:34:48 UTC

[GitHub] [beam] damccorm opened a new issue, #19966: SchemaCoder inconsistent equality behavior for POJO

damccorm opened a new issue, #19966:
URL: https://github.com/apache/beam/issues/19966

   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.
   
   ```
   
   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
   
    }
   }
   
   ```
   
   
   Imported from Jira [BEAM-8364](https://issues.apache.org/jira/browse/BEAM-8364). Original Jira may contain additional context.
   Reported by: sinisa_lyh.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscribe@beam.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org