From bf974e103e651a1334493a9594e08d19e51e392b Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 11 Apr 2023 08:52:38 -1000 Subject: [PATCH] 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 --- .../components/recorder/history/modern.py | 51 +++++++++---------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/homeassistant/components/recorder/history/modern.py b/homeassistant/components/recorder/history/modern.py index d48c7a0de9a..101eb01caa4 100644 --- a/homeassistant/components/recorder/history/modern.py +++ b/homeassistant/components/recorder/history/modern.py @@ -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}