Skip to content

Commit 93a77cb

Browse files
committed
set padding; add test
1 parent 462a36c commit 93a77cb

File tree

3 files changed

+77
-2
lines changed

3 files changed

+77
-2
lines changed

java/vector/src/main/java/org/apache/arrow/vector/BaseDataValueVector.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public abstract class BaseDataValueVector extends BaseValueVector implements Buf
3131
protected final static byte[] emptyByteArray = new byte[]{}; // Nullable vectors use this
3232

3333
/** maximum extra size at the end of the buffer */
34-
private static final int MAX_BUFFER_PADDING = 0; // TODO: check
34+
private static final int MAX_BUFFER_PADDING = 64;
3535

3636
public static void load(ArrowFieldNode fieldNode, List<BufferBacked> vectors, List<ArrowBuf> buffers) {
3737
int expectedSize = vectors.size();

java/vector/src/main/java/org/apache/arrow/vector/BitVector.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public void load(ArrowFieldNode fieldNode, ArrowBuf data) {
6868
int remainder = count % 8;
6969
// set remaining bits
7070
if (remainder > 0) {
71-
byte bitMask = (byte) (0xFFL >>> ((8 - remainder) & 7));;
71+
byte bitMask = (byte) (0xFFL >>> ((8 - remainder) & 7));
7272
this.data.setByte(fullBytesCount, bitMask);
7373
}
7474
} else if (fieldNode.getNullCount() == fieldNode.getLength()) {

java/vector/src/test/java/org/apache/arrow/vector/TestVectorUnloadLoad.java

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import static org.junit.Assert.assertTrue;
2424

2525
import java.io.IOException;
26+
import java.util.ArrayList;
2627
import java.util.Collections;
2728
import java.util.List;
2829

@@ -32,6 +33,7 @@
3233
import org.apache.arrow.vector.complex.impl.ComplexWriterImpl;
3334
import org.apache.arrow.vector.complex.reader.FieldReader;
3435
import org.apache.arrow.vector.complex.writer.BaseWriter.ComplexWriter;
36+
import org.apache.arrow.vector.complex.writer.BaseWriter.ListWriter;
3537
import org.apache.arrow.vector.complex.writer.BaseWriter.MapWriter;
3638
import org.apache.arrow.vector.complex.writer.BigIntWriter;
3739
import org.apache.arrow.vector.complex.writer.IntWriter;
@@ -99,6 +101,79 @@ public void testUnloadLoad() throws IOException {
99101
}
100102
}
101103

104+
@Test
105+
public void testUnloadLoadAddPadding() throws IOException {
106+
int count = 10000;
107+
Schema schema;
108+
try (
109+
BufferAllocator originalVectorsAllocator = allocator.newChildAllocator("original vectors", 0, Integer.MAX_VALUE);
110+
MapVector parent = new MapVector("parent", originalVectorsAllocator, null)) {
111+
112+
// write some data
113+
ComplexWriter writer = new ComplexWriterImpl("root", parent);
114+
MapWriter rootWriter = writer.rootAsMap();
115+
ListWriter list = rootWriter.list("list");
116+
IntWriter intWriter = list.integer();
117+
for (int i = 0; i < count; i++) {
118+
list.setPosition(i);
119+
list.startList();
120+
for (int j = 0; j < i % 4 + 1; j++) {
121+
intWriter.writeInt(i);
122+
}
123+
list.endList();
124+
}
125+
writer.setValueCount(count);
126+
127+
// unload it
128+
FieldVector root = parent.getChild("root");
129+
schema = new Schema(root.getField().getChildren());
130+
VectorUnloader vectorUnloader = newVectorUnloader(root);
131+
try (
132+
ArrowRecordBatch recordBatch = vectorUnloader.getRecordBatch();
133+
BufferAllocator finalVectorsAllocator = allocator.newChildAllocator("final vectors", 0, Integer.MAX_VALUE);
134+
VectorSchemaRoot newRoot = new VectorSchemaRoot(schema, finalVectorsAllocator);
135+
) {
136+
List<ArrowBuf> oldBuffers = recordBatch.getBuffers();
137+
List<ArrowBuf> newBuffers = new ArrayList<>();
138+
for (ArrowBuf oldBuffer : oldBuffers) {
139+
int l = oldBuffer.readableBytes();
140+
if (l % 64 != 0) {
141+
// pad
142+
l = l + 64 - l % 64;
143+
}
144+
ArrowBuf newBuffer = allocator.buffer(l);
145+
for (int i = oldBuffer.readerIndex(); i < oldBuffer.writerIndex(); i++) {
146+
newBuffer.setByte(i - oldBuffer.readerIndex(), oldBuffer.getByte(i));
147+
}
148+
newBuffer.readerIndex(0);
149+
newBuffer.writerIndex(l);
150+
newBuffers.add(newBuffer);
151+
}
152+
153+
try (ArrowRecordBatch newBatch = new ArrowRecordBatch(recordBatch.getLength(), recordBatch.getNodes(), newBuffers);) {
154+
// load it
155+
VectorLoader vectorLoader = new VectorLoader(newRoot);
156+
157+
vectorLoader.load(newBatch);
158+
159+
FieldReader reader = newRoot.getVector("list").getReader();
160+
for (int i = 0; i < count; i++) {
161+
reader.setPosition(i);
162+
List<Integer> expected = new ArrayList<>();
163+
for (int j = 0; j < i % 4 + 1; j++) {
164+
expected.add(i);
165+
}
166+
Assert.assertEquals(expected, reader.readObject());
167+
}
168+
}
169+
170+
for (ArrowBuf newBuf : newBuffers) {
171+
newBuf.release();
172+
}
173+
}
174+
}
175+
}
176+
102177
/**
103178
* The validity buffer can be empty if:
104179
* - all values are defined

0 commit comments

Comments
 (0)