@@ -18,6 +18,8 @@ use databend_common_expression::types::AnyType;
1818use databend_common_expression:: types:: ArrayColumn ;
1919use databend_common_expression:: types:: Bitmap ;
2020use databend_common_expression:: types:: Buffer ;
21+ use databend_common_expression:: types:: NumberColumn ;
22+ use databend_common_expression:: types:: VectorColumn ;
2123use databend_common_expression:: Column ;
2224use databend_common_expression:: TableDataType ;
2325
@@ -30,6 +32,8 @@ pub enum Nested {
3032 Primitive ( usize , bool , Option < Bitmap > ) ,
3133 /// a list
3234 LargeList ( ListNested ) ,
35+ /// a fixed list
36+ FixedList ( FixedListNested ) ,
3337 /// A struct column
3438 Struct ( usize , bool , Option < Bitmap > ) ,
3539}
@@ -51,13 +55,38 @@ impl ListNested {
5155 }
5256}
5357
58+ #[ derive( Debug , Clone , PartialEq ) ]
59+ pub struct FixedListNested {
60+ pub is_nullable : bool ,
61+ pub dimension : usize ,
62+ pub length : usize ,
63+ pub validity : Option < Bitmap > ,
64+ }
65+
66+ impl FixedListNested {
67+ pub fn new (
68+ dimension : usize ,
69+ length : usize ,
70+ validity : Option < Bitmap > ,
71+ is_nullable : bool ,
72+ ) -> Self {
73+ Self {
74+ is_nullable,
75+ dimension,
76+ length,
77+ validity,
78+ }
79+ }
80+ }
81+
5482pub type NestedState = Vec < Nested > ;
5583
5684impl Nested {
5785 pub fn length ( & self ) -> usize {
5886 match self {
5987 Nested :: Primitive ( len, _, _) => * len,
6088 Nested :: LargeList ( l) => l. offsets . len ( ) ,
89+ Nested :: FixedList ( l) => l. length ,
6190 Nested :: Struct ( len, _, _) => * len,
6291 }
6392 }
@@ -66,37 +95,34 @@ impl Nested {
6695 match self {
6796 Nested :: Primitive ( _, b, _) => * b,
6897 Nested :: LargeList ( l) => l. is_nullable ,
98+ Nested :: FixedList ( l) => l. is_nullable ,
6999 Nested :: Struct ( _, b, _) => * b,
70100 }
71101 }
72102
73- pub fn inner ( & self ) -> ( Buffer < u64 > , & Option < Bitmap > ) {
103+ pub fn offsets ( & self ) -> Option < Buffer < u64 > > {
74104 match self {
75- Nested :: Primitive ( _, _, v) => ( Buffer :: new ( ) , v) ,
76105 Nested :: LargeList ( l) => {
77106 let start = * l. offsets . first ( ) . unwrap ( ) ;
78107 let buffer = if start == 0 {
79108 l. offsets . clone ( )
80109 } else {
81110 l. offsets . iter ( ) . map ( |x| * x - start) . collect ( )
82111 } ;
83- ( buffer, & l . validity )
112+ Some ( buffer)
84113 }
85- Nested :: Struct ( _ , _ , v ) => ( Buffer :: new ( ) , v ) ,
114+ _ => None ,
86115 }
87116 }
88117
89118 pub fn validity ( & self ) -> & Option < Bitmap > {
90119 match self {
91120 Nested :: Primitive ( _, _, v) => v,
92121 Nested :: LargeList ( l) => & l. validity ,
122+ Nested :: FixedList ( l) => & l. validity ,
93123 Nested :: Struct ( _, _, v) => v,
94124 }
95125 }
96-
97- pub fn is_list ( & self ) -> bool {
98- matches ! ( self , Nested :: LargeList ( _) )
99- }
100126}
101127
102128/// Constructs the necessary `Vec<Vec<Nested>>` to write the rep and def levels of `column` to parquet
@@ -110,7 +136,10 @@ pub fn to_nested(column: &Column) -> Result<Vec<Vec<Nested>>> {
110136pub fn is_nested_type ( t : & TableDataType ) -> bool {
111137 matches ! (
112138 t,
113- TableDataType :: Tuple { .. } | TableDataType :: Array ( _) | TableDataType :: Map ( _)
139+ TableDataType :: Tuple { .. }
140+ | TableDataType :: Array ( _)
141+ | TableDataType :: Map ( _)
142+ | TableDataType :: Vector ( _)
114143 )
115144}
116145
@@ -133,6 +162,13 @@ pub fn slice_nest_column(
133162 current_length = r as usize ;
134163 current_offset = * l_nested. offsets . first ( ) . unwrap ( ) as usize ;
135164 }
165+ Nested :: FixedList ( l_nested) => {
166+ if let Some ( validity) = l_nested. validity . as_mut ( ) {
167+ validity. slice ( current_offset, current_length)
168+ } ;
169+ current_offset *= l_nested. dimension ;
170+ current_length *= l_nested. dimension ;
171+ }
136172 Nested :: Struct ( length, _, validity) => {
137173 * length = current_length;
138174 if let Some ( validity) = validity. as_mut ( ) {
@@ -176,6 +212,15 @@ fn to_nested_recursive(
176212 } ) ) ;
177213 to_nested_recursive ( & inner. underlying_column ( ) , nested, parents) ?;
178214 }
215+ Column :: Vector ( inner) => {
216+ parents. push ( Nested :: FixedList ( FixedListNested {
217+ is_nullable : nullable,
218+ dimension : inner. dimension ( ) ,
219+ length : inner. len ( ) ,
220+ validity,
221+ } ) ) ;
222+ to_nested_recursive ( & inner. underlying_column ( ) , nested, parents) ?;
223+ }
179224 Column :: Map ( inner) => {
180225 parents. push ( Nested :: LargeList ( ListNested {
181226 is_nullable : nullable,
@@ -208,6 +253,9 @@ fn to_leaves_recursive(column: &Column, leaves: &mut Vec<Column>) {
208253 Column :: Array ( col) => {
209254 to_leaves_recursive ( & col. underlying_column ( ) , leaves) ;
210255 }
256+ Column :: Vector ( col) => {
257+ to_leaves_recursive ( & col. underlying_column ( ) , leaves) ;
258+ }
211259 Column :: Map ( col) => {
212260 to_leaves_recursive ( & col. underlying_column ( ) , leaves) ;
213261 }
@@ -218,14 +266,15 @@ fn to_leaves_recursive(column: &Column, leaves: &mut Vec<Column>) {
218266 }
219267}
220268
221- /// The initial info of nested data types.
222269/// The initial info of nested data types.
223270#[ derive( Debug , Clone , Copy , PartialEq , Eq ) ]
224271pub enum InitNested {
225272 /// Primitive data types
226273 Primitive ( bool ) ,
227274 /// List data types
228275 List ( bool ) ,
276+ /// Fixed List data types
277+ FixedList ( bool ) ,
229278 /// Struct data types
230279 Struct ( bool ) ,
231280}
@@ -235,14 +284,16 @@ impl InitNested {
235284 match self {
236285 InitNested :: Primitive ( b) => * b,
237286 InitNested :: List ( b) => * b,
287+ InitNested :: FixedList ( b) => * b,
238288 InitNested :: Struct ( b) => * b,
239289 }
240290 }
241291}
242292
243293pub fn create_list ( data_type : TableDataType , nested : & mut NestedState , values : Column ) -> Column {
244294 let n = nested. pop ( ) . unwrap ( ) ;
245- let ( offsets, validity) = n. inner ( ) ;
295+ let offsets = n. offsets ( ) . unwrap ( ) ;
296+ let validity = n. validity ( ) ;
246297 let col = Column :: Array ( Box :: new ( ArrayColumn :: < AnyType > :: new ( values, offsets) ) ) ;
247298
248299 if data_type. is_nullable ( ) {
@@ -252,10 +303,36 @@ pub fn create_list(data_type: TableDataType, nested: &mut NestedState, values: C
252303 }
253304}
254305
306+ pub fn create_fixed_list (
307+ data_type : TableDataType ,
308+ dimension : usize ,
309+ nested : & mut NestedState ,
310+ values : Column ,
311+ ) -> Column {
312+ let n = nested. pop ( ) . unwrap ( ) ;
313+ let validity = n. validity ( ) ;
314+ let col = match values {
315+ Column :: Number ( NumberColumn :: Int8 ( vals) ) => {
316+ Column :: Vector ( VectorColumn :: Int8 ( ( vals. clone ( ) , dimension) ) )
317+ }
318+ Column :: Number ( NumberColumn :: Float32 ( vals) ) => {
319+ Column :: Vector ( VectorColumn :: Float32 ( ( vals. clone ( ) , dimension) ) )
320+ }
321+ _ => unreachable ! ( ) ,
322+ } ;
323+
324+ if data_type. is_nullable ( ) {
325+ col. wrap_nullable ( validity. clone ( ) )
326+ } else {
327+ col
328+ }
329+ }
330+
255331/// Creates a new [`Mapcolumn`].
256332pub fn create_map ( data_type : TableDataType , nested : & mut NestedState , values : Column ) -> Column {
257333 let n = nested. pop ( ) . unwrap ( ) ;
258- let ( offsets, validity) = n. inner ( ) ;
334+ let offsets = n. offsets ( ) . unwrap ( ) ;
335+ let validity = n. validity ( ) ;
259336 let col = Column :: Map ( Box :: new ( ArrayColumn :: < AnyType > :: new ( values, offsets) ) ) ;
260337 if data_type. is_nullable ( ) {
261338 col. wrap_nullable ( validity. clone ( ) )
@@ -271,7 +348,7 @@ pub fn create_struct(
271348) -> ( NestedState , Column ) {
272349 let mut nest = nested. pop ( ) . unwrap ( ) ;
273350 let n = nest. pop ( ) . unwrap ( ) ;
274- let ( _ , validity) = n. inner ( ) ;
351+ let validity = n. validity ( ) ;
275352
276353 let col = Column :: Tuple ( values) ;
277354 if is_nullable {
0 commit comments