[ 
https://issues.apache.org/jira/browse/FLINK-9742?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16532793#comment-16532793
 ] 

ASF GitHub Bot commented on FLINK-9742:
---------------------------------------

GitHub user HeartSaVioR opened a pull request:

    https://github.com/apache/flink/pull/6252

    [FLINK-9742][Table API & SQL] Widen scope of Expression.resultType to 
'public'

    ## What is the purpose of the change
    
    This patch proposes widen scope of Expression.resultType to 'public', to 
enable custom TimestampExtractor outside of Flink acessing 
Expression.resultType.
    
    There is some use cases of TableSource which requires custom implementation 
of TimestampExtractor, and 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". It would be better to 
just make Expression.resultType public to cover other cases as well.
    
    Please refer https://issues.apache.org/jira/browse/FLINK-9742 for more 
details. 
    
    ## Brief change log
    
    * widen scope of Expression.resultType to 'public'
    * also change the scope of resultType from all subclasses 
    
    ## Verifying this change
    
    This change is a trivial rework / code cleanup without any test coverage.
    
    ## Does this pull request potentially affect one of the following parts:
    
      - Dependencies (does it add or upgrade a dependency): (no)
      - The public API, i.e., is any changed class annotated with 
`@Public(Evolving)`: (no)
      - The serializers: no
      - The runtime per-record code paths (performance sensitive): (no)
      - Anything that affects deployment or recovery: JobManager (and its 
components), Checkpointing, Yarn/Mesos, ZooKeeper: (no)
      - The S3 file system connector: (no)
    
    ## Documentation
    
      - Does this pull request introduce a new feature? (no)
      - If yes, how is the feature documented? (not applicable)


You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/HeartSaVioR/flink FLINK-9742

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/flink/pull/6252.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #6252
    
----
commit abb3c965febb5c5b4110b68c59b509fcf9747d38
Author: Jungtaek Lim <kabhwan@...>
Date:   2018-07-04T13:51:45Z

    FLINK-9742 Widen scope of Expression.resultType to 'public'
    
    Widen scope of Expression.resultType to 'public', to enable custom 
TimestampExtractor
    outside of Flink acessing Expression.resultType.

----


> 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 &amp; 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)

Reply via email to