diff --git a/trino-aws-proxy-glue/src/main/java/io/trino/aws/proxy/glue/rest/GlueDeserializer.java b/trino-aws-proxy-glue/src/main/java/io/trino/aws/proxy/glue/rest/GlueDeserializer.java index 83d12acf..bfb209ae 100644 --- a/trino-aws-proxy-glue/src/main/java/io/trino/aws/proxy/glue/rest/GlueDeserializer.java +++ b/trino-aws-proxy-glue/src/main/java/io/trino/aws/proxy/glue/rest/GlueDeserializer.java @@ -21,6 +21,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import software.amazon.awssdk.core.SdkBytes; import software.amazon.awssdk.core.SdkField; +import software.amazon.awssdk.services.glue.model.StringColumnStatisticsData; import java.io.IOException; import java.lang.reflect.Field; @@ -70,9 +71,17 @@ public T deserialize(JsonParser parser, DeserializationContext context) if (type == null) { return (T) context.handleUnexpectedToken(context.getContextualType(), parser); } + if (type == SdkBytes.class) { sdkField.set(builder, SdkBytes.fromByteArray(fieldValue.binaryValue())); } + else if (type == StringColumnStatisticsData.class) { + StringColumnStatisticsData stringColumnStatisticsData = mapper.convertValue(fieldValue, StringColumnStatisticsData.class); + if (stringColumnStatisticsData.averageLength() == null) { + stringColumnStatisticsData = stringColumnStatisticsData.toBuilder().averageLength(0D).build(); + } + sdkField.set(builder, stringColumnStatisticsData); + } else { JavaType javaType = context.getTypeFactory().constructType(type); sdkField.set(builder, mapper.convertValue(fieldValue, javaType)); diff --git a/trino-aws-proxy-glue/src/test/java/io/trino/aws/proxy/glue/TestGlueBase.java b/trino-aws-proxy-glue/src/test/java/io/trino/aws/proxy/glue/TestGlueBase.java index 169824c5..c17e6c28 100644 --- a/trino-aws-proxy-glue/src/test/java/io/trino/aws/proxy/glue/TestGlueBase.java +++ b/trino-aws-proxy-glue/src/test/java/io/trino/aws/proxy/glue/TestGlueBase.java @@ -48,13 +48,13 @@ import software.amazon.awssdk.services.glue.model.OpenTableFormatInput; import software.amazon.awssdk.services.glue.model.PartitionIndex; import software.amazon.awssdk.services.glue.model.StorageDescriptor; +import software.amazon.awssdk.services.glue.model.StringColumnStatisticsData; import software.amazon.awssdk.services.glue.model.TableIdentifier; import software.amazon.awssdk.services.glue.model.TableInput; import software.amazon.awssdk.services.glue.model.UpdateColumnStatisticsForTableRequest; import java.net.URI; import java.time.temporal.ChronoUnit; -import java.util.List; import java.util.Map; import static io.trino.aws.proxy.glue.TestingGlueRequestHandler.DATABASE_1; @@ -174,7 +174,7 @@ public void testComplexSerialization() .databaseName(databaseName) .tableName("table1") .columnStatisticsList( - List.of(ColumnStatistics.builder() + ColumnStatistics.builder() .columnName("a") .columnType("b") .statisticsData(ColumnStatisticsData.builder() @@ -186,7 +186,20 @@ public void testComplexSerialization() .build()) .build()) .build()) - .build())) + .build(), + ColumnStatistics.builder() + .columnName("a") + .columnType("b") + .statisticsData(ColumnStatisticsData.builder() + .type(ColumnStatisticsType.STRING) + .stringColumnStatisticsData(StringColumnStatisticsData.builder() + .maximumLength(1L) +// .averageLength(0D) + .numberOfNulls(0L) + .numberOfDistinctValues(1L) + .build()) + .build()) + .build()) .build()); } diff --git a/trino-aws-proxy-glue/src/test/java/io/trino/aws/proxy/glue/TestingGlueRequestHandler.java b/trino-aws-proxy-glue/src/test/java/io/trino/aws/proxy/glue/TestingGlueRequestHandler.java index 0366f56f..93635d25 100644 --- a/trino-aws-proxy-glue/src/test/java/io/trino/aws/proxy/glue/TestingGlueRequestHandler.java +++ b/trino-aws-proxy-glue/src/test/java/io/trino/aws/proxy/glue/TestingGlueRequestHandler.java @@ -122,9 +122,18 @@ public GlueResponse handleRequest(ParsedGlueRequest request, SigningMetadata sig case UpdateColumnStatisticsForTableRequest columnStatisticsForTableRequest -> { assertThat(columnStatisticsForTableRequest.catalogId()).isEqualTo("1"); assertThat(columnStatisticsForTableRequest.databaseName()).isEqualTo("database1"); - assertThat(columnStatisticsForTableRequest.columnStatisticsList()).hasSize(1); + assertThat(columnStatisticsForTableRequest.columnStatisticsList()).hasSize(2); assertThat(columnStatisticsForTableRequest.columnStatisticsList().getFirst().statisticsData()).isNotNull(); - yield UpdateColumnStatisticsForTableResponse.builder().build(); + assertThat(columnStatisticsForTableRequest.columnStatisticsList() + .stream() + .filter(columnStatistics -> columnStatistics.statisticsData().stringColumnStatisticsData() != null) + .findFirst() + .orElseThrow() + .statisticsData() + .stringColumnStatisticsData() + .averageLength()) + .isNotNull(); + yield UpdateColumnStatisticsForTableResponse.builder().build(); } default -> throw new WebApplicationException(NOT_FOUND);