Skip to content

Commit

Permalink
Improved search engine for numeric search queries
Browse files Browse the repository at this point in the history
  • Loading branch information
javiereguiluz committed Sep 3, 2015
1 parent 886c30f commit d662a9c
Showing 1 changed file with 15 additions and 9 deletions.
24 changes: 15 additions & 9 deletions Controller/AdminController.php
Original file line number Diff line number Diff line change
Expand Up @@ -507,21 +507,27 @@ protected function findAll($entityClass, $page = 1, $maxPerPage = 15, $sortField
*/
protected function findBy($entityClass, $searchQuery, array $searchableFields, $page = 1, $maxPerPage = 15)
{
$dbIsPostgreSql = $this->isPostgreSqlUsedByEntity($entityClass);
$databaseIsPostgreSql = $this->isPostgreSqlUsedByEntity($entityClass);
$queryBuilder = $this->em->createQueryBuilder()->select('entity')->from($entityClass, 'entity');

$queryConditions = $queryBuilder->expr()->orX();
$queryParameters = array();
foreach ($searchableFields as $name => $metadata) {
// PostgreSQL doesn't allow to compare strings values with non-string columns (e.g. 'id')
if ($dbIsPostgreSql && !in_array($metadata['type'], array('text', 'string'))) {
continue;
}

if (in_array($metadata['dataType'], array('text', 'string'))) {
$queryConditions->add(sprintf('entity.%s LIKE :query', $name));
$queryParameters['query'] = '%'.$searchQuery.'%';
$isNumericField = in_array($metadata['dataType'], array('integer', 'number', 'smallint', 'bigint', 'decimal', 'float'));
$isTextField = in_array($metadata['dataType'], array('string', 'text', 'guid'));

if (is_numeric($searchQuery) && $isNumericField) {
$queryConditions->add(sprintf('entity.%s = :exact_query', $name));
$queryParameters['exact_query'] = 0 + $searchQuery; // adding '0' turns the string into a numeric value
} elseif ($isTextField) {
$queryConditions->add(sprintf('entity.%s LIKE :fuzzy_query', $name));
$queryParameters['fuzzy_query'] = '%'.$searchQuery.'%';
} else {
// PostgreSQL doesn't allow to compare string values with non-string columns (e.g. 'id')
if ($databaseIsPostgreSql) {
continue;
}

$queryConditions->add(sprintf('entity.%s IN (:words)', $name));
$queryParameters['words'] = explode(' ', $searchQuery);
}
Expand Down

0 comments on commit d662a9c

Please sign in to comment.