""" Cached query wrappers for Streamlit performance. Uses @st.cache_data to avoid re-fetching identical data on every rerun. Tag names must be passed as tuples (not lists) for hashability. """ import streamlit as st from typing import Optional from datetime import datetime from core.db_connector import get_db_connector @st.cache_data(ttl=600) def cached_get_pivot_data( tag_names: tuple, start_time: datetime, end_time: datetime, table_override: Optional[str] = None, _cache_ver: int = 2, ): """Cached pivot data query (10-minute TTL). Supports table_override for resolution control.""" db = get_db_connector() if table_override: # Fetch via get_sensor_data with override, then pivot manually df = db.get_sensor_data(list(tag_names), start_time, end_time, table_override=table_override) if df.empty: return df pivot_df = df.pivot_table(index='timestamp', columns='tag_name', values='value').reset_index() pivot_df.columns.name = None return pivot_df return db.get_pivot_data(list(tag_names), start_time, end_time) @st.cache_data(ttl=600) def cached_get_sensor_data( tag_names: tuple, start_time: datetime, end_time: datetime, table_override: Optional[str] = None, _cache_ver: int = 2, ): """Cached sensor data query (10-minute TTL)""" db = get_db_connector() return db.get_sensor_data(list(tag_names), start_time, end_time, table_override=table_override) @st.cache_data(ttl=3600) def cached_get_available_months(): """Cached available months query (1-hour TTL)""" db = get_db_connector() return db.get_available_months()