/** * Test filters in aggregations and post filter. */ public function testBoolWithFuzzyQueryAndSortFilter() { $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $search = $repo->createSearch(); $rangeFilter = new RangeFilter('price', ['from' => 200, 'to' => 999]); $search->addPostFilter($rangeFilter); $name = 'foo'; $TermsAgg = new TermsAggregation($name); $TermsAgg->setField('title'); $TermsAgg->addParameter('include', $name); $filterAgg = new FilterAggregation($name . '-filter'); $filters = $search->getPostFilters(); $filterAgg->setFilter($filters); $filterAgg->addAggregation($TermsAgg); $search->addAggregation($filterAgg); $repo->execute($search, Repository::RESULTS_RAW); }
/** * Data provider for testFilterAggregation(). * * @return array */ public function getFilterAggregationData() { $out = []; // Case #0 Single filter aggregation. $aggregation = new FilterAggregation('test_agg'); $filter = new RegexpFilter('title', 'pizza'); $aggregation->setFilter($filter); $result = ['agg_test_agg' => ['doc_count' => 1]]; $out[] = [$aggregation, $result]; // Case #1 Nested filter aggregation. $aggregation = new FilterAggregation('test_agg'); $filter = new RegexpFilter('title', 'pizza'); $aggregation->setFilter($filter); $aggregation2 = new RangeAggregation('test_agg_2'); $aggregation2->setField('price'); $aggregation2->addRange(10, 20); $aggregation->addAggregation($aggregation2); $result = ['agg_test_agg' => ['doc_count' => 1, 'agg_test_agg_2' => ['buckets' => [['key' => '10.0-20.0', 'from' => 10, 'from_as_string' => '10.0', 'to' => 20, 'to_as_string' => '20.0', 'doc_count' => 1]]]]]; $out[] = [$aggregation, $result]; return $out; }
/** * {@inheritdoc} */ public function preProcessSearch(Search $search, Search $relatedSearch, FilterState $state = null) { $name = $state ? $state->getName() : $this->getField(); $aggregation = new TermsAggregation($name); $aggregation->setField($this->getField()); if ($this->getSortType()) { $aggregation->addParameter('order', [$this->getSortType()['type'] => $this->getSortType()['order']]); } $aggregation->addParameter('size', 0); if ($this->getSize() > 0) { $aggregation->addParameter('size', $this->getSize()); } if ($relatedSearch->getPostFilters()) { $filterAggregation = new FilterAggregation($name . '-filter'); $filterAggregation->setFilter($relatedSearch->getPostFilters()); $filterAggregation->addAggregation($aggregation); $search->addAggregation($filterAggregation); } else { $search->addAggregation($aggregation); } }
/** * Data provider for testToArray. * * @return array */ public function getToArrayData() { $out = []; // Case #0 filter aggregation. $aggregation = new FilterAggregation('test_agg'); $filter = $this->getMockBuilder('ONGR\\ElasticsearchBundle\\DSL\\BuilderInterface')->setMethods(['toArray', 'getType'])->getMockForAbstractClass(); $filter->expects($this->any())->method('getType')->willReturn('test_filter'); $filter->expects($this->any())->method('toArray')->willReturn(['test_field' => ['test_value' => 'test']]); $aggregation->setFilter($filter); $result = ['agg_test_agg' => ['filter' => ['test_filter' => ['test_field' => ['test_value' => 'test']]]]]; $out[] = [$aggregation, $result]; // Case #1 nested filter aggregation. $aggregation = new FilterAggregation('test_agg'); $aggregation->setFilter($filter); $aggregation2 = $this->getMockBuilder('ONGR\\ElasticsearchBundle\\DSL\\Aggregation\\AbstractAggregation')->disableOriginalConstructor()->setMethods(['toArray', 'getName'])->getMockForAbstractClass(); $aggregation2->expects($this->any())->method('toArray')->willReturn(['agg_test_agg2' => ['avg' => []]]); $aggregation2->expects($this->any())->method('getName')->willReturn('agg_test_agg2'); $aggregation->addAggregation($aggregation2); $result = ['agg_test_agg' => ['filter' => ['test_filter' => ['test_field' => ['test_value' => 'test']]], 'aggregations' => ['agg_test_agg2' => ['avg' => []]]]]; $out[] = [$aggregation, $result]; return $out; }