From 119354499ecf7c1025ec40350e97e73d62d3fd4b Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 11 Apr 2023 09:08:43 -1000 Subject: [PATCH] Revert "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 reverts commit bf974e103e651a1334493a9594e08d19e51e392b. --- .../components/recorder/history/modern.py | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/homeassistant/components/recorder/history/modern.py b/homeassistant/components/recorder/history/modern.py index 101eb01caa4..d48c7a0de9a 100644 --- a/homeassistant/components/recorder/history/modern.py +++ b/homeassistant/components/recorder/history/modern.py @@ -321,6 +321,7 @@ 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, @@ -347,28 +348,32 @@ 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, + States.last_updated_ts.desc() if descending else States.last_updated_ts, ) - 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(), + + union_subquery = union_all( + _select_from_subquery( + _get_single_entity_start_time_stmt( + start_time_ts, + single_metadata_id, no_attributes, False, - ), - _select_from_subquery( - stmt.subquery(), - 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() ) @@ -412,6 +417,7 @@ def state_changes_during_period( end_time_ts, single_metadata_id, no_attributes, + descending, limit, include_start_time_state, run_start_ts, @@ -419,6 +425,7 @@ def state_changes_during_period( track_on=[ bool(end_time_ts), no_attributes, + descending, bool(limit), include_start_time_state, ], @@ -430,7 +437,6 @@ def state_changes_during_period( start_time_ts if include_start_time_state else None, entity_ids, entity_id_to_metadata_id, - descending=descending, ), ) @@ -648,7 +654,6 @@ 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. @@ -773,9 +778,5 @@ 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}