1
0
mirror of synced 2025-12-19 18:14:56 -05:00

Use the AirbyteValueCoercer date and time formatter everywhere (#61573)

This commit is contained in:
Francis Genet
2025-06-13 12:34:47 -07:00
committed by GitHub
parent 2bf99521b1
commit c13af59a4a
6 changed files with 20 additions and 54 deletions

View File

@@ -157,11 +157,9 @@ object AirbyteValueCoercer {
private fun offsetDateTime(it: StringValue): OffsetDateTime {
val odt =
try {
ZonedDateTime.parse(it.value, AirbyteValueDeepCoercingMapper.DATE_TIME_FORMATTER)
.toOffsetDateTime()
ZonedDateTime.parse(it.value, DATE_TIME_FORMATTER).toOffsetDateTime()
} catch (e: Exception) {
LocalDateTime.parse(it.value, AirbyteValueDeepCoercingMapper.DATE_TIME_FORMATTER)
.atOffset(ZoneOffset.UTC)
LocalDateTime.parse(it.value, DATE_TIME_FORMATTER).atOffset(ZoneOffset.UTC)
}
return odt
}

View File

@@ -7,7 +7,6 @@ package io.airbyte.cdk.load.data
import io.airbyte.cdk.load.message.Meta
import io.airbyte.protocol.models.v0.AirbyteRecordMessageMetaChange.Change
import io.airbyte.protocol.models.v0.AirbyteRecordMessageMetaChange.Reason
import java.time.format.DateTimeFormatter
/**
* A mapper which coerces ALL values against the schema. This mapper MUST NOT be called after any
@@ -178,15 +177,4 @@ class AirbyteValueDeepCoercingMapper(
)
NullValue to context
}
companion object {
val DATE_TIME_FORMATTER: DateTimeFormatter =
DateTimeFormatter.ofPattern(
"[yyyy][yy]['-']['/']['.'][' '][MMM][MM][M]['-']['/']['.'][' '][dd][d][[' '][G]][[' ']['T']HH:mm[':'ss[.][SSSSSS][SSSSS][SSSS][SSS][' '][z][zzz][Z][O][x][XXX][XX][X][[' '][G]]]]"
)
val TIME_FORMATTER: DateTimeFormatter =
DateTimeFormatter.ofPattern(
"HH:mm[':'ss[.][SSSSSS][SSSSS][SSSS][SSS][' '][z][zzz][Z][O][x][XXX][XX][X]]"
)
}
}

View File

@@ -9,7 +9,7 @@ import com.fasterxml.jackson.databind.JsonNode
import io.airbyte.cdk.load.command.DestinationStream
import io.airbyte.cdk.load.data.AirbyteType
import io.airbyte.cdk.load.data.AirbyteValue
import io.airbyte.cdk.load.data.AirbyteValueDeepCoercingMapper
import io.airbyte.cdk.load.data.AirbyteValueCoercer.DATE_TIME_FORMATTER
import io.airbyte.cdk.load.data.ArrayType
import io.airbyte.cdk.load.data.ArrayValue
import io.airbyte.cdk.load.data.EnrichedAirbyteValue
@@ -161,7 +161,7 @@ data class Meta(
TimestampWithTimezoneValue(
OffsetDateTime.parse(
value,
AirbyteValueDeepCoercingMapper.DATE_TIME_FORMATTER,
DATE_TIME_FORMATTER,
),
)
}

View File

@@ -4,7 +4,8 @@
package io.airbyte.cdk.load.util
import io.airbyte.cdk.load.data.AirbyteValueDeepCoercingMapper
import io.airbyte.cdk.load.data.AirbyteValueCoercer.DATE_TIME_FORMATTER
import io.airbyte.cdk.load.data.AirbyteValueCoercer.TIME_FORMATTER
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime
@@ -17,11 +18,11 @@ import java.time.ZonedDateTime
object TimeStringUtility {
fun toLocalDate(dateString: String): LocalDate {
return LocalDate.parse(dateString, AirbyteValueDeepCoercingMapper.DATE_TIME_FORMATTER)
return LocalDate.parse(dateString, DATE_TIME_FORMATTER)
}
fun toLocalDateTime(dateString: String): LocalDateTime {
return LocalDateTime.parse(dateString, AirbyteValueDeepCoercingMapper.DATE_TIME_FORMATTER)
return LocalDateTime.parse(dateString, DATE_TIME_FORMATTER)
}
fun toOffset(timeString: String): LocalTime {
@@ -33,12 +34,11 @@ object TimeStringUtility {
}
private fun toMicrosOfDayWithTimezone(timeString: String): LocalTime {
return OffsetTime.parse(timeString, AirbyteValueDeepCoercingMapper.TIME_FORMATTER)
.toLocalTime()
return OffsetTime.parse(timeString, TIME_FORMATTER).toLocalTime()
}
private fun toMicrosOfDayWithoutTimezone(timeString: String): LocalTime {
return LocalTime.parse(timeString, AirbyteValueDeepCoercingMapper.TIME_FORMATTER)
return LocalTime.parse(timeString, TIME_FORMATTER)
}
fun toOffsetDateTime(timestampString: String): OffsetDateTime {
@@ -50,18 +50,10 @@ object TimeStringUtility {
}
private fun toOffsetDateTimeWithTimezone(timestampString: String): OffsetDateTime {
return ZonedDateTime.parse(
timestampString,
AirbyteValueDeepCoercingMapper.DATE_TIME_FORMATTER
)
.toOffsetDateTime()
return ZonedDateTime.parse(timestampString, DATE_TIME_FORMATTER).toOffsetDateTime()
}
private fun toOffsetDateTimeWithoutTimezone(timestampString: String): OffsetDateTime {
return LocalDateTime.parse(
timestampString,
AirbyteValueDeepCoercingMapper.DATE_TIME_FORMATTER
)
.atOffset(ZoneOffset.UTC)
return LocalDateTime.parse(timestampString, DATE_TIME_FORMATTER).atOffset(ZoneOffset.UTC)
}
}

View File

@@ -4,7 +4,7 @@
package io.airbyte.cdk.load.data
import io.airbyte.cdk.load.data.AirbyteValueDeepCoercingMapper.Companion.DATE_TIME_FORMATTER
import io.airbyte.cdk.load.data.AirbyteValueCoercer.DATE_TIME_FORMATTER
import io.airbyte.cdk.load.data.json.toAirbyteValue
import io.airbyte.cdk.load.message.Meta
import io.airbyte.cdk.load.util.Jsons

View File

@@ -4,7 +4,7 @@
package io.airbyte.cdk.load.util
import io.airbyte.cdk.load.data.AirbyteValueDeepCoercingMapper
import io.airbyte.cdk.load.data.AirbyteValueCoercer
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime
@@ -22,7 +22,7 @@ internal class TimeStringUtilityTest {
val localDateString = "2024-11-18"
val localDate = TimeStringUtility.toLocalDate(localDateString)
assertEquals(
LocalDate.parse(localDateString, AirbyteValueDeepCoercingMapper.DATE_TIME_FORMATTER),
LocalDate.parse(localDateString, AirbyteValueCoercer.DATE_TIME_FORMATTER),
localDate
)
}
@@ -40,10 +40,7 @@ internal class TimeStringUtilityTest {
val localDateTimeString = "2024-11-18T12:34:56Z"
val localDateTime = TimeStringUtility.toLocalDateTime(localDateTimeString)
assertEquals(
LocalDateTime.parse(
localDateTimeString,
AirbyteValueDeepCoercingMapper.DATE_TIME_FORMATTER
),
LocalDateTime.parse(localDateTimeString, AirbyteValueCoercer.DATE_TIME_FORMATTER),
localDateTime
)
}
@@ -53,10 +50,7 @@ internal class TimeStringUtilityTest {
val offsetWithTimezoneString = "12:34:56Z"
val offsetWithTimezone = TimeStringUtility.toOffset(offsetWithTimezoneString)
assertEquals(
OffsetTime.parse(
offsetWithTimezoneString,
AirbyteValueDeepCoercingMapper.TIME_FORMATTER
)
OffsetTime.parse(offsetWithTimezoneString, AirbyteValueCoercer.TIME_FORMATTER)
.toLocalTime(),
offsetWithTimezone
)
@@ -67,10 +61,7 @@ internal class TimeStringUtilityTest {
val offsetWithoutTimezoneString = "12:34:56"
val offsetWithoutTimezone = TimeStringUtility.toOffset(offsetWithoutTimezoneString)
assertEquals(
LocalTime.parse(
offsetWithoutTimezoneString,
AirbyteValueDeepCoercingMapper.TIME_FORMATTER
),
LocalTime.parse(offsetWithoutTimezoneString, AirbyteValueCoercer.TIME_FORMATTER),
offsetWithoutTimezone
)
}
@@ -80,10 +71,7 @@ internal class TimeStringUtilityTest {
val offsetWithTimezoneString = "2024-11-18T12:34:56Z"
val offsetWithTimezone = TimeStringUtility.toOffsetDateTime(offsetWithTimezoneString)
assertEquals(
ZonedDateTime.parse(
offsetWithTimezoneString,
AirbyteValueDeepCoercingMapper.DATE_TIME_FORMATTER
)
ZonedDateTime.parse(offsetWithTimezoneString, AirbyteValueCoercer.DATE_TIME_FORMATTER)
.toOffsetDateTime(),
offsetWithTimezone
)
@@ -96,7 +84,7 @@ internal class TimeStringUtilityTest {
assertEquals(
LocalDateTime.parse(
offsetWithoutTimezoneString,
AirbyteValueDeepCoercingMapper.DATE_TIME_FORMATTER
AirbyteValueCoercer.DATE_TIME_FORMATTER
)
.atOffset(ZoneOffset.UTC),
offsetWithoutTimezone