From 25b13a72044dc7b1374d5b5d07078b7257990bd2 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Sat, 3 Nov 2018 04:30:28 +0100 Subject: [PATCH] [enh] optimise home showing only latest done/scheduled jobs --- run.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/run.py b/run.py index b59ab64..919e74d 100644 --- a/run.py +++ b/run.py @@ -6,6 +6,7 @@ import argh import random import logging import asyncio +import itertools from datetime import datetime, date from collections import defaultdict @@ -23,6 +24,7 @@ from sanic.log import LOGGING_CONFIG_DEFAULTS from sanic_jinja2 import SanicJinja2 +from peewee import fn from playhouse.shortcuts import model_to_dict from models import Repo, Job, db, Worker @@ -380,9 +382,28 @@ def subscribe(ws, channel): async def ws_index(request, websocket): subscribe(websocket, "jobs") + JobAlias = Job.alias() + subquery = JobAlias.select()\ + .where(JobAlias.state << ("done", "failure", "canceled"))\ + .group_by(JobAlias.url_or_path)\ + .select(fn.Max(JobAlias.id).alias("max_id")) + + latest_done_jobs = Job.select()\ + .join(subquery, on=(Job.id == subquery.c.max_id))\ + .order_by(-Job.id) + + subquery = JobAlias.select()\ + .where(JobAlias.state == "scheduled")\ + .group_by(JobAlias.url_or_path)\ + .select(fn.Min(JobAlias.id).alias("min_id")) + + next_scheduled_jobs = Job.select()\ + .join(subquery, on=(Job.id == subquery.c.min_id))\ + .order_by(-Job.id) + await websocket.send(ujson.dumps({ "action": "init_jobs", - "data": map(model_to_dict, Job.select().order_by(-Job.id)), + "data": itertools.chain(map(model_to_dict, next_scheduled_jobs), map(model_to_dict, latest_done_jobs)), })) while True: