[
https://issues.apache.org/jira/browse/FLINK-14380?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Elliot Pourmand updated FLINK-14380:
------------------------------------
Description:
When deciding if a class conforms to POJO using the type extractor Flink checks
that the class implements a setter and getter method. For the setter method
Flink makes the assertion that the return type is `Void`. This is an issue if
using a case class as often the return type of a case class setter is a copy of
the objects class. Consider the following case class:
{code:scala}
case class SomeClass(x: Int) {
x_=(newX: Int): SomeClass = { this.copy(x = newX) }
}
{code}
This class will be identified as not being valid POJO although getter
(generated) and setter methods are provided because the return type of the
setter is not void.
This issue discourages immutabilaty and makes the usage of case classes not
possible without falling back to Kryo Serializer.
The issue is located in
https://github.com/apache/flink/blob/master/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java
on line 1806. Here is a permalink to the line
https://github.com/apache/flink/blob/80b27a150026b7b5cb707bd9fa3e17f565bb8112/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java#L1806
A copy of the if check is here
{code:scala}
if((methodNameLow.equals("set"+fieldNameLow) ||
methodNameLow.equals(fieldNameLow+"_$eq")) &&
m.getParameterTypes().length == 1 && //
one parameter of the field's type
(m.getGenericParameterTypes()[0].equals( fieldType ) || (fieldTypeWrapper !=
null && m.getParameterTypes()[0].equals( fieldTypeWrapper )) ||
(fieldTypeGeneric != null &&
m.getGenericParameterTypes()[0].equals(fieldTypeGeneric) ) )&&
// return type is void.
m.getReturnType().equals(Void.TYPE)
) {
hasSetter = true;
}
}
{code}
I believe the `m.getReturnType().equals(Void.TYPE)` should be modified to
`m.getReturnType().equals(Void.TYPE) || m.getReturnType().equals(class.Type)`
This will allow for case class setters which return copies of the object
enabling to use case classes.
was:
When deciding if a class conforms to POJO using the type extractor Flink checks
that the class implements a setter and getter method. For the setter method
Flink makes the assertion that the return type is `Void`. This is an issue if
using a case class as often the return type of a case class setter is a copy of
the objects class. Consider the following case class:
{code:scala}
case class SomeClass(x: Int) {
x_=(newX: Int): SomeClass = { this.copy(x = newX) }
}
{code}
This class will be identified as not being valid POJO although getter
(generated) and setter methods are provided because the return type of the
setter is not void.
This issue discourages immutabilaty and makes the usage of case classes not
possible without falling back to Kryo Serializer.
The issue is located in
https://github.com/apache/flink/blob/master/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java
on line 1806. Here is a permalink to the line
https://github.com/apache/flink/blob/80b27a150026b7b5cb707bd9fa3e17f565bb8112/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java#L1806
A copy of the if check is here
```
if((methodNameLow.equals("set"+fieldNameLow) ||
methodNameLow.equals(fieldNameLow+"_$eq")) &&
m.getParameterTypes().length == 1 && //
one parameter of the field's type
(m.getGenericParameterTypes()[0].equals( fieldType ) || (fieldTypeWrapper !=
null && m.getParameterTypes()[0].equals( fieldTypeWrapper )) ||
(fieldTypeGeneric != null &&
m.getGenericParameterTypes()[0].equals(fieldTypeGeneric) ) )&&
// return type is void.
m.getReturnType().equals(Void.TYPE)
) {
hasSetter = true;
}
}
```
I believe the `m.getReturnType().equals(Void.TYPE)` should be modified to
`m.getReturnType().equals(Void.TYPE) || m.getReturnType().equals(class.Type)`
This will allow for case class setters which return copies of the object
enabling to use case classes.
> Type Extractor POJO setter check does not allow for Immutable Case Class
> ------------------------------------------------------------------------
>
> Key: FLINK-14380
> URL: https://issues.apache.org/jira/browse/FLINK-14380
> Project: Flink
> Issue Type: Bug
> Components: API / Scala
> Affects Versions: 1.8.2, 1.9.0
> Environment: Not relavent
>
> Reporter: Elliot Pourmand
> Priority: Major
>
> When deciding if a class conforms to POJO using the type extractor Flink
> checks that the class implements a setter and getter method. For the setter
> method Flink makes the assertion that the return type is `Void`. This is an
> issue if using a case class as often the return type of a case class setter
> is a copy of the objects class. Consider the following case class:
> {code:scala}
> case class SomeClass(x: Int) {
> x_=(newX: Int): SomeClass = { this.copy(x = newX) }
> }
> {code}
> This class will be identified as not being valid POJO although getter
> (generated) and setter methods are provided because the return type of the
> setter is not void.
> This issue discourages immutabilaty and makes the usage of case classes not
> possible without falling back to Kryo Serializer.
> The issue is located in
> https://github.com/apache/flink/blob/master/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java
> on line 1806. Here is a permalink to the line
> https://github.com/apache/flink/blob/80b27a150026b7b5cb707bd9fa3e17f565bb8112/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java#L1806
> A copy of the if check is here
> {code:scala}
> if((methodNameLow.equals("set"+fieldNameLow) ||
> methodNameLow.equals(fieldNameLow+"_$eq")) &&
> m.getParameterTypes().length == 1 && //
> one parameter of the field's type
>
> (m.getGenericParameterTypes()[0].equals( fieldType ) || (fieldTypeWrapper !=
> null && m.getParameterTypes()[0].equals( fieldTypeWrapper )) ||
> (fieldTypeGeneric != null &&
> m.getGenericParameterTypes()[0].equals(fieldTypeGeneric) ) )&&
> // return type is void.
> m.getReturnType().equals(Void.TYPE)
> ) {
> hasSetter = true;
> }
> }
> {code}
> I believe the `m.getReturnType().equals(Void.TYPE)` should be modified to
> `m.getReturnType().equals(Void.TYPE) || m.getReturnType().equals(class.Type)`
> This will allow for case class setters which return copies of the object
> enabling to use case classes.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)