@@ -1259,6 +1259,96 @@ func (q *FakeQuerier) getProvisionerJobsByIDsWithQueuePositionLocked(_ context.C
1259
1259
return results , nil
1260
1260
}
1261
1261
1262
+ func (q * FakeQuerier ) getProvisionerJobsByIDsWithQueuePositionLockedV0 (_ context.Context , ids []uuid.UUID ) ([]database.GetProvisionerJobsByIDsWithQueuePositionRow , error ) {
1263
+ // WITH pending_jobs AS (
1264
+ // SELECT
1265
+ // id, created_at
1266
+ // FROM
1267
+ // provisioner_jobs
1268
+ // WHERE
1269
+ // started_at IS NULL
1270
+ // AND
1271
+ // canceled_at IS NULL
1272
+ // AND
1273
+ // completed_at IS NULL
1274
+ // AND
1275
+ // error IS NULL
1276
+ // ),
1277
+ type pendingJobRow struct {
1278
+ ID uuid.UUID
1279
+ CreatedAt time.Time
1280
+ }
1281
+ pendingJobs := make ([]pendingJobRow , 0 )
1282
+ for _ , job := range q .provisionerJobs {
1283
+ if job .StartedAt .Valid ||
1284
+ job .CanceledAt .Valid ||
1285
+ job .CompletedAt .Valid ||
1286
+ job .Error .Valid {
1287
+ continue
1288
+ }
1289
+ pendingJobs = append (pendingJobs , pendingJobRow {
1290
+ ID : job .ID ,
1291
+ CreatedAt : job .CreatedAt ,
1292
+ })
1293
+ }
1294
+
1295
+ // queue_position AS (
1296
+ // SELECT
1297
+ // id,
1298
+ // ROW_NUMBER() OVER (ORDER BY created_at ASC) AS queue_position
1299
+ // FROM
1300
+ // pending_jobs
1301
+ // ),
1302
+ slices .SortFunc (pendingJobs , func (a , b pendingJobRow ) int {
1303
+ c := a .CreatedAt .Compare (b .CreatedAt )
1304
+ return c
1305
+ })
1306
+
1307
+ queuePosition := make (map [uuid.UUID ]int64 )
1308
+ for idx , pj := range pendingJobs {
1309
+ queuePosition [pj .ID ] = int64 (idx + 1 )
1310
+ }
1311
+
1312
+ // queue_size AS (
1313
+ // SELECT COUNT(*) AS count FROM pending_jobs
1314
+ // ),
1315
+ queueSize := len (pendingJobs )
1316
+
1317
+ // SELECT
1318
+ // sqlc.embed(pj),
1319
+ // COALESCE(qp.queue_position, 0) AS queue_position,
1320
+ // COALESCE(qs.count, 0) AS queue_size
1321
+ // FROM
1322
+ // provisioner_jobs pj
1323
+ // LEFT JOIN
1324
+ // queue_position qp ON pj.id = qp.id
1325
+ // LEFT JOIN
1326
+ // queue_size qs ON TRUE
1327
+ // WHERE
1328
+ // pj.id IN (...)
1329
+ jobs := make ([]database.GetProvisionerJobsByIDsWithQueuePositionRow , 0 )
1330
+ for _ , job := range q .provisionerJobs {
1331
+ if ids != nil && ! slices .Contains (ids , job .ID ) {
1332
+ continue
1333
+ }
1334
+ // clone the Tags before appending, since maps are reference types and
1335
+ // we don't want the caller to be able to mutate the map we have inside
1336
+ // dbmem!
1337
+ job .Tags = maps .Clone (job .Tags )
1338
+ job := database.GetProvisionerJobsByIDsWithQueuePositionRow {
1339
+ // sqlc.embed(pj),
1340
+ ProvisionerJob : job ,
1341
+ // COALESCE(qp.queue_position, 0) AS queue_position,
1342
+ QueuePosition : queuePosition [job .ID ],
1343
+ // COALESCE(qs.count, 0) AS queue_size
1344
+ QueueSize : int64 (queueSize ),
1345
+ }
1346
+ jobs = append (jobs , job )
1347
+ }
1348
+
1349
+ return jobs , nil
1350
+ }
1351
+
1262
1352
func (* FakeQuerier ) AcquireLock (_ context.Context , _ int64 ) error {
1263
1353
return xerrors .New ("AcquireLock must only be called within a transaction" )
1264
1354
}
@@ -4240,7 +4330,7 @@ func (q *FakeQuerier) GetProvisionerJobsByOrganizationAndStatusWithQueuePosition
4240
4330
LIMIT
4241
4331
sqlc.narg('limit')::int;
4242
4332
*/
4243
- rowsWithQueuePosition , err := q .getProvisionerJobsByIDsWithQueuePositionLocked (ctx , nil )
4333
+ rowsWithQueuePosition , err := q .getProvisionerJobsByIDsWithQueuePositionLockedV0 (ctx , nil )
4244
4334
if err != nil {
4245
4335
return nil , err
4246
4336
}
0 commit comments