From c2d7b036368015fc22078c4e6371ad72e7904a57 Mon Sep 17 00:00:00 2001 From: sksamuel Date: Sat, 27 Apr 2024 07:10:02 -0500 Subject: [PATCH] Added local date and local time encoders --- .../centurion/avro/encoders/temporals.kt | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/encoders/temporals.kt diff --git a/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/encoders/temporals.kt b/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/encoders/temporals.kt new file mode 100644 index 0000000..8525046 --- /dev/null +++ b/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/encoders/temporals.kt @@ -0,0 +1,36 @@ +package com.sksamuel.centurion.avro.encoders + +import org.apache.avro.LogicalTypes.LocalTimestampMicros +import org.apache.avro.LogicalTypes.LocalTimestampMillis +import org.apache.avro.LogicalTypes.TimeMicros +import org.apache.avro.LogicalTypes.TimeMillis +import org.apache.avro.Schema +import org.apache.avro.data.TimeConversions.LocalTimestampMicrosConversion +import org.apache.avro.data.TimeConversions.LocalTimestampMillisConversion +import org.apache.avro.data.TimeConversions.TimeMicrosConversion +import org.apache.avro.data.TimeConversions.TimeMillisConversion +import java.time.LocalDateTime +import java.time.LocalTime +import java.time.ZoneOffset + +object LocalDateTimeEncoder : Encoder { + override fun encode(schema: Schema, value: LocalDateTime): Any? { + return when { + schema.logicalType is LocalTimestampMillis -> LocalTimestampMillisConversion().toLong(value, schema, schema.logicalType) + schema.logicalType is LocalTimestampMicros -> LocalTimestampMicrosConversion().toLong(value, schema, schema.logicalType) + schema.type == Schema.Type.LONG -> value.toInstant(ZoneOffset.UTC).toEpochMilli() + else -> error("Unsupported schema for LocalDateTime: $schema") + } + } +} + +object LocalTimeEncoder : Encoder { + override fun encode(schema: Schema, value: LocalTime): Any? { + return when { + schema.logicalType is TimeMillis -> TimeMillisConversion().toInt(value, schema, schema.logicalType) + schema.logicalType is TimeMicros -> TimeMicrosConversion().toLong(value, schema, schema.logicalType) + schema.type == Schema.Type.LONG -> value.toNanoOfDay() + else -> error("Unsupported schema for LocalDateTime: $schema") + } + } +}