Skip to content

Commit c29da53

Browse files
committed
fix extraneous bits
1 parent 4e87d88 commit c29da53

File tree

2 files changed

+37
-17
lines changed

2 files changed

+37
-17
lines changed

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

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,20 +54,27 @@ public void load(ArrowFieldNode fieldNode, ArrowBuf data) {
5454
// When the vector is all nulls or all defined, the content of the buffer can be omitted
5555
if (data.readableBytes() == 0 && fieldNode.getLength() != 0) {
5656
data.release();
57-
allocateNew(fieldNode.getLength());
58-
int n = getSizeFromCount(fieldNode.getLength());
57+
int count = fieldNode.getLength();
58+
allocateNew(count);
59+
int n = getSizeFromCount(count);
5960
if (fieldNode.getNullCount() == 0) {
6061
// all defined
6162
// create an all 1s buffer
62-
for (int i = 0; i < n; ++i) {
63+
// set full bytes
64+
int fullBytesCount = count / 8;
65+
for (int i = 0; i < fullBytesCount; ++i) {
6366
this.data.setByte(i, 0xFF);
6467
}
68+
int remainder = count % 8;
69+
// set remaining bits
70+
if (remainder > 0) {
71+
byte bitMask = (byte) (0xFFL >>> ((8 - remainder) & 7));;
72+
this.data.setByte(fullBytesCount, bitMask);
73+
}
6574
} else if (fieldNode.getNullCount() == fieldNode.getLength()) {
6675
// all null
6776
// create an all 0s buffer
68-
for (int i = 0; i < n; ++i) {
69-
this.data.setByte(i, 0x00);
70-
}
77+
zeroVector();
7178
} else {
7279
throw new IllegalArgumentException("The buffer can be empty only if there's no data or it's all null or all defined");
7380
}

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

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919

2020
import static java.util.Arrays.asList;
2121
import static org.junit.Assert.assertEquals;
22-
import static org.junit.Assert.assertNotNull;
23-
import static org.junit.Assert.assertNull;
22+
import static org.junit.Assert.assertFalse;
23+
import static org.junit.Assert.assertTrue;
2424

2525
import java.io.IOException;
2626
import java.util.Collections;
@@ -128,17 +128,30 @@ public void testLoadEmptyValidityBuffer() throws IOException {
128128

129129
vectorLoader.load(recordBatch);
130130

131-
FieldReader intDefinedReader = newRoot.getVector("intDefined").getReader();
132-
FieldReader intNullReader = newRoot.getVector("intNull").getReader();
131+
NullableIntVector intDefinedVector = (NullableIntVector)newRoot.getVector("intDefined");
132+
NullableIntVector intNullVector = (NullableIntVector)newRoot.getVector("intNull");
133133
for (int i = 0; i < count; i++) {
134-
intDefinedReader.setPosition(i);
135-
intNullReader.setPosition(i);
136-
Integer defined = intDefinedReader.readInteger();
137-
assertNotNull("#" + i, defined);
138-
assertEquals("#" + i, i, defined.intValue());
139-
Integer nullVal = intNullReader.readInteger();
140-
assertNull("#" + i, nullVal);
134+
assertFalse("#" + i, intDefinedVector.getAccessor().isNull(i));
135+
assertEquals("#" + i, i, intDefinedVector.getAccessor().get(i));
136+
assertTrue("#" + i, intNullVector.getAccessor().isNull(i));
141137
}
138+
intDefinedVector.getMutator().setSafe(count + 10, 1234);
139+
assertTrue(intDefinedVector.getAccessor().isNull(count + 1));
140+
// empty slots should still default to unset
141+
intDefinedVector.getMutator().setSafe(count + 1, 789);
142+
assertFalse(intDefinedVector.getAccessor().isNull(count + 1));
143+
assertEquals(789, intDefinedVector.getAccessor().get(count + 1));
144+
assertTrue(intDefinedVector.getAccessor().isNull(count));
145+
assertTrue(intDefinedVector.getAccessor().isNull(count + 2));
146+
assertTrue(intDefinedVector.getAccessor().isNull(count + 3));
147+
assertTrue(intDefinedVector.getAccessor().isNull(count + 4));
148+
assertTrue(intDefinedVector.getAccessor().isNull(count + 5));
149+
assertTrue(intDefinedVector.getAccessor().isNull(count + 6));
150+
assertTrue(intDefinedVector.getAccessor().isNull(count + 7));
151+
assertTrue(intDefinedVector.getAccessor().isNull(count + 8));
152+
assertTrue(intDefinedVector.getAccessor().isNull(count + 9));
153+
assertFalse(intDefinedVector.getAccessor().isNull(count + 10));
154+
assertEquals(1234, intDefinedVector.getAccessor().get(count + 10));
142155
} finally {
143156
values.release();
144157
}

0 commit comments

Comments
 (0)