From 905021af142702b994b486ee7e0698d01482c9d6 Mon Sep 17 00:00:00 2001 From: Philipp Horstenkamp Date: Sat, 11 Nov 2023 14:28:25 +0100 Subject: [PATCH] Experimental caching (#285) Added some caching decoraterors to speedup page delivery. --- src/aki_prj23_transparenzregister/ui/data_elements.py | 4 ++++ .../ui/header_elements.py | 9 ++++++--- src/aki_prj23_transparenzregister/ui/pages/company.py | 2 ++ src/aki_prj23_transparenzregister/ui/pages/person.py | 10 ++++------ 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/aki_prj23_transparenzregister/ui/data_elements.py b/src/aki_prj23_transparenzregister/ui/data_elements.py index 106eecc..bd3e2f9 100644 --- a/src/aki_prj23_transparenzregister/ui/data_elements.py +++ b/src/aki_prj23_transparenzregister/ui/data_elements.py @@ -65,6 +65,10 @@ def get_finance_data(session: Session) -> pd.DataFrame: return pd.read_sql(str(query_finance), engine) +@cached( # type: ignore + cache=TTLCache(maxsize=100, ttl=600), + key=lambda session, company_id: hash((company_id, str(session.bind))), +) def get_finance_data_of_one_company(session: Session, company_id: int) -> pd.DataFrame: """Collects all available finance data of one company. diff --git a/src/aki_prj23_transparenzregister/ui/header_elements.py b/src/aki_prj23_transparenzregister/ui/header_elements.py index 37b1471..b3a1f0a 100644 --- a/src/aki_prj23_transparenzregister/ui/header_elements.py +++ b/src/aki_prj23_transparenzregister/ui/header_elements.py @@ -1,9 +1,9 @@ """Header elements for Dash.""" - +from cachetools import TTLCache, cached from dash import dcc, html -def create_header(options: dict) -> html: +def create_header(options: dict[int, str]) -> html: """Creates header for dashboard. Args: @@ -51,7 +51,10 @@ def create_header(options: dict) -> html: ) -def create_selection_header(selected_name: str) -> html: +@cached( + cache=TTLCache(maxsize=100, ttl=600), key=lambda selected_name: hash(selected_name) # type: ignore +) +def create_selection_header(selected_name: str) -> html.Div: """Create company header based on selected company. Args: diff --git a/src/aki_prj23_transparenzregister/ui/pages/company.py b/src/aki_prj23_transparenzregister/ui/pages/company.py index 5e04336..37d6e13 100644 --- a/src/aki_prj23_transparenzregister/ui/pages/company.py +++ b/src/aki_prj23_transparenzregister/ui/pages/company.py @@ -1,5 +1,6 @@ """Company detail page.""" import dash +from cachetools import TTLCache, cached from dash import html from aki_prj23_transparenzregister.ui import ( @@ -14,6 +15,7 @@ dash.register_page( ) +@cached(cache=TTLCache(maxsize=100, ttl=600), key=lambda value: hash(value)) # type: ignore def layout(value: str = "1") -> html: """Defines the layout of the company page. diff --git a/src/aki_prj23_transparenzregister/ui/pages/person.py b/src/aki_prj23_transparenzregister/ui/pages/person.py index 9758ef8..1981c4a 100644 --- a/src/aki_prj23_transparenzregister/ui/pages/person.py +++ b/src/aki_prj23_transparenzregister/ui/pages/person.py @@ -1,5 +1,6 @@ """Person detail page.""" import dash +from cachetools import TTLCache, cached from dash import html from aki_prj23_transparenzregister.ui import data_elements, header_elements @@ -10,7 +11,8 @@ dash.register_page( ) -def layout(value: str = "1") -> html: +@cached(cache=TTLCache(maxsize=100, ttl=60), key=lambda value: hash(value)) # type: ignore +def layout(value: str = "1") -> html.Div: """Defines the layout of the person detail page. Args: @@ -27,9 +29,5 @@ def layout(value: str = "1") -> html: person_id = int(value) # get all necessary data of the selected person selected_person_stats = data_elements.get_person_data(session).loc[person_id] - selected_person_name = ( - selected_person_stats["person_firstname"] - + " " - + selected_person_stats["person_lastname"] - ) + selected_person_name = f"{selected_person_stats['person_firstname']} {selected_person_stats['person_lastname']}" return header_elements.create_selection_header(selected_person_name)