Skip to content

Commit

Permalink
Improve package search for MySQL and SQLite platform
Browse files Browse the repository at this point in the history
  • Loading branch information
vtsykun committed Jan 8, 2023
1 parent b1c79a3 commit 0f631cc
Showing 1 changed file with 40 additions and 11 deletions.
51 changes: 40 additions & 11 deletions src/Repository/PackageRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,17 @@ public function findProviders($name)
return $query->getResult();
}

public function getPackageNames()
public function getPackageNames(array $allowed = null)
{
$query = $this->getEntityManager()
->createQuery("SELECT p.name FROM Packeton\Entity\Package p");
$query = $this->createQueryBuilder('p')
->resetDQLPart('select')
->select('p.name');

$names = $this->getPackageNamesForQuery($query);
if ($allowed) {
$query->where('p.id IN (:ids)')->setParameter('ids', $allowed);
}

$names = $this->getPackageNamesForQuery($query->getQuery());

return array_map('strtolower', $names);
}
Expand Down Expand Up @@ -442,9 +447,7 @@ public function searchPackage(string $search, int $limit = 10, int $page = 0, ar
$sql .= 'ORDER BY idx LIMIT :limit OFFSET :ofs';

return array_map(
function ($item) {
return $this->find($item['id']);
},
fn ($item) => $this->find($item['id']),
$conn->executeQuery($sql, $params, ['ids' => Connection::PARAM_INT_ARRAY])->fetchAllAssociative()
);
}
Expand All @@ -455,16 +458,42 @@ function ($item) {
->setParameter('ids', $allowed);
}

return $qb->andWhere(
$qb->expr()->like('p.name', ':name')
)
$packages = $qb->andWhere('p.name LIKE :name')
->setParameter('name', '%' . $search . '%')
->setMaxResults($limit)
->setFirstResult($limit * $page)
->getQuery()->getResult();

// Use levenshtein search.
if ($page === 0 && count($packages) < $limit -1) {
$excPackages = array_map(fn (Package $p) => $p->getName(), $packages);
$packageNames = $this->getPackageNames($allowed);
$alternatives = [];
foreach ($packageNames as $name) {
$score = levenshtein($name, $search)/(1+strlen($name));
if (!in_array($name, $excPackages) && $score <= 0.8) {
$alternatives[$name] = $score;
}
}

asort($alternatives);
$count = min($limit - 1 - count($packages), count($alternatives));

if ($count > 0) {
$alternatives = array_slice(array_keys($alternatives), 0, $count);
$alternatives = $this->createQueryBuilder('p')
->where('LOWER(p.name) in (:packs)')
->setParameter('packs', $alternatives)
->getQuery()->getResult();

$packages = array_merge($packages, $alternatives);
}
}

return $packages;
}

private function checkExtension($extensionName)
private function checkExtension(string $extensionName)
{
$conn = $this->getEntityManager()->getConnection();
try {
Expand Down

0 comments on commit 0f631cc

Please sign in to comment.