RowWithGetters is used as an internal detail in Beam, so it special cases internal Beam-provided logical types. If we want it to work well with user logical types, we might need to redesign it a bit.
On Mon, Mar 1, 2021 at 10:44 AM Steve Niemitz <sniem...@apache.org> wrote: > I'm working on a little library to wrap domain objects into Rows (using > RowWithGetters) and am trying to implement a new LogicalType. I'm > struggling to understand how it's supposed to interact with RowWithGetters > however. > > Let's say that my LogicalType has a java type of MyLogicalType.Value, and > base type of byte[]. This means my I have something like: > > class MyLogicalType extends Schema.LogicalType<MyLogicalType.Value, byte[]> > > Importantly here, I need to implement a toInputType function that takes a > byte[] and returns MyLogicalType.Value. > > What I'm trying to figure out is, if I construct a RowWithGetters, it > seems like my getter for the logical type field needs to first convert from > my domain value to a byte[], which will next be converted from a byte[] -> > MyLogicalType.Value (in toInputType), and then (in the context of the > SchemaCoder), be one more time converted from MyLogicalType.Value -> byte[] > (in toBaseType). This seems like there's an extra round trip in here that > there shouldn't be. For reference, the first part takes place in > RowWithGetters.getValue [1] > > More confusingly, OneOfType seems to be special cased to NOT do that, and > instead expects the getter to directly return a OneOfType.Value. If it > followed the generic case, I would expect the getter to return a Row here > instead. > > Any thoughts on this? > > [1] > https://github.com/apache/beam/blob/b853f9c7aa3662eb707290ded4c22f86befeda68/sdks/java/core/src/main/java/org/apache/beam/sdk/values/RowWithGetters.java#L140 >