/**
  * Map field value to a proper Elasticsearch query representation
  *
  * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
  * @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
  * @param array $fieldFilters
  *
  * @return mixed
  */
 public function visitQuery(Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters)
 {
     /** @var $criterion \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalOperator */
     return array("bool" => array("must" => array(array_map(function ($value) use($dispatcher, $fieldFilters) {
         return $dispatcher->dispatch($value, Dispatcher::CONTEXT_QUERY, $fieldFilters);
     }, $criterion->criteria))));
 }
Example #2
0
 /**
  * Finds and returns documents of a given $type for a given $query object.
  *
  * @param \eZ\Publish\API\Repository\Values\Content\Query $query
  * @param string $type
  * @param array $fieldFilters
  *
  * @return mixed
  */
 public function find(Query $query, $type, array $fieldFilters = array())
 {
     $aggregationList = array_map(array($this->facetBuilderVisitor, 'visit'), $query->facetBuilders);
     $aggregations = array();
     foreach ($aggregationList as $aggregation) {
         $aggregations[key($aggregation)] = reset($aggregation);
     }
     $ast = array("query" => array("filtered" => array("query" => array($this->criterionVisitorDispatcher->dispatch($query->query, CriterionVisitorDispatcher::CONTEXT_QUERY, $fieldFilters)), "filter" => array($this->criterionVisitorDispatcher->dispatch($query->filter, CriterionVisitorDispatcher::CONTEXT_FILTER, $fieldFilters)))), "aggregations" => empty($aggregations) ? new ArrayObject() : $aggregations, "sort" => array_map(array($this->sortClauseVisitor, "visit"), $query->sortClauses), "track_scores" => true);
     if ($query->offset !== null) {
         $ast["from"] = $query->offset;
     }
     // TODO: for some reason 1073741824 causes out of memory...
     if ($query->limit !== null && $query->limit !== 1073741824) {
         $ast["size"] = $query->limit;
     }
     if ($query->limit == 1073741824) {
         $ast["size"] = 1000;
     }
     $response = $this->findRaw(json_encode($ast), $type);
     // TODO: error handling
     $data = json_decode($response->body);
     return $data;
 }
 /**
  * Map field value to a proper Elasticsearch query representation
  *
  * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
  * @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
  * @param array $fieldFilters
  *
  * @return mixed
  */
 public function visitQuery(Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters)
 {
     $this->validateCriterionInput($criterion);
     /** @var $criterion \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalOperator */
     return array("bool" => array("must_not" => $dispatcher->dispatch($criterion->criteria[0], Dispatcher::CONTEXT_FILTER, $fieldFilters)));
 }