Skip to content

Commit 5bc8322

Browse files
geyslanrscampos
andcommitted
feat(dependencies): add GetAllEventsDependingOnProbe
Add a new method to the Manager that retrieves all events depending on a specified probe, including both direct and transitive dependents. This functionality is accompanied by comprehensive unit tests to cover various success and error scenarios. Co-authored-by: Raphael Campos <[email protected]>
1 parent f39337e commit 5bc8322

File tree

2 files changed

+604
-0
lines changed

2 files changed

+604
-0
lines changed

pkg/events/dependencies/manager.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,50 @@ func (m *Manager) GetProbe(handle probes.Handle) (*ProbeNode, error) {
9797
return probeNode, nil
9898
}
9999

100+
// GetAllEventsDependingOnProbe returns all events that transitively depend on the given probe.
101+
// This includes direct dependents and all events that depend on those dependents recursively.
102+
func (m *Manager) GetAllEventsDependingOnProbe(handle probes.Handle) ([]events.ID, error) {
103+
m.mu.RLock()
104+
defer m.mu.RUnlock()
105+
106+
probeNode := m.getProbe(handle)
107+
if probeNode == nil {
108+
return nil, ErrNodeNotFound
109+
}
110+
111+
return m.collectAllEventDependents(probeNode.GetDependents()), nil
112+
}
113+
114+
// collectAllEventDependents computes the transitive closure of event dependents via depth-first traversal.
115+
func (m *Manager) collectAllEventDependents(startEvents []events.ID) []events.ID {
116+
visited := make(map[events.ID]struct{}, len(startEvents))
117+
result := make([]events.ID, 0, len(startEvents))
118+
119+
var collect func(events.ID)
120+
collect = func(id events.ID) {
121+
if _, seen := visited[id]; seen {
122+
return
123+
}
124+
125+
visited[id] = struct{}{}
126+
result = append(result, id)
127+
128+
// Get the event node and recursively process all dependents
129+
if node := m.getEventNode(id); node != nil {
130+
for _, dep := range node.GetDependents() {
131+
collect(dep)
132+
}
133+
}
134+
}
135+
136+
// Start collection from each initial event
137+
for _, id := range startEvents {
138+
collect(id)
139+
}
140+
141+
return result
142+
}
143+
100144
// SelectEvent adds the given event to the management tree with default dependencies
101145
// and marks it as explicitly selected.
102146
// It also recursively adds all events that this event depends on (its dependencies) to the tree.

0 commit comments

Comments
 (0)