This is an automated email from the ASF dual-hosted git repository.
jbonofre pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-java.git
The following commit(s) were added to refs/heads/main by this push:
new c29fcfc7 GH-692: Preserve nullability information while transfering
DecimalVector and Decimal256Vector (#693)
c29fcfc7 is described below
commit c29fcfc72bed84c1dc9926bc28294b5ff193937f
Author: Vishal Boddu <[email protected]>
AuthorDate: Thu Apr 3 17:25:44 2025 +0200
GH-692: Preserve nullability information while transfering DecimalVector
and Decimal256Vector (#693)
## What's Changed
This PR proposes to use the "from" `ValueVector`'s field while
transferring `DecimalVector` and `Decimal256Vector` to preserve
nullability information. This is to have similar behavior with all the
other primitive value vectors. Note that the `FieldType` of the value
vector has nullability information.
Closes #692 .
---
.../org/apache/arrow/vector/Decimal256Vector.java | 7 ++++--
.../org/apache/arrow/vector/DecimalVector.java | 5 +++-
.../apache/arrow/vector/TestDecimal256Vector.java | 28 ++++++++++++++++++++++
.../org/apache/arrow/vector/TestDecimalVector.java | 26 ++++++++++++++++++++
4 files changed, 63 insertions(+), 3 deletions(-)
diff --git a/vector/src/main/java/org/apache/arrow/vector/Decimal256Vector.java
b/vector/src/main/java/org/apache/arrow/vector/Decimal256Vector.java
index 90f67798..f9d7e5cb 100644
--- a/vector/src/main/java/org/apache/arrow/vector/Decimal256Vector.java
+++ b/vector/src/main/java/org/apache/arrow/vector/Decimal256Vector.java
@@ -567,8 +567,11 @@ public final class Decimal256Vector extends
BaseFixedWidthVector
public TransferImpl(String ref, BufferAllocator allocator) {
to =
- new Decimal256Vector(
- ref, allocator, Decimal256Vector.this.precision,
Decimal256Vector.this.scale);
+ (Decimal256Vector.this.field != null
+ && Decimal256Vector.this.field.getFieldType() != null)
+ ? new Decimal256Vector(ref,
Decimal256Vector.this.field.getFieldType(), allocator)
+ : new Decimal256Vector(
+ ref, allocator, Decimal256Vector.this.precision,
Decimal256Vector.this.scale);
}
public TransferImpl(Field field, BufferAllocator allocator) {
diff --git a/vector/src/main/java/org/apache/arrow/vector/DecimalVector.java
b/vector/src/main/java/org/apache/arrow/vector/DecimalVector.java
index b4c55680..9bf1812c 100644
--- a/vector/src/main/java/org/apache/arrow/vector/DecimalVector.java
+++ b/vector/src/main/java/org/apache/arrow/vector/DecimalVector.java
@@ -565,7 +565,10 @@ public final class DecimalVector extends
BaseFixedWidthVector
public TransferImpl(String ref, BufferAllocator allocator) {
to =
- new DecimalVector(ref, allocator, DecimalVector.this.precision,
DecimalVector.this.scale);
+ (DecimalVector.this.field != null &&
DecimalVector.this.field.getFieldType() != null)
+ ? new DecimalVector(ref,
DecimalVector.this.field.getFieldType(), allocator)
+ : new DecimalVector(
+ ref, allocator, DecimalVector.this.precision,
DecimalVector.this.scale);
}
public TransferImpl(Field field, BufferAllocator allocator) {
diff --git
a/vector/src/test/java/org/apache/arrow/vector/TestDecimal256Vector.java
b/vector/src/test/java/org/apache/arrow/vector/TestDecimal256Vector.java
index c155ab98..b995dc5d 100644
--- a/vector/src/test/java/org/apache/arrow/vector/TestDecimal256Vector.java
+++ b/vector/src/test/java/org/apache/arrow/vector/TestDecimal256Vector.java
@@ -26,6 +26,7 @@ import java.math.BigInteger;
import org.apache.arrow.memory.ArrowBuf;
import org.apache.arrow.memory.BufferAllocator;
import org.apache.arrow.vector.types.pojo.ArrowType;
+import org.apache.arrow.vector.types.pojo.FieldType;
import org.apache.arrow.vector.util.TransferPair;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@@ -375,6 +376,33 @@ public class TestDecimal256Vector {
assertSame(fromVector.getField(), toVector.getField());
}
+ @Test
+ public void testGetTransferPairWithoutField() {
+ final Decimal256Vector fromVector = new Decimal256Vector("decimal",
allocator, 10, scale);
+ final TransferPair transferPair =
+ fromVector.getTransferPair(fromVector.getField().getName(), allocator);
+ final Decimal256Vector toVector = (Decimal256Vector) transferPair.getTo();
+ // A new Field created inside a new vector should reuse the field type
(should be the same in
+ // memory as the original Field's field type).
+ assertSame(fromVector.getField().getFieldType(),
toVector.getField().getFieldType());
+ }
+
+ @Test
+ public void testGetTransferPairWithoutFieldNonNullable() {
+ final FieldType decimal256NonNullableType =
+ new FieldType(
+ false, new ArrowType.Decimal(10, scale,
Decimal256Vector.TYPE_WIDTH * 8), null);
+ final Decimal256Vector fromVector =
+ new Decimal256Vector("decimal", decimal256NonNullableType, allocator);
+ final TransferPair transferPair =
+ fromVector.getTransferPair(fromVector.getField().getName(), allocator);
+ final Decimal256Vector toVector = (Decimal256Vector) transferPair.getTo();
+ // A new Field created inside a new vector should reuse the field type
(should be the same in
+ // memory as the original Field's field type).
+ assertSame(fromVector.getField().getFieldType(),
toVector.getField().getFieldType());
+ assertSame(decimal256NonNullableType, toVector.getField().getFieldType());
+ }
+
private void verifyWritingArrowBufWithBigEndianBytes(
Decimal256Vector decimalVector, ArrowBuf buf, BigDecimal[]
expectedValues, int length) {
decimalVector.allocateNew();
diff --git
a/vector/src/test/java/org/apache/arrow/vector/TestDecimalVector.java
b/vector/src/test/java/org/apache/arrow/vector/TestDecimalVector.java
index d5310bad..85c11e8f 100644
--- a/vector/src/test/java/org/apache/arrow/vector/TestDecimalVector.java
+++ b/vector/src/test/java/org/apache/arrow/vector/TestDecimalVector.java
@@ -26,6 +26,7 @@ import java.math.BigInteger;
import org.apache.arrow.memory.ArrowBuf;
import org.apache.arrow.memory.BufferAllocator;
import org.apache.arrow.vector.types.pojo.ArrowType;
+import org.apache.arrow.vector.types.pojo.FieldType;
import org.apache.arrow.vector.util.TransferPair;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@@ -371,6 +372,31 @@ public class TestDecimalVector {
assertSame(fromVector.getField(), toVector.getField());
}
+ @Test
+ public void testGetTransferPairWithoutField() {
+ final DecimalVector fromVector = new DecimalVector("decimal", allocator,
10, scale);
+ final TransferPair transferPair =
+ fromVector.getTransferPair(fromVector.getField().getName(), allocator);
+ final DecimalVector toVector = (DecimalVector) transferPair.getTo();
+ // A new Field created inside a new vector should reuse the field type
(should be the same in
+ // memory as the original Field's field type).
+ assertSame(fromVector.getField().getFieldType(),
toVector.getField().getFieldType());
+ }
+
+ @Test
+ public void testGetTransferPairWithoutFieldNonNullable() {
+ final FieldType decimalNonNullableType =
+ new FieldType(false, new ArrowType.Decimal(10, scale), null);
+ final DecimalVector fromVector =
+ new DecimalVector("decimal", decimalNonNullableType, allocator);
+ final TransferPair transferPair =
+ fromVector.getTransferPair(fromVector.getField().getName(), allocator);
+ final DecimalVector toVector = (DecimalVector) transferPair.getTo();
+ // A new Field created inside a new vector should reuse the field type
(should be the same in
+ // memory as the original Field's field type).
+ assertSame(fromVector.getField().getFieldType(),
toVector.getField().getFieldType());
+ }
+
private void verifyWritingArrowBufWithBigEndianBytes(
DecimalVector decimalVector, ArrowBuf buf, BigDecimal[] expectedValues,
int length) {
decimalVector.allocateNew();