From bc1a2cf69ccc41dade086202591eaef72e6a5283 Mon Sep 17 00:00:00 2001 From: Ilya Labun Date: Mon, 13 Jan 2020 14:43:41 +0100 Subject: [PATCH] Optimize certificates SQL query Co-authored-by: Javier Ramos --- lemur/certificates/service.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/lemur/certificates/service.py b/lemur/certificates/service.py index 0e91b563..c8d732bb 100644 --- a/lemur/certificates/service.py +++ b/lemur/certificates/service.py @@ -20,6 +20,7 @@ from lemur.common.utils import generate_private_key, truthiness from lemur.destinations.models import Destination from lemur.domains.models import Domain from lemur.extensions import metrics, sentry, signals +from lemur.models import certificate_associations from lemur.notifications.models import Notification from lemur.pending_certificates.models import PendingCertificate from lemur.plugins.base import plugins @@ -379,8 +380,8 @@ def render(args): elif "cn" in terms: query = query.filter( or_( - Certificate.cn.ilike(term), - Certificate.domains.any(Domain.name.ilike(term)), + func.lower(Certificate.cn).like(term.lower()), + Certificate.id.in_(like_domain_query(term)), ) ) elif "id" in terms: @@ -388,9 +389,9 @@ def render(args): elif "name" in terms: query = query.filter( or_( - Certificate.name.ilike(term), - Certificate.domains.any(Domain.name.ilike(term)), - Certificate.cn.ilike(term), + func.lower(Certificate.name).like(term.lower()), + Certificate.id.in_(like_domain_query(term)), + func.lower(Certificate.cn).like(term.lower()), ) ) elif "fixedName" in terms: @@ -435,6 +436,14 @@ def render(args): return result +def like_domain_query(term): + domain_query = database.session_query(Domain.id) + domain_query = domain_query.filter(func.lower(Domain.name).like(term.lower())) + assoc_query = database.session_query(certificate_associations.c.certificate_id) + assoc_query = assoc_query.filter(certificate_associations.c.domain_id.in_(domain_query)) + return assoc_query + + def query_name(certificate_name, args): """ Helper function that queries for a certificate by name