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)}"
}