All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.flink.table.planner.plan.logical.groupWindows.scala Maven / Gradle / Ivy

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.flink.table.planner.plan.logical

import org.apache.flink.table.expressions._
import org.apache.flink.table.planner.expressions.PlannerWindowReference
import org.apache.flink.table.planner.plan.utils.AggregateUtil.{hasTimeIntervalType, toLong}

import java.time.Duration
import java.util.Objects

/**
 * Logical super class for group windows.
 *
 * @param aliasAttribute window alias
 * @param timeAttribute time field indicating event-time or processing-time
 */
abstract class LogicalWindow(
    val aliasAttribute: PlannerWindowReference,
    val timeAttribute: FieldReferenceExpression) {

  override def equals(o: Any): Boolean = {
    if (o == null || (getClass ne o.getClass)) {
      return false
    }
    val that = o.asInstanceOf[LogicalWindow]
    Objects.equals(aliasAttribute, that.aliasAttribute) &&
      Objects.equals(timeAttribute, that.timeAttribute)
  }

  protected def isValueLiteralExpressionEqual(
      l1: ValueLiteralExpression, l2: ValueLiteralExpression): Boolean = {
    if (l1 == null && l2 == null) {
      true
    } else if (l1 == null || l2 == null) {
      false
    } else {
      if (hasTimeIntervalType(l1)) {
        if (hasTimeIntervalType(l2)) {
          val v1 = l1.getValueAs(classOf[Duration])
          val v2 = l2.getValueAs(classOf[Duration])
          v1.equals(v2) && l1.getOutputDataType.equals(l2.getOutputDataType)
        } else {
          false
        }
      } else {
        val v1 = toLong(l1)
        val v2 = toLong(l2)
        v1 == v2 && l1.getOutputDataType.equals(l2.getOutputDataType)
      }
    }
  }

  override def toString: String = getClass.getSimpleName
}

// ------------------------------------------------------------------------------------------------
// Tumbling group windows
// ------------------------------------------------------------------------------------------------

case class TumblingGroupWindow(
    alias: PlannerWindowReference,
    timeField: FieldReferenceExpression,
    size: ValueLiteralExpression)
  extends LogicalWindow(
    alias,
    timeField) {

  override def equals(o: Any): Boolean = {
    if (super.equals(o)) {
      isValueLiteralExpressionEqual(size, o.asInstanceOf[TumblingGroupWindow].size)
    } else {
      false
    }
  }

  override def toString: String = s"TumblingGroupWindow($alias, $timeField, $size)"
}

// ------------------------------------------------------------------------------------------------
// Sliding group windows
// ------------------------------------------------------------------------------------------------

case class SlidingGroupWindow(
    alias: PlannerWindowReference,
    timeField: FieldReferenceExpression,
    size: ValueLiteralExpression,
    slide: ValueLiteralExpression)
  extends LogicalWindow(
    alias,
    timeField) {

  override def equals(o: Any): Boolean = {
    if (super.equals(o)) {
      isValueLiteralExpressionEqual(size, o.asInstanceOf[SlidingGroupWindow].size) &&
        isValueLiteralExpressionEqual(slide, o.asInstanceOf[SlidingGroupWindow].slide)
    } else {
      false
    }
  }

  override def toString: String = s"SlidingGroupWindow($alias, $timeField, $size, $slide)"
}

// ------------------------------------------------------------------------------------------------
// Session group windows
// ------------------------------------------------------------------------------------------------

case class SessionGroupWindow(
    alias: PlannerWindowReference,
    timeField: FieldReferenceExpression,
    gap: ValueLiteralExpression)
  extends LogicalWindow(
    alias,
    timeField) {

  override def equals(o: Any): Boolean = {
    if (super.equals(o)) {
      isValueLiteralExpressionEqual(gap, o.asInstanceOf[SessionGroupWindow].gap)
    } else {
      false
    }
  }

  override def toString: String = s"SessionGroupWindow($alias, $timeField, $gap)"
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy