reverse later is faster because the index is in forward order and the data size we are reversing is much smaller even if we are in python code

This commit is contained in:
J. Nick Koston 2023-04-11 08:52:38 -10:00
parent 01d2188a59
commit bf974e103e
No known key found for this signature in database

View file

@ -321,7 +321,6 @@ def _state_changed_during_period_stmt(
end_time_ts: float | None,
single_metadata_id: int,
no_attributes: bool,
descending: bool,
limit: int | None,
include_start_time_state: bool,
run_start_ts: float | None,
@ -348,32 +347,28 @@ def _state_changed_during_period_stmt(
if not include_start_time_state or not run_start_ts:
return stmt.order_by(
States.metadata_id,
States.last_updated_ts.desc() if descending else States.last_updated_ts,
States.last_updated_ts,
)
union_subquery = union_all(
_select_from_subquery(
_get_single_entity_start_time_stmt(
start_time_ts,
single_metadata_id,
return _select_from_subquery(
union_all(
_select_from_subquery(
_get_single_entity_start_time_stmt(
start_time_ts,
single_metadata_id,
no_attributes,
False,
).subquery(),
no_attributes,
False,
).subquery(),
no_attributes,
False,
),
_select_from_subquery(
stmt.order_by(States.metadata_id, States.last_updated_ts).subquery(),
no_attributes,
False,
),
).subquery()
stmt = _select_from_subquery(union_subquery, no_attributes, False)
if not descending:
return stmt
# If descending, we need to reverse the results
return stmt.order_by(
union_subquery.c.metadata_id, union_subquery.c.last_updated_ts.desc()
),
_select_from_subquery(
stmt.subquery(),
no_attributes,
False,
),
).subquery(),
no_attributes,
False,
)
@ -417,7 +412,6 @@ def state_changes_during_period(
end_time_ts,
single_metadata_id,
no_attributes,
descending,
limit,
include_start_time_state,
run_start_ts,
@ -425,7 +419,6 @@ def state_changes_during_period(
track_on=[
bool(end_time_ts),
no_attributes,
descending,
bool(limit),
include_start_time_state,
],
@ -437,6 +430,7 @@ def state_changes_during_period(
start_time_ts if include_start_time_state else None,
entity_ids,
entity_id_to_metadata_id,
descending=descending,
),
)
@ -654,6 +648,7 @@ def _sorted_states_to_dict(
entity_id_to_metadata_id: dict[str, int | None],
minimal_response: bool = False,
compressed_state_format: bool = False,
descending: bool = False,
) -> MutableMapping[str, list[State | dict[str, Any]]]:
"""Convert SQL results into JSON friendly data structure.
@ -778,5 +773,9 @@ def _sorted_states_to_dict(
if (state := row[state_idx]) != prev_state
)
if descending:
for ent_results in result.values():
ent_results.reverse()
# Filter out the empty lists if some states had 0 results.
return {key: val for key, val in result.items() if val}