Skip to content

Commit bd42c70

Browse files
committed
Adds coercion from IonFloat to HiveDecimal
1 parent f8e9b0c commit bd42c70

3 files changed

Lines changed: 21 additions & 23 deletions

File tree

buildSrc/src/main/kotlin/ion-hive-serde.dependencies.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ object Versions {
2222
val hive2_version = "[2.3.0,2.4.0)"
2323
val hive3_version = "[3.1.2,3.1.17)"
2424
val kotlin_version = "1.9.22"
25-
val ionjava_version = "[1.4.0,2.0.0)"
25+
val ionjava_version = "[1.9.1,2.0.0)"
2626
val pathextraction_version = "[1.2.0,2.0.0)"
2727
val hadoop_version = "[2.7.0,2.8.0)"
2828
}

hive-common/src/main/java/com/amazon/ionhiveserde/objectinspectors/IonNumberToDecimalObjectInspector.java

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,15 @@
55

66
import static com.amazon.ionhiveserde.objectinspectors.IonUtil.isIonNull;
77

8-
import com.amazon.ion.IonDecimal;
9-
import com.amazon.ion.IonInt;
8+
import com.amazon.ion.IonNumber;
109
import com.amazon.ion.IonValue;
1110
import org.apache.hadoop.hive.common.type.HiveDecimal;
1211
import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
1312
import org.apache.hadoop.hive.serde2.objectinspector.primitive.HiveDecimalObjectInspector;
1413
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
1514

1615
/**
17-
* Adapts an {@link IonDecimal} or {@link IonInt} for the decimal Hive type.
16+
* Adapts an {@link IonNumber} for the decimal Hive type.
1817
*/
1918
public class IonNumberToDecimalObjectInspector extends AbstractIonPrimitiveJavaObjectInspector implements
2019
HiveDecimalObjectInspector {
@@ -36,27 +35,14 @@ public HiveDecimalWritable getPrimitiveWritableObject(final Object o) {
3635
@Override
3736
public HiveDecimal getPrimitiveJavaObject(final Object o) {
3837
final IonValue value = (IonValue) o;
39-
if (isIonNull((IonValue) o)) {
38+
if (isIonNull(value)) {
4039
return null;
4140
}
4241

43-
switch (value.getType()) {
44-
case INT:
45-
return getPrimitiveJavaObject((IonInt) o);
46-
47-
case DECIMAL:
48-
return getPrimitiveJavaObject((IonDecimal) o);
49-
50-
default:
51-
throw new IllegalArgumentException("Invalid Ion type: " + value.getType());
42+
if (value instanceof IonNumber) {
43+
return HiveDecimal.create(((IonNumber) value).bigDecimalValue());
44+
} else {
45+
throw new IllegalArgumentException("Invalid Ion type: " + value.getType());
5246
}
5347
}
54-
55-
private HiveDecimal getPrimitiveJavaObject(final IonDecimal ionValue) {
56-
return HiveDecimal.create(ionValue.bigDecimalValue());
57-
}
58-
59-
private HiveDecimal getPrimitiveJavaObject(final IonInt ionValue) {
60-
return HiveDecimal.create(ionValue.bigIntegerValue());
61-
}
6248
}

hive-common/src/test/kotlin/com/amazon/ionhiveserde/objectinspectors/IonNumberToDecimalObjectInspectorTest.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,29 @@ import com.amazon.ion.IonValue
77
import com.amazon.ionhiveserde.ION
88
import org.apache.hadoop.hive.common.type.HiveDecimal
99
import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable
10+
import org.junit.Test
11+
import org.junit.jupiter.api.assertThrows
12+
import java.lang.NumberFormatException
1013

1114
class IonNumberToDecimalObjectInspectorTest
1215
: AbstractIonPrimitiveJavaObjectInspectorTest<IonValue, HiveDecimalWritable, HiveDecimal>() {
1316

1417
override fun validTestCases() = listOf(
1518
ValidTestCase(ION.newDecimal(1), HiveDecimal.ONE, HiveDecimalWritable(HiveDecimal.ONE)),
1619
ValidTestCase(ION.newDecimal(0), HiveDecimal.ZERO, HiveDecimalWritable(HiveDecimal.ZERO)),
20+
ValidTestCase(ION.newFloat(1), HiveDecimal.ONE, HiveDecimalWritable(HiveDecimal.ONE)),
21+
ValidTestCase(ION.newFloat(0), HiveDecimal.ZERO, HiveDecimalWritable(HiveDecimal.ZERO)),
22+
ValidTestCase(ION.newInt(1), HiveDecimal.ONE, HiveDecimalWritable(HiveDecimal.ONE)),
1723
ValidTestCase(ION.newInt(0), HiveDecimal.ZERO, HiveDecimalWritable(HiveDecimal.ZERO)),
18-
ValidTestCase(ION.newInt(0), HiveDecimal.ZERO, HiveDecimalWritable(HiveDecimal.ZERO))
1924
)
2025

26+
@Test
27+
fun `non-numeric floats cannot be converted`() {
28+
assertThrows<NumberFormatException> { subject.getPrimitiveJavaObject(ION.newFloat(Double.NaN)) }
29+
assertThrows<NumberFormatException> { subject.getPrimitiveJavaObject(ION.newFloat(Double.NEGATIVE_INFINITY)) }
30+
assertThrows<NumberFormatException> { subject.getPrimitiveJavaObject(ION.newFloat(Double.POSITIVE_INFINITY)) }
31+
}
32+
2133
override val subject = com.amazon.ionhiveserde.objectinspectors.IonNumberToDecimalObjectInspector()
2234
}
2335

0 commit comments

Comments
 (0)