From d5f9ebd0086be256e4a13a98b1ec765df23558d1 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 2 Apr 2018 23:37:33 +0530 Subject: [PATCH] [optimize] item queries (#13480) --- erpnext/controllers/queries.py | 10 +++++-- .../stock/report/stock_ledger/stock_ledger.py | 26 ++++++++++++------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index 139586f1e2..15a93bd4eb 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -152,6 +152,11 @@ def tax_account_query(doctype, txt, searchfield, start, page_len, filters): def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=False): conditions = [] + description_cond = '' + if frappe.db.count('Item', cache=True) < 50000: + # scan description only if items are less than 50000 + description_cond = 'or tabItem.description LIKE %(txt)s' + return frappe.db.sql("""select tabItem.name, tabItem.item_group, if(length(tabItem.item_name) > 40, concat(substr(tabItem.item_name, 1, 40), "..."), item_name) as item_name, @@ -166,7 +171,7 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals or tabItem.item_group LIKE %(txt)s or tabItem.item_name LIKE %(txt)s or tabItem.barcode LIKE %(txt)s - or tabItem.description LIKE %(txt)s) + {description_cond}) {fcond} {mcond} order by if(locate(%(_txt)s, name), locate(%(_txt)s, name), 99999), @@ -176,7 +181,8 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals limit %(start)s, %(page_len)s """.format( key=searchfield, fcond=get_filters_cond(doctype, filters, conditions).replace('%', '%%'), - mcond=get_match_cond(doctype).replace('%', '%%')), + mcond=get_match_cond(doctype).replace('%', '%%'), + description_cond = description_cond), { "today": nowdate(), "txt": "%%%s%%" % txt, diff --git a/erpnext/stock/report/stock_ledger/stock_ledger.py b/erpnext/stock/report/stock_ledger/stock_ledger.py index 305702e755..6b88c52996 100644 --- a/erpnext/stock/report/stock_ledger/stock_ledger.py +++ b/erpnext/stock/report/stock_ledger/stock_ledger.py @@ -7,8 +7,9 @@ from frappe import _ def execute(filters=None): columns = get_columns() - sl_entries = get_stock_ledger_entries(filters) - item_details = get_item_details(filters) + item_conditions = get_item_conditions(filters) + item_details = get_item_details(filters, item_conditions) + sl_entries = get_stock_ledger_entries(filters, item_conditions, item_details) opening_row = get_opening_balance(filters, columns) data = [] @@ -52,7 +53,12 @@ def get_columns(): return columns -def get_stock_ledger_entries(filters): +def get_stock_ledger_entries(filters, item_conditions, item_details): + item_conditions_sql = '' + if item_conditions: + items = ['"' + frappe.db.escape(i) + '"' for i in item_details.keys()] + if items: + item_conditions_sql = 'and sle.item_code in ({})'.format(', '.join(items)) return frappe.db.sql("""select concat_ws(" ", posting_date, posting_time) as date, item_code, warehouse, actual_qty, qty_after_transaction, incoming_rate, valuation_rate, stock_value, voucher_type, voucher_no, batch_no, serial_no, company, project @@ -60,14 +66,18 @@ def get_stock_ledger_entries(filters): where company = %(company)s and posting_date between %(from_date)s and %(to_date)s {sle_conditions} + {item_conditions_sql} order by posting_date asc, posting_time asc, name asc"""\ - .format(sle_conditions=get_sle_conditions(filters)), filters, as_dict=1) + .format( + sle_conditions=get_sle_conditions(filters), + item_conditions_sql = item_conditions_sql + ), filters, as_dict=1, debug=1) -def get_item_details(filters): +def get_item_details(filters, item_conditions): item_details = {} for item in frappe.db.sql("""select name, item_name, description, item_group, brand, stock_uom from `tabItem` item {item_conditions}"""\ - .format(item_conditions=get_item_conditions(filters)), filters, as_dict=1): + .format(item_conditions=item_conditions), filters, as_dict=1): item_details.setdefault(item.name, item) return item_details @@ -85,10 +95,6 @@ def get_item_conditions(filters): def get_sle_conditions(filters): conditions = [] - item_conditions=get_item_conditions(filters) - if item_conditions: - conditions.append("""sle.item_code in (select item.name from tabItem item - {item_conditions})""".format(item_conditions=item_conditions)) if filters.get("warehouse"): warehouse_condition = get_warehouse_condition(filters.get("warehouse")) if warehouse_condition: