[
https://issues.apache.org/jira/browse/FLINK-9742?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16533542#comment-16533542
]
ASF GitHub Bot commented on FLINK-9742:
---------------------------------------
Github user HeartSaVioR commented on the issue:
https://github.com/apache/flink/pull/6252
@fhueske
Yeah, that would be great. I'm happy to revert the change and introduce new
class.
I'm just not sure where to place and how to name it, since it will be going
to have just one method, `getReturnType(Expression): TypeInformation[_]`.
Would `org.apache.flink.table.api.ExpressionUtil` be OK for new utility
class?
Thanks in advance!
> Widen scope of 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)