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
|
@startuml query-execution-flow
!theme plain
title Query Execution Flow
actor Client
participant "Query Planner" as Planner
participant "Scan Iterator" as Scan
participant "Select Iterator" as Select
participant "Project Iterator" as Project
participant "Operations API" as Ops
database "Mnesia" as DB
Client -> Planner: query({project,\n {select, {scan, employee}, Pred},\n [name, age]})
activate Planner
Planner -> Planner: parse & validate
Planner -> Scan: spawn_iterator(employee)
activate Scan
Planner -> Select: spawn_iterator(Scan, Pred)
activate Select
Planner -> Project: spawn_iterator(Select, [name, age])
activate Project
Planner --> Client: {ok, Iterator}
deactivate Planner
Client -> Project: next_tuple()
Project -> Select: next_tuple()
Select -> Scan: next_tuple()
Scan -> Ops: get_tuples_iterator(employee)
Ops -> DB: transaction(read tuple)
DB --> Ops: {ok, Tuple}
Ops --> Scan: {ok, Tuple}
Scan --> Select: {ok, Tuple}
Select -> Select: apply Predicate
Select --> Project: {ok, Tuple}
Project -> Project: filter attributes
Project --> Client: {ok, #{name => "Alice", age => 30}}
Client -> Project: next_tuple()
Project -> Select: next_tuple()
Select -> Scan: next_tuple()
Scan -> Ops: get_tuples_iterator(employee)
Ops -> DB: transaction(read tuple)
DB --> Ops: done
Ops --> Scan: done
Scan --> Select: done
Select --> Project: done
Project --> Client: done
Client -> Project: close_iterator()
deactivate Project
deactivate Select
deactivate Scan
@enduml
|