/** * 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]) . '))'; }
/** * 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)) . ')'; }
/** * 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" => $this->criterionVisitor->visit($query->query), "fq" => $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/haz.de/select?' . http_build_query($parameters) . (count($query->facetBuilders) ? '&facet=true&facet.sort=count&' : '') . implode('&', array_map(array($this->facetBuilderVisitor, 'visit'), $query->facetBuilders)) . "&hl=true&hl.fl=ezf_df_text&hl.simple.pre=<b>&hl.simple.post=<%2Fb>"); /* var_dump('/solr/haz.de/select?' . http_build_query( $parameters ) . ( count( $query->facetBuilders ) ? '&facet=true&facet.sort=count&' : '' ) . implode( '&', array_map( array( $this->facetBuilderVisitor, 'visit' ), $query->facetBuilders ) )."&hl=true&hl.fl=ezf_df_text&hl.simple.pre=<b>&hl.simple.post=<%2Fb>"); die("ende"); */ // @todo: Error handling? if ($response->headers["status"] == 200) { $data = json_decode($response->body); // @todo: Extract method $result = new SearchResult(array('time' => $data->responseHeader->QTime / 1000, 'maxScore' => $data->response->maxScore, 'totalCount' => $data->response->numFound)); $highlight_array = array(); if (isset($data->highlighting)) { foreach ($data->highlighting as $h_remoteid => $highlight) { foreach ($highlight as $highlight_item) { $highlight_array[$h_remoteid] = $highlight_item; } } } foreach ($data->response->docs as $doc) { /* $searchHit = new SearchHit( array( 'score' => $doc->score, 'valueObject' => $this->contentHandler->load( $doc->id, $doc->version_id ) ) ); */ $highlight_toID = ""; if (array_key_exists($doc->meta_guid_ms, $highlight_array)) { if (count($highlight_array[$doc->meta_guid_ms]) > 0) { $highlight_toID = $highlight_array[$doc->meta_guid_ms][0]; } } if ($doc->meta_id_si > 0) { /* $searchHit = new SearchHit( array( 'score' => $doc->score, 'valueObject' => $this->contentHandler->load( $doc->meta_id_si, $doc->meta_current_version_si ) ) ); */ $searchHit = new SearchHit(array('score' => $doc->score, 'valueObject' => $doc, 'highlight' => $highlight_toID)); } else { $searchHit = new SearchHit(array('score' => $doc->score, 'valueObject' => $doc, 'highlight' => $highlight_toID)); } $result->searchHits[] = $searchHit; } if (isset($data->facet_counts)) { foreach ($data->facet_counts->facet_fields as $field => $facet) { $result->facets[] = $this->facetBuilderVisitor->map($field, $facet); } foreach ($data->facet_counts->facet_queries as $field => $facet) { $result->facets[] = $this->facetBuilderVisitor->map($field, array($facet)); } } return $result; } else { $data = json_decode($response->body); $result = new SearchResult(array('time' => 0, 'maxScore' => 0, 'totalCount' => 0)); return $result; } }