Optimize certificates SQL query

Co-authored-by: Javier Ramos <javier.ramos@booking.com>
This commit is contained in:
Ilya Labun 2020-01-13 14:43:41 +01:00
parent cc0b2d5439
commit bc1a2cf69c
1 changed files with 14 additions and 5 deletions

View File

@ -20,6 +20,7 @@ from lemur.common.utils import generate_private_key, truthiness
from lemur.destinations.models import Destination from lemur.destinations.models import Destination
from lemur.domains.models import Domain from lemur.domains.models import Domain
from lemur.extensions import metrics, sentry, signals from lemur.extensions import metrics, sentry, signals
from lemur.models import certificate_associations
from lemur.notifications.models import Notification from lemur.notifications.models import Notification
from lemur.pending_certificates.models import PendingCertificate from lemur.pending_certificates.models import PendingCertificate
from lemur.plugins.base import plugins from lemur.plugins.base import plugins
@ -379,8 +380,8 @@ def render(args):
elif "cn" in terms: elif "cn" in terms:
query = query.filter( query = query.filter(
or_( or_(
Certificate.cn.ilike(term), func.lower(Certificate.cn).like(term.lower()),
Certificate.domains.any(Domain.name.ilike(term)), Certificate.id.in_(like_domain_query(term)),
) )
) )
elif "id" in terms: elif "id" in terms:
@ -388,9 +389,9 @@ def render(args):
elif "name" in terms: elif "name" in terms:
query = query.filter( query = query.filter(
or_( or_(
Certificate.name.ilike(term), func.lower(Certificate.name).like(term.lower()),
Certificate.domains.any(Domain.name.ilike(term)), Certificate.id.in_(like_domain_query(term)),
Certificate.cn.ilike(term), func.lower(Certificate.cn).like(term.lower()),
) )
) )
elif "fixedName" in terms: elif "fixedName" in terms:
@ -435,6 +436,14 @@ def render(args):
return result 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): def query_name(certificate_name, args):
""" """
Helper function that queries for a certificate by name Helper function that queries for a certificate by name