From 690c4324413481297175b07dd551d05a115f1c67 Mon Sep 17 00:00:00 2001 From: Divya Talesra Date: Fri, 14 Feb 2025 14:59:17 -0500 Subject: [PATCH] implementing OptionalFloatThriftCodec and float coercion --- .../drift/codec/ThriftCodecManager.java | 2 + .../builtin/OptionalFloatThriftCodec.java | 64 +++++++++++++++++++ .../coercion/DefaultJavaCoercions.java | 12 ++++ .../ThriftCodecByteCodeGenerator.java | 5 +- .../drift/codec/metadata/ThriftCatalog.java | 2 + 5 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 drift-codec/src/main/java/com/facebook/drift/codec/internal/builtin/OptionalFloatThriftCodec.java diff --git a/drift-codec/src/main/java/com/facebook/drift/codec/ThriftCodecManager.java b/drift-codec/src/main/java/com/facebook/drift/codec/ThriftCodecManager.java index e5504e682..63d0ca6f8 100644 --- a/drift-codec/src/main/java/com/facebook/drift/codec/ThriftCodecManager.java +++ b/drift-codec/src/main/java/com/facebook/drift/codec/ThriftCodecManager.java @@ -32,6 +32,7 @@ import com.facebook.drift.codec.internal.builtin.LongThriftCodec; import com.facebook.drift.codec.internal.builtin.MapThriftCodec; import com.facebook.drift.codec.internal.builtin.OptionalDoubleThriftCodec; +import com.facebook.drift.codec.internal.builtin.OptionalFloatThriftCodec; import com.facebook.drift.codec.internal.builtin.OptionalIntThriftCodec; import com.facebook.drift.codec.internal.builtin.OptionalLongThriftCodec; import com.facebook.drift.codec.internal.builtin.OptionalThriftCodec; @@ -186,6 +187,7 @@ public ThriftCodec load(ThriftType type) addBuiltinCodec(new DoubleArrayThriftCodec()); addBuiltinCodec(new FloatArrayThriftCodec()); addBuiltinCodec(new OptionalDoubleThriftCodec()); + addBuiltinCodec(new OptionalFloatThriftCodec()); addBuiltinCodec(new OptionalIntThriftCodec()); addBuiltinCodec(new OptionalLongThriftCodec()); diff --git a/drift-codec/src/main/java/com/facebook/drift/codec/internal/builtin/OptionalFloatThriftCodec.java b/drift-codec/src/main/java/com/facebook/drift/codec/internal/builtin/OptionalFloatThriftCodec.java new file mode 100644 index 000000000..e88516b66 --- /dev/null +++ b/drift-codec/src/main/java/com/facebook/drift/codec/internal/builtin/OptionalFloatThriftCodec.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2017 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.facebook.drift.codec.internal.builtin; + +import com.facebook.drift.codec.ThriftCodec; +import com.facebook.drift.codec.metadata.ThriftType; +import com.facebook.drift.protocol.TProtocolReader; +import com.facebook.drift.protocol.TProtocolWriter; + +import javax.annotation.concurrent.Immutable; + +import java.util.Optional; + +import static java.util.Objects.requireNonNull; + +@Immutable +public class OptionalFloatThriftCodec + implements ThriftCodec> +{ + @Override + public ThriftType getType() + { + return new ThriftType(ThriftType.FLOAT, new TypeToken>() {}.getType(), Optional.empty()); + } + + @Override + public Optional read(TProtocolReader protocol) + throws Exception + { + requireNonNull(protocol, "protocol is null"); + return Optional.of(protocol.readFloat()); + } + + @Override + public void write(Optional value, TProtocolWriter protocol) + throws Exception + { + requireNonNull(value, "value is null"); + requireNonNull(protocol, "protocol is null"); + + // write can not be called with a missing value, and instead the write should be skipped + // after check the result from isNull + protocol.writeFloat(value.orElseThrow((() -> new IllegalArgumentException("value is not present")))); + } + + @Override + public boolean isNull(Optional value) + { + return value == null || !value.isPresent(); + } +} diff --git a/drift-codec/src/main/java/com/facebook/drift/codec/internal/coercion/DefaultJavaCoercions.java b/drift-codec/src/main/java/com/facebook/drift/codec/internal/coercion/DefaultJavaCoercions.java index e38a05bb5..e64e721e7 100644 --- a/drift-codec/src/main/java/com/facebook/drift/codec/internal/coercion/DefaultJavaCoercions.java +++ b/drift-codec/src/main/java/com/facebook/drift/codec/internal/coercion/DefaultJavaCoercions.java @@ -86,6 +86,18 @@ public static long boxedLongToLong(Long value) return value; } + @FromThrift + public static Float floatToBoxedFloat(float value) + { + return value; + } + + @ToThrift + public static float boxedFloatToFloat(Float value) + { + return value; + } + @FromThrift public static float doubleToPrimitiveFloat(double value) { diff --git a/drift-codec/src/main/java/com/facebook/drift/codec/internal/compiler/ThriftCodecByteCodeGenerator.java b/drift-codec/src/main/java/com/facebook/drift/codec/internal/compiler/ThriftCodecByteCodeGenerator.java index fbd81fd77..ba9dadaf5 100644 --- a/drift-codec/src/main/java/com/facebook/drift/codec/internal/compiler/ThriftCodecByteCodeGenerator.java +++ b/drift-codec/src/main/java/com/facebook/drift/codec/internal/compiler/ThriftCodecByteCodeGenerator.java @@ -1102,7 +1102,10 @@ public static ParameterizedType toParameterizedType(ThriftTypeReference typeRef) } if (ReflectionHelper.isOptional(typeRef.getJavaType())) { - return type(Optional.class, toParameterizedType(typeRef.get().getValueTypeReference())); + ThriftType valueType = typeRef.get().getValueTypeReference().get(); + if (!valueType.equals(ThriftType.FLOAT)) { + return type(Optional.class, toParameterizedType(typeRef.get().getValueTypeReference())); + } } switch (typeRef.getProtocolType()) { diff --git a/drift-codec/src/main/java/com/facebook/drift/codec/metadata/ThriftCatalog.java b/drift-codec/src/main/java/com/facebook/drift/codec/metadata/ThriftCatalog.java index 3fb924825..b12387592 100644 --- a/drift-codec/src/main/java/com/facebook/drift/codec/metadata/ThriftCatalog.java +++ b/drift-codec/src/main/java/com/facebook/drift/codec/metadata/ThriftCatalog.java @@ -21,6 +21,7 @@ import com.facebook.drift.annotations.ThriftUnion; import com.facebook.drift.codec.ThriftProtocolType; import com.facebook.drift.codec.internal.builtin.OptionalDoubleThriftCodec; +import com.facebook.drift.codec.internal.builtin.OptionalFloatThriftCodec; import com.facebook.drift.codec.internal.builtin.OptionalIntThriftCodec; import com.facebook.drift.codec.internal.builtin.OptionalLongThriftCodec; import com.facebook.drift.codec.internal.coercion.DefaultJavaCoercions; @@ -116,6 +117,7 @@ public ThriftCatalog(Monitor monitor) this.monitor = monitor; addDefaultCoercions(DefaultJavaCoercions.class); addThriftType(new OptionalDoubleThriftCodec().getType()); + addThriftType(new OptionalFloatThriftCodec().getType()); addThriftType(new OptionalIntThriftCodec().getType()); addThriftType(new OptionalLongThriftCodec().getType()); }