| 268 | } |
| 269 | |
| 270 | func (*Store) listTasksImpl(ctx context.Context, txn *sql.Tx, find *TaskFind) ([]*TaskMessage, error) { |
| 271 | q := qb.Q().Space(` |
| 272 | SELECT |
| 273 | task.id, |
| 274 | task.project, |
| 275 | task.plan_id, |
| 276 | task.instance, |
| 277 | task.db_name, |
| 278 | task.environment, |
| 279 | COALESCE(latest_task_run.status, ?) AS latest_task_run_status, |
| 280 | task.type, |
| 281 | task.payload, |
| 282 | latest_task_run.updated_at, |
| 283 | latest_task_run.run_at |
| 284 | FROM task |
| 285 | LEFT JOIN LATERAL ( |
| 286 | SELECT |
| 287 | task_run.status, |
| 288 | task_run.updated_at, |
| 289 | task_run.run_at |
| 290 | FROM task_run |
| 291 | WHERE task_run.project = task.project AND task_run.task_id = task.id |
| 292 | ORDER BY task_run.id DESC |
| 293 | LIMIT 1 |
| 294 | ) AS latest_task_run ON TRUE |
| 295 | WHERE task.project = ?`, storepb.TaskRun_NOT_STARTED.String(), find.ProjectID) |
| 296 | if find.Workspace != "" { |
| 297 | q.Space("AND task.project IN (SELECT resource_id FROM project WHERE workspace = ?)", find.Workspace) |
| 298 | } |
| 299 | if v := find.ID; v != nil { |
| 300 | q.Space("AND task.id = ?", *v) |
| 301 | } |
| 302 | if v := find.IDs; v != nil { |
| 303 | q.Space("AND task.id = ANY(?)", *v) |
| 304 | } |
| 305 | if v := find.PlanID; v != nil { |
| 306 | q.Space("AND task.plan_id = ?", *v) |
| 307 | } |
| 308 | if v := find.PlanIDs; v != nil { |
| 309 | q.Space("AND task.plan_id = ANY(?)", *v) |
| 310 | } |
| 311 | if v := find.Environment; v != nil { |
| 312 | q.Space("AND task.environment = ?", *v) |
| 313 | } |
| 314 | if v := find.InstanceID; v != nil { |
| 315 | q.Space("AND task.instance = ?", *v) |
| 316 | } |
| 317 | if v := find.DatabaseName; v != nil { |
| 318 | q.Space("AND task.db_name = ?", *v) |
| 319 | } |
| 320 | if v := find.LatestTaskRunStatusList; v != nil { |
| 321 | var statusStrings []string |
| 322 | for _, status := range *v { |
| 323 | statusStrings = append(statusStrings, status.String()) |
| 324 | } |
| 325 | q.Space("AND latest_task_run.status = ANY(?)", statusStrings) |
| 326 | } |
| 327 | if v := find.TypeList; v != nil { |