sqruff_lib_core/parser/segments/
join.rs1use 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 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 self.0
22 .children(const { &SyntaxSet::new(&[SyntaxKind::FromExpressionElement]) })
23 .next()
24 .cloned()
25 } else {
26 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}