|
6 | 6 | "errors" |
7 | 7 | "fmt" |
8 | 8 | "github.com/serverledge-faas/serverledge/internal/client" |
| 9 | + "golang.org/x/exp/slices" |
9 | 10 | "io" |
10 | 11 | "net/http" |
11 | 12 | "sort" |
@@ -114,89 +115,35 @@ func (w *Workflow) computePreviousTasks() { |
114 | 115 | } |
115 | 116 | } |
116 | 117 |
|
117 | | -// Visit visits the workflow starting from the given task and return a list of visited tasks. |
118 | | -// If excludeEnd = true, the EndTask will not be in the output list |
119 | | -func Visit(workflow *Workflow, taskId TaskId, tasks []Task, excludeEnd bool) []Task { |
| 118 | +func Visit(workflow *Workflow, taskId TaskId, excludeEnd bool) []Task { |
| 119 | + |
120 | 120 | task, ok := workflow.Find(taskId) |
121 | 121 | if !ok { |
122 | 122 | return []Task{} |
123 | 123 | } |
124 | | - if !isTaskPresent(task, tasks) { |
| 124 | + |
| 125 | + tasks := make([]Task, 0) |
| 126 | + visited := make(map[TaskId]bool) |
| 127 | + toVisit := []Task{task} |
| 128 | + |
| 129 | + for len(toVisit) > 0 { |
| 130 | + task := toVisit[0] |
125 | 131 | tasks = append(tasks, task) |
126 | | - } |
127 | | - switch n := task.(type) { |
128 | | - case *StartTask: |
129 | | - toAdd := Visit(workflow, n.GetNext()[0], tasks, excludeEnd) |
130 | | - for _, add := range toAdd { |
131 | | - if !isTaskPresent(add, tasks) { |
132 | | - // only when isEndTask = true, excludeEnd = true -> we don't add the task |
133 | | - if !isEndTask(add) || !excludeEnd { |
134 | | - tasks = append(tasks, add) |
135 | | - } |
136 | | - } |
137 | | - } |
138 | | - return tasks |
139 | | - case *SimpleTask, *PassTask, *SuccessTask, *FailureTask: |
140 | | - toAdd := Visit(workflow, n.GetNext()[0], tasks, excludeEnd) |
141 | | - for _, add := range toAdd { |
142 | | - if !isTaskPresent(add, tasks) { |
143 | | - if !isEndTask(add) || !excludeEnd { |
144 | | - tasks = append(tasks, add) |
145 | | - } |
146 | | - } |
147 | | - } |
148 | | - return tasks |
149 | | - case *EndTask: |
150 | | - if !excludeEnd { // move end task to the end of the visit list |
151 | | - endTask := n |
152 | | - // get index of end task to remove\ |
153 | | - indexToRemove := -1 |
154 | | - for i, task := range tasks { |
155 | | - if isEndTask(task) { |
156 | | - indexToRemove = i |
157 | | - break |
158 | | - } |
159 | | - } |
160 | | - // remove end task |
161 | | - tasks = append(tasks[:indexToRemove], tasks[indexToRemove+1:]...) |
162 | | - // append at the end of the visited task list |
163 | | - tasks = append(tasks, endTask) |
164 | | - } |
165 | | - return tasks |
166 | | - case *ChoiceTask: |
167 | | - for _, alternative := range n.GetNext() { |
168 | | - toAdd := Visit(workflow, alternative, tasks, excludeEnd) |
169 | | - for _, add := range toAdd { |
170 | | - if !isTaskPresent(add, tasks) { |
171 | | - if !isEndTask(add) || !excludeEnd { |
172 | | - tasks = append(tasks, add) |
173 | | - } |
174 | | - } |
175 | | - } |
176 | | - } |
177 | | - return tasks |
178 | | - case *FanOutTask: |
179 | | - for _, parallelBranch := range n.GetNext() { |
180 | | - toAdd := Visit(workflow, parallelBranch, tasks, excludeEnd) |
181 | | - for _, add := range toAdd { |
182 | | - if !isTaskPresent(add, tasks) { |
183 | | - if !isEndTask(add) || !excludeEnd { |
184 | | - tasks = append(tasks, add) |
| 132 | + toVisit = toVisit[1:] |
| 133 | + visited[task.GetId()] = true |
| 134 | + |
| 135 | + for _, nextTask := range task.GetNext() { |
| 136 | + if _, ok := visited[nextTask]; !ok { |
| 137 | + nt := workflow.Tasks[nextTask] |
| 138 | + if !excludeEnd || nt.GetType() != End { |
| 139 | + if !slices.Contains(toVisit, nt) { |
| 140 | + toVisit = append(toVisit, nt) |
185 | 141 | } |
186 | 142 | } |
187 | 143 | } |
188 | 144 | } |
189 | | - return tasks |
190 | | - case *FanInTask: |
191 | | - toAdd := Visit(workflow, n.GetNext()[0], tasks, excludeEnd) |
192 | | - for _, add := range toAdd { |
193 | | - if !isTaskPresent(add, tasks) { |
194 | | - if !isEndTask(add) || !excludeEnd { |
195 | | - tasks = append(tasks, add) |
196 | | - } |
197 | | - } |
198 | | - } |
199 | 145 | } |
| 146 | + |
200 | 147 | return tasks |
201 | 148 | } |
202 | 149 |
|
|
0 commit comments