33
44use std:: hash:: Hasher ;
55
6+ use vortex:: array:: ArrayEq ;
7+ use vortex:: array:: ArrayHash ;
68use vortex:: array:: ArrayRef ;
79use vortex:: array:: EmptyMetadata ;
810use vortex:: array:: ExecutionCtx ;
@@ -16,10 +18,15 @@ use vortex::array::vtable::ArrayId;
1618use vortex:: array:: vtable:: VTable ;
1719use vortex:: array:: vtable:: ValidityVTableFromChild ;
1820use vortex:: dtype:: DType ;
21+ use vortex:: dtype:: Nullability ;
1922use vortex:: error:: VortexResult ;
23+ use vortex:: error:: vortex_ensure_eq;
24+ use vortex:: error:: vortex_err;
25+ use vortex:: error:: vortex_panic;
2026use vortex:: session:: VortexSession ;
2127
2228use crate :: encodings:: norm:: array:: NormVectorArray ;
29+ use crate :: utils:: extension_element_ptype;
2330
2431mod operations;
2532mod validity;
@@ -52,70 +59,109 @@ impl VTable for NormVector {
5259 }
5360
5461 fn array_hash < H : Hasher > ( array : & NormVectorArray , state : & mut H , precision : Precision ) {
55- todo ! ( )
62+ array. vector_array ( ) . array_hash ( state, precision) ;
63+ array. norms ( ) . array_hash ( state, precision) ;
5664 }
5765
5866 fn array_eq ( array : & NormVectorArray , other : & NormVectorArray , precision : Precision ) -> bool {
59- todo ! ( )
67+ array. norms ( ) . array_eq ( other. norms ( ) , precision)
68+ && array
69+ . vector_array ( )
70+ . array_eq ( other. vector_array ( ) , precision)
6071 }
6172
62- fn nbuffers ( array : & NormVectorArray ) -> usize {
63- todo ! ( )
73+ fn nbuffers ( _array : & NormVectorArray ) -> usize {
74+ 0
6475 }
6576
66- fn buffer ( array : & NormVectorArray , idx : usize ) -> BufferHandle {
67- todo ! ( )
77+ fn buffer ( _array : & NormVectorArray , idx : usize ) -> BufferHandle {
78+ vortex_panic ! ( "NormVectorArray has no buffers (index {idx})" )
6879 }
6980
70- fn buffer_name ( array : & NormVectorArray , idx : usize ) -> Option < String > {
71- todo ! ( )
81+ fn buffer_name ( _array : & NormVectorArray , idx : usize ) -> Option < String > {
82+ vortex_panic ! ( "NormVectorArray has no buffers (index {idx})" )
7283 }
7384
74- fn nchildren ( array : & NormVectorArray ) -> usize {
75- todo ! ( )
85+ fn nchildren ( _array : & NormVectorArray ) -> usize {
86+ 2
7687 }
7788
7889 fn child ( array : & NormVectorArray , idx : usize ) -> ArrayRef {
79- todo ! ( )
90+ match idx {
91+ 0 => array. vector_array ( ) . clone ( ) ,
92+ 1 => array. norms ( ) . clone ( ) ,
93+ _ => vortex_panic ! ( "NormVectorArray child index {idx} out of bounds" ) ,
94+ }
8095 }
8196
82- fn child_name ( array : & NormVectorArray , idx : usize ) -> String {
83- todo ! ( )
97+ fn child_name ( _array : & NormVectorArray , idx : usize ) -> String {
98+ match idx {
99+ 0 => "vector_array" . to_string ( ) ,
100+ 1 => "norms" . to_string ( ) ,
101+ _ => vortex_panic ! ( "NormVectorArray child_name index {idx} out of bounds" ) ,
102+ }
84103 }
85104
86- fn metadata ( array : & NormVectorArray ) -> VortexResult < Self :: Metadata > {
87- todo ! ( )
105+ fn metadata ( _array : & NormVectorArray ) -> VortexResult < Self :: Metadata > {
106+ Ok ( EmptyMetadata )
88107 }
89108
90- fn serialize ( metadata : Self :: Metadata ) -> VortexResult < Option < Vec < u8 > > > {
91- todo ! ( )
109+ fn serialize ( _metadata : Self :: Metadata ) -> VortexResult < Option < Vec < u8 > > > {
110+ Ok ( Some ( vec ! [ ] ) )
92111 }
93112
94113 fn deserialize (
95- bytes : & [ u8 ] ,
114+ _bytes : & [ u8 ] ,
96115 _dtype : & DType ,
97116 _len : usize ,
98117 _buffers : & [ BufferHandle ] ,
99118 _session : & VortexSession ,
100119 ) -> VortexResult < Self :: Metadata > {
101- todo ! ( )
120+ Ok ( EmptyMetadata )
102121 }
103122
104123 fn build (
105124 dtype : & DType ,
106125 len : usize ,
107- metadata : & Self :: Metadata ,
108- buffers : & [ BufferHandle ] ,
126+ _metadata : & Self :: Metadata ,
127+ _buffers : & [ BufferHandle ] ,
109128 children : & dyn ArrayChildren ,
110129 ) -> VortexResult < NormVectorArray > {
111- todo ! ( )
130+ vortex_ensure_eq ! (
131+ children. len( ) ,
132+ 2 ,
133+ "NormVectorArray requires exactly 2 children"
134+ ) ;
135+
136+ let vector_array = children. get ( 0 , dtype, len) ?;
137+
138+ let ext = dtype. as_extension_opt ( ) . ok_or_else ( || {
139+ vortex_err ! ( "NormVectorArray dtype must be an extension type, got {dtype}" )
140+ } ) ?;
141+ let element_ptype = extension_element_ptype ( ext) ?;
142+ let norms_dtype = DType :: Primitive ( element_ptype, Nullability :: NonNullable ) ;
143+ let norms = children. get ( 1 , & norms_dtype, len) ?;
144+
145+ NormVectorArray :: try_new ( vector_array, norms)
112146 }
113147
114148 fn with_children ( array : & mut NormVectorArray , children : Vec < ArrayRef > ) -> VortexResult < ( ) > {
115- todo ! ( )
149+ vortex_ensure_eq ! (
150+ children. len( ) ,
151+ 2 ,
152+ "NormVectorArray requires exactly 2 children"
153+ ) ;
154+
155+ let [ vector_array, norms] : [ ArrayRef ; 2 ] = children
156+ . try_into ( )
157+ . map_err ( |_| vortex_err ! ( "NormVectorArray requires exactly 2 children" ) ) ?;
158+
159+ array. vector_array = vector_array;
160+ array. norms = norms;
161+ Ok ( ( ) )
116162 }
117163
118164 fn execute ( array : & NormVectorArray , ctx : & mut ExecutionCtx ) -> VortexResult < ExecutionStep > {
119- todo ! ( )
165+ Ok ( ExecutionStep :: Done ( array . execute_into_vector ( ctx ) ? ) )
120166 }
121167}
0 commit comments