sqruff_lib_core/parser/segments/
join.rs

1use crate::dialects::common::AliasInfo;
2use crate::dialects::syntax::{SyntaxKind, SyntaxSet};
3use crate::parser::segments::ErasedSegment;
4use crate::parser::segments::from::FromExpressionElementSegment;
5
6pub struct JoinClauseSegment(pub ErasedSegment);
7
8impl JoinClauseSegment {
9    pub fn eventual_aliases(&self) -> Vec<(ErasedSegment, AliasInfo)> {
10        let mut buff = Vec::new();
11
12        // Check if this is an APPLY clause (CROSS APPLY or OUTER APPLY)
13        // APPLY clauses have a different structure where FromExpressionElement is in the sequence
14        let is_apply = self
15            .0
16            .children(const { &SyntaxSet::new(&[SyntaxKind::Keyword]) })
17            .any(|kw| kw.raw().to_uppercase() == "APPLY");
18
19        let from_expression = if is_apply {
20            // For APPLY clauses, find the FromExpressionElement in the sequence
21            self.0
22                .children(const { &SyntaxSet::new(&[SyntaxKind::FromExpressionElement]) })
23                .next()
24                .cloned()
25        } else {
26            // For regular JOIN clauses, get the nested child
27            self.0
28                .child(const { &SyntaxSet::new(&[SyntaxKind::FromExpressionElement]) })
29        };
30
31        if let Some(from_expr) = from_expression {
32            let alias = FromExpressionElementSegment(from_expr.clone()).eventual_alias();
33            buff.push((from_expr.clone(), alias));
34        }
35
36        for join_clause in self.0.recursive_crawl(
37            const { &SyntaxSet::new(&[SyntaxKind::JoinClause]) },
38            true,
39            const { &SyntaxSet::single(SyntaxKind::SelectStatement) },
40            true,
41        ) {
42            if join_clause.id() == self.0.id() {
43                continue;
44            }
45
46            let aliases = JoinClauseSegment(join_clause).eventual_aliases();
47
48            if !aliases.is_empty() {
49                buff.extend(aliases);
50            }
51        }
52
53        buff
54    }
55}