Home Assistant Unofficial Reference 2024.12.1
all.py
Go to the documentation of this file.
1 """All queries for logbook."""
2 
3 from __future__ import annotations
4 
5 from sqlalchemy import lambda_stmt
6 from sqlalchemy.sql.lambdas import StatementLambdaElement
7 from sqlalchemy.sql.selectable import Select
8 
10  LAST_UPDATED_INDEX_TS,
11  Events,
12  States,
13 )
15 
16 from .common import apply_states_filters, select_events_without_states, select_states
17 
18 
20  start_day: float,
21  end_day: float,
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."""
27  stmt = lambda_stmt(
28  lambda: select_events_without_states(start_day, end_day, event_type_ids)
29  )
30  if context_id_bin is not None:
31  stmt += lambda s: s.where(Events.context_id_bin == context_id_bin).union_all(
32  _states_query_for_context_id(start_day, end_day, context_id_bin),
33  )
34  elif filters and filters.has_config:
35  stmt = stmt.add_criteria(
36  lambda q: q.filter(filters.events_entity_filter()).union_all(
37  _states_query_for_all(start_day, end_day).where(
38  filters.states_metadata_entity_filter()
39  )
40  ),
41  track_on=[filters],
42  )
43  else:
44  stmt += lambda s: s.union_all(_states_query_for_all(start_day, end_day))
45 
46  stmt += lambda s: s.order_by(Events.time_fired_ts)
47  return stmt
48 
49 
50 def _states_query_for_all(start_day: float, end_day: float) -> Select:
51  return apply_states_filters(_apply_all_hints(select_states()), start_day, end_day)
52 
53 
54 def _apply_all_hints(sel: Select) -> Select:
55  """Force mysql to use the right index on large selects."""
56  return sel.with_hint(
57  States, f"FORCE INDEX ({LAST_UPDATED_INDEX_TS})", dialect_name="mysql"
58  ).with_hint(
59  States, f"FORCE INDEX ({LAST_UPDATED_INDEX_TS})", dialect_name="mariadb"
60  )
61 
62 
64  start_day: float, end_day: float, context_id_bin: bytes
65 ) -> Select:
66  return apply_states_filters(select_states(), start_day, end_day).where(
67  States.context_id_bin == context_id_bin
68  )
Select _states_query_for_context_id(float start_day, float end_day, bytes context_id_bin)
Definition: all.py:65
Select _states_query_for_all(float start_day, float end_day)
Definition: all.py:50
Select _apply_all_hints(Select sel)
Definition: all.py:54
StatementLambdaElement all_stmt(float start_day, float end_day, tuple[int,...] event_type_ids, Filters|None filters, bytes|None context_id_bin=None)
Definition: all.py:25
Select apply_states_filters(Select sel, float start_day, float end_day)
Definition: common.py:167
Select select_events_without_states(float start_day, float end_day, tuple[int,...] event_type_ids)
Definition: common.py:147