[enh] optimise home showing only latest done/scheduled jobs

This commit is contained in:
Laurent Peuch 2018-11-03 04:30:28 +01:00
parent 713851cadc
commit 25b13a7204

23
run.py
View file

@ -6,6 +6,7 @@ import argh
import random import random
import logging import logging
import asyncio import asyncio
import itertools
from datetime import datetime, date from datetime import datetime, date
from collections import defaultdict from collections import defaultdict
@ -23,6 +24,7 @@ from sanic.log import LOGGING_CONFIG_DEFAULTS
from sanic_jinja2 import SanicJinja2 from sanic_jinja2 import SanicJinja2
from peewee import fn
from playhouse.shortcuts import model_to_dict from playhouse.shortcuts import model_to_dict
from models import Repo, Job, db, Worker from models import Repo, Job, db, Worker
@ -380,9 +382,28 @@ def subscribe(ws, channel):
async def ws_index(request, websocket): async def ws_index(request, websocket):
subscribe(websocket, "jobs") 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({ await websocket.send(ujson.dumps({
"action": "init_jobs", "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: while True: