mirror of
https://github.com/shlinkio/shlink.git
synced 2025-02-25 18:45:27 -06:00
Simplify query to find short URL when domain is null
This commit is contained in:
parent
8fd53afe3f
commit
745255736a
@ -31,24 +31,33 @@ class ShortUrlRepository extends EntitySpecificationRepository implements ShortU
|
|||||||
$ordering = $dbPlatform instanceof PostgreSQLPlatform ? 'ASC' : 'DESC';
|
$ordering = $dbPlatform instanceof PostgreSQLPlatform ? 'ASC' : 'DESC';
|
||||||
$isStrict = $shortUrlMode === ShortUrlMode::STRICT;
|
$isStrict = $shortUrlMode === ShortUrlMode::STRICT;
|
||||||
|
|
||||||
$qb = $this->createQueryBuilder('s');
|
// FIXME The `LOWER(s.shortCode)` condition in non-strict mode drops performance dramatically.
|
||||||
$qb->leftJoin('s.domain', 'd')
|
// Investigate if the case-insensitive check can be done natively by the DB engine.
|
||||||
->where($qb->expr()->eq($isStrict ? 's.shortCode' : 'LOWER(s.shortCode)', ':shortCode'))
|
|
||||||
->setParameter('shortCode', $isStrict ? $identifier->shortCode : strtolower($identifier->shortCode))
|
|
||||||
->andWhere($qb->expr()->orX(
|
|
||||||
$qb->expr()->isNull('s.domain'),
|
|
||||||
$qb->expr()->eq('d.authority', ':domain'),
|
|
||||||
))
|
|
||||||
->setParameter('domain', $identifier->domain);
|
|
||||||
|
|
||||||
// Since we order by domain, we will have first the URL matching provided domain, followed by the one
|
$qb = $this->createQueryBuilder('s');
|
||||||
// with no domain (if any), so it is safe to fetch 1 max result, and we will get:
|
$qb->where($qb->expr()->eq($isStrict ? 's.shortCode' : 'LOWER(s.shortCode)', ':shortCode'))
|
||||||
// * The short URL matching both the short code and the domain, or
|
->setParameter('shortCode', $isStrict ? $identifier->shortCode : strtolower($identifier->shortCode))
|
||||||
// * The short URL matching the short code but without any domain, or
|
|
||||||
// * No short URL at all
|
|
||||||
$qb->orderBy('s.domain', $ordering)
|
|
||||||
->setMaxResults(1);
|
->setMaxResults(1);
|
||||||
|
|
||||||
|
// If $domain is null, do not join with domains nor do $qb->expr()->eq('d.authority', ':domain')
|
||||||
|
$domain = $identifier->domain;
|
||||||
|
if ($domain === null) {
|
||||||
|
$qb->andWhere($qb->expr()->isNull('s.domain'));
|
||||||
|
} else {
|
||||||
|
$qb->leftJoin('s.domain', 'd')
|
||||||
|
->andWhere($qb->expr()->orX(
|
||||||
|
$qb->expr()->isNull('s.domain'),
|
||||||
|
$qb->expr()->eq('d.authority', ':domain'),
|
||||||
|
))
|
||||||
|
->setParameter('domain', $domain)
|
||||||
|
// Since we order by domain, we will have first the URL matching provided domain, followed by the one
|
||||||
|
// with no domain (if any), so it is safe to fetch 1 max result, and we will get:
|
||||||
|
// * The short URL matching both the short code and the domain, or
|
||||||
|
// * The short URL matching the short code but without any domain, or
|
||||||
|
// * No short URL at all
|
||||||
|
->orderBy('s.domain', $ordering);
|
||||||
|
}
|
||||||
|
|
||||||
return $qb->getQuery()->getOneOrNullResult();
|
return $qb->getQuery()->getOneOrNullResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user