/** * @desc Validates fields and executes the provided method * * @param $method - Search method name to be called * @param array $fields = array of required request field names * @param bool $pagination - get pagination values from request * @throws NotFoundApiException * @throws InvalidParameterApiException */ private function executeSearch($method, array $fields = [], $pagination = false) { $searchParams = new LyricsApiSearchParams(); // Validate fields foreach ($fields as $fieldName) { $fieldValue = $this->wg->Request->getVal($fieldName); if (empty($fieldValue)) { throw new InvalidParameterApiException($fieldName); } $searchParams->addField($fieldName, $fieldValue); } // Get pagination if ($pagination) { list($limit, $offset) = $this->getPaginationParamsFromRequest(); $searchParams->setLimit($limit); $searchParams->setOffset($offset); } $this->response->setFormat(WikiaResponse::FORMAT_JSON); $results = $this->lyricsApiHandler->{$method}($searchParams); // Validate result if (is_null($results)) { // New songs that we don't have yet are likely to get hit repeatedly by a // ton of users until we get the song, so this is a special case where it // is helpful to cache 404s for a little while. $this->response->setCacheValidity(WikiaResponse::CACHE_VERY_SHORT); throw new NotFoundApiException($this->getNotFoundDetails($method)); } $this->response->setVal('result', $results); $this->response->setCacheValidity(WikiaResponse::CACHE_STANDARD); }
/** * @desc Searches for a song lyrics in Solr index * * @param LyricsApiSearchParams $searchParams * * @return array|null */ public function searchLyrics(LyricsApiSearchParams $searchParams) { $query = $this->newQueryFromSearch(['type: %1%' => LyricsUtils::TYPE_SONG, 'lyrics: %P2%' => $searchParams->getField(LyricsApiController::PARAM_QUERY)]); $query->setStart($searchParams->getOffset()); $query->setRows($searchParams->getLimit()); $hl = $query->getHighlighting(); $hl->setFields(self::INDEX_FIELD_NAME_LYRICS); $hl->setSimplePrefix(self::HIGHLIGHT_PREFIX); $hl->setSimplePostfix(self::HIGHLIGHT_POSTFIX); $solrSongs = $this->client->select($query); if ($solrSongs->getNumFound() <= 0) { return null; } $songs = []; $highlighting = $solrSongs->getHighlighting(); /** @var Solarium_Document_ReadOnly $solrSong */ foreach ($solrSongs as $solrSong) { $fields = $solrSong->getFields(); $songs[] = $this->getOutputSong($solrSong, $highlighting->getResult($fields['id']), true); } return $songs; }