Skip to content

Commit daf2e01

Browse files
VamsiPindikura Ravindra
authored andcommitted
ARROW-8646: [Java] Allow UnionListWriter to write null values
Closes apache#7070 from tvamsikalyan/master Authored-by: Vamsi <vamsi@dremio.com> Signed-off-by: Pindikura Ravindra <ravindra@dremio.com>
1 parent 1f175e1 commit daf2e01

4 files changed

Lines changed: 81 additions & 0 deletions

File tree

‎java/vector/src/main/codegen/templates/UnionFixedSizeListWriter.java‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,11 @@ public void write(DecimalHolder holder) {
181181
writer.setPosition(writer.idx() + 1);
182182
}
183183
184+
@Override
185+
public void writeNull() {
186+
writer.setPosition(writer.idx()+1);
187+
}
188+
184189
public void writeDecimal(int start, ArrowBuf buffer, ArrowType arrowType) {
185190
if (writer.idx() >= (idx() + 1) * listSize) {
186191
throw new IllegalStateException(String.format("values at index %s is greater than listSize %s", idx(), listSize));

‎java/vector/src/main/codegen/templates/UnionListWriter.java‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,11 @@ public void write(DecimalHolder holder) {
178178
writer.setPosition(writer.idx()+1);
179179
}
180180

181+
@Override
182+
public void writeNull() {
183+
writer.setPosition(writer.idx()+1);
184+
}
185+
181186
public void writeDecimal(int start, ArrowBuf buffer, ArrowType arrowType) {
182187
writer.writeDecimal(start, buffer, arrowType);
183188
writer.setPosition(writer.idx()+1);

‎java/vector/src/test/java/org/apache/arrow/vector/TestFixedSizeListVector.java‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,38 @@ public void testConsistentChildName() throws Exception {
240240
}
241241
}
242242

243+
@Test
244+
public void testUnionFixedSizeListWriterWithNulls() throws Exception {
245+
/* Write to a decimal list vector
246+
* each list of size 3 and having its data values alternating between null and a non-null.
247+
* Read and verify
248+
*/
249+
try (final FixedSizeListVector vector = FixedSizeListVector.empty("vector", /*listSize=*/3, allocator)) {
250+
251+
UnionFixedSizeListWriter writer = vector.getWriter();
252+
writer.allocate();
253+
254+
final int valueCount = 100;
255+
256+
for (int i = 0; i < valueCount; i++) {
257+
writer.startList();
258+
writer.decimal().writeDecimal(new BigDecimal(i));
259+
writer.writeNull();
260+
writer.decimal().writeDecimal(new BigDecimal(i * 3));
261+
writer.endList();
262+
}
263+
vector.setValueCount(valueCount);
264+
265+
for (int i = 0; i < valueCount; i++) {
266+
List<BigDecimal> values = (List<BigDecimal>) vector.getObject(i);
267+
assertEquals(3, values.size());
268+
assertEquals(new BigDecimal(i), values.get(0));
269+
assertEquals(null, values.get(1));
270+
assertEquals(new BigDecimal(i * 3), values.get(2));
271+
}
272+
}
273+
}
274+
243275
@Test
244276
public void testUnionFixedSizeListWriter() throws Exception {
245277
try (final FixedSizeListVector vector1 = FixedSizeListVector.empty("vector", 3, allocator)) {

‎java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java‎

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,45 @@ public void listScalarType() {
266266
}
267267
}
268268

269+
@Test
270+
public void testListScalarNull() {
271+
/* Write to a integer list vector
272+
* each list of size 8 and having it's data values alternating between null and a non-null.
273+
* Read and verify
274+
*/
275+
try (ListVector listVector = ListVector.empty("list", allocator)) {
276+
listVector.allocateNew();
277+
UnionListWriter listWriter = new UnionListWriter(listVector);
278+
for (int i = 0; i < COUNT; i++) {
279+
listWriter.startList();
280+
for (int j = 0; j < i % 7; j++) {
281+
if (j % 2 == 0) {
282+
listWriter.writeNull();
283+
} else {
284+
IntHolder holder = new IntHolder();
285+
holder.value = j;
286+
listWriter.write(holder);
287+
}
288+
}
289+
listWriter.endList();
290+
}
291+
listWriter.setValueCount(COUNT);
292+
UnionListReader listReader = new UnionListReader(listVector);
293+
for (int i = 0; i < COUNT; i++) {
294+
listReader.setPosition(i);
295+
for (int j = 0; j < i % 7; j++) {
296+
listReader.next();
297+
if (j % 2 == 0) {
298+
assertFalse("index is set: " + j, listReader.reader().isSet());
299+
} else {
300+
assertTrue("index is not set: " + j, listReader.reader().isSet());
301+
assertEquals(j, listReader.reader().readInteger().intValue());
302+
}
303+
}
304+
}
305+
}
306+
}
307+
269308
@Test
270309
public void listDecimalType() {
271310
try (ListVector listVector = ListVector.empty("list", allocator)) {

0 commit comments

Comments
 (0)