pub struct PredicateBytecode { /* private fields */ }Implementations§
Source§impl PredicateBytecode
impl PredicateBytecode
Sourcepub fn ops(&self) -> &[PredicateOp]
pub fn ops(&self) -> &[PredicateOp]
Read-only view of the lowered op sequence. Useful for tests and for the optional optimizer pass landing in v2.2.
Sourcepub fn lower(predicate: &DExpr, base: &DataFrame) -> Option<Self>
pub fn lower(predicate: &DExpr, base: &DataFrame) -> Option<Self>
Lower a DExpr predicate to bytecode. Returns None if the predicate
shape is not supported by the columnar fast path (caller falls through
to row-wise evaluation, exactly as the AST-walk path did).
Sourcepub fn interpret_sparse(
&self,
base: &DataFrame,
existing_indices: &[usize],
nrows: usize,
) -> BitMask
pub fn interpret_sparse( &self, base: &DataFrame, existing_indices: &[usize], nrows: usize, ) -> BitMask
Sparse-aware interpretation (v2.2). Evaluates the predicate over only
the rows listed in existing_indices (must be ascending and a subset
of 0..nrows). Result bits are set exclusively for indices in the
input set, so no final AND with existing_mask is needed — the
caller has effectively pre-applied it via index materialization.
Bit-identical to interpret(base, &existing_mask) whenever
existing_indices == existing_mask.iter_set().collect(). The win
is amortizing per-Cmp cost from O(nrows) to O(|existing_indices|),
which is meaningful when the parent selection has already narrowed
the row set substantially (typical for chained .filter(...).filter(...)).
Caller is responsible for the density decision (see
should_use_sparse_path). Below that threshold, the random-access
gather here beats the sequential column scan in interpret.
Sourcepub fn evaluate_to_selection(
&self,
base: &DataFrame,
nrows: usize,
) -> AdaptiveSelection
pub fn evaluate_to_selection( &self, base: &DataFrame, nrows: usize, ) -> AdaptiveSelection
Interpret the bytecode against base, AND-merging the result with
existing_mask. Result is bit-identical to AST-walk on every shape
lower accepts.
Evaluate the predicate without ANDing into an existing mask,
classifying the result as an AdaptiveSelection. Used by the
v3 Phase 3 production wiring path: when the existing selection is
already a Hybrid (mid-band density, large nrows), we want the
fresh predicate result to also be classified so the downstream
existing.intersect(fresh) call can route through Phase 3’s
per-chunk dispatch instead of materialising-and-AND.
Bit-equivalent to interpret followed by AdaptiveSelection:: from_predicate_result(...), but skips the per-call existing-mask
AND so the classification reflects the predicate’s own selectivity.
pub fn interpret(&self, base: &DataFrame, existing_mask: &BitMask) -> BitMask
Trait Implementations§
Source§impl Clone for PredicateBytecode
impl Clone for PredicateBytecode
Source§fn clone(&self) -> PredicateBytecode
fn clone(&self) -> PredicateBytecode
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for PredicateBytecode
impl RefUnwindSafe for PredicateBytecode
impl Send for PredicateBytecode
impl Sync for PredicateBytecode
impl Unpin for PredicateBytecode
impl UnsafeUnpin for PredicateBytecode
impl UnwindSafe for PredicateBytecode
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more