Skip to content

Commit b7451a2

Browse files
committed
Add RealType.getFloat to directly fetch value as a float
1 parent 7cc4bb8 commit b7451a2

File tree

21 files changed

+50
-44
lines changed

21 files changed

+50
-44
lines changed

core/trino-main/src/main/java/io/trino/operator/scalar/ArrayMaxFunction.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import static io.trino.spi.type.DoubleType.DOUBLE;
3232
import static io.trino.spi.type.RealType.REAL;
3333
import static io.trino.util.Failures.internalError;
34-
import static java.lang.Float.intBitsToFloat;
3534

3635
@ScalarFunction("array_max")
3736
@Description("Get maximum value of array")
@@ -166,19 +165,13 @@ public static Long realTypeArrayMax(@SqlType("array(real)") Block block)
166165
if (block.isNull(position)) {
167166
return null;
168167
}
169-
if (selectedPosition < 0 || floatGreater(getReal(block, position), getReal(block, selectedPosition))) {
168+
if (selectedPosition < 0 || floatGreater(REAL.getFloat(block, position), REAL.getFloat(block, selectedPosition))) {
170169
selectedPosition = position;
171170
}
172171
}
173172
return REAL.getLong(block, selectedPosition);
174173
}
175174

176-
@SuppressWarnings("NumericCastThatLosesPrecision")
177-
private static float getReal(Block block, int position)
178-
{
179-
return intBitsToFloat(REAL.getInt(block, position));
180-
}
181-
182175
private static boolean floatGreater(float left, float right)
183176
{
184177
return (left > right) || Float.isNaN(right);

core/trino-main/src/main/java/io/trino/operator/scalar/FormatFunction.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@
7070
import static io.trino.type.UnknownType.UNKNOWN;
7171
import static io.trino.util.Failures.internalError;
7272
import static io.trino.util.Reflection.methodHandle;
73-
import static java.lang.Float.intBitsToFloat;
7473
import static java.lang.Math.toIntExact;
7574
import static java.lang.String.format;
7675

@@ -199,7 +198,7 @@ private static BiFunction<ConnectorSession, Block, Object> valueConverter(Functi
199198
return (session, block) -> BIGINT.getLong(block, position);
200199
}
201200
if (type.equals(REAL)) {
202-
return (session, block) -> intBitsToFloat(REAL.getInt(block, position));
201+
return (session, block) -> REAL.getFloat(block, position);
203202
}
204203
if (type.equals(DOUBLE)) {
205204
return (session, block) -> DOUBLE.getDouble(block, position);

core/trino-main/src/main/java/io/trino/type/DecimalCasts.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import static io.trino.util.JsonUtil.createJsonParser;
6666
import static io.trino.util.JsonUtil.currentTokenAsLongDecimal;
6767
import static io.trino.util.JsonUtil.currentTokenAsShortDecimal;
68+
import static java.lang.Float.intBitsToFloat;
6869
import static java.lang.Math.multiplyExact;
6970
import static java.lang.Math.toIntExact;
7071
import static java.lang.String.format;
@@ -467,13 +468,15 @@ public static Int128 doubleToLongDecimal(double value, long precision, long scal
467468
@UsedByGeneratedCode
468469
public static long realToShortDecimal(long value, long precision, long scale, long tenToScale)
469470
{
470-
return DecimalConversions.realToShortDecimal(value, precision, scale);
471+
float floatValue = intBitsToFloat((int) value);
472+
return DecimalConversions.realToShortDecimal(floatValue, precision, scale);
471473
}
472474

473475
@UsedByGeneratedCode
474476
public static Int128 realToLongDecimal(long value, long precision, long scale, Int128 tenToScale)
475477
{
476-
return DecimalConversions.realToLongDecimal(value, precision, scale);
478+
float floatValue = intBitsToFloat((int) value);
479+
return DecimalConversions.realToLongDecimal(floatValue, precision, scale);
477480
}
478481

479482
@UsedByGeneratedCode

core/trino-main/src/main/java/io/trino/util/JsonUtil.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,6 @@
9494
import static io.trino.util.DateTimeUtils.printDate;
9595
import static io.trino.util.JsonUtil.ObjectKeyProvider.createObjectKeyProvider;
9696
import static java.lang.Float.floatToRawIntBits;
97-
import static java.lang.Float.intBitsToFloat;
9897
import static java.lang.Math.toIntExact;
9998
import static java.lang.String.format;
10099
import static java.math.RoundingMode.HALF_UP;
@@ -232,7 +231,7 @@ static ObjectKeyProvider createObjectKeyProvider(Type type)
232231
return (block, position) -> String.valueOf(BIGINT.getLong(block, position));
233232
}
234233
if (type.equals(REAL)) {
235-
return (block, position) -> String.valueOf(intBitsToFloat(REAL.getInt(block, position)));
234+
return (block, position) -> String.valueOf(REAL.getFloat(block, position));
236235
}
237236
if (type.equals(DOUBLE)) {
238237
return (block, position) -> String.valueOf(DOUBLE.getDouble(block, position));
@@ -382,7 +381,7 @@ public void writeJsonValue(JsonGenerator jsonGenerator, Block block, int positio
382381
jsonGenerator.writeNull();
383382
}
384383
else {
385-
float value = intBitsToFloat(REAL.getInt(block, position));
384+
float value = REAL.getFloat(block, position);
386385
jsonGenerator.writeNumber(value);
387386
}
388387
}

core/trino-spi/src/main/java/io/trino/spi/type/DecimalConversions.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,17 @@ private static Int128 internalDoubleToLongDecimal(double value, long precision,
122122
}
123123
}
124124

125+
/**
126+
* @deprecated Use {@link #realToShortDecimal(float, long, long)} instead
127+
*/
128+
@Deprecated(forRemoval = true)
125129
public static long realToShortDecimal(long value, long precision, long scale)
130+
{
131+
float floatValue = intBitsToFloat(intScale(value));
132+
return realToShortDecimal(floatValue, precision, scale);
133+
}
134+
135+
public static long realToShortDecimal(float value, long precision, long scale)
126136
{
127137
// TODO: implement specialized version for short decimals
128138
Int128 decimal = realToLongDecimal(value, precision, scale);
@@ -135,9 +145,18 @@ public static long realToShortDecimal(long value, long precision, long scale)
135145
return low;
136146
}
137147

148+
/**
149+
* @deprecated Use {@link #realToLongDecimal(float, long, long)} instead
150+
*/
151+
@Deprecated(forRemoval = true)
138152
public static Int128 realToLongDecimal(long value, long precision, long scale)
139153
{
140154
float floatValue = intBitsToFloat(intScale(value));
155+
return realToLongDecimal(floatValue, precision, scale);
156+
}
157+
158+
public static Int128 realToLongDecimal(float floatValue, long precision, long scale)
159+
{
141160
if (Float.isInfinite(floatValue) || Float.isNaN(floatValue)) {
142161
throw new TrinoException(INVALID_CAST_ARGUMENT, format("Cannot cast REAL '%s' to DECIMAL(%s, %s)", floatValue, precision, scale));
143162
}

core/trino-spi/src/main/java/io/trino/spi/type/RealType.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ public Object getObjectValue(ConnectorSession session, Block block, int position
6363
if (block.isNull(position)) {
6464
return null;
6565
}
66+
return getFloat(block, position);
67+
}
68+
69+
public float getFloat(Block block, int position)
70+
{
6671
return intBitsToFloat(block.getInt(position, 0));
6772
}
6873

lib/trino-hive-formats/src/main/java/io/trino/hive/formats/line/json/JsonSerializer.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
import static io.trino.spi.type.SmallintType.SMALLINT;
5252
import static io.trino.spi.type.TinyintType.TINYINT;
5353
import static io.trino.spi.type.VarbinaryType.VARBINARY;
54-
import static java.lang.Float.intBitsToFloat;
5554

5655
/**
5756
* Deserializer that is bug for bug compatible with Hive JsonSerDe.
@@ -128,7 +127,7 @@ else if (type instanceof DecimalType) {
128127
generator.writeNumber(value.toBigDecimal().toString());
129128
}
130129
else if (REAL.equals(type)) {
131-
generator.writeNumber(intBitsToFloat(REAL.getInt(block, position)));
130+
generator.writeNumber(REAL.getFloat(block, position));
132131
}
133132
else if (DOUBLE.equals(type)) {
134133
generator.writeNumber(DOUBLE.getDouble(block, position));
@@ -212,7 +211,7 @@ else if (type instanceof DecimalType) {
212211
return type.getObjectValue(null, block, position).toString();
213212
}
214213
else if (REAL.equals(type)) {
215-
return String.valueOf(intBitsToFloat(REAL.getInt(block, position)));
214+
return String.valueOf(REAL.getFloat(block, position));
216215
}
217216
else if (DOUBLE.equals(type)) {
218217
return String.valueOf(DOUBLE.getDouble(block, position));

lib/trino-hive-formats/src/main/java/io/trino/hive/formats/line/openxjson/OpenXJsonSerializer.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@
5757
import static io.trino.spi.type.SmallintType.SMALLINT;
5858
import static io.trino.spi.type.TinyintType.TINYINT;
5959
import static io.trino.spi.type.VarbinaryType.VARBINARY;
60-
import static java.lang.Float.intBitsToFloat;
6160
import static java.time.temporal.ChronoField.DAY_OF_MONTH;
6261
import static java.time.temporal.ChronoField.HOUR_OF_DAY;
6362
import static java.time.temporal.ChronoField.MINUTE_OF_HOUR;
@@ -155,7 +154,7 @@ else if (type instanceof DecimalType) {
155154
return value.toBigDecimal().toString();
156155
}
157156
else if (REAL.equals(type)) {
158-
return intBitsToFloat(REAL.getInt(block, position));
157+
return REAL.getFloat(block, position);
159158
}
160159
else if (DOUBLE.equals(type)) {
161160
return DOUBLE.getDouble(block, position);

lib/trino-parquet/src/main/java/io/trino/parquet/writer/valuewriter/RealValueWriter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import org.apache.parquet.schema.PrimitiveType;
1919

2020
import static io.trino.spi.type.RealType.REAL;
21-
import static java.lang.Float.intBitsToFloat;
2221
import static java.util.Objects.requireNonNull;
2322

2423
public class RealValueWriter
@@ -37,7 +36,7 @@ public void write(Block block)
3736
{
3837
for (int i = 0; i < block.getPositionCount(); i++) {
3938
if (!block.isNull(i)) {
40-
float value = intBitsToFloat(REAL.getInt(block, i));
39+
float value = REAL.getFloat(block, i);
4140
valuesWriter.writeFloat(value);
4241
getStatistics().updateStats(value);
4342
}

plugin/trino-cassandra/src/main/java/io/trino/plugin/cassandra/CassandraPageSink.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@
6767
import static io.trino.spi.type.TinyintType.TINYINT;
6868
import static io.trino.spi.type.UuidType.trinoUuidToJavaUuid;
6969
import static io.trino.spi.type.VarbinaryType.VARBINARY;
70-
import static java.lang.Float.intBitsToFloat;
7170
import static java.util.Objects.requireNonNull;
7271
import static java.util.concurrent.CompletableFuture.completedFuture;
7372

@@ -174,7 +173,7 @@ else if (DOUBLE.equals(type)) {
174173
values.add(DOUBLE.getDouble(block, position));
175174
}
176175
else if (REAL.equals(type)) {
177-
values.add(intBitsToFloat(REAL.getInt(block, position)));
176+
values.add(REAL.getFloat(block, position));
178177
}
179178
else if (DATE.equals(type)) {
180179
values.add(toCassandraDate.apply(DATE.getInt(block, position)));

0 commit comments

Comments
 (0)