From 35f861fa8768683a18cab990e40674bc66b01379 Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Sun, 16 Mar 2025 15:39:36 +0530 Subject: [PATCH 1/3] perf: extract query type using re.match --- frappe/database/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/database/utils.py b/frappe/database/utils.py index 90bc40663a..9da6f6187f 100644 --- a/frappe/database/utils.py +++ b/frappe/database/utils.py @@ -25,7 +25,7 @@ NestedSetHierarchy = ( "descendants of (inclusive)", ) # split when whitespace or backtick is found -QUERY_TYPE_DELIMITER_PATTERN = re.compile(rf"[{string.whitespace}`]") +QUERY_TYPE_PATTERN = re.compile(r"\s*([^\s`]*)") def convert_to_value(o: FilterValue): @@ -37,7 +37,7 @@ def convert_to_value(o: FilterValue): def get_query_type(query: str) -> str: - return QUERY_TYPE_DELIMITER_PATTERN.split(query.lstrip(), maxsplit=1)[0].lower() + return QUERY_TYPE_PATTERN.match(query)[1].lower() def is_query_type(query: str, query_type: str | tuple[str, ...]) -> bool: From 09de71cb9656b4740ae623a6fc6077e6e3e5d570 Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Sun, 16 Mar 2025 15:39:59 +0530 Subject: [PATCH 2/3] perf: define `__slots__` in `NamedParameterWrapper` --- frappe/query_builder/terms.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frappe/query_builder/terms.py b/frappe/query_builder/terms.py index 46c73dd518..cdae2a449d 100644 --- a/frappe/query_builder/terms.py +++ b/frappe/query_builder/terms.py @@ -12,6 +12,8 @@ from frappe.utils.data import format_time, format_timedelta class NamedParameterWrapper: """Utility class to hold parameter values and keys""" + __slots__ = ("parameters",) + def __init__(self) -> None: self.parameters = {} From 3139419323e46885d250250abc12033ada81a0fa Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Sun, 16 Mar 2025 15:53:51 +0530 Subject: [PATCH 3/3] perf: declare `_dict` as global --- frappe/database/database.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index d965dda5b8..bf750fed4d 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -17,7 +17,7 @@ from pypika.dialects import MySQLQueryBuilder, PostgreSQLQueryBuilder import frappe import frappe.defaults -from frappe import _ +from frappe import _, _dict from frappe.database.utils import ( DefaultOrderBy, EmptyQueryValues, @@ -333,7 +333,7 @@ class Database: elif as_dict: keys = [column[0] for column in self._cursor.description] for row in result: - row = frappe._dict(zip(keys, row, strict=False)) + row = _dict(zip(keys, row, strict=False)) if update: row.update(update) yield row @@ -460,13 +460,13 @@ class Database: if query_type in IMPLICIT_COMMIT_QUERY_TYPES and self.transaction_writes: raise ImplicitCommitError("This statement can cause implicit commit", query) - def fetch_as_dict(self, result) -> list[frappe._dict]: + def fetch_as_dict(self, result) -> list[_dict]: """Internal. Convert results to dict.""" if not result: return [] keys = [column[0] for column in self._cursor.description] - return [frappe._dict(zip(keys, row, strict=False)) for row in result] + return [_dict(zip(keys, row, strict=False)) for row in result] @staticmethod def clear_db_table_cache(query_type: str): @@ -743,7 +743,7 @@ class Database: if not r: return [] - r = frappe._dict(r) + r = _dict(r) if update: r.update(update) @@ -773,14 +773,14 @@ class Database: ).run(debug=debug) if not cast: - return frappe._dict(queried_result) + return _dict(queried_result) try: meta = frappe.get_meta(doctype) except DoesNotExistError: - return frappe._dict(queried_result) + return _dict(queried_result) - return_value = frappe._dict() + return_value = _dict() for fieldname, value in queried_result: if df := meta.get_field(fieldname):