1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
//!# QuickStart
//!## Get dependencies from SQL written ref macro with Jinja.
//!First, create sql like Jinja.
//!```sql
//!-- src/sample_sqls/level1/sample.sql
//!select
//!u.*
//!, r.*
//!from {{ ref("db", "users") }} as u
//!left join {{ ref("role") }} as r on
//!u.id = r.user_id
//!```
//!```sql
//!-- src/sample_sqls/sample2.sql
//!select
//!u.*
//!, r.*
//!from {{ ref("db", "sales") }} as u
//!left join {{ ref("db", "sale_detail") }} as r on
//!u.id = r.sale_id
//!```
//!Use alias lib from main function.
//!```rust no_run
//!use alisql;
//!
//!let d = alisql::get_dependencies("src/sample_sqls", 5);
//! dbg!(d);
//!```
//!### Result
//!```text
//! d = [
//! Table {
//! table: "sample",
//! sql: SQL {
//! path: "src/sample_sqls/level1/sample.sql",
//! query: "select \nu.*\n, r.* \nfrom {{ ref(\"db\", \"users\") }} as u\nleft join {{ ref(\"role\") }} as r on\nu.id = r.user_id",
//! },
//! depends_on: [
//! "db.users",
//! "role",
//! ],
//! },
//! Table {
//! table: "sample2",
//! sql: SQL {
//! path: "src/sample_sqls/sample2.sql",
//! query: "select \nu.*\n, r.* \nfrom {{ ref(\"db\", \"sales\") }} as u\nleft join {{ ref(\"db\", \"sale_detail\") }} as r on\nu.id = r.sale_id",
//! },
//! depends_on: [
//! "db.sales",
//! "db.sale_detail",
//! ],
//! },
//!]
//!```
//! ## Get dependencies graph from SQL with Mermaid.
//!
//! orientation are
//! - TB : top to bottom
//! - TD : top-down/ same as top to bottom
//! - BT : bottom to top
//! - RL : right to left
//! - LR : left to right
//!
//! ```rust no_run
//! use alisql;
//!
//! let m = alisql::get_mermaid("src/sample_sqls", "TD", 5);
//! println!("{}", m);
//!```
//!
//! ```text
//!graph TD;
//!db.users --> sample;
//!role --> sample;
//!db.sales --> sample2;
//!db.sale_detail --> sample2;
//!```
//!
//! ### Reference
//! - [Mermaid](https://mermaid-js.github.io/mermaid/#/./flowchart?id=flowchart-orientation)
//!
use ;
use WalkDir;