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

[IMP] pos_self_order: Avoid extra _get_attributes_by_ptal_id calls #159551

Closed

Conversation

zaha-odoo
Copy link
Contributor

@zaha-odoo zaha-odoo commented Mar 27, 2024

Description of the issue/feature this PR addresses:
This commit is a performance fix to improve the speed of opening the pos kiosk or QR code.

_get_attributes method of pos_self_order's product.product extension will call self.env["pos.session"]._get_attributes_by_ptal_id() every time it is called. For N products, _get_attributes is called N times. This can lead to slow performance for high enough N, because _get_attributes_by_ptal_id method is slow, because it makes many read calls to product.attribute.value

This commit lifts the call to _get_attributes_by_ptal_id higher in the call stack, so that it is only called once as opposed to N times. It passes its result into _get_attributes via context, which will re-call _get_attributes_by_ptal_id if it wasn't in context for backwards compatibility reasons.

attributes must be deep copied within _get_attributes, because _add_price_info_to_attributes mutates the values within, which would invalidate future calls. The deep copy gives a fresh instance for each call, and only copies the applicable attributes so it shouldn't be large.

In this particular customer's DB they have 1376 product.product records and their pos config's pricelist (id 36) has 1572 rules in it.

Overall, based on the benchmarks below, this commit makes loading the pos about 4-5 times faster.

Benchmarks:

Before commit

Customer DB
product.product count == 1376
SQL query count ~= 5034
Time to load pos ~= 44 sec

Customer DB with more products
product.product count == 3792
SQL query count ~= 9359
Time to load pos ~= 96 sec

After commit

Customer DB
product.product count == 1376
SQL query count ~= 2360
Time to load pos ~= 8 sec

Customer DB with more products
product.product count == 3792
SQL query count ~= 3906
Time to load pos ~= 22 sec

Current behavior before PR:
Slow loading of pos kiosk/QR code

Desired behavior after PR is merged:
Faster loading of pos kiosk/QR code

opw-3758923

@robodoo
Copy link
Contributor

robodoo commented Mar 27, 2024

Pull request status dashboard.

@C3POdoo C3POdoo requested review from a team and caburj and removed request for a team March 27, 2024 18:07
@C3POdoo C3POdoo added the OE the report is linked to a support ticket (opw-...) label Mar 27, 2024
@caburj
Copy link
Contributor

caburj commented Mar 29, 2024

needs rebase

@zaha-odoo
Copy link
Contributor Author

@caburj Can rebase this to a later version, would 17.0 be a good candidate for this? It is also the version of this customer's DB. Apologies for my lack of knowledge here, but would the reason for the rebase be for stability?

@zaha-odoo zaha-odoo force-pushed the saas-16.4-opw-3758923-zaha branch 3 times, most recently from 267af04 to 855cdbc Compare March 29, 2024 14:30
This commit is a performance fix to improve the speed of opening the pos kiosk or QR code.

`_get_attributes` method of pos_self_order's product.product extension will call `self.env["pos.session"]._get_attributes_by_ptal_id()` every time it is called. For *N* products, `_get_attributes` is called *N* times. This can lead to slow performance for high enough *N*, because `_get_attributes_by_ptal_id` method is slow, because it makes many `read` calls to product.attribute.value

This commit lifts the call to `_get_attributes_by_ptal_id` higher in the call stack, so that it is only called once as opposed to *N* times. It passes its result into `_get_attributes` via context, which will re-call `_get_attributes_by_ptal_id` if it wasn't in context for backwards compatibility reasons.

attributes must be deep copied within `_get_attributes`, because `_add_price_info_to_attributes` mutates the values within, which would invalidate future calls. The deep copy gives a fresh instance for each call, and only copies the applicable attributes so it shouldn't be large.

In this particular customer's DB they have 1376 product.product records and their pos config's pricelist (id 36) has 1572 rules in it.

Overall, based on the benchmarks below, this commit makes loading the pos about 4-5 times faster.

Benchmarks:

__Before commit__

_Customer DB_
product.product count == 1376
SQL query count ~= 5034
Time to load pos ~= 44 sec

_Customer DB with more products_
product.product count == 3792
SQL query count ~= 9359
Time to load pos ~= 96 sec

__After commit__

_Customer DB_
product.product count == 1376
SQL query count ~= 2360
Time to load pos ~= 8 sec

_Customer DB with more products_
product.product count == 3792
SQL query count ~= 3906
Time to load pos ~= 22 sec
@caburj
Copy link
Contributor

caburj commented Apr 23, 2024

robodoo r+

robodoo pushed a commit that referenced this pull request Apr 23, 2024
This commit is a performance fix to improve the speed of opening the pos kiosk or QR code.

`_get_attributes` method of pos_self_order's product.product extension will call `self.env["pos.session"]._get_attributes_by_ptal_id()` every time it is called. For *N* products, `_get_attributes` is called *N* times. This can lead to slow performance for high enough *N*, because `_get_attributes_by_ptal_id` method is slow, because it makes many `read` calls to product.attribute.value

This commit lifts the call to `_get_attributes_by_ptal_id` higher in the call stack, so that it is only called once as opposed to *N* times. It passes its result into `_get_attributes` via context, which will re-call `_get_attributes_by_ptal_id` if it wasn't in context for backwards compatibility reasons.

attributes must be deep copied within `_get_attributes`, because `_add_price_info_to_attributes` mutates the values within, which would invalidate future calls. The deep copy gives a fresh instance for each call, and only copies the applicable attributes so it shouldn't be large.

In this particular customer's DB they have 1376 product.product records and their pos config's pricelist (id 36) has 1572 rules in it.

Overall, based on the benchmarks below, this commit makes loading the pos about 4-5 times faster.

Benchmarks:

__Before commit__

_Customer DB_
product.product count == 1376
SQL query count ~= 5034
Time to load pos ~= 44 sec

_Customer DB with more products_
product.product count == 3792
SQL query count ~= 9359
Time to load pos ~= 96 sec

__After commit__

_Customer DB_
product.product count == 1376
SQL query count ~= 2360
Time to load pos ~= 8 sec

_Customer DB with more products_
product.product count == 3792
SQL query count ~= 3906
Time to load pos ~= 22 sec

closes #159551

Signed-off-by: Joseph Caburnay (jcb) <jcb@odoo.com>
@robodoo robodoo closed this Apr 23, 2024
@fw-bot fw-bot deleted the saas-16.4-opw-3758923-zaha branch May 7, 2024 10:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
OE the report is linked to a support ticket (opw-...)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants