@@ -12,6 +12,7 @@ import (
1212
1313 "github.com/fsamin/go-dump"
1414 "github.com/go-gorp/gorp"
15+ "github.com/lib/pq"
1516 "go.opencensus.io/stats"
1617
1718 "github.com/ovh/cds/engine/api/database/gorpmapping"
@@ -238,6 +239,15 @@ func LoadLastRun(db gorp.SqlExecutor, projectkey, workflowname string, loadOpts
238239 return loadRun (db , loadOpts , query , projectkey , workflowname )
239240}
240241
242+ // LoadLastRuns returns the last run per workflowIDs
243+ func LoadLastRuns (db gorp.SqlExecutor , workflowIDs []int64 , limit int ) ([]sdk.WorkflowRun , error ) {
244+ query := fmt .Sprintf (`select %s
245+ from workflow_run
246+ where workflow_run.workflow_id = ANY($1)
247+ order by workflow_run.workflow_id, workflow_run.num desc limit $2` , wfRunfields )
248+ return loadRuns (db , query , pq .Int64Array (workflowIDs ), limit )
249+ }
250+
241251// LoadRun returns a specific run
242252func LoadRun (ctx context.Context , db gorp.SqlExecutor , projectkey , workflowname string , number int64 , loadOpts LoadRunOptions ) (* sdk.WorkflowRun , error ) {
243253 _ , end := observability .Span (ctx , "workflow.LoadRun" ,
@@ -284,6 +294,22 @@ func LoadAndLockRunByJobID(db gorp.SqlExecutor, id int64, loadOpts LoadRunOption
284294 return loadRun (db , loadOpts , query , id )
285295}
286296
297+ func loadRuns (db gorp.SqlExecutor , query string , args ... interface {}) ([]sdk.WorkflowRun , error ) {
298+ runs := []Run {}
299+ if _ , err := db .Select (& runs , query , args ... ); err != nil {
300+ return nil , sdk .WrapError (err , "Unable to load runs" )
301+ }
302+ wruns := make ([]sdk.WorkflowRun , len (runs ))
303+ for i := range runs {
304+ wr := sdk .WorkflowRun (runs [i ])
305+ if err := loadRunTags (db , & wr ); err != nil {
306+ return nil , sdk .WrapError (err , "Unable to load tags" )
307+ }
308+ wruns [i ] = wr
309+ }
310+ return wruns , nil
311+ }
312+
287313//LoadRuns loads all runs
288314//It returns runs, offset, limit count and an error
289315func LoadRuns (db gorp.SqlExecutor , projectkey , workflowname string , offset , limit int , tagFilter map [string ]string ) ([]sdk.WorkflowRun , int , int , int , error ) {
@@ -367,18 +393,9 @@ func LoadRuns(db gorp.SqlExecutor, projectkey, workflowname string, offset, limi
367393 args = append (args , strings .Join (tags , "," ))
368394 }
369395
370- runs := []Run {}
371- if _ , err := db .Select (& runs , query , args ... ); err != nil {
372- return nil , 0 , 0 , 0 , sdk .WrapError (errc , "Unable to load runs" )
373- }
374- wruns := make ([]sdk.WorkflowRun , len (runs ))
375- for i := range runs {
376- wr := sdk .WorkflowRun (runs [i ])
377- if err := loadRunTags (db , & wr ); err != nil {
378- return nil , 0 , 0 , 0 , sdk .WrapError (err , "Unable to load tags" )
379- }
380-
381- wruns [i ] = wr
396+ wruns , err := loadRuns (db , query , args ... )
397+ if err != nil {
398+ return nil , 0 , 0 , 0 , err
382399 }
383400
384401 return wruns , offset , limit , int (count ), nil
0 commit comments