From cee2b50461e974c410024d9e2935bb65385bdbe3 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Thu, 6 Oct 2022 15:28:29 +0530 Subject: [PATCH] perf: single query `db.set_value` --- frappe/database/database.py | 23 +++++------------------ frappe/tests/test_perf.py | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index b2989e5879..5ca06f7dc6 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -28,7 +28,6 @@ from frappe.database.utils import ( from frappe.exceptions import DoesNotExistError, ImplicitCommitError from frappe.model.utils.link_count import flush_local_link_count from frappe.query_builder.functions import Count -from frappe.query_builder.utils import DocType from frappe.utils import cast as cast_fieldtype from frappe.utils import get_datetime, get_table_name, getdate, now, sbool @@ -880,23 +879,11 @@ class Database: frappe.clear_document_cache(dt, dt) else: - table = DocType(dt) - - if for_update: - docnames = tuple( - self.get_values(dt, dn, "name", debug=debug, for_update=for_update, pluck=True) - ) or (NullValue(),) - query = frappe.qb.update(table).where(table.name.isin(docnames)) - - for docname in docnames: - frappe.clear_document_cache(dt, docname) - - else: - query = frappe.qb.engine.build_conditions(table=dt, filters=dn, update=True) - # TODO: Fix this; doesn't work rn - gavin@frappe.io - # frappe.cache().hdel_keys(dt, "document_cache") - # Workaround: clear all document caches - frappe.cache().delete_value("document_cache") + query = frappe.qb.engine.build_conditions(table=dt, filters=dn, update=True) + # TODO: Fix this; doesn't work rn - gavin@frappe.io + # frappe.cache().hdel_keys(dt, "document_cache") + # Workaround: clear all document caches + frappe.cache().delete_value("document_cache") for column, value in to_update.items(): query = query.set(column, value) diff --git a/frappe/tests/test_perf.py b/frappe/tests/test_perf.py index 4d0faad1c8..65f03c2f13 100644 --- a/frappe/tests/test_perf.py +++ b/frappe/tests/test_perf.py @@ -50,6 +50,20 @@ class TestPerformance(FrappeTestCase): with self.assertQueryCount(0): frappe.get_meta("User") + def test_set_value_query_count(self): + frappe.db.set_value("User", "Administrator", "interest", "Nothing") + + with self.assertQueryCount(1): + frappe.db.set_value("User", "Administrator", "interest", "Nothing") + + with self.assertQueryCount(1): + frappe.db.set_value("User", {"user_type": "System User"}, "interest", "Nothing") + + with self.assertQueryCount(1): + frappe.db.set_value( + "User", {"user_type": "System User"}, {"interest": "Nothing", "bio": "boring person"} + ) + def test_controller_caching(self): get_controller("User")