@@ -6,6 +6,70 @@ from firebolt.dtypes import *
6
6
from firebolt.test_fixtures.bool_array import as_bool_array_scalar
7
7
8
8
9
+ fn build_list_of_list [data_type : DataType]() raises -> ListArray:
10
+ """ Build a test ListArray.
11
+
12
+ See: https://elferherrera.github.io/arrow_guide/arrays_nested.html
13
+ """
14
+
15
+ # Define all the values.
16
+ var bitmap = ArcPointer(Bitmap.alloc(10 ))
17
+ bitmap[].unsafe_range_set(0 , 10 , True )
18
+ var buffer = ArcPointer(Buffer.alloc[data_type.native](10 ))
19
+ for i in range (10 ):
20
+ buffer[].unsafe_set[data_type.native](i, i + 1 )
21
+
22
+ var value_data = ArrayData(
23
+ dtype = data_type,
24
+ length = 10 ,
25
+ bitmap = bitmap,
26
+ buffers = List(buffer),
27
+ children = List[ArcPointer[ArrayData]](),
28
+ offset = 0 ,
29
+ )
30
+
31
+ # Define the PrimitiveArrays.
32
+ var value_offset = ArcPointer(Buffer.alloc(7 ))
33
+ value_offset[].unsafe_set[DType.int32](0 , 0 )
34
+ value_offset[].unsafe_set[DType.int32](1 , 2 )
35
+ value_offset[].unsafe_set[DType.int32](2 , 4 )
36
+ value_offset[].unsafe_set[DType.int32](3 , 7 )
37
+ value_offset[].unsafe_set[DType.int32](4 , 7 )
38
+ value_offset[].unsafe_set[DType.int32](5 , 8 )
39
+ value_offset[].unsafe_set[DType.int32](6 , 10 )
40
+
41
+ var list_bitmap = ArcPointer(Bitmap.alloc(6 ))
42
+ list_bitmap[].unsafe_range_set(0 , 6 , True )
43
+ list_bitmap[].unsafe_set(3 , False )
44
+ var list_data = ArrayData(
45
+ dtype = list_(data_type),
46
+ length = 6 ,
47
+ buffers = List(value_offset),
48
+ children = List(ArcPointer(value_data)),
49
+ bitmap = list_bitmap,
50
+ offset = 0 ,
51
+ )
52
+
53
+ # Now define the master array data.
54
+ var top_offsets = Buffer.alloc(4 )
55
+ top_offsets.unsafe_set[DType.int32](0 , 0 )
56
+ top_offsets.unsafe_set[DType.int32](1 , 2 )
57
+ top_offsets.unsafe_set[DType.int32](2 , 5 )
58
+ top_offsets.unsafe_set[DType.int32](3 , 6 )
59
+ var top_bitmap = ArcPointer(Bitmap.alloc(4 ))
60
+ top_bitmap[].unsafe_range_set(0 , 4 , True )
61
+ return ListArray(
62
+ ArrayData(
63
+ dtype = list_(list_(data_type)),
64
+ length = 4 ,
65
+ buffers = List(ArcPointer(top_offsets^ )),
66
+ children = List(ArcPointer(list_data)),
67
+ bitmap = top_bitmap,
68
+ offset = 0 ,
69
+ )
70
+ )
71
+
72
+
9
73
def test_list_int_array ():
10
74
var ints = Int64Array(capacity = 3 )
11
75
ints.append(1 )
@@ -57,6 +121,19 @@ def test_list_str():
57
121
assert_equal(first_value.unsafe_get(1 ), " world" )
58
122
59
123
124
+ def test_list_of_list ():
125
+ list2 = build_list_of_list[int64]()
126
+ top = ListArray(list2.unsafe_get(0 ))
127
+ middle_0 = top.unsafe_get(0 )
128
+ bottom = Int64Array(middle_0)
129
+ assert_equal(bottom.unsafe_get(1 ), 2 )
130
+ assert_equal(bottom.unsafe_get(0 ), 1 )
131
+ middle_1 = top.unsafe_get(1 )
132
+ bottom = Int64Array(middle_1)
133
+ assert_equal(bottom.unsafe_get(0 ), 3 )
134
+ assert_equal(bottom.unsafe_get(1 ), 4 )
135
+
136
+
60
137
def test_struct_array ():
61
138
var fields = List[Field](
62
139
Field(" id" , int64),
@@ -103,3 +180,7 @@ def test_struct_array_str_repr():
103
180
assert_equal(str_repr, " StructArray(length=0)" )
104
181
assert_equal(repr_repr, " StructArray(length=0)" )
105
182
assert_equal(str_repr, repr_repr)
183
+
184
+
185
+ fn main () raises :
186
+ test_list_of_list()
0 commit comments