Merge pull request #18491 from resilient-tech/perf-set-document_naming

perf: cache document naming rule to avoid recurring db calls
This commit is contained in:
Ankush Menat 2022-11-04 17:13:19 +05:30 committed by GitHub
commit 0175fafde3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 34 additions and 28 deletions

View file

@ -8,11 +8,19 @@ from frappe.desk.notifications import clear_notifications, delete_notification_c
common_default_keys = ["__default", "__global"]
doctype_map_keys = (
"energy_point_rule_map",
"assignment_rule_map",
"milestone_tracker_map",
)
doctypes_for_mapping = {
"Energy Point Rule",
"Assignment Rule",
"Milestone Tracker",
"Document Naming Rule",
}
def get_doctype_map_key(doctype):
return frappe.scrub(doctype) + "_map"
doctype_map_keys = tuple(map(get_doctype_map_key, doctypes_for_mapping))
bench_cache_keys = ("assets_json",)
@ -66,7 +74,7 @@ doctype_cache_keys = (
"notifications",
"workflow",
"data_import_column_header_map",
) + doctype_map_keys
)
def clear_user_cache(user=None):
@ -161,23 +169,11 @@ def clear_controller_cache(doctype=None):
def get_doctype_map(doctype, name, filters=None, order_by=None):
cache = frappe.cache()
cache_key = frappe.scrub(doctype) + "_map"
doctype_map = cache.hget(cache_key, name)
if doctype_map is not None:
# cached, return
items = json.loads(doctype_map)
else:
# non cached, build cache
try:
items = frappe.get_all(doctype, filters=filters, order_by=order_by)
cache.hset(cache_key, name, json.dumps(items))
except frappe.db.TableMissingError:
# executed from inside patch, ignore
items = []
return items
return frappe.cache().hget(
get_doctype_map_key(doctype),
name,
lambda: frappe.get_all(doctype, filters=filters, order_by=order_by, ignore_ddl=True),
)
def clear_doctype_map(doctype, name):

View file

@ -12,6 +12,15 @@ class DocumentNamingRule(Document):
def validate(self):
self.validate_fields_in_conditions()
def clear_doctype_map(self):
frappe.cache_manager.clear_doctype_map(self.doctype, self.document_type)
def on_update(self):
self.clear_doctype_map()
def on_trash(self):
self.clear_doctype_map()
def validate_fields_in_conditions(self):
if self.has_value_changed("document_type"):
docfields = [x.fieldname for x in frappe.get_meta(self.document_type).fields]

View file

@ -235,13 +235,14 @@ def set_naming_from_document_naming_rule(doc):
if doc.doctype in log_types:
return
# ignore_ddl if naming is not yet bootstrapped
for d in frappe.get_all(
document_naming_rules = frappe.cache_manager.get_doctype_map(
"Document Naming Rule",
dict(document_type=doc.doctype, disabled=0),
doc.doctype,
filters={"document_type": doc.doctype, "disabled": 0},
order_by="priority desc",
ignore_ddl=True,
):
)
for d in document_naming_rules:
frappe.get_cached_doc("Document Naming Rule", d.name).apply(doc)
if doc.name:
break