Github user fhueske commented on a diff in the pull request:
https://github.com/apache/flink/pull/3715#discussion_r125457951
--- Diff:
flink-libraries/flink-table/src/main/scala/org/apache/flink/table/runtime/join/WindowJoinUtil.scala
---
@@ -210,77 +187,71 @@ object JoinUtil {
case _ => Seq()
}
case c: RexCall =>
- c.operands.map(analyzeSingleConditionTerm(_, leftFieldCount,
inputType)).reduce(_++_)
+ c.operands.map(extractTimeIndicatorAccesses(_, leftFieldCount,
inputType)).reduce(_++_)
case _ => Seq()
}
}
/**
- * Extract time offset and determain which table the offset belong to
+ * Extract time offset and determain it's the lower bound of left
stream or the upper bound
+ *
+ * @return window boundary, is left lower bound
*/
def extractTimeOffsetFromCondition(
timeTerm: RexNode,
isLeftExprBelongLeftTable: Boolean,
rexBuilder: RexBuilder,
- config: TableConfig) = {
+ config: TableConfig): (Long, Boolean) = {
val timeCall: RexCall = timeTerm.asInstanceOf[RexCall]
- val leftLiteral =
- reduceTimeExpression(
- timeCall.operands.get(0),
- rexBuilder,
- config)
- val rightLiteral =
- reduceTimeExpression(
- timeCall.operands.get(1),
- rexBuilder,
- config)
-
- val (tmpTimeOffset: Long, isLeftTableTimeOffset: Boolean) =
+ val isLeftLowerBound: Boolean =
timeTerm.getKind match {
- // e.g a.proctime > b.proctime - 5 sec, we need to store stream a.
- // the left expr(a) belong to left table, so the offset belong to
left table
+ // e.g a.proctime > b.proctime - 5 sec, then it's the lower bound
of a and the value is -5
+ // e.g b.proctime > a.proctime - 5 sec, then it's not the lower
bound of a but upper bound
case kind @ (SqlKind.GREATER_THAN | SqlKind.GREATER_THAN_OR_EQUAL)
=>
- (rightLiteral - leftLiteral, isLeftExprBelongLeftTable)
- // e.g a.proctime < b.proctime + 5 sec, we need to store stream b.
+ isLeftExprBelongLeftTable
+ // e.g a.proctime < b.proctime + 5 sec, the the upper bound of a
is 5
case kind @ (SqlKind.LESS_THAN | SqlKind.LESS_THAN_OR_EQUAL) =>
- (leftLiteral - rightLiteral, !isLeftExprBelongLeftTable)
- case _ => 0
+ !isLeftExprBelongLeftTable
+ case _ =>
+ throw new TableException("Unsupport time-condition.")
}
- val timeOffset =
- // only preceding offset need to store records
- if (tmpTimeOffset < 0)
- // determain the boudary value
+ val (leftLiteral, rightLiteral) =
+ reduceTimeExpression(
+ timeCall.operands.get(0),
+ timeCall.operands.get(1),
+ rexBuilder,
+ config)
+ val tmpTimeOffset: Long =
+ if (isLeftExprBelongLeftTable) rightLiteral - leftLiteral else
leftLiteral - rightLiteral
+
+ val boundary =
+ tmpTimeOffset.signum * (
if (timeTerm.getKind == SqlKind.LESS_THAN || timeTerm.getKind ==
SqlKind.GREATER_THAN) {
- -tmpTimeOffset - 1
+ tmpTimeOffset.abs - 1
} else {
- -tmpTimeOffset
- }
- else 0
+ tmpTimeOffset.abs
+ })
- (timeOffset, isLeftTableTimeOffset)
+ (boundary, isLeftLowerBound)
}
/**
* Calcute the time boundary. Replace the rowtime/proctime with zero
literal.
* For example:
- * a.proctime - inteval '1' second > b.proctime - interval '1' second
- interval '2' second
- * |-----------left--------------|
|-------------------right---------------------------\
- * then the boundary of a is right - left:
- * ((0 - 1000) - 2000) - (0 - 1000) = -2000(-preceding, +following)
+ * b.proctime - interval '1' second - interval '2' second will be
translate to
--- End diff --
will be translate -> will be translated
---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---