/** * 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)))); }
/** * 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))); }