From 2478490c85263ba8ac700f036b0948ca9ec4b7e3 Mon Sep 17 00:00:00 2001 From: Jiri Kalvoda <jirikalvoda@kam.mff.cuni.cz> Date: Tue, 16 Jul 2024 11:48:00 +0200 Subject: [PATCH] MainServer: prev_data --- prog/communication.py | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/prog/communication.py b/prog/communication.py index be0d89b..0f7a974 100644 --- a/prog/communication.py +++ b/prog/communication.py @@ -237,17 +237,17 @@ class MainServer(FuncCaller): self._download_server = download_server.DownloadServer(s) return self._download_server - async def _tree_walker(self, condition, worker): + async def _tree_walker(self, condition, worker, reverse=False): d = "data/realtime" - for d_Y_m_d in sorted(os.listdir(d)): + for d_Y_m_d in sorted(os.listdir(d), reverse=reverse): path = d_Y_m_d dt = path_to_dt(path) if await condition(dt, datetime.timedelta(days=1)): - for d_H in sorted(os.listdir(d+"/"+path)): + for d_H in sorted(os.listdir(d+"/"+path), reverse=reverse): path = d_Y_m_d+"/"+d_H dt = path_to_dt(path) if await condition(dt, datetime.timedelta(hours=1)): - for d_M_S in sorted(os.listdir(d+"/"+path)): + for d_M_S in sorted(os.listdir(d+"/"+path), reverse=reverse): path = d_Y_m_d+"/"+d_H+"/"+d_M_S dt = path_to_dt(path) await worker(dt) @@ -278,6 +278,21 @@ class MainServer(FuncCaller): return r.val return None + async def list_prev_realtime_data(self, dt_from: datetime): + class Return(Exception): + def __init__(self, val): + self.val = val + async def condition(dt, delta): + return dt_intersect(dt_minf, dt_from, dt, delta) + async def worker(dt): + if dt < dt_from: + raise Return(dt) + try: + await self._tree_walker(condition, worker, reverse=True) + except Return as r: + return r.val + return None + @server_exec() async def get_data(self, dt: datetime.datetime): path = "data/realtime/"+dt_to_path(dt) @@ -298,6 +313,14 @@ class MainServer(FuncCaller): else: return next_dt, await self.get_data(dt) + @server_exec() + async def get_prev_data(self, dt: datetime.datetime): + prev_dt = await self.list_prev_realtime_data(dt) + if prev_dt is None: + return None + else: + return prev_dt, await self.get_data(dt) + @server_exec() async def get_preprocessed_data(self, dt: datetime.datetime, route_id: str): assert all(i.isalnum() for i in route_id) -- GitLab