/**
  * {@inheritdoc}
  */
 public function generateSorting(SortingInterface $sorting, QueryBuilder $query, ShopContextInterface $context)
 {
     $selection = $this->priceHelper->getSelection($context);
     $this->priceHelper->joinPrices($query, $context);
     $query->addSelect('MIN(' . $selection . ') as cheapest_price');
     /** @var PriceSorting $sorting */
     $query->addOrderBy('cheapest_price', $sorting->getDirection())->addOrderBy('product.id', $sorting->getDirection());
 }
 /**
  * @param FacetInterface|Facet\PriceFacet $facet
  * @param Criteria $criteria
  * @param ShopContextInterface $context
  * @return RangeFacetResult
  */
 public function generateFacet(FacetInterface $facet, Criteria $criteria, ShopContextInterface $context)
 {
     $queryCriteria = clone $criteria;
     $queryCriteria->resetConditions();
     $queryCriteria->resetSorting();
     $query = $this->queryBuilderFactory->createQuery($queryCriteria, $context);
     $query->resetQueryPart('orderBy');
     $query->resetQueryPart('groupBy');
     $selection = $this->priceHelper->getSelection($context);
     $this->priceHelper->joinPrices($query, $context);
     $query->select('MIN(' . $selection . ') as cheapest_price');
     /**@var $statement \Doctrine\DBAL\Driver\ResultStatement */
     $statement = $query->execute();
     $min = $statement->fetch(\PDO::FETCH_COLUMN);
     $query->groupBy('product.id')->orderBy('cheapest_price', 'DESC')->setFirstResult(0)->setMaxResults(1);
     /**@var $statement \Doctrine\DBAL\Driver\ResultStatement */
     $statement = $query->execute();
     $max = $statement->fetch(\PDO::FETCH_COLUMN);
     $activeMin = $min;
     $activeMax = $max;
     /**@var $condition PriceCondition */
     if ($condition = $criteria->getCondition($facet->getName())) {
         $activeMin = $condition->getMinPrice();
         $activeMax = $condition->getMaxPrice();
     }
     return new RangeFacetResult($facet->getName(), $criteria->hasCondition($facet->getName()), $this->snippetNamespace->get($facet->getName(), 'Price'), (double) $min, (double) $max, (double) $activeMin, (double) $activeMax, $this->minFieldName, $this->maxFieldName, [], 'frontend/listing/filter/facet-currency-range.tpl');
 }
 /**
  * {@inheritdoc}
  */
 public function generateCondition(ConditionInterface $condition, QueryBuilder $query, ShopContextInterface $context)
 {
     $selection = $this->priceHelper->getSelection($context);
     $selection = 'MIN(' . $selection . ')';
     $this->priceHelper->joinPrices($query, $context);
     /** @var PriceCondition $condition */
     if ($condition->getMaxPrice() > 0 && $condition->getMinPrice() > 0) {
         $query->andHaving($selection . ' BETWEEN :priceMin AND :priceMax');
         $query->setParameter(':priceMin', $condition->getMinPrice());
         $query->setParameter(':priceMax', $condition->getMaxPrice());
     } elseif ($condition->getMaxPrice() > 0) {
         $query->andHaving($selection . ' <= :priceMax');
         $query->setParameter(':priceMax', $condition->getMaxPrice());
     } elseif ($condition->getMinPrice() > 0) {
         $query->andHaving($selection . ' >= :priceMin');
         $query->setParameter(':priceMin', $condition->getMinPrice());
     }
     return;
 }