1
+ use fsst:: Symbol ;
1
2
use serde:: { Deserialize , Serialize } ;
2
3
use vortex_array:: serde:: ArrayParts ;
3
4
use vortex_array:: vtable:: SerdeVTable ;
4
5
use vortex_array:: {
5
- Array , ArrayChildVisitor , ArrayContext , ArrayRef , ArrayVisitorImpl , DeserializeMetadata ,
6
- SerdeMetadata ,
6
+ Array , ArrayBufferVisitor , ArrayChildVisitor , ArrayContext , ArrayRef , ArrayVisitorImpl ,
7
+ DeserializeMetadata , SerdeMetadata ,
7
8
} ;
9
+ use vortex_buffer:: Buffer ;
8
10
use vortex_dtype:: { DType , Nullability , PType } ;
9
- use vortex_error:: { VortexExpect , VortexResult } ;
11
+ use vortex_error:: { VortexExpect , VortexResult , vortex_bail } ;
10
12
11
- use crate :: array:: { SYMBOL_LENS_DTYPE , SYMBOLS_DTYPE } ;
12
13
use crate :: { FSSTArray , FSSTEncoding } ;
13
14
14
15
#[ derive( Debug , Clone , Serialize , Deserialize ) ]
15
16
pub struct FSSTMetadata {
16
- symbols_len : usize ,
17
- codes_nullability : Nullability ,
18
17
uncompressed_lengths_ptype : PType ,
19
18
}
20
19
21
20
impl ArrayVisitorImpl < SerdeMetadata < FSSTMetadata > > for FSSTArray {
21
+ fn _buffers ( & self , visitor : & mut dyn ArrayBufferVisitor ) {
22
+ visitor. visit_buffer ( & self . symbols ( ) . clone ( ) . into_byte_buffer ( ) ) ;
23
+ visitor. visit_buffer ( & self . symbol_lengths ( ) . clone ( ) . into_byte_buffer ( ) ) ;
24
+ }
25
+
22
26
fn _children ( & self , visitor : & mut dyn ArrayChildVisitor ) {
23
- visitor. visit_child ( "symbols" , self . symbols ( ) ) ;
24
- visitor. visit_child ( "symbol_lengths" , self . symbol_lengths ( ) ) ;
25
27
visitor. visit_child ( "codes" , self . codes ( ) ) ;
26
28
visitor. visit_child ( "uncompressed_lengths" , self . uncompressed_lengths ( ) ) ;
27
29
}
28
30
29
31
fn _metadata ( & self ) -> SerdeMetadata < FSSTMetadata > {
30
32
SerdeMetadata ( FSSTMetadata {
31
- symbols_len : self . symbols ( ) . len ( ) ,
32
- codes_nullability : self . codes ( ) . dtype ( ) . nullability ( ) ,
33
33
uncompressed_lengths_ptype : PType :: try_from ( self . uncompressed_lengths ( ) . dtype ( ) )
34
34
. vortex_expect ( "Must be a valid PType" ) ,
35
35
} )
@@ -46,17 +46,19 @@ impl SerdeVTable<&FSSTArray> for FSSTEncoding {
46
46
) -> VortexResult < ArrayRef > {
47
47
let metadata = SerdeMetadata :: < FSSTMetadata > :: deserialize ( parts. metadata ( ) ) ?;
48
48
49
- let symbols = parts
50
- . child ( 0 )
51
- . decode ( ctx, SYMBOLS_DTYPE . clone ( ) , metadata. symbols_len ) ?;
52
- let symbol_lengths =
53
- parts
54
- . child ( 1 )
55
- . decode ( ctx, SYMBOL_LENS_DTYPE . clone ( ) , metadata. symbols_len ) ?;
49
+ if parts. nbuffers ( ) != 2 {
50
+ vortex_bail ! ( InvalidArgument : "Expected 2 buffers, got {}" , parts. nbuffers( ) ) ;
51
+ }
52
+ let symbols = Buffer :: < Symbol > :: from_byte_buffer ( parts. buffer ( 0 ) ?) ;
53
+ let symbol_lengths = Buffer :: < u8 > :: from_byte_buffer ( parts. buffer ( 1 ) ?) ;
54
+
55
+ if parts. nchildren ( ) != 2 {
56
+ vortex_bail ! ( InvalidArgument : "Expected 2 children, got {}" , parts. nchildren( ) ) ;
57
+ }
56
58
let codes = parts
57
- . child ( 2 )
58
- . decode ( ctx, DType :: Binary ( metadata . codes_nullability ) , len) ?;
59
- let uncompressed_lengths = parts. child ( 3 ) . decode (
59
+ . child ( 0 )
60
+ . decode ( ctx, DType :: Binary ( dtype . nullability ( ) ) , len) ?;
61
+ let uncompressed_lengths = parts. child ( 1 ) . decode (
60
62
ctx,
61
63
DType :: Primitive (
62
64
metadata. uncompressed_lengths_ptype ,
@@ -76,7 +78,7 @@ impl SerdeVTable<&FSSTArray> for FSSTEncoding {
76
78
mod test {
77
79
use vortex_array:: SerdeMetadata ;
78
80
use vortex_array:: test_harness:: check_metadata;
79
- use vortex_dtype:: { Nullability , PType } ;
81
+ use vortex_dtype:: PType ;
80
82
81
83
use crate :: serde:: FSSTMetadata ;
82
84
@@ -86,8 +88,6 @@ mod test {
86
88
check_metadata (
87
89
"fsst.metadata" ,
88
90
SerdeMetadata ( FSSTMetadata {
89
- symbols_len : usize:: MAX ,
90
- codes_nullability : Nullability :: Nullable ,
91
91
uncompressed_lengths_ptype : PType :: U64 ,
92
92
} ) ,
93
93
) ;
0 commit comments