diff --git a/lemur/certificates/service.py b/lemur/certificates/service.py index f711bbd9..df73487d 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 @@ -455,8 +456,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: @@ -464,9 +465,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: @@ -511,6 +512,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 diff --git a/lemur/migrations/versions/8323a5ea723a_.py b/lemur/migrations/versions/8323a5ea723a_.py new file mode 100644 index 00000000..9505cdb1 --- /dev/null +++ b/lemur/migrations/versions/8323a5ea723a_.py @@ -0,0 +1,50 @@ +"""Add lowercase index for certificate name and cn and also for domain name + +Revision ID: 8323a5ea723a +Revises: b33c838cb669 +Create Date: 2020-01-10 10:51:44.776052 + +""" + +# revision identifiers, used by Alembic. +revision = '8323a5ea723a' +down_revision = 'b33c838cb669' + +from alembic import op +from sqlalchemy import text + +import sqlalchemy as sa + + +def upgrade(): + op.create_index( + "ix_certificates_cn_lower", + "certificates", + [text("lower(cn)")], + unique=False, + postgresql_ops={"lower(cn)": "gin_trgm_ops"}, + postgresql_using="gin", + ) + op.create_index( + "ix_certificates_name_lower", + "certificates", + [text("lower(name)")], + unique=False, + postgresql_ops={"lower(name)": "gin_trgm_ops"}, + postgresql_using="gin", + ) + op.create_index( + "ix_domains_name_lower", + "domains", + [text("lower(name)")], + unique=False, + postgresql_ops={"lower(name)": "gin_trgm_ops"}, + postgresql_using="gin", + ) + + + +def downgrade(): + op.drop_index("ix_certificates_cn_lower", table_name="certificates") + op.drop_index("ix_certificates_name_lower", table_name="certificates") + op.drop_index("ix_domains_name_lower", table_name="domains") diff --git a/lemur/migrations/versions/ee827d1e1974_.py b/lemur/migrations/versions/ee827d1e1974_.py index 56696fe3..649f1ed7 100644 --- a/lemur/migrations/versions/ee827d1e1974_.py +++ b/lemur/migrations/versions/ee827d1e1974_.py @@ -45,6 +45,6 @@ def upgrade(): def downgrade(): - op.drop_index("ix_domains_name", table_name="domains") + op.drop_index("ix_domains_name_gin", table_name="domains") op.drop_index("ix_certificates_name", table_name="certificates") op.drop_index("ix_certificates_cn", table_name="certificates")