Skip to content

Commit ad1de1e

Browse files
perf[array]: Constant kernel filter pushdown (#5698)
1 parent dc7f364 commit ad1de1e

File tree

1 file changed

+30
-4
lines changed
  • vortex-array/src/arrays/constant/vtable

1 file changed

+30
-4
lines changed

vortex-array/src/arrays/constant/vtable/mod.rs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
11
// SPDX-License-Identifier: Apache-2.0
22
// SPDX-FileCopyrightText: Copyright the Vortex contributors
33

4+
use std::fmt::Debug;
5+
46
use vortex_buffer::BufferHandle;
57
use vortex_dtype::DType;
68
use vortex_error::VortexResult;
79
use vortex_error::vortex_bail;
810
use vortex_error::vortex_ensure;
11+
use vortex_mask::Mask;
912
use vortex_scalar::Scalar;
1013
use vortex_scalar::ScalarValue;
1114
use vortex_vector::ScalarOps;
15+
use vortex_vector::Vector;
1216
use vortex_vector::VectorMutOps;
1317

1418
use crate::ArrayRef;
1519
use crate::EmptyMetadata;
1620
use crate::arrays::ConstantArray;
1721
use crate::kernel::BindCtx;
22+
use crate::kernel::Kernel;
1823
use crate::kernel::KernelRef;
19-
use crate::kernel::kernel;
24+
use crate::kernel::PushDownResult;
2025
use crate::serde::ArrayChildren;
2126
use crate::vtable;
2227
use 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

Comments
 (0)