Skip to content

Commit

Permalink
bug #428 Improved search engine for numeric search queries (javieregu…
Browse files Browse the repository at this point in the history
…iluz)

This PR was squashed before being merged into the master branch (closes #428).

Discussion
----------

Improved search engine for numeric search queries

This fixes #422.

Commits
-------

d662a9c Improved search engine for numeric search queries
  • Loading branch information
javiereguiluz committed Sep 3, 2015
2 parents ef5514e + d662a9c commit 48f775c
Showing 1 changed file with 15 additions and 9 deletions.
24 changes: 15 additions & 9 deletions Controller/AdminController.php
Expand Up @@ -514,21 +514,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 48f775c

Please sign in to comment.