Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Avoid returning statistics columns that the metadata knows are impossible #92095

Merged
merged 9 commits into from
Apr 30, 2023

Conversation

bdraco
Copy link
Member

@bdraco bdraco commented Apr 26, 2023

Since we don't document the stats websocket apis, I'm not 100% sure we should publish this as a breaking change since that implies we expect the api to be stable and I don't think we actually have that guarentee. If we do want to do a breaking change for this, I'll do a blog post as well.

Breaking change

This breaking change is only for custom frontend developers who are using the statistics websocket apis.

statistics no longer returns columns of empty values when the metadata knows they are impossible. If has_sum is False for all queried statistics the sum and state columns will not be returned. If has_mean is False for all queried statistics, the mean, min, and max columns will not be returned.

This allows consumers of the api to avoid the overhead of populating empty columns (selecting an empty column has nearly the same overhead as a column with data) when they not aware (or cannot practically request) of the metadata in advance.

Proposed change

I tried to handle this on the frontend, but we don't have the metadata soon enough and would have to pay an additional round trip to get it. That solution didn't work out and is being reverted in home-assistant/frontend#16328 This replaces that.

We want to avoid searching the database for empty fields when the metadata already tells us they will be empty. This prevents generating larger responses with columns of the same empty field over and over.

Remove columns from the result when statistics_during_period notices the caller asks for an impossible request because all the requested stats do not have has_mean (mean/min/max columns) or has_sum (sum/state) columns

Type of change

  • Dependency upgrade
  • Bugfix (non-breaking change which fixes an issue)
  • New integration (thank you!)
  • New feature (which adds functionality to an existing integration)
  • Deprecation (breaking change to happen in the future)
  • Breaking change (fix/feature causing existing functionality to break)
  • Code quality improvements to existing code or addition of tests

Additional information

  • This PR fixes or closes issue: fixes #
  • This PR is related to issue:
  • Link to documentation pull request:

Checklist

  • The code change is tested and works locally.
  • Local tests pass. Your PR cannot be merged unless tests pass
  • There is no commented out code in this PR.
  • I have followed the development checklist
  • I have followed the perfect PR recommendations
  • The code has been formatted using Black (black --fast homeassistant tests)
  • Tests have been added to verify that the new code works.

If user exposed functionality or configuration variables are added/changed:

If the code communicates with devices, web services, or third-party tools:

  • The manifest file has all fields filled out correctly.
    Updated and included derived files by running: python3 -m script.hassfest.
  • New or updated dependencies have been added to requirements_all.txt.
    Updated by running python3 -m script.gen_requirements_all.
  • For the updated dependencies - a link to the changelog, or at minimum a diff between library versions is added to the PR description.
  • Untested files have been added to .coveragerc.

To help with the load of incoming pull requests:

We want to avoid searching the database for empty fields when the metadata
already tells us they will be empty. This prevents generating larger
responses with columns of the same empty field over and over.

Remove columns from the result when statistics_during_period notices
the caller asks for an impossible request because all the requested
stats do not have has_mean (mean/min/max columns) or has_sum (sum/state)
columns
@home-assistant
Copy link

Hey there @home-assistant/core, mind taking a look at this pull request as it has been labeled with an integration (recorder) you are listed as a code owner for? Thanks!

Code owner commands

Code owners of recorder can trigger bot actions by commenting:

  • @home-assistant close Closes the pull request.
  • @home-assistant rename Awesome new title Renames the pull request.
  • @home-assistant reopen Reopen the pull request.
  • @home-assistant unassign recorder Removes the current integration label and assignees on the pull request, add the integration domain after the command.

@bdraco
Copy link
Member Author

bdraco commented Apr 26, 2023

There are lots of tests that check for empty data that will need to be updated

@bdraco bdraco changed the title Avoid returning empty statistics columns Avoid returning statistics columns when the metadata knows they are impossible Apr 28, 2023
@bdraco bdraco changed the title Avoid returning statistics columns when the metadata knows they are impossible Avoid returning statistics columns that the metadata knows are impossible Apr 28, 2023
@bdraco bdraco marked this pull request as ready for review April 29, 2023 15:38
@bdraco bdraco requested review from Danielhiversen and a team as code owners April 29, 2023 15:38
Copy link
Member

@frenck frenck left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is fine. This API is not public (as in, not publicly supported/described); its sole purpose is powering the frontend.

I do think a dev blog post would help, but, we should be clear about the support in that case.

../Frenck

bdraco added a commit to home-assistant/developers.home-assistant that referenced this pull request Apr 30, 2023
@frenck frenck merged commit bb4c03c into dev Apr 30, 2023
@frenck frenck deleted the stats_skip_empty_columns branch April 30, 2023 18:46
@bdraco
Copy link
Member Author

bdraco commented Apr 30, 2023

Thanks

raman325 added a commit to raman325/home-assistant that referenced this pull request Apr 30, 2023
* dev: (581 commits)
  Only store and pass around coordinator in Rituals Perfume Genie (home-assistant#92298)
  Avoid returning statistics columns that the metadata knows are impossible (home-assistant#92095)
  Add `date` platform (home-assistant#81948)
  Prevent pysnmp from being installed as it does not work with newer python (home-assistant#92292)
  Use SnapshotAssertion in Renault tests (home-assistant#90778)
  Home Connect add WasherDryer support (home-assistant#90673)
  Move lastfm constants to separate file (home-assistant#92289)
  Fix august lock state when API reports locking and locked with the same timestamp (home-assistant#92276)
  Ensure onvif webhook can be registered (home-assistant#92295)
  Bump beacontools to fix conflict with construct<2.10 and >=2.8.16 (home-assistant#92293)
  Bump pynina to 0.3.0 (home-assistant#92286)
  Fix mqtt not available when starting snips (home-assistant#92296)
  Extract Rituals Perfume Genie DataUpdateCoordinator into module (home-assistant#92284)
  Bump bleak to 0.20.2 (home-assistant#92294)
  Add missing fstrings in Local Calendar (home-assistant#92288)
  Remove myself from switcher_kis codeowners (home-assistant#92277)
  Handle AttributeError from wrong port in ONVIF config flow (home-assistant#92272)
  Auto repair incorrect collation on MySQL schema (home-assistant#92270)
  Update orjson to 3.8.11 (home-assistant#92228)
  Update coverage to 7.2.4 (home-assistant#92229)
  ...
@github-actions github-actions bot locked and limited conversation to collaborators May 1, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants