use crate::error::Result;
use crate::executor::scan::RecordBatch;
use crate::parser::ast::{Expr, JoinType};
mod expression;
mod hash_join;
mod nested_loop;
mod value;
pub use value::JoinValue;
pub struct JoinContext<'a> {
pub left: &'a RecordBatch,
pub right: &'a RecordBatch,
pub left_row: usize,
pub right_row: usize,
pub left_alias: Option<&'a str>,
pub right_alias: Option<&'a str>,
}
pub struct Join {
pub join_type: JoinType,
pub on_condition: Option<Expr>,
pub left_alias: Option<String>,
pub right_alias: Option<String>,
}
impl Join {
pub fn new(join_type: JoinType, on_condition: Option<Expr>) -> Self {
Self {
join_type,
on_condition,
left_alias: None,
right_alias: None,
}
}
pub fn with_left_alias(mut self, alias: impl Into<String>) -> Self {
self.left_alias = Some(alias.into());
self
}
pub fn with_right_alias(mut self, alias: impl Into<String>) -> Self {
self.right_alias = Some(alias.into());
self
}
pub fn execute(&self, left: &RecordBatch, right: &RecordBatch) -> Result<RecordBatch> {
match self.join_type {
JoinType::Inner => self.inner_join(left, right),
JoinType::Left => self.left_join(left, right),
JoinType::Right => self.right_join(left, right),
JoinType::Full => self.full_join(left, right),
JoinType::Cross => self.cross_join(left, right),
}
}
}
#[cfg(test)]
mod tests;