diff --git a/src/Solr/Query/AbstractParamsBuilder.php b/src/Solr/Query/AbstractParamsBuilder.php index 5f75498..7b8281d 100755 --- a/src/Solr/Query/AbstractParamsBuilder.php +++ b/src/Solr/Query/AbstractParamsBuilder.php @@ -20,6 +20,7 @@ abstract class AbstractParamsBuilder implements ParamsBuilder, HasFilter, HasPagination { + private $attributeToReset = ''; /** * @var $attributeRepository AttributeRepository */ @@ -49,6 +50,10 @@ abstract class AbstractParamsBuilder implements ParamsBuilder, HasFilter, HasPag * @var $eventDispatcher EventDispatcher */ protected $eventDispatcher; + /** + * @var bool + */ + private $broaden = false; public function __construct(AttributeRepository $attributeRepository, FilterQueryBuilder $filterQueryBuilder, Pagination $pagination, ResultsConfig $resultsConfig, FuzzyConfig $fuzzyConfig, $storeId, $eventDispatcher) @@ -62,6 +67,16 @@ public function __construct(AttributeRepository $attributeRepository, FilterQuer $this->eventDispatcher = $eventDispatcher; } + /** + * @param boolean $broaden + * @return AbstractParamsBuilder + */ + public function setBroaden($broaden) + { + $this->broaden = $broaden; + return $this; + } + /** * Return filter query builder used to build the filter query paramter * @@ -73,25 +88,24 @@ public function getFilterQueryBuilder() } /** - * @param string $attributeToReset * @return array */ - public function buildAsArray($attributeToReset = '') + public function buildAsArray() { - if ($attributeToReset) { - switch($attributeToReset) { + if ($this->attributeToReset) { + switch($this->attributeToReset) { case 'category'; break; case 'price': - $attributeToReset .= '_f'; + $this->attributeToReset .= '_f'; break; default: - $attributeToReset .= '_facet'; + $this->attributeToReset .= '_facet'; } } $params = array( 'q.op' => $this->resultsConfig->getSearchOperator(), - 'fq' => $this->getFilterQuery($attributeToReset), + 'fq' => $this->getFilterQuery($this->attributeToReset), 'fl' => 'result_html_autosuggest_nonindex,score,sku_s,name_s,product_id', 'sort' => $this->getSortParam(), 'facet' => 'true', @@ -103,7 +117,7 @@ public function buildAsArray($attributeToReset = '') $params = $this->addFacetParams($params); - if (!$this->fuzzyConfig->isActive()) { + if (!$this->fuzzyConfig->isActive() || $this->broaden) { $params['mm'] = '0%'; } return $params; @@ -249,7 +263,18 @@ protected function addFacetParams($params) } $params['f.price_f.facet.interval.set'][] = sprintf('(%f,%s]', $lowerBorder, '*'); return $params; - }return $params; + } + + return $params; } + /** + * @param string $attributeToReset + * @return $this + */ + public function setAttributeToReset($attributeToReset) + { + $this->attributeToReset = $attributeToReset; + return $this; + } } \ No newline at end of file diff --git a/src/Solr/Query/AbstractQueryBuilder.php b/src/Solr/Query/AbstractQueryBuilder.php index 8b7cfe2..10f9873 100755 --- a/src/Solr/Query/AbstractQueryBuilder.php +++ b/src/Solr/Query/AbstractQueryBuilder.php @@ -70,7 +70,9 @@ public function build() $this->getQueryText(), 0, $this->pagination->getPageSize() * $this->pagination->getCurrentPage(), - $this->paramsBuilder->buildAsArray($this->attributetoReset) + $this->paramsBuilder + ->setAttributeToReset($this->attributetoReset) + ->buildAsArray() ); } @@ -116,6 +118,12 @@ protected function getEventDispatcher() { return $this->eventDispatcher; } - - + + /** + * @return string + */ + protected function getAttributetoReset() + { + return $this->attributetoReset; + } } \ No newline at end of file diff --git a/src/Solr/Query/ParamsBuilder.php b/src/Solr/Query/ParamsBuilder.php index 3f2b9c7..0197b8a 100755 --- a/src/Solr/Query/ParamsBuilder.php +++ b/src/Solr/Query/ParamsBuilder.php @@ -21,10 +21,9 @@ interface ParamsBuilder /** * Return parameters as array as expected by solr service * - * @param string $attributeToReset * @return mixed[] */ - public function buildAsArray($attributeToReset = ''); + public function buildAsArray(); /** * Return store id diff --git a/src/Solr/Query/SearchQueryBuilder.php b/src/Solr/Query/SearchQueryBuilder.php index 03dd17a..c8e6d4e 100755 --- a/src/Solr/Query/SearchQueryBuilder.php +++ b/src/Solr/Query/SearchQueryBuilder.php @@ -59,8 +59,16 @@ final class SearchQueryBuilder extends AbstractQueryBuilder * @param int $storeId * @param EventDispatcher $eventDispatcher */ - public function __construct(SearchString $searchString, FuzzyConfig $fuzzyConfig, ResultsConfig $resultsConfig, AttributeRepository $attributeRepository, Pagination $pagination, ParamsBuilder $paramsBuilder, $storeId, EventDispatcher $eventDispatcher) - { + public function __construct( + SearchString $searchString, + FuzzyConfig $fuzzyConfig, + ResultsConfig $resultsConfig, + AttributeRepository $attributeRepository, + Pagination $pagination, + ParamsBuilder $paramsBuilder, + $storeId, + EventDispatcher $eventDispatcher + ) { parent::__construct($attributeRepository, $pagination, $paramsBuilder, $storeId, $eventDispatcher); $this->fuzzyConfig = $fuzzyConfig; $this->resultsConfig = $resultsConfig; @@ -114,6 +122,20 @@ protected function getResultsConfig() return $this->resultsConfig; } + public function build() + { + return new Query( + $this->getStoreId(), + $this->getQueryText(), + 0, + $this->getPagination()->getPageSize() * $this->getPagination()->getCurrentPage(), + $this->getParamsBuilder() + ->setBroaden($this->broaden) + ->setAttributeToReset($this->getAttributetoReset()) + ->buildAsArray() + ); + } + /** * @return string */ diff --git a/src/Solr/Request/SearchRequest.php b/src/Solr/Request/SearchRequest.php index da2ca30..22f405c 100755 --- a/src/Solr/Request/SearchRequest.php +++ b/src/Solr/Request/SearchRequest.php @@ -106,6 +106,9 @@ public function doRequest($activeFilterAttributeCodes = array()) $minimumResults = $this->fuzzyConfig->getMinimumResults(); if ($this->getCurrentSort() !== 'position') { $result = $this->getResultFromRequest($pageSize, $isFuzzyActive, $activeFilterAttributeCodes); + if ($result->documents()->count() === 0) { + $result = $this->getBroaderResult($activeFilterAttributeCodes, $pageSize, $result); + } return $this->sliceResult($result); } else { $result = $this->getResultFromRequest($isFuzzyActive ? self::PAGESIZE_ALL : $pageSize, false, $activeFilterAttributeCodes); @@ -116,12 +119,7 @@ public function doRequest($activeFilterAttributeCodes = array()) $result = $result->merge($fuzzyResult, $pageSize); } if ($result->documents()->count() === 0) { - $this->foundNoResults = true; - $check = explode(' ', $this->queryBuilder->getSearchString()->getRawString()); - if (count($check) > 1) { - $result = $this->getResultFromRequest($pageSize, false, $activeFilterAttributeCodes); - } - $this->foundNoResults = false; + $result = $this->getBroaderResult($activeFilterAttributeCodes, $pageSize, $result); } return $this->sliceResult($result); } @@ -242,4 +240,21 @@ private function getResource() { return $this->resource; } + + /** + * @param string[] $activeFilterAttributeCodes + * @param int $pageSize + * @param SolrResponse + * @return SolrResponse + */ + private function getBroaderResult($activeFilterAttributeCodes, $pageSize, $result) + { + $this->foundNoResults = true; + $check = explode(' ', $this->queryBuilder->getSearchString()->getRawString()); + if (count($check) > 1) { + $result = $this->getResultFromRequest($pageSize, false, $activeFilterAttributeCodes); + } + $this->foundNoResults = false; + return $result; + } } \ No newline at end of file