11// SPDX-License-Identifier: Apache-2.0
22// SPDX-FileCopyrightText: Copyright the Vortex contributors
33
4+ use std:: fmt:: Debug ;
5+
46use vortex_buffer:: BufferHandle ;
57use vortex_dtype:: DType ;
68use vortex_error:: VortexResult ;
79use vortex_error:: vortex_bail;
810use vortex_error:: vortex_ensure;
11+ use vortex_mask:: Mask ;
912use vortex_scalar:: Scalar ;
1013use vortex_scalar:: ScalarValue ;
1114use vortex_vector:: ScalarOps ;
15+ use vortex_vector:: Vector ;
1216use vortex_vector:: VectorMutOps ;
1317
1418use crate :: ArrayRef ;
1519use crate :: EmptyMetadata ;
1620use crate :: arrays:: ConstantArray ;
1721use crate :: kernel:: BindCtx ;
22+ use crate :: kernel:: Kernel ;
1823use crate :: kernel:: KernelRef ;
19- use crate :: kernel:: kernel ;
24+ use crate :: kernel:: PushDownResult ;
2025use crate :: serde:: ArrayChildren ;
2126use crate :: vtable;
2227use crate :: vtable:: ArrayId ;
@@ -89,9 +94,10 @@ impl VTable for ConstantVTable {
8994 }
9095
9196 fn bind_kernel ( array : & Self :: Array , _ctx : & mut BindCtx ) -> VortexResult < KernelRef > {
92- let scalar = array. scalar ( ) . to_vector_scalar ( ) ;
93- let len = array. len ( ) ;
94- Ok ( kernel ( move || Ok ( scalar. clone ( ) . repeat ( len) . freeze ( ) ) ) )
97+ Ok ( Box :: new ( ConstantKernel {
98+ value : array. scalar . to_vector_scalar ( ) ,
99+ len : array. len ,
100+ } ) )
95101 }
96102
97103 fn with_children ( _array : & mut Self :: Array , children : Vec < ArrayRef > ) -> VortexResult < ( ) > {
@@ -103,3 +109,23 @@ impl VTable for ConstantVTable {
103109 Ok ( ( ) )
104110 }
105111}
112+
113+ #[ derive( Debug ) ]
114+ struct ConstantKernel {
115+ value : vortex_vector:: Scalar ,
116+ len : usize ,
117+ }
118+
119+ impl Kernel for ConstantKernel {
120+ fn execute ( self : Box < Self > ) -> VortexResult < Vector > {
121+ Ok ( self . value . repeat ( self . len ) . freeze ( ) )
122+ }
123+
124+ fn push_down_filter ( self : Box < Self > , selection : & Mask ) -> VortexResult < PushDownResult > {
125+ vortex_ensure ! ( self . len == selection. len( ) ) ;
126+ Ok ( PushDownResult :: Pushed ( Box :: new ( ConstantKernel {
127+ value : self . value ,
128+ len : selection. true_count ( ) ,
129+ } ) ) )
130+ }
131+ }
0 commit comments