aboutsummaryrefslogtreecommitdiffstats
path: root/docs/reactive-queries.puml
blob: bcba5d53b0a2749edfc11011744baff93e7768ff (plain) (blame)
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
@startuml reactive-queries
!theme plain
title Reactive Queries (Live Subscriptions)

participant "Client" as C
participant "Subscription Manager" as SM
participant "Domino" as D
database "employee relation" as E

C -> SM: subscribe(query: "age > 30")
activate SM
SM -> D: register_subscription(employee, predicate)
activate D
D -> E: initial query
E --> D: [{name: "Alice", age: 35}]
D --> SM: initial results
SM --> C: [{name: "Alice", age: 35}]
deactivate D
deactivate SM

... time passes ...

C -> D: insert(employee, {name: "Bob", age: 32})
activate D
D -> D: check affected subscriptions
D -> D: evaluate predicate on new tuple\n(32 > 30? yes)
D -> SM: notify(subscription_id, {inserted: "Bob"})
activate SM
SM -> C: delta: {inserted: {name: "Bob", age: 32}}
deactivate SM
deactivate D

C -> D: insert(employee, {name: "Charlie", age: 25})
activate D
D -> D: evaluate predicate\n(25 > 30? no)
D -> D: no notification needed
deactivate D

note right of SM
  Subscription tracks:
  - Relation(s) to watch
  - Filter predicate
  - Client callback

  On mutation:
  1. Check which subscriptions affected
  2. Evaluate predicate on changed tuples
  3. Send delta (not full re-query)
end note

@enduml