1 """Devices queries for logbook."""
3 from __future__
import annotations
5 from collections.abc
import Iterable
8 from sqlalchemy
import lambda_stmt, select
9 from sqlalchemy.sql.elements
import BooleanClauseList
10 from sqlalchemy.sql.lambdas
import StatementLambdaElement
11 from sqlalchemy.sql.selectable
import CTE, CompoundSelect, Select
23 apply_events_context_hints,
24 apply_states_context_hints,
25 select_events_context_id_subquery,
26 select_events_context_only,
27 select_events_without_states,
28 select_states_context_only,
35 event_type_ids: tuple[int, ...],
36 json_quotable_device_ids: list[str],
38 """Generate a subquery to find context ids for multiple devices."""
44 return select(inner.c.context_id_bin).group_by(inner.c.context_id_bin)
51 event_type_ids: tuple[int, ...],
52 json_quotable_device_ids: list[str],
54 """Generate a CTE to find the device context ids and a query to find linked row."""
59 json_quotable_device_ids,
64 .select_from(devices_cte)
65 .outerjoin(Events, devices_cte.c.context_id_bin == Events.context_id_bin)
66 .outerjoin(EventTypes, (Events.event_type_id == EventTypes.event_type_id))
67 .outerjoin(EventData, (Events.data_id == EventData.data_id)),
71 .select_from(devices_cte)
72 .outerjoin(States, devices_cte.c.context_id_bin == States.context_id_bin)
73 .outerjoin(StatesMeta, (States.metadata_id == StatesMeta.metadata_id))
81 event_type_ids: tuple[int, ...],
82 json_quotable_device_ids: list[str],
83 ) -> StatementLambdaElement:
84 """Generate a logbook query for multiple devices."""
93 json_quotable_device_ids,
94 ).order_by(Events.time_fired_ts)
99 json_quotable_device_ids: Iterable[str],
100 ) -> BooleanClauseList:
101 """Create matchers for the device_ids in the event_data."""
102 return DEVICE_ID_IN_EVENT.is_not(
None) & sqlalchemy.cast(
103 DEVICE_ID_IN_EVENT, sqlalchemy.Text()
104 ).in_(json_quotable_device_ids)
Select select_states_context_only()
Select select_events_without_states(float start_day, float end_day, tuple[int,...] event_type_ids)
Select select_events_context_id_subquery(float start_day, float end_day, tuple[int,...] event_type_ids)
Select apply_states_context_hints(Select sel)
Select apply_events_context_hints(Select sel)
Select select_events_context_only()
CompoundSelect _apply_devices_context_union(Select sel, float start_day, float end_day, tuple[int,...] event_type_ids, list[str] json_quotable_device_ids)
Select _select_device_id_context_ids_sub_query(float start_day, float end_day, tuple[int,...] event_type_ids, list[str] json_quotable_device_ids)
StatementLambdaElement devices_stmt(float start_day, float end_day, tuple[int,...] event_type_ids, list[str] json_quotable_device_ids)
BooleanClauseList apply_event_device_id_matchers(Iterable[str] json_quotable_device_ids)