/** * @see ApiBase::execute() */ public function execute() { $extracted = $this->extractRequestParams(); $params = $this->paramsParser->parseAndValidate($extracted); $suggestionGenerator = new SuggestionGenerator($this->entityLookup, $this->termIndex, $this->suggester); if ($params->entity !== null) { $suggestions = $suggestionGenerator->generateSuggestionsByItem($params->entity, $params->suggesterLimit, $params->minProbability, $params->context); } else { $suggestions = $suggestionGenerator->generateSuggestionsByPropertyList($params->properties, $params->suggesterLimit, $params->minProbability, $params->context); } $suggestions = $suggestionGenerator->filterSuggestions($suggestions, $params->search, $params->language, $params->resultSize); // Build result array $resultBuilder = new ResultBuilder($this->getResult(), $this->termIndex, $this->entityTitleLookup, $params->search); $entries = $resultBuilder->createResultArray($suggestions, $params->language, $params->search); // merge with search result if possible and necessary if (count($entries) < $params->resultSize && $params->search !== '') { $searchResult = $this->querySearchApi($params->resultSize, $params->search, $params->language); $entries = $resultBuilder->mergeWithTraditionalSearchResults($entries, $searchResult, $params->resultSize); } // Define Result $slicedEntries = array_slice($entries, $params->continue, $params->limit); ApiResult::setIndexedTagName($slicedEntries, 'search'); $this->getResult()->addValue(null, 'search', $slicedEntries); $this->getResult()->addValue(null, 'success', 1); if (count($entries) >= $params->resultSize) { $this->getResult()->addValue(null, 'search-continue', $params->resultSize); } $this->getResult()->addValue('searchinfo', 'search', $params->search); }
public function testMergeWithTraditionalSearchResults() { $suggesterResult = array(array('id' => '8'), array('id' => '14'), array('id' => '20')); $searchResult = array(array('id' => '7'), array('id' => '8'), array('id' => '13'), array('id' => '14'), array('id' => '15'), array('id' => '16')); $mergedResult = $this->resultBuilder->mergeWithTraditionalSearchResults($suggesterResult, $searchResult, 5); $expected = array(array('id' => '8'), array('id' => '14'), array('id' => '20'), array('id' => '7'), array('id' => '13')); $this->assertEquals($mergedResult, $expected); }