You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@beam.apache.org by "Neville Li (Jira)" <ji...@apache.org> on 2019/10/07 20:06:00 UTC

[jira] [Created] (BEAM-8364) SchemaCoder inconsistent equality behavior for POJO

Neville Li created BEAM-8364:
--------------------------------

             Summary: 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


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)