pub struct PhysicalIntersect {
pub num_build_sides: u32,
pub probe_key_col: u32,
pub build_key_col: u32,
}Expand description
Physical intersect operator.
For multi-pattern matching like MATCH (a)-[:r1]->(b), (a)-[:r2]->(c):
- Multiple build sides each produce a hash table keyed by the shared variable
a - The probe side produces candidate values for
a - For each probe key, all build hash tables are probed
- The matching node ID lists are pairwise intersected (two-way sorted merge)
- Only keys that appear in ALL build sides produce output
Implementation: a simplified version of the C++ Intersect (intersect.h).
Builds hash tables from build chunks, probes with probe chunks, and does
pairwise intersection using sorted node ID comparison.
Fields§
§num_build_sides: u32Number of build hash tables (one per pattern).
probe_key_col: u32Column index of the key in the probe side.
build_key_col: u32Column index of the key in each build side.
Implementations§
Source§impl PhysicalIntersect
impl PhysicalIntersect
pub fn execute_binary( &self, build_chunks: &[DataChunk], probe_chunks: &[DataChunk], ) -> OperatorResult
Sourcepub fn execute_sides(
&self,
build_sides: &[Vec<DataChunk>],
probe_chunks: &[DataChunk],
) -> OperatorResult
pub fn execute_sides( &self, build_sides: &[Vec<DataChunk>], probe_chunks: &[DataChunk], ) -> OperatorResult
Execute the intersect against independently-produced build sides.
Each build side is hashed into its own table keyed on the shared node ID.
A probe row passes only when its key is present in EVERY build table, and
the output is the full cross product of the matching build rows (so a
shared node with k neighbors per side produces k1 * k2 * ... rows).
Output column layout: [probe columns] + [build side 1 columns] + ....
Auto Trait Implementations§
impl Freeze for PhysicalIntersect
impl RefUnwindSafe for PhysicalIntersect
impl Send for PhysicalIntersect
impl Sync for PhysicalIntersect
impl Unpin for PhysicalIntersect
impl UnsafeUnpin for PhysicalIntersect
impl UnwindSafe for PhysicalIntersect
Blanket Implementations§
impl<T> Allocation for T
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
impl<T> Fruit for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
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