-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.py
72 lines (57 loc) · 2.2 KB
/
index.py
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
from sql_insight.core.observer import ExpressionWalker
from sql_insight.core.utils import get_expressions_by_path
from sql_insight.observers.PartitionObserver import PartitionObserver
from sql_insight.observers.ObjectTrackingObserver import ObjectTrackingObserver
from sqlglot import parse_one
from sqlglot.expressions import Query, From, Table, Join, Subquery, With, CTE
partition = PartitionObserver()
object_tracker = ObjectTrackingObserver()
expression = parse_one(
"""
with boses as (
select id, name from (
select * from employees e
inner join employees b
on b.id = e.bossId
) where salary > 50000
)
select name, age from boses b
inner join people p
on b.id = p.id
where age < 28 and name = 'yossi'
""",
dialect="trino",
)
walker = ExpressionWalker(expression, object_tracker, partition)
walker.walk()
for column in partition.columns:
query_expression = column.find_ancestor(Query)
if query_expression:
simple_tables = [
*get_expressions_by_path(query_expression, (From, Table)),
*get_expressions_by_path(query_expression, (Join, Table)),
]
subquery_tables = [
*get_expressions_by_path(query_expression, (From, Subquery)),
*get_expressions_by_path(query_expression, (Join, Subquery)),
]
cte_tables = get_expressions_by_path(query_expression, (With, CTE))
filtered_simple_tables = []
for table in simple_tables:
is_cte = False
for cte in cte_tables:
if cte.alias == table.name:
is_cte = True
if not is_cte:
filtered_simple_tables.append(table)
print(
column.name,
object_tracker.get_all_column_deps(
column.name, [*filtered_simple_tables, *cte_tables, *subquery_tables]
),
)
"""
Question the observer strategy, as you can simply loop over the expressions you're looking for
Pro:
you can use multiple observers for single query, however not sure how necessary it is....
"""