-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathnested.knot
More file actions
33 lines (28 loc) · 1.02 KB
/
Copy pathnested.knot
File metadata and controls
33 lines (28 loc) · 1.02 KB
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
-- Nested relations: a record field can hold its own relation `[T]`.
-- Stored in a child table linked by `_parent_id`; reads/writes are transparent.
with {
type Person = {name: Text, age: Int 1}
*teams : [{name: Text, members: [Person]}]
}
(do
replace *teams = [
{ name "Engineering" members [{ name "Alice" age 30 } { name "Bob" age 25 } { name "Eve" age 22 }] }
{ name "Design" members [{ name "Carol" age 35 } { name "Eve" age 22 }] }
]
-- Read nested members: bind the team, then bind its members field.
base.println "Before:"
teams <- *teams
base.forEach teams (\t -> do
base.forEach t.members (\m -> base.println (" " ++ t.name ++ ": " ++ m.name)))
-- Remove Eve from every team: rewrite each team's members list.
*teams = do
t <- teams
yield { t | members (do
m <- t.members
where m.name != "Eve"
yield m) }
base.println "After:"
teams2 <- *teams
base.forEach teams2 (\t -> do
base.forEach t.members (\m -> base.println (" " ++ t.name ++ ": " ++ m.name)))
yield {})