Fix SAWarning in logbook queries (#72101)

This commit is contained in:
J. Nick Koston 2022-05-18 12:33:58 -05:00 committed by GitHub
parent 4a95539d9d
commit 985bcb23f2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 19 deletions

View file

@ -8,7 +8,7 @@ from sqlalchemy import Column, lambda_stmt, select, union_all
from sqlalchemy.orm import Query from sqlalchemy.orm import Query
from sqlalchemy.sql.elements import ClauseList from sqlalchemy.sql.elements import ClauseList
from sqlalchemy.sql.lambdas import StatementLambdaElement from sqlalchemy.sql.lambdas import StatementLambdaElement
from sqlalchemy.sql.selectable import Select from sqlalchemy.sql.selectable import CTE, CompoundSelect
from homeassistant.components.recorder.models import Events, States from homeassistant.components.recorder.models import Events, States
@ -28,7 +28,7 @@ def _select_device_id_context_ids_sub_query(
end_day: dt, end_day: dt,
event_types: tuple[str, ...], event_types: tuple[str, ...],
json_quotable_device_ids: list[str], json_quotable_device_ids: list[str],
) -> Select: ) -> CompoundSelect:
"""Generate a subquery to find context ids for multiple devices.""" """Generate a subquery to find context ids for multiple devices."""
return select( return select(
union_all( union_all(
@ -45,17 +45,17 @@ def _apply_devices_context_union(
end_day: dt, end_day: dt,
event_types: tuple[str, ...], event_types: tuple[str, ...],
json_quotable_device_ids: list[str], json_quotable_device_ids: list[str],
) -> StatementLambdaElement: ) -> CompoundSelect:
"""Generate a CTE to find the device context ids and a query to find linked row.""" """Generate a CTE to find the device context ids and a query to find linked row."""
devices_cte = _select_device_id_context_ids_sub_query( devices_cte: CTE = _select_device_id_context_ids_sub_query(
start_day, start_day,
end_day, end_day,
event_types, event_types,
json_quotable_device_ids, json_quotable_device_ids,
).cte() ).cte()
return query.union_all( return query.union_all(
select_events_context_only().where(Events.context_id.in_(devices_cte)), select_events_context_only().where(Events.context_id.in_(devices_cte.select())),
select_states_context_only().where(States.context_id.in_(devices_cte)), select_states_context_only().where(States.context_id.in_(devices_cte.select())),
) )

View file

@ -8,7 +8,7 @@ import sqlalchemy
from sqlalchemy import Column, lambda_stmt, select, union_all from sqlalchemy import Column, lambda_stmt, select, union_all
from sqlalchemy.orm import Query from sqlalchemy.orm import Query
from sqlalchemy.sql.lambdas import StatementLambdaElement from sqlalchemy.sql.lambdas import StatementLambdaElement
from sqlalchemy.sql.selectable import Select from sqlalchemy.sql.selectable import CTE, CompoundSelect
from homeassistant.components.recorder.models import ( from homeassistant.components.recorder.models import (
ENTITY_ID_LAST_UPDATED_INDEX, ENTITY_ID_LAST_UPDATED_INDEX,
@ -37,7 +37,7 @@ def _select_entities_context_ids_sub_query(
event_types: tuple[str, ...], event_types: tuple[str, ...],
entity_ids: list[str], entity_ids: list[str],
json_quotable_entity_ids: list[str], json_quotable_entity_ids: list[str],
) -> Select: ) -> CompoundSelect:
"""Generate a subquery to find context ids for multiple entities.""" """Generate a subquery to find context ids for multiple entities."""
return select( return select(
union_all( union_all(
@ -58,9 +58,9 @@ def _apply_entities_context_union(
event_types: tuple[str, ...], event_types: tuple[str, ...],
entity_ids: list[str], entity_ids: list[str],
json_quotable_entity_ids: list[str], json_quotable_entity_ids: list[str],
) -> StatementLambdaElement: ) -> CompoundSelect:
"""Generate a CTE to find the entity and device context ids and a query to find linked row.""" """Generate a CTE to find the entity and device context ids and a query to find linked row."""
entities_cte = _select_entities_context_ids_sub_query( entities_cte: CTE = _select_entities_context_ids_sub_query(
start_day, start_day,
end_day, end_day,
event_types, event_types,
@ -69,10 +69,12 @@ def _apply_entities_context_union(
).cte() ).cte()
return query.union_all( return query.union_all(
states_query_for_entity_ids(start_day, end_day, entity_ids), states_query_for_entity_ids(start_day, end_day, entity_ids),
select_events_context_only().where(Events.context_id.in_(entities_cte)), select_events_context_only().where(
Events.context_id.in_(entities_cte.select())
),
select_states_context_only() select_states_context_only()
.where(States.entity_id.not_in(entity_ids)) .where(States.entity_id.not_in(entity_ids))
.where(States.context_id.in_(entities_cte)), .where(States.context_id.in_(entities_cte.select())),
) )
@ -84,7 +86,6 @@ def entities_stmt(
json_quotable_entity_ids: list[str], json_quotable_entity_ids: list[str],
) -> StatementLambdaElement: ) -> StatementLambdaElement:
"""Generate a logbook query for multiple entities.""" """Generate a logbook query for multiple entities."""
assert json_quotable_entity_ids is not None
return lambda_stmt( return lambda_stmt(
lambda: _apply_entities_context_union( lambda: _apply_entities_context_union(
select_events_without_states(start_day, end_day, event_types).where( select_events_without_states(start_day, end_day, event_types).where(

View file

@ -8,7 +8,7 @@ import sqlalchemy
from sqlalchemy import lambda_stmt, select, union_all from sqlalchemy import lambda_stmt, select, union_all
from sqlalchemy.orm import Query from sqlalchemy.orm import Query
from sqlalchemy.sql.lambdas import StatementLambdaElement from sqlalchemy.sql.lambdas import StatementLambdaElement
from sqlalchemy.sql.selectable import Select from sqlalchemy.sql.selectable import CTE, CompoundSelect
from homeassistant.components.recorder.models import Events, States from homeassistant.components.recorder.models import Events, States
@ -33,7 +33,7 @@ def _select_entities_device_id_context_ids_sub_query(
entity_ids: list[str], entity_ids: list[str],
json_quotable_entity_ids: list[str], json_quotable_entity_ids: list[str],
json_quotable_device_ids: list[str], json_quotable_device_ids: list[str],
) -> Select: ) -> CompoundSelect:
"""Generate a subquery to find context ids for multiple entities and multiple devices.""" """Generate a subquery to find context ids for multiple entities and multiple devices."""
return select( return select(
union_all( union_all(
@ -57,8 +57,8 @@ def _apply_entities_devices_context_union(
entity_ids: list[str], entity_ids: list[str],
json_quotable_entity_ids: list[str], json_quotable_entity_ids: list[str],
json_quotable_device_ids: list[str], json_quotable_device_ids: list[str],
) -> StatementLambdaElement: ) -> CompoundSelect:
devices_entities_cte = _select_entities_device_id_context_ids_sub_query( devices_entities_cte: CTE = _select_entities_device_id_context_ids_sub_query(
start_day, start_day,
end_day, end_day,
event_types, event_types,
@ -68,10 +68,12 @@ def _apply_entities_devices_context_union(
).cte() ).cte()
return query.union_all( return query.union_all(
states_query_for_entity_ids(start_day, end_day, entity_ids), states_query_for_entity_ids(start_day, end_day, entity_ids),
select_events_context_only().where(Events.context_id.in_(devices_entities_cte)), select_events_context_only().where(
Events.context_id.in_(devices_entities_cte.select())
),
select_states_context_only() select_states_context_only()
.where(States.entity_id.not_in(entity_ids)) .where(States.entity_id.not_in(entity_ids))
.where(States.context_id.in_(devices_entities_cte)), .where(States.context_id.in_(devices_entities_cte.select())),
) )