MCPcopy Create free account
hub / github.com/SeaQL/sea-orm / find_linked_recursive

Function find_linked_recursive

src/entity/link.rs:58–95  ·  view source on GitHub ↗
(
    mut initial_query: Select<E>,
    mut link: Vec<LinkDef>,
)

Source from the content-addressed store, hash-verified

56}
57
58pub(crate) fn find_linked_recursive<E>(
59 mut initial_query: Select<E>,
60 mut link: Vec<LinkDef>,
61) -> Select<E>
62where
63 E: EntityTrait,
64{
65 let cte_name = Alias::new("cte");
66
67 let Some(first) = link.first_mut() else {
68 return initial_query;
69 };
70 first.from_tbl = cte_name.clone().into_table_ref();
71 let mut recursive_query: Select<E> =
72 find_linked(link.into_iter().rev(), JoinType::InnerJoin).select_only();
73 initial_query.query.exprs_mut_for_each(|expr| {
74 recursive_query.query.expr(expr.clone());
75 });
76
77 let mut cte_query = initial_query.query.clone();
78 cte_query.union(UnionType::All, recursive_query.query);
79
80 let cte = CommonTableExpression::new()
81 .table_name(cte_name.clone())
82 .query(cte_query)
83 .to_owned();
84
85 let mut select = E::find().select_only();
86 initial_query.query.exprs_mut_for_each(|expr| {
87 select.query.expr(expr.clone());
88 });
89 select
90 .query
91 .from_clear()
92 .from_as(cte_name, E::default())
93 .with_cte(cte);
94 select
95}

Callers 2

find_linked_recursiveMethod · 0.85

Calls 8

find_linkedFunction · 0.85
select_onlyMethod · 0.80
revMethod · 0.80
into_iterMethod · 0.80
exprMethod · 0.80
newFunction · 0.50
queryMethod · 0.45
table_nameMethod · 0.45

Tested by

no test coverage detected