OP-7: Address CR comments

This commit is contained in:
Gracjan Józefczyk
2022-12-08 09:43:46 +01:00
parent be96c860ca
commit 74be13ba65
8 changed files with 151 additions and 60 deletions

View File

@@ -47,6 +47,7 @@ final class ShopProductsFinder implements ShopProductsFinderInterface
if (!$selectedBuckets) {
continue;
}
$facet = $this->facetRegistry->getFacetById($facetId);
$boolQuery->addFilter($facet->getQuery($selectedBuckets));
}

View File

@@ -0,0 +1,49 @@
<?php
/*
* This file was created by developers working at BitBag
* Do you need more information about us and what we do? Visit our https://bitbag.io website!
* We are hiring developers from all over the world. Join us and start your new, exciting adventure and become part of us: https://bitbag.io/career
*/
declare(strict_types=1);
namespace BitBag\SyliusElasticsearchPlugin\Form\Resolver;
use BitBag\SyliusElasticsearchPlugin\Facet\RegistryInterface;
use BitBag\SyliusElasticsearchPlugin\QueryBuilder\FormQueryBuilder\TaxonFacetsQueryBuilderInterface;
use FOS\ElasticaBundle\Finder\PaginatedFinderInterface;
use Pagerfanta\Pagerfanta;
use Symfony\Component\Form\FormEvent;
final class ProductsFilterFacetResolver implements ProductsFilterFacetResolverInterface
{
private TaxonFacetsQueryBuilderInterface $queryBuilder;
private RegistryInterface $facetRegistry;
private PaginatedFinderInterface $finder;
public function __construct(
TaxonFacetsQueryBuilderInterface $queryBuilder,
RegistryInterface $facetRegistry,
PaginatedFinderInterface $finder
) {
$this->queryBuilder = $queryBuilder;
$this->facetRegistry = $facetRegistry;
$this->finder = $finder;
}
public function resolveFacets(FormEvent $event, string $namePropertyPrefix): Pagerfanta
{
$query = $this->queryBuilder->getQuery($event, $namePropertyPrefix);
foreach ($this->facetRegistry->getFacets() as $facetId => $facet) {
$query->addAggregation($facet->getAggregation()->setName($facetId));
}
$query->setSize(0);
return $this->finder->findPaginated($query);
}
}

View File

@@ -0,0 +1,19 @@
<?php
/*
* This file was created by developers working at BitBag
* Do you need more information about us and what we do? Visit our https://bitbag.io website!
* We are hiring developers from all over the world. Join us and start your new, exciting adventure and become part of us: https://bitbag.io/career
*/
declare(strict_types=1);
namespace BitBag\SyliusElasticsearchPlugin\Form\Resolver;
use Pagerfanta\Pagerfanta;
use Symfony\Component\Form\FormEvent;
interface ProductsFilterFacetResolverInterface
{
public function resolveFacets(FormEvent $event, string $namePropertyPrefix): Pagerfanta;
}

View File

@@ -10,11 +10,7 @@ declare(strict_types=1);
namespace BitBag\SyliusElasticsearchPlugin\Form\Type;
use BitBag\SyliusElasticsearchPlugin\Controller\RequestDataHandler\DataHandlerInterface;
use BitBag\SyliusElasticsearchPlugin\Facet\RegistryInterface;
use BitBag\SyliusElasticsearchPlugin\QueryBuilder\QueryBuilderInterface;
use Elastica\Query;
use FOS\ElasticaBundle\Finder\PaginatedFinderInterface;
use BitBag\SyliusElasticsearchPlugin\Form\Resolver\ProductsFilterFacetResolverInterface;
use FOS\ElasticaBundle\Paginator\FantaPaginatorAdapter;
use Pagerfanta\Adapter\AdapterInterface;
use Symfony\Component\Form\FormBuilderInterface;
@@ -25,33 +21,16 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
final class ShopProductsFilterType extends AbstractFilterType
{
/** @var string */
private $namePropertyPrefix;
private string $namePropertyPrefix;
/** @var PaginatedFinderInterface */
private $finder;
/** @var RegistryInterface */
private $facetRegistry;
/** @var QueryBuilderInterface */
private $searchProductsQueryBuilder;
/** @var DataHandlerInterface */
private $shopProductListDataHandler;
private ProductsFilterFacetResolverInterface $facetResolver;
public function __construct(
string $namePropertyPrefix,
PaginatedFinderInterface $finder,
RegistryInterface $facetRegistry,
QueryBuilderInterface $searchProductsQueryBuilder,
DataHandlerInterface $shopProductListDataHandler
ProductsFilterFacetResolverInterface $facetResolver
) {
$this->namePropertyPrefix = $namePropertyPrefix;
$this->finder = $finder;
$this->facetRegistry = $facetRegistry;
$this->searchProductsQueryBuilder = $searchProductsQueryBuilder;
$this->shopProductListDataHandler = $shopProductListDataHandler;
$this->facetResolver = $facetResolver;
}
public function buildForm(FormBuilderInterface $builder, array $options): void
@@ -63,7 +42,7 @@ final class ShopProductsFilterType extends AbstractFilterType
->add('price', PriceFilterType::class, ['required' => false, 'label' => false])
->setMethod('GET');
$builder->addEventListener(FormEvents::PRE_SUBMIT, [$this, 'resolveFacets']);
$builder->addEventListener(FormEvents::PRE_SUBMIT, [$this, 'addFacets']);
}
public function configureOptions(OptionsResolver $resolver): void
@@ -73,33 +52,13 @@ final class ShopProductsFilterType extends AbstractFilterType
]);
}
public function resolveFacets(FormEvent $event): void
public function addFacets(FormEvent $event): void
{
$query = $this->getQuery($event);
$facets = $this->facetResolver->resolveFacets($event, $this->namePropertyPrefix);
foreach ($this->facetRegistry->getFacets() as $facetId => $facet) {
$query->addAggregation($facet->getAggregation()->setName($facetId));
if ($facets->getAdapter()) {
$this->modifyForm($event->getForm(), $facets->getAdapter());
}
$query->setSize(0);
$results = $this->finder->findPaginated($query);
if ($results->getAdapter()) {
$this->modifyForm($event->getForm(), $results->getAdapter());
}
}
private function getQuery(FormEvent $event): Query
{
$eventData = $event->getData();
if (!isset($eventData[$this->namePropertyPrefix])) {
$eventData[$this->namePropertyPrefix] = '';
}
$data = $this->shopProductListDataHandler->retrieveData($eventData);
return new Query($this->searchProductsQueryBuilder->buildQuery($data));
}
private function modifyForm(FormInterface $form, AdapterInterface $adapter): void

View File

@@ -0,0 +1,43 @@
<?php
/*
* This file was created by developers working at BitBag
* Do you need more information about us and what we do? Visit our https://bitbag.io website!
* We are hiring developers from all over the world. Join us and start your new, exciting adventure and become part of us: https://bitbag.io/career
*/
declare(strict_types=1);
namespace BitBag\SyliusElasticsearchPlugin\QueryBuilder\FormQueryBuilder;
use BitBag\SyliusElasticsearchPlugin\Controller\RequestDataHandler\DataHandlerInterface;
use BitBag\SyliusElasticsearchPlugin\QueryBuilder\QueryBuilderInterface;
use Elastica\Query;
use Symfony\Component\Form\FormEvent;
final class TaxonFacetsQueryBuilder implements TaxonFacetsQueryBuilderInterface
{
private DataHandlerInterface $shopProductListDataHandler;
private QueryBuilderInterface $searchProductsQueryBuilder;
public function __construct(
DataHandlerInterface $shopProductListDataHandler,
QueryBuilderInterface $searchProductsQueryBuilder
) {
$this->shopProductListDataHandler = $shopProductListDataHandler;
$this->searchProductsQueryBuilder = $searchProductsQueryBuilder;
}
public function getQuery(FormEvent $event, string $namePropertyPrefix): Query
{
$eventData = $event->getData();
if (!isset($eventData[$namePropertyPrefix])) {
$eventData[$namePropertyPrefix] = '';
}
$data = $this->shopProductListDataHandler->retrieveData($eventData);
return new Query($this->searchProductsQueryBuilder->buildQuery($data));
}
}

View File

@@ -0,0 +1,19 @@
<?php
/*
* This file was created by developers working at BitBag
* Do you need more information about us and what we do? Visit our https://bitbag.io website!
* We are hiring developers from all over the world. Join us and start your new, exciting adventure and become part of us: https://bitbag.io/career
*/
declare(strict_types=1);
namespace BitBag\SyliusElasticsearchPlugin\QueryBuilder\FormQueryBuilder;
use Elastica\Query;
use Symfony\Component\Form\FormEvent;
interface TaxonFacetsQueryBuilderInterface
{
public function getQuery(FormEvent $event, string $namePropertyPrefix): Query;
}

View File

@@ -29,10 +29,7 @@
<service id="bitbag_sylius_elasticsearch_plugin.form.type.shop_products_filter" class="BitBag\SyliusElasticsearchPlugin\Form\Type\ShopProductsFilterType">
<argument>%bitbag_es_shop_name_property_prefix%</argument>
<argument type="service" id="fos_elastica.finder.bitbag_shop_product" />
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.facet.taxon_registry" />
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.query_builder.shop_products" />
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.controller.request_data_handler.shop_product_list" />
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.form.resolver.facet_resolver" />
<tag name="form.type" />
</service>
@@ -71,5 +68,11 @@
<service id="bitbag_sylius_elasticsearch_plugin.form.mapper.type.percent" class="BitBag\SyliusElasticsearchPlugin\Form\Type\ChoiceMapper\AttributesMapper\AttributesTypePercentMapper">
<tag name="bitbag_sylius_elasticsearch_plugin.form.type.product_attributes_mapper" />
</service>
<service id="bitbag_sylius_elasticsearch_plugin.form.resolver.facet_resolver" class="BitBag\SyliusElasticsearchPlugin\Form\Resolver\ProductsFilterFacetResolver">
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.query_builder.taxon_facets" />
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.facet.taxon_registry" />
<argument type="service" id="fos_elastica.finder.bitbag_shop_product" />
</service>
</services>
</container>

View File

@@ -89,11 +89,9 @@
<argument>%bitbag_es_fuzziness%</argument>
</service>
<service id="bitbag_sylius_elasticsearch_plugin.query_builder.taxon_facets" class="BitBag\SyliusElasticsearchPlugin\QueryBuilder\TaxonFacetsQueryBuilder">
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.query_builder.is_enabled" />
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.query_builder.has_channel" />
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.query_builder.has_product_taxon" />
<argument>%bitbag_es_fuzziness%</argument>
<service id="bitbag_sylius_elasticsearch_plugin.query_builder.taxon_facets" class="BitBag\SyliusElasticsearchPlugin\QueryBuilder\FormQueryBuilder\TaxonFacetsQueryBuilder">
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.controller.request_data_handler.shop_product_list" />
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.query_builder.shop_products" />
</service>
</services>
</container>