apache / apache/beam

SchemaCoder inconsistent equality behavior for POJO

Open
#19,966 0 comments 0 reactions 0 assignees View on GitHub
bug core dsl java P3 sql
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.