1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package pqarrow
18
19 import (
20 "context"
21 "testing"
22
23 "github.com/apache/arrow/go/v15/arrow"
24 "github.com/apache/arrow/go/v15/arrow/array"
25 "github.com/apache/arrow/go/v15/arrow/memory"
26 "github.com/apache/arrow/go/v15/internal/types"
27 "github.com/google/uuid"
28 "github.com/stretchr/testify/assert"
29 "github.com/stretchr/testify/require"
30 )
31
32 func TestNonNullableSingleList(t *testing.T) {
33
34
35
36
37
38
39
40
41
42 bldr := array.NewListBuilder(memory.DefaultAllocator, arrow.PrimitiveTypes.Int64)
43 defer bldr.Release()
44
45 vb := bldr.ValueBuilder().(*array.Int64Builder)
46
47 bldr.Append(true)
48 vb.Append(1)
49
50 bldr.Append(true)
51 vb.Append(2)
52 vb.Append(3)
53
54 bldr.Append(true)
55 vb.Append(4)
56 vb.Append(5)
57 vb.Append(6)
58
59 arr := bldr.NewListArray()
60 defer arr.Release()
61
62 mp, err := newMultipathLevelBuilder(arr, false)
63 require.NoError(t, err)
64 defer mp.Release()
65
66 ctx := arrowCtxFromContext(NewArrowWriteContext(context.Background(), nil))
67 result, err := mp.write(0, ctx)
68 require.NoError(t, err)
69
70 assert.Equal(t, []int16{2, 2, 2, 2, 2, 2}, result.defLevels)
71 assert.Equal(t, []int16{0, 0, 1, 0, 1, 1}, result.repLevels)
72 assert.Len(t, result.postListVisitedElems, 1)
73 assert.EqualValues(t, 0, result.postListVisitedElems[0].start)
74 assert.EqualValues(t, 6, result.postListVisitedElems[0].end)
75 }
76
77
78
79
80
81
82
83
84
85
86
87
88
89 func TestNullableSingleListAllNulls(t *testing.T) {
90 bldr := array.NewListBuilder(memory.DefaultAllocator, arrow.PrimitiveTypes.Int64)
91 defer bldr.Release()
92
93 bldr.AppendNull()
94 bldr.AppendNull()
95 bldr.AppendNull()
96 bldr.AppendNull()
97
98 arr := bldr.NewListArray()
99 defer arr.Release()
100
101 mp, err := newMultipathLevelBuilder(arr, true)
102 require.NoError(t, err)
103 defer mp.Release()
104
105 ctx := arrowCtxFromContext(NewArrowWriteContext(context.Background(), nil))
106 result, err := mp.write(0, ctx)
107 require.NoError(t, err)
108
109 assert.Equal(t, []int16{0, 0, 0, 0}, result.defLevels)
110 assert.Equal(t, []int16{0, 0, 0, 0}, result.repLevels)
111 }
112
113 func TestNullableSingleListAllEmpty(t *testing.T) {
114 bldr := array.NewListBuilder(memory.DefaultAllocator, arrow.PrimitiveTypes.Int64)
115 defer bldr.Release()
116
117 bldr.Append(true)
118 bldr.Append(true)
119 bldr.Append(true)
120 bldr.Append(true)
121
122 arr := bldr.NewListArray()
123 defer arr.Release()
124
125 mp, err := newMultipathLevelBuilder(arr, true)
126 require.NoError(t, err)
127 defer mp.Release()
128
129 ctx := arrowCtxFromContext(NewArrowWriteContext(context.Background(), nil))
130 result, err := mp.write(0, ctx)
131 require.NoError(t, err)
132
133 assert.Equal(t, []int16{1, 1, 1, 1}, result.defLevels)
134 assert.Equal(t, []int16{0, 0, 0, 0}, result.repLevels)
135 }
136
137 func TestNullableSingleListAllNullEntries(t *testing.T) {
138 bldr := array.NewListBuilder(memory.DefaultAllocator, arrow.PrimitiveTypes.Int64)
139 defer bldr.Release()
140
141 vb := bldr.ValueBuilder().(*array.Int64Builder)
142
143 bldr.Append(true)
144 vb.AppendNull()
145 bldr.Append(true)
146 vb.AppendNull()
147 bldr.Append(true)
148 vb.AppendNull()
149 bldr.Append(true)
150 vb.AppendNull()
151
152 arr := bldr.NewListArray()
153 defer arr.Release()
154
155 mp, err := newMultipathLevelBuilder(arr, true)
156 require.NoError(t, err)
157 defer mp.Release()
158
159 ctx := arrowCtxFromContext(NewArrowWriteContext(context.Background(), nil))
160 result, err := mp.write(0, ctx)
161 require.NoError(t, err)
162
163 assert.Equal(t, []int16{2, 2, 2, 2}, result.defLevels)
164 assert.Equal(t, []int16{0, 0, 0, 0}, result.repLevels)
165 assert.Len(t, result.postListVisitedElems, 1)
166 assert.EqualValues(t, 0, result.postListVisitedElems[0].start)
167 assert.EqualValues(t, 4, result.postListVisitedElems[0].end)
168 }
169
170 func TestNullableSingleListAllPresentEntries(t *testing.T) {
171 bldr := array.NewListBuilder(memory.DefaultAllocator, arrow.PrimitiveTypes.Int64)
172 defer bldr.Release()
173
174 vb := bldr.ValueBuilder().(*array.Int64Builder)
175
176 bldr.Append(true)
177 bldr.Append(true)
178 bldr.Append(true)
179 vb.Append(1)
180 bldr.Append(true)
181 bldr.Append(true)
182 vb.Append(2)
183 vb.Append(3)
184
185 arr := bldr.NewListArray()
186 defer arr.Release()
187
188 mp, err := newMultipathLevelBuilder(arr, true)
189 require.NoError(t, err)
190 defer mp.Release()
191
192 ctx := arrowCtxFromContext(NewArrowWriteContext(context.Background(), nil))
193 result, err := mp.write(0, ctx)
194 require.NoError(t, err)
195
196 assert.Equal(t, []int16{1, 1, 3, 1, 3, 3}, result.defLevels)
197 assert.Equal(t, []int16{0, 0, 0, 0, 0, 1}, result.repLevels)
198 assert.Len(t, result.postListVisitedElems, 1)
199 assert.EqualValues(t, 0, result.postListVisitedElems[0].start)
200 assert.EqualValues(t, 3, result.postListVisitedElems[0].end)
201 }
202
203 func TestNullableSingleListSomeNullEntriesSomeNullLists(t *testing.T) {
204 bldr := array.NewListBuilder(memory.DefaultAllocator, arrow.PrimitiveTypes.Int64)
205 defer bldr.Release()
206
207 vb := bldr.ValueBuilder().(*array.Int64Builder)
208
209 bldr.Append(false)
210 bldr.Append(true)
211 vb.AppendValues([]int64{1, 2, 3}, nil)
212 bldr.Append(true)
213 bldr.Append(true)
214 bldr.AppendNull()
215 bldr.AppendNull()
216 bldr.Append(true)
217 vb.AppendValues([]int64{4, 5}, nil)
218 bldr.Append(true)
219 vb.AppendNull()
220
221 arr := bldr.NewListArray()
222 defer arr.Release()
223
224 mp, err := newMultipathLevelBuilder(arr, true)
225 require.NoError(t, err)
226 defer mp.Release()
227
228 ctx := arrowCtxFromContext(NewArrowWriteContext(context.Background(), nil))
229 result, err := mp.write(0, ctx)
230 require.NoError(t, err)
231
232 assert.Equal(t, []int16{0, 3, 3, 3, 1, 1, 0, 0, 3, 3, 2}, result.defLevels)
233 assert.Equal(t, []int16{0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0}, result.repLevels)
234 }
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255 func TestNestedListsWithSomeEntries(t *testing.T) {
256 listType := arrow.ListOf(arrow.PrimitiveTypes.Int64)
257 bldr := array.NewListBuilder(memory.DefaultAllocator, listType)
258 defer bldr.Release()
259
260 nestedBldr := bldr.ValueBuilder().(*array.ListBuilder)
261 vb := nestedBldr.ValueBuilder().(*array.Int64Builder)
262
263
264
265 bldr.AppendNull()
266 bldr.Append(true)
267 nestedBldr.Append(true)
268 vb.AppendValues([]int64{1, 2, 3}, nil)
269 nestedBldr.Append(true)
270 vb.AppendValues([]int64{4, 5}, nil)
271
272 bldr.Append(true)
273 nestedBldr.Append(true)
274 nestedBldr.Append(true)
275 nestedBldr.Append(true)
276 bldr.Append(true)
277
278 arr := bldr.NewListArray()
279 defer arr.Release()
280
281 mp, err := newMultipathLevelBuilder(arr, true)
282 require.NoError(t, err)
283 defer mp.Release()
284
285 ctx := arrowCtxFromContext(NewArrowWriteContext(context.Background(), nil))
286 result, err := mp.write(0, ctx)
287 require.NoError(t, err)
288
289 assert.Equal(t, []int16{0, 5, 5, 5, 5, 5, 3, 3, 3, 1}, result.defLevels)
290 assert.Equal(t, []int16{0, 0, 2, 2, 1, 2, 0, 1, 1, 0}, result.repLevels)
291 }
292
293 func TestNestedListsWithSomeNulls(t *testing.T) {
294 listType := arrow.ListOf(arrow.PrimitiveTypes.Int64)
295 bldr := array.NewListBuilder(memory.DefaultAllocator, listType)
296 defer bldr.Release()
297
298 nestedBldr := bldr.ValueBuilder().(*array.ListBuilder)
299 vb := nestedBldr.ValueBuilder().(*array.Int64Builder)
300
301
302
303 bldr.AppendNull()
304 bldr.Append(true)
305 nestedBldr.Append(true)
306 vb.AppendValues([]int64{1, 0, 3}, []bool{true, false, true})
307 nestedBldr.AppendNull()
308 nestedBldr.AppendNull()
309 bldr.Append(true)
310 nestedBldr.Append(true)
311 vb.AppendValues([]int64{4, 5}, nil)
312
313 arr := bldr.NewListArray()
314 defer arr.Release()
315
316 mp, err := newMultipathLevelBuilder(arr, true)
317 require.NoError(t, err)
318 defer mp.Release()
319
320 ctx := arrowCtxFromContext(NewArrowWriteContext(context.Background(), nil))
321 result, err := mp.write(0, ctx)
322 require.NoError(t, err)
323
324 assert.Equal(t, []int16{0, 5, 4, 5, 2, 2, 5, 5}, result.defLevels)
325 assert.Equal(t, []int16{0, 0, 2, 2, 1, 1, 0, 2}, result.repLevels)
326 }
327
328 func TestNestedListsSomeNullsSomeEmpty(t *testing.T) {
329 listType := arrow.ListOf(arrow.PrimitiveTypes.Int64)
330 bldr := array.NewListBuilder(memory.DefaultAllocator, listType)
331 defer bldr.Release()
332
333 nestedBldr := bldr.ValueBuilder().(*array.ListBuilder)
334 vb := nestedBldr.ValueBuilder().(*array.Int64Builder)
335
336
337
338 bldr.AppendNull()
339 bldr.Append(true)
340 nestedBldr.Append(true)
341 vb.AppendValues([]int64{1, 0, 3}, []bool{true, false, true})
342 nestedBldr.Append(true)
343 nestedBldr.Append(true)
344 bldr.Append(true)
345 nestedBldr.Append(true)
346 vb.AppendValues([]int64{4, 5}, nil)
347
348 arr := bldr.NewListArray()
349 defer arr.Release()
350
351 mp, err := newMultipathLevelBuilder(arr, true)
352 require.NoError(t, err)
353 defer mp.Release()
354
355 ctx := arrowCtxFromContext(NewArrowWriteContext(context.Background(), nil))
356 result, err := mp.write(0, ctx)
357 require.NoError(t, err)
358
359 assert.Equal(t, []int16{0, 5, 4, 5, 3, 3, 5, 5}, result.defLevels)
360 assert.Equal(t, []int16{0, 0, 2, 2, 1, 1, 0, 2}, result.repLevels)
361 }
362
363 func TestNestedExtensionListsWithSomeNulls(t *testing.T) {
364 mem := memory.NewCheckedAllocator(memory.DefaultAllocator)
365 defer mem.AssertSize(t, 0)
366
367 listType := arrow.ListOf(types.NewUUIDType())
368 bldr := array.NewListBuilder(mem, listType)
369 defer bldr.Release()
370
371 nestedBldr := bldr.ValueBuilder().(*array.ListBuilder)
372 vb := nestedBldr.ValueBuilder().(*types.UUIDBuilder)
373
374 uuid1 := uuid.New()
375 uuid3 := uuid.New()
376 uuid4 := uuid.New()
377 uuid5 := uuid.New()
378
379
380
381 bldr.AppendNull()
382 bldr.Append(true)
383 nestedBldr.Append(true)
384 vb.Append(uuid1)
385 vb.AppendNull()
386 vb.Append(uuid3)
387 nestedBldr.AppendNull()
388 nestedBldr.AppendNull()
389 bldr.Append(true)
390 nestedBldr.Append(true)
391 vb.AppendValues([]uuid.UUID{uuid4, uuid5}, nil)
392
393 arr := bldr.NewListArray()
394 defer arr.Release()
395
396 mp, err := newMultipathLevelBuilder(arr, true)
397 require.NoError(t, err)
398 defer mp.Release()
399
400 ctx := arrowCtxFromContext(NewArrowWriteContext(context.Background(), nil))
401 result, err := mp.write(0, ctx)
402 require.NoError(t, err)
403
404 assert.Equal(t, []int16{0, 5, 4, 5, 2, 2, 5, 5}, result.defLevels)
405 assert.Equal(t, []int16{0, 0, 2, 2, 1, 1, 0, 2}, result.repLevels)
406 assert.Equal(t, result.leafArr.NullN(), 1)
407 }
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434 func TestTripleNestedAllPresent(t *testing.T) {
435 listType := arrow.ListOf(arrow.PrimitiveTypes.Int64)
436 nestedListType := arrow.ListOf(listType)
437 bldr := array.NewListBuilder(memory.DefaultAllocator, nestedListType)
438 defer bldr.Release()
439
440 dblNestedBldr := bldr.ValueBuilder().(*array.ListBuilder)
441 nestedBldr := dblNestedBldr.ValueBuilder().(*array.ListBuilder)
442 vb := nestedBldr.ValueBuilder().(*array.Int64Builder)
443
444
445 bldr.Append(true)
446 dblNestedBldr.Append(true)
447 nestedBldr.Append(true)
448 vb.AppendValues([]int64{1, 2, 3}, nil)
449 nestedBldr.Append(true)
450 vb.AppendValues([]int64{4, 5, 6}, nil)
451
452 dblNestedBldr.Append(true)
453 nestedBldr.Append(true)
454 vb.AppendValues([]int64{7, 8, 9}, nil)
455
456 arr := bldr.NewListArray()
457 defer arr.Release()
458
459 mp, err := newMultipathLevelBuilder(arr, true)
460 require.NoError(t, err)
461 defer mp.Release()
462
463 ctx := arrowCtxFromContext(NewArrowWriteContext(context.Background(), nil))
464 result, err := mp.write(0, ctx)
465 require.NoError(t, err)
466
467 assert.Equal(t, []int16{7, 7, 7, 7, 7, 7, 7, 7, 7}, result.defLevels)
468 assert.Equal(t, []int16{0, 3, 3, 2, 3, 3, 1, 3, 3}, result.repLevels)
469 }
470
471 func TestTripleNestedSomeNullsSomeEmpty(t *testing.T) {
472 listType := arrow.ListOf(arrow.PrimitiveTypes.Int64)
473 nestedListType := arrow.ListOf(listType)
474 bldr := array.NewListBuilder(memory.DefaultAllocator, nestedListType)
475 defer bldr.Release()
476
477 dblNestedBldr := bldr.ValueBuilder().(*array.ListBuilder)
478 nestedBldr := dblNestedBldr.ValueBuilder().(*array.ListBuilder)
479 vb := nestedBldr.ValueBuilder().(*array.Int64Builder)
480
481
482
483
484
485
486
487
488
489 bldr.Append(true)
490 dblNestedBldr.AppendNull()
491 dblNestedBldr.Append(true)
492 nestedBldr.Append(true)
493 vb.AppendValues([]int64{1, 0, 3}, []bool{true, false, true})
494 nestedBldr.Append(true)
495 dblNestedBldr.Append(true)
496
497
498 bldr.Append(true)
499 dblNestedBldr.Append(true)
500 nestedBldr.Append(true)
501 dblNestedBldr.Append(true)
502 nestedBldr.Append(true)
503 nestedBldr.Append(true)
504 vb.AppendValues([]int64{1, 2}, nil)
505 dblNestedBldr.AppendNull()
506 dblNestedBldr.Append(true)
507 nestedBldr.Append(true)
508 vb.Append(3)
509
510
511 bldr.AppendNull()
512
513
514 bldr.Append(true)
515
516 arr := bldr.NewListArray()
517 defer arr.Release()
518
519 mp, err := newMultipathLevelBuilder(arr, true)
520 require.NoError(t, err)
521 defer mp.Release()
522
523 ctx := arrowCtxFromContext(NewArrowWriteContext(context.Background(), nil))
524 result, err := mp.write(0, ctx)
525 require.NoError(t, err)
526
527 assert.Equal(t, []int16{
528 2, 7, 6, 7, 5, 3,
529 5, 5, 7, 7, 2, 7,
530 0,
531 1,
532 }, result.defLevels)
533 assert.Equal(t, []int16{
534 0, 1, 3, 3, 2, 1,
535 0, 1, 2, 3, 1, 1,
536 0, 0,
537 }, result.repLevels)
538 }
539
540 func TestStruct(t *testing.T) {
541 structType := arrow.StructOf(arrow.Field{Name: "list", Type: arrow.ListOf(arrow.PrimitiveTypes.Int64), Nullable: true},
542 arrow.Field{Name: "Entries", Type: arrow.PrimitiveTypes.Int64, Nullable: true})
543
544 bldr := array.NewStructBuilder(memory.DefaultAllocator, structType)
545 defer bldr.Release()
546
547 entryBldr := bldr.FieldBuilder(1).(*array.Int64Builder)
548 listBldr := bldr.FieldBuilder(0).(*array.ListBuilder)
549 vb := listBldr.ValueBuilder().(*array.Int64Builder)
550
551
552
553 bldr.Append(true)
554 entryBldr.Append(1)
555 listBldr.Append(true)
556 vb.AppendValues([]int64{2, 3}, nil)
557
558 bldr.Append(true)
559 entryBldr.Append(4)
560 listBldr.Append(true)
561 vb.AppendValues([]int64{5, 6}, nil)
562
563 bldr.AppendNull()
564
565 arr := bldr.NewArray()
566 defer arr.Release()
567
568 mp, err := newMultipathLevelBuilder(arr, true)
569 require.NoError(t, err)
570 defer mp.Release()
571
572 ctx := arrowCtxFromContext(NewArrowWriteContext(context.Background(), nil))
573 result, err := mp.writeAll(ctx)
574 require.NoError(t, err)
575
576 assert.Len(t, result, 2)
577 assert.Equal(t, []int16{4, 4, 4, 4, 0}, result[0].defLevels)
578 assert.Equal(t, []int16{0, 1, 0, 1, 0}, result[0].repLevels)
579
580 assert.Equal(t, []int16{2, 2, 0}, result[1].defLevels)
581 assert.Nil(t, result[1].repLevels)
582 }
583
584 func TestFixedSizeListNullableElems(t *testing.T) {
585 bldr := array.NewFixedSizeListBuilder(memory.DefaultAllocator, 2, arrow.PrimitiveTypes.Int64)
586 defer bldr.Release()
587
588 vb := bldr.ValueBuilder().(*array.Int64Builder)
589 bldr.AppendValues([]bool{false, true, true, false})
590 vb.AppendValues([]int64{2, 3, 4, 5}, nil)
591
592
593
594 arr := bldr.NewArray()
595 defer arr.Release()
596
597 mp, err := newMultipathLevelBuilder(arr, true)
598 require.NoError(t, err)
599 defer mp.Release()
600
601 ctx := arrowCtxFromContext(NewArrowWriteContext(context.Background(), nil))
602 result, err := mp.writeAll(ctx)
603 require.NoError(t, err)
604
605 assert.Len(t, result, 1)
606 assert.Equal(t, []int16{0, 3, 3, 3, 3, 0}, result[0].defLevels)
607 assert.Equal(t, []int16{0, 0, 1, 0, 1, 0}, result[0].repLevels)
608
609
610
611
612 assert.Len(t, result[0].postListVisitedElems, 1)
613 assert.EqualValues(t, 2, result[0].postListVisitedElems[0].start)
614 assert.EqualValues(t, 6, result[0].postListVisitedElems[0].end)
615 }
616
617 func TestFixedSizeListMissingMiddleTwoVisitedRanges(t *testing.T) {
618 bldr := array.NewFixedSizeListBuilder(memory.DefaultAllocator, 2, arrow.PrimitiveTypes.Int64)
619 defer bldr.Release()
620
621 vb := bldr.ValueBuilder().(*array.Int64Builder)
622 bldr.AppendValues([]bool{true, false, true})
623 vb.AppendValues([]int64{0, 1, 2, 3}, nil)
624
625
626
627 arr := bldr.NewArray()
628 defer arr.Release()
629
630 mp, err := newMultipathLevelBuilder(arr, true)
631 require.NoError(t, err)
632 defer mp.Release()
633
634 ctx := arrowCtxFromContext(NewArrowWriteContext(context.Background(), nil))
635 result, err := mp.writeAll(ctx)
636 require.NoError(t, err)
637
638 assert.Len(t, result, 1)
639 assert.Equal(t, []int16{3, 3, 0, 3, 3}, result[0].defLevels)
640 assert.Equal(t, []int16{0, 1, 0, 0, 1}, result[0].repLevels)
641
642
643
644
645 assert.Len(t, result[0].postListVisitedElems, 2)
646 assert.EqualValues(t, 0, result[0].postListVisitedElems[0].start)
647 assert.EqualValues(t, 2, result[0].postListVisitedElems[0].end)
648
649 assert.EqualValues(t, 4, result[0].postListVisitedElems[1].start)
650 assert.EqualValues(t, 6, result[0].postListVisitedElems[1].end)
651 }
652
653 func TestPrimitiveNonNullable(t *testing.T) {
654 bldr := array.NewInt64Builder(memory.DefaultAllocator)
655 defer bldr.Release()
656
657 bldr.AppendValues([]int64{1, 2, 3, 4}, nil)
658
659 arr := bldr.NewArray()
660 defer arr.Release()
661
662 mp, err := newMultipathLevelBuilder(arr, false)
663 require.NoError(t, err)
664 defer mp.Release()
665
666 ctx := arrowCtxFromContext(NewArrowWriteContext(context.Background(), nil))
667 result, err := mp.write(0, ctx)
668 require.NoError(t, err)
669
670 assert.Nil(t, result.defLevels)
671 assert.Nil(t, result.repLevels)
672
673 assert.Len(t, result.postListVisitedElems, 1)
674 assert.EqualValues(t, 0, result.postListVisitedElems[0].start)
675 assert.EqualValues(t, 4, result.postListVisitedElems[0].end)
676 }
677
View as plain text