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

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

Github user fhueske commented on a diff in the pull request:

    https://github.com/apache/flink/pull/5140#discussion_r159719430
  
    --- Diff: 
flink-libraries/flink-table/src/main/scala/org/apache/flink/table/plan/nodes/datastream/DataStreamWindowJoin.scala
 ---
    @@ -183,23 +190,48 @@ class DataStreamWindowJoin(
         }
       }
     
    -  def createEmptyJoin(
    +  def createNegativeWindowSizeJoin(
    --- End diff --
    
    I think we can make this even more efficient if we implement this as:
    
    ```
    def createNegativeWindowSizeJoin(
        joinType: JoinType,
        leftInput: DataStream[CRow],
        rightInput: DataStream[CRow],
        leftArity: Int,
        rightArity: Int,
        returnType: TypeInformation[CRow]): DataStream[CRow] = {
    
      // we filter all records instead of adding an empty source to preserve 
the watermarks
      val allFilter = new FlatMapFunction[CRow, CRow] with 
ResultTypeQueryable[CRow] {
        override def flatMap(value: CRow, out: Collector[CRow]): Unit = { }
        override def getProducedType: TypeInformation[CRow] = returnType
      }
    
      val leftPadder = new MapFunction[CRow, CRow] with 
ResultTypeQueryable[CRow] {
        val paddingUtil = new OuterJoinPaddingUtil(leftArity, rightArity)
        override def map(value: CRow): CRow = new 
CRow(paddingUtil.padLeft(value.row), true)
        override def getProducedType: TypeInformation[CRow] = returnType
      }
    
      val rightPadder = new MapFunction[CRow, CRow] with 
ResultTypeQueryable[CRow] {
        val paddingUtil = new OuterJoinPaddingUtil(leftArity, rightArity)
        override def map(value: CRow): CRow = new 
CRow(paddingUtil.padRight(value.row), true)
        override def getProducedType: TypeInformation[CRow] = returnType
      }
    
      val leftP = leftInput.getParallelism
      val rightP = rightInput.getParallelism
    
      joinType match {
        case JoinType.INNER =>
          leftInput.flatMap(allFilter).name("Empty Inner 
Join").setParallelism(leftP)
            .union(rightInput.flatMap(allFilter).name("Empty Inner 
Join").setParallelism(rightP))
        case JoinType.LEFT_OUTER =>
          leftInput.map(leftPadder).name("Left Outer 
Join").setParallelism(leftP)
            .union(rightInput.flatMap(allFilter).name("Left Outer 
Join").setParallelism(rightP))
        case JoinType.RIGHT_OUTER =>
          leftInput.flatMap(allFilter).name("Right Outer 
Join").setParallelism(leftP)
            .union(rightInput.map(rightPadder).name("Right Outer 
Join").setParallelism(rightP))
        case JoinType.FULL_OUTER =>
          leftInput.map(leftPadder).name("Full Outer 
Join").setParallelism(leftP)
            .union(rightInput.map(rightPadder).name("Full Outer 
Join").setParallelism(rightP))
      }
    }
    ```
    
    We also need to make `OuterJoinPaddingUtil` extend `java.io.Serializable` 
for this.



> Add support for windowed outer joins for streaming tables
> ---------------------------------------------------------
>
>                 Key: FLINK-7797
>                 URL: https://issues.apache.org/jira/browse/FLINK-7797
>             Project: Flink
>          Issue Type: Sub-task
>          Components: Table API & SQL
>    Affects Versions: 1.4.0
>            Reporter: Fabian Hueske
>            Assignee: Xingcan Cui
>
> Currently, only windowed inner joins for streaming tables are supported.
> This issue is about adding support for windowed LEFT, RIGHT, and FULL OUTER 
> joins.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to