use crate::bridge::envelope::PhysicalPlan;
use crate::bridge::physical_plan::JoinProjection;
use crate::bridge::scan_filter::ScanFilter;
use crate::data::executor::task::ExecutionTask;
pub(crate) struct JoinParams<'a> {
pub task: &'a ExecutionTask,
pub on: &'a [(String, String)],
pub join_type: &'a str,
pub limit: usize,
pub projection: &'a [JoinProjection],
pub post_filter_bytes: &'a [u8],
}
pub(crate) struct HashJoinParams<'a> {
pub join: JoinParams<'a>,
pub tid: u64,
pub left_collection: &'a str,
pub right_collection: &'a str,
pub left_alias: Option<&'a str>,
pub right_alias: Option<&'a str>,
pub inline_left: Option<&'a PhysicalPlan>,
pub inline_right: Option<&'a PhysicalPlan>,
pub inline_left_bitmap: Option<&'a PhysicalPlan>,
pub inline_right_bitmap: Option<&'a PhysicalPlan>,
}
pub(crate) struct InlineHashJoinParams<'a> {
pub join: JoinParams<'a>,
pub left_data: &'a [u8],
pub right_data: &'a [u8],
pub right_alias: Option<&'a str>,
}
pub(crate) struct BroadcastJoinParams<'a> {
pub join: JoinParams<'a>,
pub tid: u64,
pub large_collection: &'a str,
pub small_collection: &'a str,
pub large_alias: Option<&'a str>,
pub small_alias: Option<&'a str>,
pub broadcast_data: &'a [u8],
}
impl JoinParams<'_> {
pub fn filter_and_project(&self, results: &mut Vec<Vec<u8>>) {
if !self.post_filter_bytes.is_empty() {
let filters: Vec<ScanFilter> =
zerompk::from_msgpack(self.post_filter_bytes).unwrap_or_default();
if !filters.is_empty() {
results.retain(|row| super::binary_row_matches_filters(row, &filters));
}
}
if !self.projection.is_empty() {
for row in results.iter_mut() {
*row = super::binary_row_project(row, self.projection);
}
}
}
}