oxigdal_query/executor/join/
mod.rs1use crate::error::Result;
4use crate::executor::scan::RecordBatch;
5use crate::parser::ast::{Expr, JoinType};
6
7mod expression;
9mod hash_join;
10mod nested_loop;
11mod value;
12
13pub use value::JoinValue;
15
16pub struct JoinContext<'a> {
21 pub left: &'a RecordBatch,
23 pub right: &'a RecordBatch,
25 pub left_row: usize,
27 pub right_row: usize,
29 pub left_alias: Option<&'a str>,
31 pub right_alias: Option<&'a str>,
33}
34
35pub struct Join {
37 pub join_type: JoinType,
39 pub on_condition: Option<Expr>,
41 pub left_alias: Option<String>,
43 pub right_alias: Option<String>,
45}
46
47impl Join {
48 pub fn new(join_type: JoinType, on_condition: Option<Expr>) -> Self {
50 Self {
51 join_type,
52 on_condition,
53 left_alias: None,
54 right_alias: None,
55 }
56 }
57
58 pub fn with_left_alias(mut self, alias: impl Into<String>) -> Self {
60 self.left_alias = Some(alias.into());
61 self
62 }
63
64 pub fn with_right_alias(mut self, alias: impl Into<String>) -> Self {
66 self.right_alias = Some(alias.into());
67 self
68 }
69
70 pub fn execute(&self, left: &RecordBatch, right: &RecordBatch) -> Result<RecordBatch> {
72 match self.join_type {
73 JoinType::Inner => self.inner_join(left, right),
74 JoinType::Left => self.left_join(left, right),
75 JoinType::Right => self.right_join(left, right),
76 JoinType::Full => self.full_join(left, right),
77 JoinType::Cross => self.cross_join(left, right),
78 }
79 }
80}
81
82#[cfg(test)]
83mod tests;