/**
  * 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)) . ')';
 }
예제 #3
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 \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;
     }
 }