[jira] [Closed] (FLINK-9742) Expose Expression.resultType to public

2018-07-05 Thread Fabian Hueske (JIRA)


 [ 
https://issues.apache.org/jira/browse/FLINK-9742?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Fabian Hueske closed FLINK-9742.

   Resolution: Fixed
Fix Version/s: 1.6.0

Fixed for 1.6.0 with 5cb080cd785658fcb817a00f51e12d6fcbc78b33

> Expose Expression.resultType to public
> --
>
> Key: FLINK-9742
> URL: https://issues.apache.org/jira/browse/FLINK-9742
> Project: Flink
>  Issue Type: Improvement
>  Components: Table API  SQL
>Affects Versions: 1.5.0
>Reporter: Jungtaek Lim
>Assignee: Jungtaek Lim
>Priority: Major
>  Labels: pull-request-available
> Fix For: 1.6.0
>
>
> I have use case of TableSource which requires custom implementation of 
> TimestampExtractor. To ensure new TimestampExtractor to cover more general 
> use cases, accessing Expression.resultType is necessary, but its scope is now 
> defined as package private for "org.apache.flink".
> Below is the implementation of custom TimestampExtractor which leverages 
> Expression.resultType, hence had to place it to org.apache.flink package 
> (looks like a hack).
> {code:java}
> class IsoDateStringAwareExistingField(val field: String) extends 
> TimestampExtractor {
>   override def getArgumentFields: Array[String] = Array(field)
>   override def validateArgumentFields(argumentFieldTypes: 
> Array[TypeInformation[_]]): Unit = {
> val fieldType = argumentFieldTypes(0)
> fieldType match {
>   case Types.LONG => // OK
>   case Types.SQL_TIMESTAMP => // OK
>   case Types.STRING => // OK
>   case _: TypeInformation[_] =>
> throw ValidationException(
>   s"Field '$field' must be of type Long or Timestamp or String but is 
> of type $fieldType.")
> }
>   }
>   override def getExpression(fieldAccesses: Array[ResolvedFieldReference]): 
> Expression = {
> val fieldAccess: Expression = fieldAccesses(0)
> fieldAccess.resultType match {
>   case Types.LONG =>
> // access LONG field
> fieldAccess
>   case Types.SQL_TIMESTAMP =>
> // cast timestamp to long
> Cast(fieldAccess, Types.LONG)
>   case Types.STRING =>
> Cast(Cast(fieldAccess, SqlTimeTypeInfo.TIMESTAMP), Types.LONG)
> }
>   }
> }{code}
> It would be better to just make Expression.resultType public to cover other 
> cases as well. (I'm not sure other methods would be also better to be public 
> as well.)



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)


[jira] [Closed] (FLINK-9742) Expose Expression.resultType to public

2018-07-05 Thread Fabian Hueske (JIRA)


 [ 
https://issues.apache.org/jira/browse/FLINK-9742?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Fabian Hueske closed FLINK-9742.

Resolution: Fixed

> Expose Expression.resultType to public
> --
>
> Key: FLINK-9742
> URL: https://issues.apache.org/jira/browse/FLINK-9742
> Project: Flink
>  Issue Type: Improvement
>  Components: Table API  SQL
>Affects Versions: 1.5.0
>Reporter: Jungtaek Lim
>Priority: Major
>  Labels: pull-request-available
>
> I have use case of TableSource which requires custom implementation of 
> TimestampExtractor. To ensure new TimestampExtractor to cover more general 
> use cases, accessing Expression.resultType is necessary, but its scope is now 
> defined as package private for "org.apache.flink".
> Below is the implementation of custom TimestampExtractor which leverages 
> Expression.resultType, hence had to place it to org.apache.flink package 
> (looks like a hack).
> {code:java}
> class IsoDateStringAwareExistingField(val field: String) extends 
> TimestampExtractor {
>   override def getArgumentFields: Array[String] = Array(field)
>   override def validateArgumentFields(argumentFieldTypes: 
> Array[TypeInformation[_]]): Unit = {
> val fieldType = argumentFieldTypes(0)
> fieldType match {
>   case Types.LONG => // OK
>   case Types.SQL_TIMESTAMP => // OK
>   case Types.STRING => // OK
>   case _: TypeInformation[_] =>
> throw ValidationException(
>   s"Field '$field' must be of type Long or Timestamp or String but is 
> of type $fieldType.")
> }
>   }
>   override def getExpression(fieldAccesses: Array[ResolvedFieldReference]): 
> Expression = {
> val fieldAccess: Expression = fieldAccesses(0)
> fieldAccess.resultType match {
>   case Types.LONG =>
> // access LONG field
> fieldAccess
>   case Types.SQL_TIMESTAMP =>
> // cast timestamp to long
> Cast(fieldAccess, Types.LONG)
>   case Types.STRING =>
> Cast(Cast(fieldAccess, SqlTimeTypeInfo.TIMESTAMP), Types.LONG)
> }
>   }
> }{code}
> It would be better to just make Expression.resultType public to cover other 
> cases as well. (I'm not sure other methods would be also better to be public 
> as well.)



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)