/** * Finds Location objects for the given query. * * @param \eZ\Publish\API\Repository\Values\Content\LocationQuery $query * * @return \eZ\Publish\API\Repository\Values\Content\Search\SearchResult */ public function findLocations(LocationQuery $query) { $parameters = array("q" => 'document_type_id:"location" AND ' . $this->criterionVisitor->visit($query->query), "fq" => 'document_type_id:"location" AND ' . $this->criterionVisitor->visit($query->filter), "sort" => implode(", ", array_map(array($this->sortClauseVisitor, "visit"), $query->sortClauses)), "fl" => "*,score", "wt" => "json"); if ($query->offset !== null) { $parameters["start"] = $query->offset; } if ($query->limit !== null) { $parameters["rows"] = $query->limit; } // @todo: Extract method $response = $this->client->request('GET', '/solr/select?' . http_build_query($parameters) . (count($query->facetBuilders) ? '&facet=true&facet.sort=count&' : '') . implode('&', array_map(array($this->facetBuilderVisitor, 'visit'), $query->facetBuilders))); // @todo: Error handling? $data = json_decode($response->body); if (!isset($data->response)) { throw new \Exception('->response not set: ' . var_export(array($data, $parameters), true)); } // @todo: Extract method $result = new SearchResult(array('time' => $data->responseHeader->QTime / 1000, 'maxScore' => $data->response->maxScore, 'totalCount' => $data->response->numFound)); foreach ($data->response->docs as $doc) { $searchHit = new SearchHit(array('score' => $doc->score, 'valueObject' => $this->locationHandler->load(substr($doc->id, 8)))); $result->searchHits[] = $searchHit; } if (isset($data->facet_counts)) { foreach ($data->facet_counts->facet_fields as $field => $facet) { $result->facets[] = $this->facetBuilderVisitor->map($field, $facet); } } return $result; }
/** * Finds content objects for the given query. * * @todo define structs for the field filters * * @param \eZ\Publish\API\Repository\Values\Content\Query $query * @param array $fieldFilters - a map of filters for the returned fields. * Currently supported: <code>array("languages" => array(<language1>,..))</code>. * * @return \eZ\Publish\API\Repository\Values\Content\Search\SearchResult */ public function findContent(Query $query, array $fieldFilters = array()) { $parameters = array("q" => 'document_type_id:"content" AND ' . $this->criterionVisitor->visit($query->query), "fq" => 'document_type_id:"content" AND ' . $this->criterionVisitor->visit($query->filter), "sort" => implode(", ", array_map(array($this->sortClauseVisitor, "visit"), $query->sortClauses)), "fl" => "*,score", "wt" => "json"); if ($query->offset !== null) { $parameters["start"] = $query->offset; } if ($query->limit !== null) { $parameters["rows"] = $query->limit; } // @todo: Extract method $response = $this->client->request('GET', '/solr/select?' . http_build_query($parameters) . (count($query->facetBuilders) ? '&facet=true&facet.sort=count&' : '') . implode('&', array_map(array($this->facetBuilderVisitor, 'visit'), $query->facetBuilders))); // @todo: Error handling? $data = json_decode($response->body); if (!isset($data->response)) { throw new \Exception('->response not set: ' . var_export(array($data, $parameters), true)); } // @todo: Extract method $result = new SearchResult(array('time' => $data->responseHeader->QTime / 1000, 'maxScore' => $data->response->maxScore, 'totalCount' => $data->response->numFound)); foreach ($data->response->docs as $doc) { $searchHit = new SearchHit(array('score' => $doc->score, 'valueObject' => new SPIContentInfo(array('id' => substr($doc->id, 7), 'name' => $doc->name_s, 'contentTypeId' => $doc->type_id, 'sectionId' => $doc->section_id, 'currentVersionNo' => $doc->version_id, 'isPublished' => $doc->status_id === SPIContentInfo::STATUS_PUBLISHED, 'ownerId' => $doc->owner_id, 'modificationDate' => $doc->modified_dt, 'publicationDate' => $doc->published_dt, 'alwaysAvailable' => $doc->always_available_b, 'remoteId' => $doc->remote_id_id, 'mainLanguageCode' => $doc->main_language_code_s, 'mainLocationId' => isset($doc->main_location_id) ? $doc->main_location_id : null)))); $result->searchHits[] = $searchHit; } if (isset($data->facet_counts)) { foreach ($data->facet_counts->facet_fields as $field => $facet) { $result->facets[] = $this->facetBuilderVisitor->map($field, $facet); } } return $result; }
/** * Map field value to a proper Solr representation * * @param Criterion $criterion * @param CriterionVisitor $subVisitor * * @return string */ public function visit(Criterion $criterion, CriterionVisitor $subVisitor = null) { if (!isset($criterion->criteria[0]) || count($criterion->criteria) > 1) { throw new \RuntimeException("Invalid aggregation in LogicalNot criterion."); } return '(*:* NOT (' . $subVisitor->visit($criterion->criteria[0]) . '))'; }
/** * Finds content objects for the given query. * * @todo define structs for the field filters * * @param \eZ\Publish\API\Repository\Values\Content\Query $query * @param array $fieldFilters - a map of filters for the returned fields. * Currently supported: <code>array("languages" => array(<language1>,..))</code>. * * @return mixed */ public function find(Query $query, array $fieldFilters = array()) { $query = clone $query; $this->coreFilter->apply($query, $fieldFilters); $parameters = array("q" => $this->criterionVisitor->visit($query->query), "fq" => $this->criterionVisitor->visit($query->filter), "sort" => $this->getSortClauses($query->sortClauses), "start" => $query->offset, "rows" => $query->limit, "fl" => "*,score,[shard]", "wt" => "json"); $searchTargets = $this->getSearchTargets($fieldFilters); if (!empty($searchTargets)) { $parameters["shards"] = $searchTargets; } $queryString = http_build_query($parameters); $facets = $this->getFacets($query->facetBuilders); if (!empty($facets)) { $queryString .= "&facet=true&facet.sort=count&{$facets}"; } $response = $this->client->request('GET', $this->endpointRegistry->getEndpoint($this->endpointResolver->getEntryEndpoint()), "/select?{$queryString}"); // @todo: Error handling? $result = json_decode($response->body); if (!isset($result->response)) { throw new \Exception('->response not set: ' . var_export(array($result, $parameters), true)); } return $result; }
/** * Map field value to a proper Solr representation. * * @param Criterion $criterion * @param CriterionVisitor $subVisitor * * @return string */ public function visit(Criterion $criterion, CriterionVisitor $subVisitor = null) { return '(' . implode(' AND ', array_map(function ($value) use($subVisitor) { return $subVisitor->visit($value); }, $criterion->criteria)) . ')'; }