diff --git a/src/Filter/Widget/OptionMultiDynamicAggregate.php b/src/Filter/Widget/OptionMultiDynamicAggregate.php deleted file mode 100644 index d69fc1f..0000000 --- a/src/Filter/Widget/OptionMultiDynamicAggregate.php +++ /dev/null @@ -1,220 +0,0 @@ -getAggregation(sprintf('%s-filter', $filterName)); - - foreach ($values as $name => $value) { - $data[$name] = $aggregation->find(sprintf('%s.%s.name', $name, $filterName)); - } - - $data['all-selected'] = $aggregation->find(sprintf('all-selected.%s.%s.name', $filterName, $filterName)); - - return $data; - } - - /** - * {@inheritdoc} - */ - public function modifySearch(Search $search, FilterState $state = null, SearchRequest $request = null) - { - if ($state && $state->isActive()) { - $search->addPostFilter($this->getFilterQuery($state->getValue())); - } - } - - /** - * Forms $unsortedChoices array with all possible choices. - * 0 is assigned to the document count of the choices. - * - * @param DocumentIterator $result - * @param ViewData $data - * - * @return array - */ - protected function formInitialUnsortedChoices($result, $data) - { - $unsortedChoices = []; - $urlParameters = array_merge( - $data->getResetUrlParameters(), - $data->getState()->getUrlParameters() - ); - - foreach ($result->getAggregation($data->getName())->getAggregation($data->getName())->getAggregation('name') as $nameBucket) { - $groupName = $nameBucket['key']; - - foreach ($nameBucket->getAggregation('value') as $bucket) { - $bucketArray = ['key' => $bucket['key'], 'doc_count' => 0]; - $choice = $this->createChoice($data, $bucket['key'], '', $bucketArray, $urlParameters); - $unsortedChoices[$groupName][$bucket['key']] = $choice; - } - } - - return $unsortedChoices; - } - - /** - * {@inheritdoc} - */ - public function getViewData(DocumentIterator $result, ViewData $data) - { - $unsortedChoices = []; - $activeNames = $data->getState()->isActive() ? array_keys($data->getState()->getValue()) : []; - $filterAggregations = $this->fetchAggregation($result, $data->getName(), $data->getState()->getValue()); - - if ($this->getShowZeroChoices()) { - $unsortedChoices = $this->formInitialUnsortedChoices($result, $data); - } - - /** @var AggregationValue $bucket */ - foreach ($filterAggregations as $activeName => $filterAggregation) { - foreach ($filterAggregation as $nameAggregation) { - $name = $nameAggregation['key']; - - if (($name != $activeName && $activeName != 'all-selected') || - ($activeName == 'all-selected' && in_array($name, $activeNames))) { - continue; - } - - foreach ($nameAggregation['value']['buckets'] as $bucket) { - $choice = $this->createChoice($data, $name, $activeName, $bucket); - $unsortedChoices[$name][$bucket['key']] = $choice; - } - - $this->addViewDataItem($data, $name, $unsortedChoices[$name]); - unset($unsortedChoices[$name]); - } - } - - /** @var ViewData\AggregateViewData $data */ - $data->sortItems(); - - return $data; - } - - /** - * {@inheritdoc} - */ - public function preProcessSearch(Search $search, Search $relatedSearch, FilterState $state = null) - { - [$parent, $child, $field] = explode('>', $this->getDocumentField()); - $filter = !empty($filter = $relatedSearch->getPostFilters()) ? $filter : new MatchAllQuery(); - $parentAggregation = new NestedAggregation($state->getName(), $parent); - $childAggregation = new NestedAggregation($state->getName(), $child); - $nameAggregation = new TermsAggregation('name', $this->getNameField()); - $valueAggregation = new TermsAggregation('value', $field); - $filterAggregation = new FilterAggregation($state->getName() . '-filter'); - $nameAggregation->addAggregation($valueAggregation); - $childAggregation->addAggregation($nameAggregation); - $parentAggregation->addAggregation($childAggregation); - $filterAggregation->setFilter($filter); - - if ($this->getSortType()) { - $valueAggregation->addParameter('order', [$this->getSortType() => $this->getSortOrder()]); - } - - if ($this->getOption('size')) { - $valueAggregation->addParameter('size', $this->getOption('size')); - } - - if ($state->isActive()) { - foreach ($state->getValue() as $key => $term) { - $terms = $state->getValue(); - unset($terms[$key]); - - $this->addSubFilterAggregation( - $filterAggregation, - $childAggregation, - $terms, - $key - ); - } - } - - $this->addSubFilterAggregation( - $filterAggregation, - $parentAggregation, - $state->getValue() ? $state->getValue() : [], - 'all-selected' - ); - - $search->addAggregation($filterAggregation); - - if ($this->getShowZeroChoices()) { - $search->addAggregation($parentAggregation); - } - } - - /** - * @param array $terms - * - * @return BoolQuery - */ - private function getFilterQuery($terms) - { - [$parent, $child, $field] = explode('>', $this->getDocumentField()); - $boolQuery = new BoolQuery(); - foreach ($terms as $groupName => $values) { - $innerBoolQuery = new BoolQuery(); - - foreach ($values as $value) { - $nestedBoolQuery = new BoolQuery(); - $nestedBoolQuery->add(new TermQuery($field, $value)); - $nestedBoolQuery->add(new TermQuery($this->getNameField(), $groupName)); - - $inStockBoolQuery = new BoolQuery(); - - $inStockBoolQuery->add(new RangeQuery('variants.stock', ['gte' => 1]), BoolQuery::SHOULD); - $inStockBoolQuery->add(new TermQuery('variants.is_tracked', false), BoolQuery::SHOULD); - - $childBoolQuery = new BoolQuery(); - $childBoolQuery->add($inStockBoolQuery, BoolQuery::MUST); - $childBoolQuery->add(new NestedQuery($child, $nestedBoolQuery), BoolQuery::MUST); - - $nestedQuery = new NestedQuery($parent, $childBoolQuery); - - $innerBoolQuery->add( - $nestedQuery, - - BoolQuery::SHOULD - ); - } - - $boolQuery->add($innerBoolQuery); - } - - return $boolQuery; - } -} diff --git a/src/Resources/config/app/config.yml b/src/Resources/config/app/config.yml index 62127aa..18072cb 100644 --- a/src/Resources/config/app/config.yml +++ b/src/Resources/config/app/config.yml @@ -89,9 +89,9 @@ ongr_filter_manager: options: name_field: attributes.code options: - type: sylius_elastic_search.multi_dynamic_aggregate_options + type: sylius_elastic_search.multi_dynamic_aggregate request_field: options - document_field: variants>variants.options>variants.options.value.raw + document_field: variants.options>variants.options.value.raw options: name_field: variants.options.name.raw sort_type: _term diff --git a/src/Resources/config/services.xml b/src/Resources/config/services.xml index ec4ce9a..89ec6fd 100644 --- a/src/Resources/config/services.xml +++ b/src/Resources/config/services.xml @@ -49,10 +49,6 @@ - - - -