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)