From 93b9ca86f78423339ae5830eb81dba39c04a40b5 Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Tue, 29 Oct 2019 15:02:10 +0530 Subject: [PATCH] perf: optimise globals search --- .../global_search_settings.py | 11 +++- frappe/utils/global_search.py | 53 +++++++++---------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/frappe/desk/doctype/global_search_settings/global_search_settings.py b/frappe/desk/doctype/global_search_settings/global_search_settings.py index 0729fca5cb..42ac5db8d2 100644 --- a/frappe/desk/doctype/global_search_settings/global_search_settings.py +++ b/frappe/desk/doctype/global_search_settings/global_search_settings.py @@ -29,12 +29,21 @@ class GlobalSearchSettings(Document): repeated_dts = (", ".join([frappe.bold(dt) for dt in repeated_dts])) frappe.throw(_("Document Type {0} has been repeated.").format(repeated_dts)) + def on_update(self): + get_doctypes_for_global_search() + def get_doctypes_for_global_search(): doctypes = frappe.get_list("Global Search DocType", fields=["document_type"], order_by="idx ASC") if not doctypes: return [] - return [d.document_type for d in doctypes] + priorities = [d.document_type for d in doctypes] + allowed_doctypes = ",".join(["'{0}'".format(dt) for dt in priorities]) + + frappe.cache().hset("global_search", "search_priorities", priorities) + frappe.cache().hset("global_search", "allowed_doctypes", allowed_doctypes) + + return priorities, allowed_doctypes @frappe.whitelist() def reset_global_search_settings_doctypes(): diff --git a/frappe/utils/global_search.py b/frappe/utils/global_search.py index 447466770d..7c38298dc3 100644 --- a/frappe/utils/global_search.py +++ b/frappe/utils/global_search.py @@ -418,10 +418,19 @@ def search(text, start=0, limit=20, doctype=""): from frappe.desk.doctype.global_search_settings.global_search_settings import get_doctypes_for_global_search results = [] - texts = [t.strip() for t in text.split('&') if t] - priorities = get_doctypes_for_global_search() - allowed_doctypes = ",".join(["'{0}'".format(dt) for dt in priorities]) - for text in texts: + sorted_results = [] + + priorities = frappe.cache().hget("global_search", "search_priorities") + allowed_doctypes = frappe.cache().hget("global_search", "allowed_doctypes") + + if not priorities or not allowed_doctypes: + priorities, allowed_doctypes = get_doctypes_for_global_search() + + for text in set(text.split('&')): + text = text.strip() + if not text: + continue + mariadb_conditions = '' postgres_conditions = '' offset = '' @@ -455,36 +464,22 @@ def search(text, start=0, limit=20, doctype=""): 'postgres': common_query.format(fields=postgres_fields, conditions=postgres_conditions, limit=limit, offset=offset) }, as_dict=True) - tmp_result=[] - for i in result: - if i.rank > 0.0: - if i in results or not results: - tmp_result.extend([i]) - results.extend(tmp_result) - - for r in results: - try: - if frappe.get_meta(r.doctype).image_field: - r.image = frappe.db.get_value(r.doctype, r.name, frappe.get_meta(r.doctype).image_field) - except Exception: - frappe.clear_messages() - - sorted_results = [] + results.extend(result) for priority in priorities: - tmp_result = [] - if not results: - break - for index, r in enumerate(results): - if r.doctype == priority: - tmp_result.extend([r]) + if r.doctype == priority and r.rank > 0.0: + try: + meta = frappe.get_meta(r.doctype) + if meta.image_field: + r.image = frappe.db.get_value(r.doctype, r.name, meta.image_field) + except Exception: + frappe.clear_messages() + + sorted_results.extend([r]) results.pop(index) - sorted_results.extend(tmp_result) - - return sorted_results - + return sorted_results or results @frappe.whitelist(allow_guest=True) def web_search(text, scope=None, start=0, limit=20):