def getFilterTemporal()

in spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacUtils.scala [294:337]


  def getFilterTemporal(filter: TemporalFilter): String = {
    val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")

    def formatDateTime(dateTime: LocalDateTime): String = {
      if (dateTime == null) ".." else dateTime.format(formatter)
    }

    def calculateUnionTemporal(filter: TemporalFilter): (LocalDateTime, LocalDateTime) = {
      filter match {
        case TemporalFilter.AndFilter(left, right) =>
          val (leftStart, leftEnd) = calculateUnionTemporal(left)
          val (rightStart, rightEnd) = calculateUnionTemporal(right)
          val start =
            if (leftStart == null || (rightStart != null && rightStart.isBefore(leftStart)))
              rightStart
            else leftStart
          val end =
            if (leftEnd == null || (rightEnd != null && rightEnd.isAfter(leftEnd))) rightEnd
            else leftEnd
          (start, end)
        case TemporalFilter.OrFilter(left, right) =>
          val (leftStart, leftEnd) = calculateUnionTemporal(left)
          val (rightStart, rightEnd) = calculateUnionTemporal(right)
          val start =
            if (leftStart == null || (rightStart != null && rightStart.isBefore(leftStart)))
              rightStart
            else leftStart
          val end =
            if (leftEnd == null || (rightEnd != null && rightEnd.isAfter(leftEnd))) rightEnd
            else leftEnd
          (start, end)
        case TemporalFilter.LessThanFilter(_, value) =>
          (null, value)
        case TemporalFilter.GreaterThanFilter(_, value) =>
          (value, null)
        case TemporalFilter.EqualFilter(_, value) =>
          (value, value)
      }
    }

    val (start, end) = calculateUnionTemporal(filter)
    if (end == null) s"datetime=${formatDateTime(start)}/.."
    else s"datetime=${formatDateTime(start)}/${formatDateTime(end)}"
  }