SchemaCoder inconsistent equality behavior for POJO
- Dominant language
- Java
- Stars
- 8.7k
- Forks
- 4.7k
- Avg merge
- 1d 20h
- Merged PRs (30d)
- 196
Description
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 coder = SchemaCoder.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.
Contributor guide
Assessment
This issue has not been assessed yet.