From 0ff140fa2bcf8e2588e3d9127790c3b48f6f3745 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 21 Nov 2016 14:58:18 +0530 Subject: [PATCH] [optimize] remove count(*) from queries --- frappe/boot.py | 2 +- frappe/core/doctype/user/user.py | 8 ++++---- frappe/core/notifications.py | 4 ++-- frappe/custom/doctype/custom_field/custom_field.py | 2 +- frappe/database.py | 4 ++-- frappe/desk/doctype/desktop_icon/desktop_icon.py | 2 +- frappe/desk/page/chat/chat.py | 2 +- .../email/doctype/auto_email_report/auto_email_report.py | 2 +- frappe/email/doctype/email_group/email_group.py | 2 +- frappe/patches/v6_1/rename_file_data.py | 2 +- frappe/print/doctype/letter_head/letter_head.py | 2 +- frappe/utils/bot.py | 2 +- frappe/utils/nestedset.py | 4 ++-- frappe/website/doctype/blog_post/blog_post.py | 2 +- frappe/www/contact.py | 2 +- 15 files changed, 21 insertions(+), 21 deletions(-) diff --git a/frappe/boot.py b/frappe/boot.py index 8e01582bf1..5a4d6d2c4c 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -94,7 +94,7 @@ def get_allowed_pages(): # pages where role is not set are also allowed for p in frappe.db.sql("""select name, modified, title from `tabPage` where - (select count(*) from `tabPage Role` + (select count(name) from `tabPage Role` where `tabPage Role`.parent=tabPage.name) = 0""", as_dict=1): page_info[p.name] = {"modified":p.modified, "title":p.title} diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index fcaae3e301..9a618ec86a 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -586,7 +586,7 @@ def sign_up(email, full_name, redirect_to): else: return _("Already Registered") else: - if frappe.db.sql("""select count(*) from tabUser where + if frappe.db.sql("""select count(name) from tabUser where HOUR(TIMEDIFF(CURRENT_TIMESTAMP, TIMESTAMP(modified)))=1""")[0][0] > 300: frappe.respond_as_web_page(_('Temperorily Disabled'), @@ -676,19 +676,19 @@ def get_system_users(exclude_users=None, limit=None): def get_active_users(): """Returns No. of system users who logged in, in the last 3 days""" - return frappe.db.sql("""select count(*) from `tabUser` + return frappe.db.sql("""select count(name) from `tabUser` where enabled = 1 and user_type != 'Website User' and name not in ({}) and hour(timediff(now(), last_active)) < 72""".format(", ".join(["%s"]*len(STANDARD_USERS))), STANDARD_USERS)[0][0] def get_website_users(): """Returns total no. of website users""" - return frappe.db.sql("""select count(*) from `tabUser` + return frappe.db.sql("""select count(name) from `tabUser` where enabled = 1 and user_type = 'Website User'""")[0][0] def get_active_website_users(): """Returns No. of website users who logged in, in the last 3 days""" - return frappe.db.sql("""select count(*) from `tabUser` + return frappe.db.sql("""select count(name) from `tabUser` where enabled = 1 and user_type = 'Website User' and hour(timediff(now(), last_active)) < 72""")[0][0] diff --git a/frappe/core/notifications.py b/frappe/core/notifications.py index b689905daa..da585aabb4 100644 --- a/frappe/core/notifications.py +++ b/frappe/core/notifications.py @@ -44,7 +44,7 @@ def get_todays_events(as_list=False): def get_unread_messages(): "returns unread (docstatus-0 messages for a user)" return frappe.db.sql("""\ - SELECT count(*) + select count(name) FROM `tabCommunication` WHERE communication_type in ('Chat', 'Notification') AND reference_doctype = 'User' @@ -55,7 +55,7 @@ def get_unread_messages(): def get_unseen_likes(): """Returns count of unseen likes""" - return frappe.db.sql("""select count(*) from `tabCommunication` + return frappe.db.sql("""select count(name) from `tabCommunication` where communication_type='Comment' and modified >= DATE_SUB(NOW(),INTERVAL 1 YEAR) diff --git a/frappe/custom/doctype/custom_field/custom_field.py b/frappe/custom/doctype/custom_field/custom_field.py index 11198be9f2..6471643a56 100644 --- a/frappe/custom/doctype/custom_field/custom_field.py +++ b/frappe/custom/doctype/custom_field/custom_field.py @@ -77,7 +77,7 @@ def get_fields_label(doctype=None): def create_custom_field_if_values_exist(doctype, df): df = frappe._dict(df) if df.fieldname in frappe.db.get_table_columns(doctype) and \ - frappe.db.sql("""select count(*) from `tab{doctype}` + frappe.db.sql("""select count(name) from `tab{doctype}` where ifnull({fieldname},'')!=''""".format(doctype=doctype, fieldname=df.fieldname))[0][0]: create_custom_field(doctype, df) diff --git a/frappe/database.py b/frappe/database.py index 8861a6b6f8..483c0d7579 100644 --- a/frappe/database.py +++ b/frappe/database.py @@ -777,10 +777,10 @@ class Database: """Returns `COUNT(*)` for given DocType and filters.""" if filters: conditions, filters = self.build_conditions(filters) - return frappe.db.sql("""select count(*) + return frappe.db.sql("""select count(name) from `tab%s` where %s""" % (dt, conditions), filters, debug=debug)[0][0] else: - return frappe.db.sql("""select count(*) + return frappe.db.sql("""select count(name) from `tab%s`""" % (dt,))[0][0] diff --git a/frappe/desk/doctype/desktop_icon/desktop_icon.py b/frappe/desk/doctype/desktop_icon/desktop_icon.py index 69673e945d..aea46f7d1c 100644 --- a/frappe/desk/doctype/desktop_icon/desktop_icon.py +++ b/frappe/desk/doctype/desktop_icon/desktop_icon.py @@ -110,7 +110,7 @@ def add_user_icon(_doctype, label=None, link=None, type='link', standard=0): else: idx = frappe.db.sql('select max(idx) from `tabDesktop Icon` where owner=%s', frappe.session.user)[0][0] or \ - frappe.db.sql('select count(*) from `tabDesktop Icon` where standard=1')[0][0] + frappe.db.sql('select count(name) from `tabDesktop Icon` where standard=1')[0][0] module = frappe.db.get_value('DocType', _doctype, 'module') module_icon = frappe.get_value('Desktop Icon', {'standard':1, 'module_name':module}, diff --git a/frappe/desk/page/chat/chat.py b/frappe/desk/page/chat/chat.py index 011f4f8a05..d2c17bd411 100644 --- a/frappe/desk/page/chat/chat.py +++ b/frappe/desk/page/chat/chat.py @@ -61,7 +61,7 @@ def get_list(arg=None): @frappe.whitelist() def get_active_users(): data = frappe.db.sql("""select name, - (select count(*) from tabSessions where user=tabUser.name + (select count(name) from tabSessions where user=tabUser.name and timediff(now(), lastupdate) < time("01:00:00")) as has_session from tabUser where enabled=1 and diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.py b/frappe/email/doctype/auto_email_report/auto_email_report.py index 39c0715473..b9d38fa9e1 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.py +++ b/frappe/email/doctype/auto_email_report/auto_email_report.py @@ -35,7 +35,7 @@ class AutoEmailReport(Document): def validate_report_count(self): '''check that there are only 3 enabled reports per user''' - count = frappe.db.sql('select count(*) from `tabAuto Email Report` where user=%s and enabled=1', self.user)[0][0] + count = frappe.db.sql('select count(name) from `tabAuto Email Report` where user=%s and enabled=1', self.user)[0][0] if count > max_reports_per_user: frappe.throw(_('Only {0} emailed reports are allowed per user').format(max_reports_per_user)) diff --git a/frappe/email/doctype/email_group/email_group.py b/frappe/email/doctype/email_group/email_group.py index 734e49da55..a87168f39b 100755 --- a/frappe/email/doctype/email_group/email_group.py +++ b/frappe/email/doctype/email_group/email_group.py @@ -49,7 +49,7 @@ class EmailGroup(Document): return self.total_subscribers def get_total_subscribers(self): - return frappe.db.sql("""select count(*) from `tabEmail Group Member` + return frappe.db.sql("""select count(name) from `tabEmail Group Member` where email_group=%s""", self.name)[0][0] def on_trash(self): diff --git a/frappe/patches/v6_1/rename_file_data.py b/frappe/patches/v6_1/rename_file_data.py index f077896dd4..9d76365c6d 100644 --- a/frappe/patches/v6_1/rename_file_data.py +++ b/frappe/patches/v6_1/rename_file_data.py @@ -29,7 +29,7 @@ def execute(): # reset file size for folder in frappe.db.sql("""select name from tabFile f1 where is_folder = 1 and - (select count(*) from tabFile f2 where f2.folder = f1.name and f2.is_folder = 1) = 0"""): + (select count(name) from tabFile f2 where f2.folder = f1.name and f2.is_folder = 1) = 0"""): folder = frappe.get_doc("File", folder[0]) folder.save() diff --git a/frappe/print/doctype/letter_head/letter_head.py b/frappe/print/doctype/letter_head/letter_head.py index 3e9ce09c83..a51f94b8e7 100755 --- a/frappe/print/doctype/letter_head/letter_head.py +++ b/frappe/print/doctype/letter_head/letter_head.py @@ -10,7 +10,7 @@ from frappe.model.document import Document class LetterHead(Document): def validate(self): if not self.is_default: - if not frappe.db.sql("""select count(*) from `tabLetter Head` where ifnull(is_default,0)=1"""): + if not frappe.db.sql("""select count(name) from `tabLetter Head` where ifnull(is_default,0)=1"""): self.is_default = 1 def on_update(self): diff --git a/frappe/utils/bot.py b/frappe/utils/bot.py index e8a7150407..015c2cf68f 100644 --- a/frappe/utils/bot.py +++ b/frappe/utils/bot.py @@ -88,7 +88,7 @@ class CountBot(BotParser): if self.startswith('how many'): self.tables = self.reply.identify_tables(self.query.split(None, 1)[1]) if self.tables: - return str(frappe.db.sql('select count(*) from `tab{0}`'.format(self.get_doctype()))[0][0]) + return str(frappe.db.sql('select count(name) from `tab{0}`'.format(self.get_doctype()))[0][0]) class FindBot(BotParser): def get_reply(self): diff --git a/frappe/utils/nestedset.py b/frappe/utils/nestedset.py index 8065382aaa..82328e295c 100644 --- a/frappe/utils/nestedset.py +++ b/frappe/utils/nestedset.py @@ -224,7 +224,7 @@ class NestedSet(Document): def validate_one_root(self): if not self.get(self.nsm_parent_field): - if frappe.db.sql("""select count(*) from `tab%s` where + if frappe.db.sql("""select count(name) from `tab%s` where ifnull(%s, '')=''""" % (self.doctype, self.nsm_parent_field))[0][0] > 1: frappe.throw(_("""Multiple root nodes not allowed."""), NestedSetMultipleRootsError) @@ -240,7 +240,7 @@ class NestedSet(Document): def get_root_of(doctype): """Get root element of a DocType with a tree structure""" return frappe.db.sql("""select t1.name from `tab{0}` t1 where - (select count(*) from `tab{1}` t2 where + (select count(name) from `tab{1}` t2 where t2.lft < t1.lft and t2.rgt > t1.rgt) = 0""".format(doctype, doctype))[0][0] def get_ancestors_of(doctype, name): diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index 189c24f05e..320bbfa921 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -41,7 +41,7 @@ class BlogPost(WebsiteGenerator): self.published_on = today() # update posts - frappe.db.sql("""update tabBlogger set posts=(select count(*) from `tabBlog Post` + frappe.db.sql("""update tabBlogger set posts=(select count(name) from `tabBlog Post` where ifnull(blogger,'')=tabBlogger.name) where name=%s""", (self.blogger,)) diff --git a/frappe/www/contact.py b/frappe/www/contact.py index 14e26ed816..32b4adc7d9 100644 --- a/frappe/www/contact.py +++ b/frappe/www/contact.py @@ -38,7 +38,7 @@ def send_message(subject="Website Query", message="", sender=""): return # guest method, cap max writes per hour - if frappe.db.sql("""select count(*) from `tabCommunication` + if frappe.db.sql("""select count(name) from `tabCommunication` where `sent_or_received`="Received" and TIMEDIFF(%s, modified) < '01:00:00'""", now())[0][0] > max_communications_per_hour: frappe.response["message"] = "Sorry: we believe we have received an unreasonably high number of requests of this kind. Please try later"