1 """Entities and Devices queries for logbook."""
3 from __future__
import annotations
5 from collections.abc
import Collection, Iterable
7 from sqlalchemy
import lambda_stmt, select, union_all
8 from sqlalchemy.sql.elements
import ColumnElement
9 from sqlalchemy.sql.lambdas
import StatementLambdaElement
10 from sqlalchemy.sql.selectable
import CTE, CompoundSelect, Select
21 apply_events_context_hints,
22 apply_states_context_hints,
23 select_events_context_id_subquery,
24 select_events_context_only,
25 select_events_without_states,
26 select_states_context_only,
28 from .devices
import apply_event_device_id_matchers
29 from .entities
import (
31 apply_event_entity_id_matchers,
32 states_select_for_entity_ids,
39 event_type_ids: tuple[int, ...],
40 states_metadata_ids: Collection[int],
41 json_quoted_entity_ids: list[str],
42 json_quoted_device_ids: list[str],
44 """Generate a subquery to find context ids for multiple entities and multiple devices."""
48 json_quoted_entity_ids, json_quoted_device_ids
53 (States.last_updated_ts > start_day) & (States.last_updated_ts < end_day)
55 .where(States.metadata_id.in_(states_metadata_ids)),
57 return select(union.c.context_id_bin).group_by(union.c.context_id_bin)
64 event_type_ids: tuple[int, ...],
65 states_metadata_ids: Collection[int],
66 json_quoted_entity_ids: list[str],
67 json_quoted_device_ids: list[str],
74 json_quoted_entity_ids,
75 json_quoted_device_ids,
86 .select_from(devices_entities_cte)
88 Events, devices_entities_cte.c.context_id_bin == Events.context_id_bin
90 .outerjoin(EventTypes, (Events.event_type_id == EventTypes.event_type_id))
91 .outerjoin(EventData, (Events.data_id == EventData.data_id)),
95 .select_from(devices_entities_cte)
97 States, devices_entities_cte.c.context_id_bin == States.context_id_bin
99 .outerjoin(StatesMeta, (States.metadata_id == StatesMeta.metadata_id))
107 event_type_ids: tuple[int, ...],
108 states_metadata_ids: Collection[int],
109 json_quoted_entity_ids: list[str],
110 json_quoted_device_ids: list[str],
111 ) -> StatementLambdaElement:
112 """Generate a logbook query for multiple entities."""
117 json_quoted_entity_ids, json_quoted_device_ids
124 json_quoted_entity_ids,
125 json_quoted_device_ids,
126 ).order_by(Events.time_fired_ts)
131 json_quoted_entity_ids: Iterable[str], json_quoted_device_ids: Iterable[str]
132 ) -> ColumnElement[bool]:
133 """Create matchers for the device_id and entity_id in the event_data."""
135 json_quoted_entity_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()
BooleanClauseList apply_event_device_id_matchers(Iterable[str] json_quotable_device_ids)
CompoundSelect _apply_entities_devices_context_union(Select sel, float start_day, float end_day, tuple[int,...] event_type_ids, Collection[int] states_metadata_ids, list[str] json_quoted_entity_ids, list[str] json_quoted_device_ids)
ColumnElement[bool] _apply_event_entity_id_device_id_matchers(Iterable[str] json_quoted_entity_ids, Iterable[str] json_quoted_device_ids)
Select _select_entities_device_id_context_ids_sub_query(float start_day, float end_day, tuple[int,...] event_type_ids, Collection[int] states_metadata_ids, list[str] json_quoted_entity_ids, list[str] json_quoted_device_ids)
StatementLambdaElement entities_devices_stmt(float start_day, float end_day, tuple[int,...] event_type_ids, Collection[int] states_metadata_ids, list[str] json_quoted_entity_ids, list[str] json_quoted_device_ids)
ColumnElement[bool] apply_event_entity_id_matchers(Iterable[str] json_quoted_entity_ids)
Select apply_entities_hints(Select sel)
Select states_select_for_entity_ids(float start_day, float end_day, Collection[int] states_metadata_ids)