1 """All queries for logbook."""
3 from __future__
import annotations
5 from sqlalchemy
import lambda_stmt
6 from sqlalchemy.sql.lambdas
import StatementLambdaElement
7 from sqlalchemy.sql.selectable
import Select
10 LAST_UPDATED_INDEX_TS,
16 from .common
import apply_states_filters, select_events_without_states, select_states
22 event_type_ids: tuple[int, ...],
23 filters: Filters |
None,
24 context_id_bin: bytes |
None =
None,
25 ) -> StatementLambdaElement:
26 """Generate a logbook query for all entities."""
30 if context_id_bin
is not None:
31 stmt +=
lambda s: s.where(Events.context_id_bin == context_id_bin).union_all(
34 elif filters
and filters.has_config:
35 stmt = stmt.add_criteria(
36 lambda q: q.filter(filters.events_entity_filter()).union_all(
38 filters.states_metadata_entity_filter()
46 stmt +=
lambda s: s.order_by(Events.time_fired_ts)
55 """Force mysql to use the right index on large selects."""
57 States, f
"FORCE INDEX ({LAST_UPDATED_INDEX_TS})", dialect_name=
"mysql"
59 States, f
"FORCE INDEX ({LAST_UPDATED_INDEX_TS})", dialect_name=
"mariadb"
64 start_day: float, end_day: float, context_id_bin: bytes
67 States.context_id_bin == context_id_bin
Select _states_query_for_context_id(float start_day, float end_day, bytes context_id_bin)
Select _states_query_for_all(float start_day, float end_day)
Select _apply_all_hints(Select sel)
StatementLambdaElement all_stmt(float start_day, float end_day, tuple[int,...] event_type_ids, Filters|None filters, bytes|None context_id_bin=None)
Select apply_states_filters(Select sel, float start_day, float end_day)
Select select_events_without_states(float start_day, float end_day, tuple[int,...] event_type_ids)