sqruff_lib_core/parser/segments/
join.rs1use crate::dialects::common::AliasInfo;
2use crate::dialects::syntax::{SyntaxKind, SyntaxSet};
3use crate::parser::segments::base::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 from_expression = self
13 .0
14 .child(const { &SyntaxSet::new(&[SyntaxKind::FromExpressionElement]) })
15 .unwrap();
16 let alias = FromExpressionElementSegment(from_expression.clone()).eventual_alias();
17
18 buff.push((from_expression.clone(), alias));
19
20 for join_clause in self.0.recursive_crawl(
21 const { &SyntaxSet::new(&[SyntaxKind::JoinClause]) },
22 true,
23 const { &SyntaxSet::single(SyntaxKind::SelectStatement) },
24 true,
25 ) {
26 if join_clause.id() == join_clause.id() {
27 continue;
28 }
29
30 let aliases = JoinClauseSegment(join_clause).eventual_aliases();
31
32 if !aliases.is_empty() {
33 buff.extend(aliases);
34 }
35 }
36
37 buff
38 }
39}