diff --git a/main.py b/main.py index 36a506b..a8dc2a7 100644 --- a/main.py +++ b/main.py @@ -1,3 +1,4 @@ +import asyncio import os import httpx from fastapi import FastAPI, Query @@ -159,26 +160,30 @@ async def meta(city: str = "", dimension: str = "", brand: str = "", manager: st params = parse_filters(city, dimension, brand, manager, status, search, date_start, date_end) hds = bool(params["date_start"]) hde = bool(params["date_end"]) - cities = await ch_query( - f"SELECT DISTINCT city FROM default.pf_board WHERE {build_where(dimension=True, brand=True, manager=True, status=True, search=True, date_start=hds, date_end=hde)} AND char_length(city) > 0 ORDER BY city", - params, - ) - brands = await ch_query( - f"SELECT DISTINCT brand FROM default.pf_board WHERE {build_where(city=True, dimension=True, manager=True, status=True, search=True, date_start=hds, date_end=hde)} AND char_length(brand) > 0 ORDER BY brand", - params, - ) - dimensions = await ch_query( - f"SELECT DISTINCT dimension FROM default.pf_board WHERE {build_where(city=True, brand=True, manager=True, status=True, search=True, date_start=hds, date_end=hde)} AND char_length(dimension) > 0 ORDER BY dimension", - params, - ) - # manager is an Array(String) column — ARRAY JOIN to enumerate distinct names. - managers = await ch_query( - f"SELECT DISTINCT m AS manager FROM default.pf_board ARRAY JOIN manager AS m WHERE {build_where(city=True, dimension=True, brand=True, status=True, search=True, date_start=hds, date_end=hde)} AND char_length(m) > 0 ORDER BY manager", - params, - ) - statuses = await ch_query( - f"SELECT DISTINCT task_status FROM default.pf_board WHERE {build_where(city=True, dimension=True, brand=True, manager=True, search=True, date_start=hds, date_end=hde)} AND char_length(task_status) > 0 ORDER BY task_status", - params, + # The five facet lists are independent queries, so run them concurrently + # instead of awaiting one after another (5x latency on every filter change). + cities, brands, dimensions, managers, statuses = await asyncio.gather( + ch_query( + f"SELECT DISTINCT city FROM default.pf_board WHERE {build_where(dimension=True, brand=True, manager=True, status=True, search=True, date_start=hds, date_end=hde)} AND char_length(city) > 0 ORDER BY city", + params, + ), + ch_query( + f"SELECT DISTINCT brand FROM default.pf_board WHERE {build_where(city=True, dimension=True, manager=True, status=True, search=True, date_start=hds, date_end=hde)} AND char_length(brand) > 0 ORDER BY brand", + params, + ), + ch_query( + f"SELECT DISTINCT dimension FROM default.pf_board WHERE {build_where(city=True, brand=True, manager=True, status=True, search=True, date_start=hds, date_end=hde)} AND char_length(dimension) > 0 ORDER BY dimension", + params, + ), + # manager is an Array(String) column — ARRAY JOIN to enumerate distinct names. + ch_query( + f"SELECT DISTINCT m AS manager FROM default.pf_board ARRAY JOIN manager AS m WHERE {build_where(city=True, dimension=True, brand=True, status=True, search=True, date_start=hds, date_end=hde)} AND char_length(m) > 0 ORDER BY manager", + params, + ), + ch_query( + f"SELECT DISTINCT task_status FROM default.pf_board WHERE {build_where(city=True, dimension=True, brand=True, manager=True, search=True, date_start=hds, date_end=hde)} AND char_length(task_status) > 0 ORDER BY task_status", + params, + ), ) return { "cities": [r["city"] for r in cities],