Skip to main content

shape_ast/ast/
joins.rs

1//! JOIN operation types for Shape AST
2
3use serde::{Deserialize, Serialize};
4
5use super::expressions::Expr;
6
7/// JOIN type
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
9pub enum JoinType {
10    Inner,
11    Left,
12    Right,
13    Full,
14    Cross,
15}
16
17/// JOIN condition
18#[derive(Debug, Clone, Serialize, Deserialize)]
19pub enum JoinCondition {
20    /// ON expression (e.g., ON a.id = b.id)
21    On(Expr),
22    /// USING columns (e.g., USING (id, name))
23    Using(Vec<String>),
24    /// Temporal join (within a time duration)
25    Temporal {
26        /// Time column on left side
27        left_time: String,
28        /// Time column on right side
29        right_time: String,
30        /// Maximum time difference
31        within: crate::data::Timeframe,
32    },
33    /// Natural join (implicit matching columns)
34    Natural,
35}
36
37/// A JOIN clause
38#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct JoinClause {
40    /// Type of join
41    pub join_type: JoinType,
42    /// Right side of the join
43    pub right: JoinSource,
44    /// Join condition
45    pub condition: JoinCondition,
46}
47
48/// Source for a JOIN
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub enum JoinSource {
51    /// Named data source (table/symbol)
52    Named(String),
53    /// Subquery
54    Subquery(Box<super::queries::Query>),
55    /// CTE reference
56    Cte(String),
57}