2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 package org
.apache
.arrow
.vector
.complex
.writer
;
20 import static org
.junit
.Assert
.*;
22 import java
.math
.BigDecimal
;
23 import java
.time
.LocalDateTime
;
24 import java
.util
.HashSet
;
25 import java
.util
.List
;
28 import org
.apache
.arrow
.memory
.ArrowBuf
;
29 import org
.apache
.arrow
.memory
.BufferAllocator
;
30 import org
.apache
.arrow
.memory
.RootAllocator
;
31 import org
.apache
.arrow
.util
.AutoCloseables
;
32 import org
.apache
.arrow
.vector
.BigIntVector
;
33 import org
.apache
.arrow
.vector
.DecimalVector
;
34 import org
.apache
.arrow
.vector
.Float4Vector
;
35 import org
.apache
.arrow
.vector
.Float8Vector
;
36 import org
.apache
.arrow
.vector
.IntVector
;
37 import org
.apache
.arrow
.vector
.SchemaChangeCallBack
;
38 import org
.apache
.arrow
.vector
.complex
.ListVector
;
39 import org
.apache
.arrow
.vector
.complex
.MapVector
;
40 import org
.apache
.arrow
.vector
.complex
.NonNullableStructVector
;
41 import org
.apache
.arrow
.vector
.complex
.StructVector
;
42 import org
.apache
.arrow
.vector
.complex
.UnionVector
;
43 import org
.apache
.arrow
.vector
.complex
.impl
.ComplexWriterImpl
;
44 import org
.apache
.arrow
.vector
.complex
.impl
.SingleStructReaderImpl
;
45 import org
.apache
.arrow
.vector
.complex
.impl
.SingleStructWriter
;
46 import org
.apache
.arrow
.vector
.complex
.impl
.UnionListReader
;
47 import org
.apache
.arrow
.vector
.complex
.impl
.UnionListWriter
;
48 import org
.apache
.arrow
.vector
.complex
.impl
.UnionMapReader
;
49 import org
.apache
.arrow
.vector
.complex
.impl
.UnionReader
;
50 import org
.apache
.arrow
.vector
.complex
.impl
.UnionWriter
;
51 import org
.apache
.arrow
.vector
.complex
.reader
.BaseReader
.StructReader
;
52 import org
.apache
.arrow
.vector
.complex
.reader
.BigIntReader
;
53 import org
.apache
.arrow
.vector
.complex
.reader
.FieldReader
;
54 import org
.apache
.arrow
.vector
.complex
.reader
.Float4Reader
;
55 import org
.apache
.arrow
.vector
.complex
.reader
.Float8Reader
;
56 import org
.apache
.arrow
.vector
.complex
.reader
.IntReader
;
57 import org
.apache
.arrow
.vector
.complex
.writer
.BaseWriter
.ComplexWriter
;
58 import org
.apache
.arrow
.vector
.complex
.writer
.BaseWriter
.ListWriter
;
59 import org
.apache
.arrow
.vector
.complex
.writer
.BaseWriter
.MapWriter
;
60 import org
.apache
.arrow
.vector
.complex
.writer
.BaseWriter
.StructWriter
;
61 import org
.apache
.arrow
.vector
.holders
.DecimalHolder
;
62 import org
.apache
.arrow
.vector
.holders
.IntHolder
;
63 import org
.apache
.arrow
.vector
.holders
.NullableTimeStampNanoTZHolder
;
64 import org
.apache
.arrow
.vector
.types
.pojo
.ArrowType
;
65 import org
.apache
.arrow
.vector
.types
.pojo
.ArrowType
.ArrowTypeID
;
66 import org
.apache
.arrow
.vector
.types
.pojo
.ArrowType
.Int
;
67 import org
.apache
.arrow
.vector
.types
.pojo
.ArrowType
.Struct
;
68 import org
.apache
.arrow
.vector
.types
.pojo
.ArrowType
.Timestamp
;
69 import org
.apache
.arrow
.vector
.types
.pojo
.ArrowType
.Union
;
70 import org
.apache
.arrow
.vector
.types
.pojo
.ArrowType
.Utf8
;
71 import org
.apache
.arrow
.vector
.types
.pojo
.Field
;
72 import org
.apache
.arrow
.vector
.types
.pojo
.FieldType
;
73 import org
.apache
.arrow
.vector
.util
.CallBack
;
74 import org
.apache
.arrow
.vector
.util
.DecimalUtility
;
75 import org
.apache
.arrow
.vector
.util
.JsonStringArrayList
;
76 import org
.apache
.arrow
.vector
.util
.JsonStringHashMap
;
77 import org
.apache
.arrow
.vector
.util
.Text
;
78 import org
.apache
.arrow
.vector
.util
.TransferPair
;
79 import org
.junit
.After
;
80 import org
.junit
.Assert
;
81 import org
.junit
.Before
;
82 import org
.junit
.Test
;
84 public class TestComplexWriter
{
86 private BufferAllocator allocator
;
88 private static final int COUNT
= 100;
92 allocator
= new RootAllocator(Integer
.MAX_VALUE
);
96 public void terminate() throws Exception
{
101 public void simpleNestedTypes() {
102 NonNullableStructVector parent
= populateStructVector(null);
103 StructReader rootReader
= new SingleStructReaderImpl(parent
).reader("root");
104 for (int i
= 0; i
< COUNT
; i
++) {
105 rootReader
.setPosition(i
);
106 Assert
.assertEquals(i
, rootReader
.reader("int").readInteger().intValue());
107 Assert
.assertEquals(i
, rootReader
.reader("bigInt").readLong().longValue());
114 public void transferPairSchemaChange() {
115 SchemaChangeCallBack callBack1
= new SchemaChangeCallBack();
116 SchemaChangeCallBack callBack2
= new SchemaChangeCallBack();
117 try (NonNullableStructVector parent
= populateStructVector(callBack1
)) {
118 TransferPair tp
= parent
.getTransferPair("newVector", allocator
, callBack2
);
120 ComplexWriter writer
= new ComplexWriterImpl("newWriter", parent
);
121 StructWriter rootWriter
= writer
.rootAsStruct();
122 IntWriter intWriter
= rootWriter
.integer("newInt");
123 intWriter
.writeInt(1);
124 writer
.setValueCount(1);
126 assertTrue(callBack1
.getSchemaChangedAndReset());
127 // The second vector should not have registered a schema change
128 assertFalse(callBack1
.getSchemaChangedAndReset());
132 private NonNullableStructVector
populateStructVector(CallBack callBack
) {
133 NonNullableStructVector parent
=
134 new NonNullableStructVector("parent", allocator
, new FieldType(false, Struct
.INSTANCE
, null, null), callBack
);
135 ComplexWriter writer
= new ComplexWriterImpl("root", parent
);
136 StructWriter rootWriter
= writer
.rootAsStruct();
137 IntWriter intWriter
= rootWriter
.integer("int");
138 BigIntWriter bigIntWriter
= rootWriter
.bigInt("bigInt");
139 for (int i
= 0; i
< COUNT
; i
++) {
141 intWriter
.writeInt(i
);
142 bigIntWriter
.writeBigInt(i
);
145 writer
.setValueCount(COUNT
);
150 public void nullableStruct() {
151 try (NonNullableStructVector structVector
= NonNullableStructVector
.empty("parent", allocator
)) {
152 ComplexWriter writer
= new ComplexWriterImpl("root", structVector
);
153 StructWriter rootWriter
= writer
.rootAsStruct();
154 for (int i
= 0; i
< COUNT
; i
++) {
157 StructWriter structWriter
= rootWriter
.struct("struct");
158 structWriter
.setPosition(i
);
159 structWriter
.start();
160 structWriter
.bigInt("nested").writeBigInt(i
);
165 writer
.setValueCount(COUNT
);
166 checkNullableStruct(structVector
);
171 * This test is similar to {@link #nullableStruct()} ()} but we get the inner struct writer once at the beginning.
174 public void nullableStruct2() {
175 try (NonNullableStructVector structVector
= NonNullableStructVector
.empty("parent", allocator
)) {
176 ComplexWriter writer
= new ComplexWriterImpl("root", structVector
);
177 StructWriter rootWriter
= writer
.rootAsStruct();
178 StructWriter structWriter
= rootWriter
.struct("struct");
180 for (int i
= 0; i
< COUNT
; i
++) {
183 structWriter
.setPosition(i
);
184 structWriter
.start();
185 structWriter
.bigInt("nested").writeBigInt(i
);
190 writer
.setValueCount(COUNT
);
191 checkNullableStruct(structVector
);
195 private void checkNullableStruct(NonNullableStructVector structVector
) {
196 StructReader rootReader
= new SingleStructReaderImpl(structVector
).reader("root");
197 for (int i
= 0; i
< COUNT
; i
++) {
198 rootReader
.setPosition(i
);
199 assertTrue("index is set: " + i
, rootReader
.isSet());
200 FieldReader struct
= rootReader
.reader("struct");
202 assertTrue("index is set: " + i
, struct
.isSet());
203 assertNotNull("index is set: " + i
, struct
.readObject());
204 assertEquals(i
, struct
.reader("nested").readLong().longValue());
206 assertFalse("index is not set: " + i
, struct
.isSet());
207 assertNull("index is not set: " + i
, struct
.readObject());
213 public void testList() {
214 try (NonNullableStructVector parent
= NonNullableStructVector
.empty("parent", allocator
)) {
215 ComplexWriter writer
= new ComplexWriterImpl("root", parent
);
216 StructWriter rootWriter
= writer
.rootAsStruct();
219 rootWriter
.bigInt("int").writeBigInt(0);
220 rootWriter
.list("list").startList();
221 rootWriter
.list("list").bigInt().writeBigInt(0);
222 rootWriter
.list("list").endList();
226 rootWriter
.bigInt("int").writeBigInt(1);
229 writer
.setValueCount(2);
231 StructReader rootReader
= new SingleStructReaderImpl(parent
).reader("root");
233 rootReader
.setPosition(0);
234 assertTrue("row 0 list is not set", rootReader
.reader("list").isSet());
235 assertEquals(Long
.valueOf(0), rootReader
.reader("list").reader().readLong());
237 rootReader
.setPosition(1);
238 assertFalse("row 1 list is set", rootReader
.reader("list").isSet());
243 public void listScalarType() {
244 try (ListVector listVector
= ListVector
.empty("list", allocator
)) {
245 listVector
.allocateNew();
246 UnionListWriter listWriter
= new UnionListWriter(listVector
);
247 for (int i
= 0; i
< COUNT
; i
++) {
248 listWriter
.startList();
249 for (int j
= 0; j
< i
% 7; j
++) {
251 listWriter
.writeInt(j
);
253 IntHolder holder
= new IntHolder();
255 listWriter
.write(holder
);
258 listWriter
.endList();
260 listWriter
.setValueCount(COUNT
);
261 UnionListReader listReader
= new UnionListReader(listVector
);
262 for (int i
= 0; i
< COUNT
; i
++) {
263 listReader
.setPosition(i
);
264 for (int j
= 0; j
< i
% 7; j
++) {
266 assertEquals(j
, listReader
.reader().readInteger().intValue());
273 public void testListScalarNull() {
274 /* Write to a integer list vector
275 * each list of size 8 and having it's data values alternating between null and a non-null.
278 try (ListVector listVector
= ListVector
.empty("list", allocator
)) {
279 listVector
.allocateNew();
280 UnionListWriter listWriter
= new UnionListWriter(listVector
);
281 for (int i
= 0; i
< COUNT
; i
++) {
282 listWriter
.startList();
283 for (int j
= 0; j
< i
% 7; j
++) {
285 listWriter
.writeNull();
287 IntHolder holder
= new IntHolder();
289 listWriter
.write(holder
);
292 listWriter
.endList();
294 listWriter
.setValueCount(COUNT
);
295 UnionListReader listReader
= new UnionListReader(listVector
);
296 for (int i
= 0; i
< COUNT
; i
++) {
297 listReader
.setPosition(i
);
298 for (int j
= 0; j
< i
% 7; j
++) {
301 assertFalse("index is set: " + j
, listReader
.reader().isSet());
303 assertTrue("index is not set: " + j
, listReader
.reader().isSet());
304 assertEquals(j
, listReader
.reader().readInteger().intValue());
312 public void listDecimalType() {
313 try (ListVector listVector
= ListVector
.empty("list", allocator
)) {
314 listVector
.allocateNew();
315 UnionListWriter listWriter
= new UnionListWriter(listVector
);
316 DecimalHolder holder
= new DecimalHolder();
317 holder
.buffer
= allocator
.buffer(DecimalVector
.TYPE_WIDTH
);
318 ArrowType arrowType
= new ArrowType
.Decimal(10, 0, 128);
319 for (int i
= 0; i
< COUNT
; i
++) {
320 listWriter
.startList();
321 for (int j
= 0; j
< i
% 7; j
++) {
323 listWriter
.writeDecimal(new BigDecimal(j
));
324 } else if (j
% 4 == 1) {
325 DecimalUtility
.writeBigDecimalToArrowBuf(new BigDecimal(j
), holder
.buffer
, 0, DecimalVector
.TYPE_WIDTH
);
328 holder
.precision
= 10;
329 listWriter
.write(holder
);
330 } else if (j
% 4 == 2) {
331 DecimalUtility
.writeBigDecimalToArrowBuf(new BigDecimal(j
), holder
.buffer
, 0, DecimalVector
.TYPE_WIDTH
);
332 listWriter
.writeDecimal(0, holder
.buffer
, arrowType
);
334 byte[] value
= BigDecimal
.valueOf(j
).unscaledValue().toByteArray();
335 listWriter
.writeBigEndianBytesToDecimal(value
, arrowType
);
338 listWriter
.endList();
340 listWriter
.setValueCount(COUNT
);
341 UnionListReader listReader
= new UnionListReader(listVector
);
342 for (int i
= 0; i
< COUNT
; i
++) {
343 listReader
.setPosition(i
);
344 for (int j
= 0; j
< i
% 7; j
++) {
346 Object expected
= new BigDecimal(j
);
347 Object actual
= listReader
.reader().readBigDecimal();
348 assertEquals(expected
, actual
);
351 holder
.buffer
.close();
356 public void listScalarTypeNullable() {
357 try (ListVector listVector
= ListVector
.empty("list", allocator
)) {
358 listVector
.allocateNew();
359 UnionListWriter listWriter
= new UnionListWriter(listVector
);
360 for (int i
= 0; i
< COUNT
; i
++) {
362 listWriter
.setPosition(i
);
363 listWriter
.startList();
364 for (int j
= 0; j
< i
% 7; j
++) {
365 listWriter
.writeInt(j
);
367 listWriter
.endList();
370 listWriter
.setValueCount(COUNT
);
371 UnionListReader listReader
= new UnionListReader(listVector
);
372 for (int i
= 0; i
< COUNT
; i
++) {
373 listReader
.setPosition(i
);
375 assertTrue("index is set: " + i
, listReader
.isSet());
376 assertEquals("correct length at: " + i
, i
% 7, ((List
<?
>) listReader
.readObject()).size());
378 assertFalse("index is not set: " + i
, listReader
.isSet());
379 assertNull("index is not set: " + i
, listReader
.readObject());
386 public void listStructType() {
387 try (ListVector listVector
= ListVector
.empty("list", allocator
)) {
388 listVector
.allocateNew();
389 UnionListWriter listWriter
= new UnionListWriter(listVector
);
390 StructWriter structWriter
= listWriter
.struct();
391 for (int i
= 0; i
< COUNT
; i
++) {
392 listWriter
.startList();
393 for (int j
= 0; j
< i
% 7; j
++) {
394 structWriter
.start();
395 structWriter
.integer("int").writeInt(j
);
396 structWriter
.bigInt("bigInt").writeBigInt(j
);
399 listWriter
.endList();
401 listWriter
.setValueCount(COUNT
);
402 UnionListReader listReader
= new UnionListReader(listVector
);
403 for (int i
= 0; i
< COUNT
; i
++) {
404 listReader
.setPosition(i
);
405 for (int j
= 0; j
< i
% 7; j
++) {
407 Assert
.assertEquals("record: " + i
, j
, listReader
.reader().reader("int").readInteger().intValue());
408 Assert
.assertEquals(j
, listReader
.reader().reader("bigInt").readLong().longValue());
415 public void listListType() {
416 try (ListVector listVector
= ListVector
.empty("list", allocator
)) {
417 listVector
.allocateNew();
418 UnionListWriter listWriter
= new UnionListWriter(listVector
);
419 for (int i
= 0; i
< COUNT
; i
++) {
420 listWriter
.startList();
421 for (int j
= 0; j
< i
% 7; j
++) {
422 ListWriter innerListWriter
= listWriter
.list();
423 innerListWriter
.startList();
424 for (int k
= 0; k
< i
% 13; k
++) {
425 innerListWriter
.integer().writeInt(k
);
427 innerListWriter
.endList();
429 listWriter
.endList();
431 listWriter
.setValueCount(COUNT
);
432 checkListOfLists(listVector
);
437 * This test is similar to {@link #listListType()} but we get the inner list writer once at the beginning.
440 public void listListType2() {
441 try (ListVector listVector
= ListVector
.empty("list", allocator
)) {
442 listVector
.allocateNew();
443 UnionListWriter listWriter
= new UnionListWriter(listVector
);
444 ListWriter innerListWriter
= listWriter
.list();
446 for (int i
= 0; i
< COUNT
; i
++) {
447 listWriter
.startList();
448 for (int j
= 0; j
< i
% 7; j
++) {
449 innerListWriter
.startList();
450 for (int k
= 0; k
< i
% 13; k
++) {
451 innerListWriter
.integer().writeInt(k
);
453 innerListWriter
.endList();
455 listWriter
.endList();
457 listWriter
.setValueCount(COUNT
);
458 checkListOfLists(listVector
);
462 private void checkListOfLists(final ListVector listVector
) {
463 UnionListReader listReader
= new UnionListReader(listVector
);
464 for (int i
= 0; i
< COUNT
; i
++) {
465 listReader
.setPosition(i
);
466 for (int j
= 0; j
< i
% 7; j
++) {
468 FieldReader innerListReader
= listReader
.reader();
469 for (int k
= 0; k
< i
% 13; k
++) {
470 innerListReader
.next();
471 Assert
.assertEquals("record: " + i
, k
, innerListReader
.reader().readInteger().intValue());
478 public void unionListListType() {
479 try (ListVector listVector
= ListVector
.empty("list", allocator
)) {
480 listVector
.allocateNew();
481 UnionListWriter listWriter
= new UnionListWriter(listVector
);
482 for (int i
= 0; i
< COUNT
; i
++) {
483 listWriter
.startList();
484 for (int j
= 0; j
< i
% 7; j
++) {
485 ListWriter innerListWriter
= listWriter
.list();
486 innerListWriter
.startList();
487 for (int k
= 0; k
< i
% 13; k
++) {
489 innerListWriter
.integer().writeInt(k
);
491 innerListWriter
.bigInt().writeBigInt(k
);
494 innerListWriter
.endList();
496 listWriter
.endList();
498 listWriter
.setValueCount(COUNT
);
499 checkUnionList(listVector
);
504 * This test is similar to {@link #unionListListType()} but we get the inner list writer once at the beginning.
507 public void unionListListType2() {
508 try (ListVector listVector
= ListVector
.empty("list", allocator
)) {
509 listVector
.allocateNew();
510 UnionListWriter listWriter
= new UnionListWriter(listVector
);
511 ListWriter innerListWriter
= listWriter
.list();
513 for (int i
= 0; i
< COUNT
; i
++) {
514 listWriter
.startList();
515 for (int j
= 0; j
< i
% 7; j
++) {
516 innerListWriter
.startList();
517 for (int k
= 0; k
< i
% 13; k
++) {
519 innerListWriter
.integer().writeInt(k
);
521 innerListWriter
.bigInt().writeBigInt(k
);
524 innerListWriter
.endList();
526 listWriter
.endList();
528 listWriter
.setValueCount(COUNT
);
529 checkUnionList(listVector
);
533 private void checkUnionList(ListVector listVector
) {
534 UnionListReader listReader
= new UnionListReader(listVector
);
535 for (int i
= 0; i
< COUNT
; i
++) {
536 listReader
.setPosition(i
);
537 for (int j
= 0; j
< i
% 7; j
++) {
539 FieldReader innerListReader
= listReader
.reader();
540 for (int k
= 0; k
< i
% 13; k
++) {
541 innerListReader
.next();
543 Assert
.assertEquals("record: " + i
, k
, innerListReader
.reader().readInteger().intValue());
545 Assert
.assertEquals("record: " + i
, k
, innerListReader
.reader().readLong().longValue());
553 public void testListMapType() {
554 try (ListVector listVector
= ListVector
.empty("list", allocator
)) {
555 listVector
.allocateNew();
556 UnionListWriter listWriter
= new UnionListWriter(listVector
);
557 MapWriter innerMapWriter
= listWriter
.map(true);
559 for (int i
= 0; i
< COUNT
; i
++) {
560 listWriter
.startList();
561 for (int j
= 0; j
< i
% 7; j
++) {
562 innerMapWriter
.startMap();
563 for (int k
= 0; k
< i
% 13; k
++) {
564 innerMapWriter
.startEntry();
565 innerMapWriter
.key().integer().writeInt(k
);
567 innerMapWriter
.value().bigInt().writeBigInt(k
);
569 innerMapWriter
.endEntry();
571 innerMapWriter
.endMap();
573 listWriter
.endList();
575 listWriter
.setValueCount(COUNT
);
576 checkListMap(listVector
);
578 // Verify that the map vector has keysSorted = true
579 MapVector mapVector
= (MapVector
) listVector
.getDataVector();
580 ArrowType arrowType
= mapVector
.getField().getFieldType().getType();
581 assertTrue(((ArrowType
.Map
) arrowType
).getKeysSorted());
585 private void checkListMap(ListVector listVector
) {
586 UnionListReader listReader
= new UnionListReader(listVector
);
587 for (int i
= 0; i
< COUNT
; i
++) {
588 listReader
.setPosition(i
);
589 for (int j
= 0; j
< i
% 7; j
++) {
591 UnionMapReader mapReader
= (UnionMapReader
) listReader
.reader();
592 for (int k
= 0; k
< i
% 13; k
++) {
594 Assert
.assertEquals("record key: " + i
, k
, mapReader
.key().readInteger().intValue());
596 Assert
.assertEquals("record value: " + i
, k
, mapReader
.value().readLong().longValue());
598 Assert
.assertNull("record value: " + i
, mapReader
.value().readLong());
606 public void simpleUnion() {
607 UnionVector vector
= new UnionVector("union", allocator
, /* field type */ null, /* call-back */ null);
608 UnionWriter unionWriter
= new UnionWriter(vector
);
609 unionWriter
.allocate();
610 for (int i
= 0; i
< COUNT
; i
++) {
611 unionWriter
.setPosition(i
);
613 unionWriter
.writeInt(i
);
615 unionWriter
.writeFloat4((float) i
);
618 vector
.setValueCount(COUNT
);
619 UnionReader unionReader
= new UnionReader(vector
);
620 for (int i
= 0; i
< COUNT
; i
++) {
621 unionReader
.setPosition(i
);
623 Assert
.assertEquals(i
, i
, unionReader
.readInteger());
625 Assert
.assertEquals((float) i
, unionReader
.readFloat(), 1e-12);
632 public void promotableWriter() {
633 try (NonNullableStructVector parent
= NonNullableStructVector
.empty("parent", allocator
)) {
635 ComplexWriter writer
= new ComplexWriterImpl("root", parent
);
636 StructWriter rootWriter
= writer
.rootAsStruct();
637 for (int i
= 0; i
< 100; i
++) {
638 BigIntWriter bigIntWriter
= rootWriter
.bigInt("a");
639 bigIntWriter
.setPosition(i
);
640 bigIntWriter
.writeBigInt(i
);
642 Field field
= parent
.getField().getChildren().get(0).getChildren().get(0);
643 Assert
.assertEquals("a", field
.getName());
644 Assert
.assertEquals(Int
.TYPE_TYPE
, field
.getType().getTypeID());
645 Int intType
= (Int
) field
.getType();
647 Assert
.assertEquals(64, intType
.getBitWidth());
648 Assert
.assertTrue(intType
.getIsSigned());
649 for (int i
= 100; i
< 200; i
++) {
650 VarCharWriter varCharWriter
= rootWriter
.varChar("a");
651 varCharWriter
.setPosition(i
);
652 byte[] bytes
= Integer
.toString(i
).getBytes();
653 ArrowBuf tempBuf
= allocator
.buffer(bytes
.length
);
654 tempBuf
.setBytes(0, bytes
);
655 varCharWriter
.writeVarChar(0, bytes
.length
, tempBuf
);
658 field
= parent
.getField().getChildren().get(0).getChildren().get(0);
659 Assert
.assertEquals("a", field
.getName());
660 Assert
.assertEquals(Union
.TYPE_TYPE
, field
.getType().getTypeID());
661 Assert
.assertEquals(Int
.TYPE_TYPE
, field
.getChildren().get(0).getType().getTypeID());
662 Assert
.assertEquals(Utf8
.TYPE_TYPE
, field
.getChildren().get(1).getType().getTypeID());
663 StructReader rootReader
= new SingleStructReaderImpl(parent
).reader("root");
664 for (int i
= 0; i
< 100; i
++) {
665 rootReader
.setPosition(i
);
666 FieldReader reader
= rootReader
.reader("a");
667 Long value
= reader
.readLong();
668 Assert
.assertNotNull("index: " + i
, value
);
669 Assert
.assertEquals(i
, value
.intValue());
671 for (int i
= 100; i
< 200; i
++) {
672 rootReader
.setPosition(i
);
673 FieldReader reader
= rootReader
.reader("a");
674 Text value
= reader
.readText();
675 Assert
.assertEquals(Integer
.toString(i
), value
.toString());
681 * Even without writing to the writer, the union schema is created correctly.
684 public void promotableWriterSchema() {
685 try (NonNullableStructVector parent
= NonNullableStructVector
.empty("parent", allocator
)) {
686 ComplexWriter writer
= new ComplexWriterImpl("root", parent
);
687 StructWriter rootWriter
= writer
.rootAsStruct();
688 rootWriter
.bigInt("a");
689 rootWriter
.varChar("a");
691 Field field
= parent
.getField().getChildren().get(0).getChildren().get(0);
692 Assert
.assertEquals("a", field
.getName());
693 Assert
.assertEquals(ArrowTypeID
.Union
, field
.getType().getTypeID());
695 Assert
.assertEquals(ArrowTypeID
.Int
, field
.getChildren().get(0).getType().getTypeID());
696 Int intType
= (Int
) field
.getChildren().get(0).getType();
697 Assert
.assertEquals(64, intType
.getBitWidth());
698 Assert
.assertTrue(intType
.getIsSigned());
699 Assert
.assertEquals(ArrowTypeID
.Utf8
, field
.getChildren().get(1).getType().getTypeID());
703 private Set
<String
> getFieldNames(List
<Field
> fields
) {
704 Set
<String
> fieldNames
= new HashSet
<>();
705 for (Field field
: fields
) {
706 fieldNames
.add(field
.getName());
707 if (!field
.getChildren().isEmpty()) {
708 for (String name
: getFieldNames(field
.getChildren())) {
709 fieldNames
.add(field
.getName() + "::" + name
);
717 public void structWriterMixedCaseFieldNames() {
718 try (NonNullableStructVector parent
= NonNullableStructVector
.empty("parent", allocator
)) {
719 // test case-sensitive StructWriter
720 ComplexWriter writer
= new ComplexWriterImpl("rootCaseSensitive", parent
, false, true);
721 StructWriter rootWriterCaseSensitive
= writer
.rootAsStruct();
722 rootWriterCaseSensitive
.bigInt("int_field");
723 rootWriterCaseSensitive
.bigInt("Int_Field");
724 rootWriterCaseSensitive
.float4("float_field");
725 rootWriterCaseSensitive
.float4("Float_Field");
726 StructWriter structFieldWriterCaseSensitive
= rootWriterCaseSensitive
.struct("struct_field");
727 structFieldWriterCaseSensitive
.varChar("char_field");
728 structFieldWriterCaseSensitive
.varChar("Char_Field");
729 ListWriter listFieldWriterCaseSensitive
= rootWriterCaseSensitive
.list("list_field");
730 StructWriter listStructFieldWriterCaseSensitive
= listFieldWriterCaseSensitive
.struct();
731 listStructFieldWriterCaseSensitive
.bit("bit_field");
732 listStructFieldWriterCaseSensitive
.bit("Bit_Field");
734 List
<Field
> fieldsCaseSensitive
= parent
.getField().getChildren().get(0).getChildren();
735 Set
<String
> fieldNamesCaseSensitive
= getFieldNames(fieldsCaseSensitive
);
736 Assert
.assertEquals(11, fieldNamesCaseSensitive
.size());
737 Assert
.assertTrue(fieldNamesCaseSensitive
.contains("int_field"));
738 Assert
.assertTrue(fieldNamesCaseSensitive
.contains("Int_Field"));
739 Assert
.assertTrue(fieldNamesCaseSensitive
.contains("float_field"));
740 Assert
.assertTrue(fieldNamesCaseSensitive
.contains("Float_Field"));
741 Assert
.assertTrue(fieldNamesCaseSensitive
.contains("struct_field"));
742 Assert
.assertTrue(fieldNamesCaseSensitive
.contains("struct_field::char_field"));
743 Assert
.assertTrue(fieldNamesCaseSensitive
.contains("struct_field::Char_Field"));
744 Assert
.assertTrue(fieldNamesCaseSensitive
.contains("list_field"));
745 Assert
.assertTrue(fieldNamesCaseSensitive
.contains("list_field::$data$"));
746 Assert
.assertTrue(fieldNamesCaseSensitive
.contains("list_field::$data$::bit_field"));
747 Assert
.assertTrue(fieldNamesCaseSensitive
.contains("list_field::$data$::Bit_Field"));
749 // test case-insensitive StructWriter
750 ComplexWriter writerCaseInsensitive
= new ComplexWriterImpl("rootCaseInsensitive", parent
, false, false);
751 StructWriter rootWriterCaseInsensitive
= writerCaseInsensitive
.rootAsStruct();
753 rootWriterCaseInsensitive
.bigInt("int_field");
754 rootWriterCaseInsensitive
.bigInt("Int_Field");
755 rootWriterCaseInsensitive
.float4("float_field");
756 rootWriterCaseInsensitive
.float4("Float_Field");
757 StructWriter structFieldWriterCaseInsensitive
= rootWriterCaseInsensitive
.struct("struct_field");
758 structFieldWriterCaseInsensitive
.varChar("char_field");
759 structFieldWriterCaseInsensitive
.varChar("Char_Field");
760 ListWriter listFieldWriterCaseInsensitive
= rootWriterCaseInsensitive
.list("list_field");
761 StructWriter listStructFieldWriterCaseInsensitive
= listFieldWriterCaseInsensitive
.struct();
762 listStructFieldWriterCaseInsensitive
.bit("bit_field");
763 listStructFieldWriterCaseInsensitive
.bit("Bit_Field");
765 List
<Field
> fieldsCaseInsensitive
= parent
.getField().getChildren().get(1).getChildren();
766 Set
<String
> fieldNamesCaseInsensitive
= getFieldNames(fieldsCaseInsensitive
);
767 Assert
.assertEquals(7, fieldNamesCaseInsensitive
.size());
768 Assert
.assertTrue(fieldNamesCaseInsensitive
.contains("int_field"));
769 Assert
.assertTrue(fieldNamesCaseInsensitive
.contains("float_field"));
770 Assert
.assertTrue(fieldNamesCaseInsensitive
.contains("struct_field"));
771 Assert
.assertTrue(fieldNamesCaseInsensitive
.contains("struct_field::char_field"));
772 Assert
.assertTrue(fieldNamesCaseSensitive
.contains("list_field"));
773 Assert
.assertTrue(fieldNamesCaseSensitive
.contains("list_field::$data$"));
774 Assert
.assertTrue(fieldNamesCaseSensitive
.contains("list_field::$data$::bit_field"));
779 public void timeStampSecWriter() throws Exception
{
781 final long expectedSecs
= 981173106L;
782 final LocalDateTime expectedSecDateTime
= LocalDateTime
.of(2001, 2, 3, 4, 5, 6, 0);
784 try (NonNullableStructVector parent
= NonNullableStructVector
.empty("parent", allocator
)) {
787 ComplexWriter writer
= new ComplexWriterImpl("root", parent
);
788 StructWriter rootWriter
= writer
.rootAsStruct();
791 TimeStampSecWriter timeStampSecWriter
= rootWriter
.timeStampSec("sec");
792 timeStampSecWriter
.setPosition(0);
793 timeStampSecWriter
.writeTimeStampSec(expectedSecs
);
796 TimeStampSecTZWriter timeStampSecTZWriter
= rootWriter
.timeStampSecTZ("secTZ", "UTC");
797 timeStampSecTZWriter
.setPosition(1);
798 timeStampSecTZWriter
.writeTimeStampSecTZ(expectedSecs
);
801 List
<Field
> children
= parent
.getField().getChildren().get(0).getChildren();
802 checkTimestampField(children
.get(0), "sec");
803 checkTimestampTZField(children
.get(1), "secTZ", "UTC");
806 StructReader rootReader
= new SingleStructReaderImpl(parent
).reader("root");
808 FieldReader secReader
= rootReader
.reader("sec");
809 secReader
.setPosition(0);
810 LocalDateTime secDateTime
= secReader
.readLocalDateTime();
811 Assert
.assertEquals(expectedSecDateTime
, secDateTime
);
812 long secLong
= secReader
.readLong();
813 Assert
.assertEquals(expectedSecs
, secLong
);
816 FieldReader secTZReader
= rootReader
.reader("secTZ");
817 secTZReader
.setPosition(1);
818 long secTZLong
= secTZReader
.readLong();
819 Assert
.assertEquals(expectedSecs
, secTZLong
);
825 public void timeStampMilliWriters() throws Exception
{
827 final long expectedMillis
= 981173106123L;
828 final LocalDateTime expectedMilliDateTime
= LocalDateTime
.of(2001, 2, 3, 4, 5, 6, 123 * 1_000_000
);
830 try (NonNullableStructVector parent
= NonNullableStructVector
.empty("parent", allocator
);) {
832 ComplexWriter writer
= new ComplexWriterImpl("root", parent
);
833 StructWriter rootWriter
= writer
.rootAsStruct();
835 TimeStampMilliWriter timeStampWriter
= rootWriter
.timeStampMilli("milli");
836 timeStampWriter
.setPosition(0);
837 timeStampWriter
.writeTimeStampMilli(expectedMillis
);
841 TimeStampMilliTZWriter timeStampTZWriter
= rootWriter
.timeStampMilliTZ("milliTZ", tz
);
842 timeStampTZWriter
.setPosition(0);
843 timeStampTZWriter
.writeTimeStampMilliTZ(expectedMillis
);
846 List
<Field
> children
= parent
.getField().getChildren().get(0).getChildren();
847 checkTimestampField(children
.get(0), "milli");
848 checkTimestampTZField(children
.get(1), "milliTZ", tz
);
851 StructReader rootReader
= new SingleStructReaderImpl(parent
).reader("root");
854 FieldReader milliReader
= rootReader
.reader("milli");
855 milliReader
.setPosition(0);
856 LocalDateTime milliDateTime
= milliReader
.readLocalDateTime();
857 Assert
.assertEquals(expectedMilliDateTime
, milliDateTime
);
858 long milliLong
= milliReader
.readLong();
859 Assert
.assertEquals(expectedMillis
, milliLong
);
862 FieldReader milliTZReader
= rootReader
.reader("milliTZ");
863 milliTZReader
.setPosition(0);
864 long milliTZLong
= milliTZReader
.readLong();
865 Assert
.assertEquals(expectedMillis
, milliTZLong
);
870 private void checkTimestampField(Field field
, String name
) {
871 Assert
.assertEquals(name
, field
.getName());
872 Assert
.assertEquals(ArrowType
.Timestamp
.TYPE_TYPE
, field
.getType().getTypeID());
875 private void checkTimestampTZField(Field field
, String name
, String tz
) {
876 checkTimestampField(field
, name
);
877 Assert
.assertEquals(tz
, ((Timestamp
) field
.getType()).getTimezone());
881 public void timeStampMicroWriters() throws Exception
{
883 final long expectedMicros
= 981173106123456L;
884 final LocalDateTime expectedMicroDateTime
= LocalDateTime
.of(2001, 2, 3, 4, 5, 6, 123456 * 1000);
886 try (NonNullableStructVector parent
= NonNullableStructVector
.empty("parent", allocator
)) {
888 ComplexWriter writer
= new ComplexWriterImpl("root", parent
);
889 StructWriter rootWriter
= writer
.rootAsStruct();
892 TimeStampMicroWriter timeStampMicroWriter
= rootWriter
.timeStampMicro("micro");
893 timeStampMicroWriter
.setPosition(0);
894 timeStampMicroWriter
.writeTimeStampMicro(expectedMicros
);
898 TimeStampMicroTZWriter timeStampMicroWriter
= rootWriter
.timeStampMicroTZ("microTZ", tz
);
899 timeStampMicroWriter
.setPosition(1);
900 timeStampMicroWriter
.writeTimeStampMicroTZ(expectedMicros
);
904 List
<Field
> children
= parent
.getField().getChildren().get(0).getChildren();
905 checkTimestampField(children
.get(0), "micro");
906 checkTimestampTZField(children
.get(1), "microTZ", tz
);
909 StructReader rootReader
= new SingleStructReaderImpl(parent
).reader("root");
911 FieldReader microReader
= rootReader
.reader("micro");
912 microReader
.setPosition(0);
913 LocalDateTime microDateTime
= microReader
.readLocalDateTime();
914 Assert
.assertEquals(expectedMicroDateTime
, microDateTime
);
915 long microLong
= microReader
.readLong();
916 Assert
.assertEquals(expectedMicros
, microLong
);
919 FieldReader microReader
= rootReader
.reader("microTZ");
920 microReader
.setPosition(1);
921 long microLong
= microReader
.readLong();
922 Assert
.assertEquals(expectedMicros
, microLong
);
928 public void timeStampNanoWriters() throws Exception
{
930 final long expectedNanos
= 981173106123456789L;
931 final LocalDateTime expectedNanoDateTime
= LocalDateTime
.of(2001, 2, 3, 4, 5, 6, 123456789);
933 try (NonNullableStructVector parent
= NonNullableStructVector
.empty("parent", allocator
)) {
935 ComplexWriter writer
= new ComplexWriterImpl("root", parent
);
936 StructWriter rootWriter
= writer
.rootAsStruct();
939 TimeStampNanoWriter timeStampNanoWriter
= rootWriter
.timeStampNano("nano");
940 timeStampNanoWriter
.setPosition(0);
941 timeStampNanoWriter
.writeTimeStampNano(expectedNanos
);
945 TimeStampNanoTZWriter timeStampNanoWriter
= rootWriter
.timeStampNanoTZ("nanoTZ", tz
);
946 timeStampNanoWriter
.setPosition(0);
947 timeStampNanoWriter
.writeTimeStampNanoTZ(expectedNanos
);
950 List
<Field
> children
= parent
.getField().getChildren().get(0).getChildren();
951 checkTimestampField(children
.get(0), "nano");
952 checkTimestampTZField(children
.get(1), "nanoTZ", tz
);
954 StructReader rootReader
= new SingleStructReaderImpl(parent
).reader("root");
957 FieldReader nanoReader
= rootReader
.reader("nano");
958 nanoReader
.setPosition(0);
959 LocalDateTime nanoDateTime
= nanoReader
.readLocalDateTime();
960 Assert
.assertEquals(expectedNanoDateTime
, nanoDateTime
);
961 long nanoLong
= nanoReader
.readLong();
962 Assert
.assertEquals(expectedNanos
, nanoLong
);
965 FieldReader nanoReader
= rootReader
.reader("nanoTZ");
966 nanoReader
.setPosition(0);
967 long nanoLong
= nanoReader
.readLong();
968 Assert
.assertEquals(expectedNanos
, nanoLong
);
969 NullableTimeStampNanoTZHolder h
= new NullableTimeStampNanoTZHolder();
971 Assert
.assertEquals(expectedNanos
, h
.value
);
978 public void fixedSizeBinaryWriters() throws Exception
{
982 byte[][] values
= new byte[numValues
][byteWidth
];
983 for (int i
= 0; i
< numValues
; i
++) {
984 for (int j
= 0; j
< byteWidth
; j
++) {
985 values
[i
][j
] = ((byte) i
);
988 ArrowBuf
[] bufs
= new ArrowBuf
[numValues
];
989 for (int i
= 0; i
< numValues
; i
++) {
990 bufs
[i
] = allocator
.buffer(byteWidth
);
991 bufs
[i
].setBytes(0, values
[i
]);
994 try (NonNullableStructVector parent
= NonNullableStructVector
.empty("parent", allocator
)) {
996 ComplexWriter writer
= new ComplexWriterImpl("root", parent
);
997 StructWriter rootWriter
= writer
.rootAsStruct();
999 String fieldName
= "fixedSizeBinary";
1000 FixedSizeBinaryWriter fixedSizeBinaryWriter
= rootWriter
.fixedSizeBinary(fieldName
, byteWidth
);
1001 for (int i
= 0; i
< numValues
; i
++) {
1002 fixedSizeBinaryWriter
.setPosition(i
);
1003 fixedSizeBinaryWriter
.writeFixedSizeBinary(bufs
[i
]);
1007 List
<Field
> children
= parent
.getField().getChildren().get(0).getChildren();
1008 Assert
.assertEquals(fieldName
, children
.get(0).getName());
1009 Assert
.assertEquals(ArrowType
.FixedSizeBinary
.TYPE_TYPE
, children
.get(0).getType().getTypeID());
1012 StructReader rootReader
= new SingleStructReaderImpl(parent
).reader("root");
1014 FieldReader fixedSizeBinaryReader
= rootReader
.reader(fieldName
);
1015 for (int i
= 0; i
< numValues
; i
++) {
1016 fixedSizeBinaryReader
.setPosition(i
);
1017 byte[] readValues
= fixedSizeBinaryReader
.readByteArray();
1018 Assert
.assertArrayEquals(values
[i
], readValues
);
1022 AutoCloseables
.close(bufs
);
1026 public void complexCopierWithList() {
1027 try (NonNullableStructVector parent
= NonNullableStructVector
.empty("parent", allocator
)) {
1028 ComplexWriter writer
= new ComplexWriterImpl("root", parent
);
1029 StructWriter rootWriter
= writer
.rootAsStruct();
1030 ListWriter listWriter
= rootWriter
.list("list");
1031 StructWriter innerStructWriter
= listWriter
.struct();
1032 IntWriter outerIntWriter
= listWriter
.integer();
1034 listWriter
.startList();
1035 outerIntWriter
.writeInt(1);
1036 outerIntWriter
.writeInt(2);
1037 innerStructWriter
.start();
1038 IntWriter intWriter
= innerStructWriter
.integer("a");
1039 intWriter
.writeInt(1);
1040 innerStructWriter
.end();
1041 innerStructWriter
.start();
1042 intWriter
= innerStructWriter
.integer("a");
1043 intWriter
.writeInt(2);
1044 innerStructWriter
.end();
1045 listWriter
.endList();
1047 writer
.setValueCount(1);
1049 StructVector structVector
= (StructVector
) parent
.getChild("root");
1050 TransferPair tp
= structVector
.getTransferPair(allocator
);
1051 tp
.splitAndTransfer(0, 1);
1052 NonNullableStructVector toStructVector
= (NonNullableStructVector
) tp
.getTo();
1053 JsonStringHashMap
<?
, ?
> toMapValue
= (JsonStringHashMap
<?
, ?
>) toStructVector
.getObject(0);
1054 JsonStringArrayList
<?
> object
= (JsonStringArrayList
<?
>) toMapValue
.get("list");
1055 assertEquals(1, object
.get(0));
1056 assertEquals(2, object
.get(1));
1057 JsonStringHashMap
<?
, ?
> innerStruct
= (JsonStringHashMap
<?
, ?
>) object
.get(2);
1058 assertEquals(1, innerStruct
.get("a"));
1059 innerStruct
= (JsonStringHashMap
<?
, ?
>) object
.get(3);
1060 assertEquals(2, innerStruct
.get("a"));
1061 toStructVector
.close();
1066 public void testSingleStructWriter1() {
1067 /* initialize a SingleStructWriter with empty StructVector and then lazily
1068 * create all vectors with expected initialCapacity.
1070 try (NonNullableStructVector parent
= NonNullableStructVector
.empty("parent", allocator
)) {
1071 SingleStructWriter singleStructWriter
= new SingleStructWriter(parent
);
1073 int initialCapacity
= 1024;
1074 singleStructWriter
.setInitialCapacity(initialCapacity
);
1076 IntWriter intWriter
= singleStructWriter
.integer("intField");
1077 BigIntWriter bigIntWriter
= singleStructWriter
.bigInt("bigIntField");
1078 Float4Writer float4Writer
= singleStructWriter
.float4("float4Field");
1079 Float8Writer float8Writer
= singleStructWriter
.float8("float8Field");
1080 ListWriter listWriter
= singleStructWriter
.list("listField");
1081 MapWriter mapWriter
= singleStructWriter
.map("mapField", false);
1084 long bigIntValue
= 10000;
1085 float float4Value
= 100.5f
;
1086 double float8Value
= 100.375;
1088 for (int i
= 0; i
< initialCapacity
; i
++) {
1089 singleStructWriter
.start();
1091 intWriter
.writeInt(intValue
+ i
);
1092 bigIntWriter
.writeBigInt(bigIntValue
+ (long) i
);
1093 float4Writer
.writeFloat4(float4Value
+ (float) i
);
1094 float8Writer
.writeFloat8(float8Value
+ (double) i
);
1096 listWriter
.setPosition(i
);
1097 listWriter
.startList();
1098 listWriter
.integer().writeInt(intValue
+ i
);
1099 listWriter
.integer().writeInt(intValue
+ i
+ 1);
1100 listWriter
.integer().writeInt(intValue
+ i
+ 2);
1101 listWriter
.integer().writeInt(intValue
+ i
+ 3);
1102 listWriter
.endList();
1104 mapWriter
.setPosition(i
);
1105 mapWriter
.startMap();
1106 mapWriter
.startEntry();
1107 mapWriter
.key().integer().writeInt(intValue
+ i
);
1108 mapWriter
.value().integer().writeInt(intValue
+ i
+ 1);
1109 mapWriter
.endEntry();
1110 mapWriter
.startEntry();
1111 mapWriter
.key().integer().writeInt(intValue
+ i
+ 2);
1112 mapWriter
.value().integer().writeInt(intValue
+ i
+ 3);
1113 mapWriter
.endEntry();
1116 singleStructWriter
.end();
1119 IntVector intVector
= (IntVector
) parent
.getChild("intField");
1120 BigIntVector bigIntVector
= (BigIntVector
) parent
.getChild("bigIntField");
1121 Float4Vector float4Vector
= (Float4Vector
) parent
.getChild("float4Field");
1122 Float8Vector float8Vector
= (Float8Vector
) parent
.getChild("float8Field");
1124 int capacity
= singleStructWriter
.getValueCapacity();
1125 assertTrue(capacity
>= initialCapacity
&& capacity
< initialCapacity
* 2);
1126 capacity
= intVector
.getValueCapacity();
1127 assertTrue(capacity
>= initialCapacity
&& capacity
< initialCapacity
* 2);
1128 capacity
= bigIntVector
.getValueCapacity();
1129 assertTrue(capacity
>= initialCapacity
&& capacity
< initialCapacity
* 2);
1130 capacity
= float4Vector
.getValueCapacity();
1131 assertTrue(capacity
>= initialCapacity
&& capacity
< initialCapacity
* 2);
1132 capacity
= float8Vector
.getValueCapacity();
1133 assertTrue(capacity
>= initialCapacity
&& capacity
< initialCapacity
* 2);
1135 StructReader singleStructReader
= new SingleStructReaderImpl(parent
);
1137 IntReader intReader
= singleStructReader
.reader("intField");
1138 BigIntReader bigIntReader
= singleStructReader
.reader("bigIntField");
1139 Float4Reader float4Reader
= singleStructReader
.reader("float4Field");
1140 Float8Reader float8Reader
= singleStructReader
.reader("float8Field");
1141 UnionListReader listReader
= (UnionListReader
) singleStructReader
.reader("listField");
1142 UnionMapReader mapReader
= (UnionMapReader
) singleStructReader
.reader("mapField");
1144 for (int i
= 0; i
< initialCapacity
; i
++) {
1145 intReader
.setPosition(i
);
1146 bigIntReader
.setPosition(i
);
1147 float4Reader
.setPosition(i
);
1148 float8Reader
.setPosition(i
);
1149 listReader
.setPosition(i
);
1150 mapReader
.setPosition(i
);
1152 assertEquals(intValue
+ i
, intReader
.readInteger().intValue());
1153 assertEquals(bigIntValue
+ (long) i
, bigIntReader
.readLong().longValue());
1154 assertEquals(float4Value
+ (float) i
, float4Reader
.readFloat().floatValue(), 0);
1155 assertEquals(float8Value
+ (double) i
, float8Reader
.readDouble().doubleValue(), 0);
1157 for (int j
= 0; j
< 4; j
++) {
1159 assertEquals(intValue
+ i
+ j
, listReader
.reader().readInteger().intValue());
1162 for (int k
= 0; k
< 4; k
+= 2) {
1164 assertEquals(intValue
+ k
+ i
, mapReader
.key().readInteger().intValue());
1165 assertEquals(intValue
+ k
+ i
+ 1, mapReader
.value().readInteger().intValue());
1174 public void testListWriterWithNulls() {
1175 try (ListVector listVector
= ListVector
.empty("list", allocator
)) {
1176 listVector
.setInitialCapacity(COUNT
);
1177 listVector
.allocateNew();
1178 listVector
.getValidityBuffer().setOne(0, (int) listVector
.getValidityBuffer().capacity());
1180 UnionListWriter listWriter
= listVector
.getWriter();
1182 // expected listVector : [[null], null, [2, 4], null, [null], null, [6, 12], ...]
1183 for (int i
= 0; i
< COUNT
; i
++) {
1184 listWriter
.setPosition(i
);
1186 listWriter
.startList();
1188 listWriter
.integer().writeNull();
1190 listWriter
.integer().writeInt(i
);
1191 listWriter
.integer().writeInt(i
* 2);
1193 listWriter
.endList();
1195 listWriter
.writeNull();
1198 listVector
.setValueCount(COUNT
);
1200 UnionListReader listReader
= new UnionListReader(listVector
);
1201 for (int i
= 0; i
< COUNT
; i
++) {
1202 listReader
.setPosition(i
);
1204 Assert
.assertTrue(listReader
.isSet());
1207 Assert
.assertNull(listReader
.reader().readInteger());
1209 Assert
.assertEquals(i
, listReader
.reader().readInteger().intValue());
1211 Assert
.assertEquals(i
* 2, listReader
.reader().readInteger().intValue());
1214 Assert
.assertFalse(listReader
.isSet());
1221 public void testListOfListWriterWithNulls() {
1222 try (ListVector listVector
= ListVector
.empty("listoflist", allocator
)) {
1223 listVector
.setInitialCapacity(COUNT
);
1224 listVector
.allocateNew();
1225 listVector
.getValidityBuffer().setOne(0, (int) listVector
.getValidityBuffer().capacity());
1227 UnionListWriter listWriter
= listVector
.getWriter();
1229 // create list : [ [null], null, [[null, 2, 4]], null, [null], null, [[null, 6, 12]], ... ]
1230 for (int i
= 0; i
< COUNT
; i
++) {
1231 listWriter
.setPosition(i
);
1233 listWriter
.startList();
1235 listWriter
.list().writeNull();
1237 listWriter
.list().startList();
1238 listWriter
.list().integer().writeNull();
1239 listWriter
.list().integer().writeInt(i
);
1240 listWriter
.list().integer().writeInt(i
* 2);
1241 listWriter
.list().endList();
1243 listWriter
.endList();
1245 listWriter
.writeNull();
1248 listVector
.setValueCount(COUNT
);
1250 UnionListReader listReader
= new UnionListReader(listVector
);
1251 for (int i
= 0; i
< COUNT
; i
++) {
1252 listReader
.setPosition(i
);
1254 Assert
.assertTrue(listReader
.isSet());
1257 Assert
.assertFalse(listReader
.reader().isSet());
1259 listReader
.reader().next();
1260 Assert
.assertFalse(listReader
.reader().reader().isSet());
1261 listReader
.reader().next();
1262 Assert
.assertEquals(i
, listReader
.reader().reader().readInteger().intValue());
1263 listReader
.reader().next();
1264 Assert
.assertEquals(i
* 2, listReader
.reader().reader().readInteger().intValue());
1267 Assert
.assertFalse(listReader
.isSet());
1274 public void testListOfListOfListWriterWithNulls() {
1275 try (ListVector listVector
= ListVector
.empty("listoflistoflist", allocator
)) {
1276 listVector
.setInitialCapacity(COUNT
);
1277 listVector
.allocateNew();
1278 listVector
.getValidityBuffer().setOne(0, (int) listVector
.getValidityBuffer().capacity());
1280 UnionListWriter listWriter
= listVector
.getWriter();
1282 // create list : [ null, [null], [[null]], [[[null, 1, 2]]], null, [null], ...
1283 for (int i
= 0; i
< COUNT
; i
++) {
1284 listWriter
.setPosition(i
);
1286 listWriter
.writeNull();
1288 listWriter
.startList();
1290 listWriter
.list().writeNull();
1291 } else if (i
% 4 == 2) {
1292 listWriter
.list().startList();
1293 listWriter
.list().list().writeNull();
1294 listWriter
.list().endList();
1296 listWriter
.list().startList();
1297 listWriter
.list().list().startList();
1298 listWriter
.list().list().integer().writeNull();
1299 listWriter
.list().list().integer().writeInt(i
);
1300 listWriter
.list().list().integer().writeInt(i
* 2);
1301 listWriter
.list().list().endList();
1302 listWriter
.list().endList();
1304 listWriter
.endList();
1307 listVector
.setValueCount(COUNT
);
1309 UnionListReader listReader
= new UnionListReader(listVector
);
1310 for (int i
= 0; i
< COUNT
; i
++) {
1311 listReader
.setPosition(i
);
1313 Assert
.assertFalse(listReader
.isSet());
1315 Assert
.assertTrue(listReader
.isSet());
1318 Assert
.assertFalse(listReader
.reader().isSet());
1319 } else if (i
% 4 == 2) {
1320 listReader
.reader().next();
1321 Assert
.assertFalse(listReader
.reader().reader().isSet());
1323 listReader
.reader().next();
1324 listReader
.reader().reader().next();
1325 Assert
.assertFalse(listReader
.reader().reader().reader().isSet());
1326 listReader
.reader().reader().next();
1327 Assert
.assertEquals(i
, listReader
.reader().reader().reader().readInteger().intValue());
1328 listReader
.reader().reader().next();
1329 Assert
.assertEquals(i
* 2, listReader
.reader().reader().reader().readInteger().intValue());