From 308e84f44ea574d658d5b30edcab1083d1fe35f2 Mon Sep 17 00:00:00 2001 From: Ere Maijala <ere.maijala@helsinki.fi> Date: Mon, 14 Mar 2016 16:44:44 -0400 Subject: [PATCH] Searches initiated from advanced search now remain advanced for user experience consistency. - Empty advanced searches no longer revert to basic status. - Resolves VUFIND-1154. --- module/VuFind/src/VuFind/Search/Base/Params.php | 10 +++++++--- .../VuFind/src/VuFind/Search/QueryAdapter.php | 3 ++- .../VuFindSearch/Backend/Solr/QueryBuilder.php | 17 ++++++++++++++--- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/module/VuFind/src/VuFind/Search/Base/Params.php b/module/VuFind/src/VuFind/Search/Base/Params.php index a25505bacd8..cde0619e754 100644 --- a/module/VuFind/src/VuFind/Search/Base/Params.php +++ b/module/VuFind/src/VuFind/Search/Base/Params.php @@ -449,9 +449,13 @@ class Params implements ServiceLocatorAwareInterface $this->searchType = $this->query instanceof Query ? 'basic' : 'advanced'; - // If we ended up with a basic search, set the default handler if necessary: - if ($this->searchType == 'basic' && $this->query->getHandler() === null) { - $this->query->setHandler($this->getOptions()->getDefaultHandler()); + // If we ended up with a basic search, set the default handler if necessary + // and convert it to an advanced search: + if ($this->searchType == 'basic') { + if ($this->query->getHandler() === null) { + $this->query->setHandler($this->getOptions()->getDefaultHandler()); + } + $this->convertToAdvancedSearch(); } } diff --git a/module/VuFind/src/VuFind/Search/QueryAdapter.php b/module/VuFind/src/VuFind/Search/QueryAdapter.php index 2dd5b9c8c49..0d4a62cc3a7 100644 --- a/module/VuFind/src/VuFind/Search/QueryAdapter.php +++ b/module/VuFind/src/VuFind/Search/QueryAdapter.php @@ -56,7 +56,8 @@ abstract class QueryAdapter */ public static function deminify(array $search) { - if (isset($search['l'])) { + // Use array_key_exists since null is also valid + if (array_key_exists('l', $search)) { $handler = isset($search['i']) ? $search['i'] : $search['f']; return new Query( $search['l'], $handler, isset($search['o']) ? $search['o'] : null diff --git a/module/VuFindSearch/src/VuFindSearch/Backend/Solr/QueryBuilder.php b/module/VuFindSearch/src/VuFindSearch/Backend/Solr/QueryBuilder.php index 74ff8564bbe..29f228bad3b 100644 --- a/module/VuFindSearch/src/VuFindSearch/Backend/Solr/QueryBuilder.php +++ b/module/VuFindSearch/src/VuFindSearch/Backend/Solr/QueryBuilder.php @@ -309,9 +309,17 @@ class QueryBuilder implements QueryBuilderInterface [$this, 'reduceQueryGroupComponents'], $component->getQueries() ); $searchString = $component->isNegated() ? 'NOT ' : ''; - $searchString .= sprintf( - '(%s)', implode(" {$component->getOperator()} ", $reduced) + $reduced = array_filter( + $reduced, + function ($s) { + return '' !== $s; + } ); + if ($reduced) { + $searchString .= sprintf( + '(%s)', implode(" {$component->getOperator()} ", $reduced) + ); + } } else { $searchString = $this->getLuceneHelper() ->normalizeSearchString($component->getString()); @@ -319,7 +327,7 @@ class QueryBuilder implements QueryBuilderInterface $component->getHandler(), $searchString ); - if ($searchHandler) { + if ($searchHandler && '' !== $searchString) { $searchString = $this->createSearchString($searchString, $searchHandler); } @@ -339,6 +347,9 @@ class QueryBuilder implements QueryBuilderInterface { $advanced = $this->getLuceneHelper()->containsAdvancedLuceneSyntax($string); + if (null === $string) { + return ''; + } if ($advanced && $handler) { return $handler->createAdvancedQueryString($string); } else if ($handler) { -- GitLab