/**
  * @param QueryBuilder $query
  * @param ProductAttributeFacet $facet
  * @param Criteria $criteria
  * @param Struct\ShopContextInterface $context
  * @return null|RadioFacetResult|ValueListFacetResult
  */
 private function createValueListFacetResult(QueryBuilder $query, ProductAttributeFacet $facet, Criteria $criteria, Struct\ShopContextInterface $context)
 {
     $sqlField = 'productAttribute.' . $facet->getField();
     $query->addSelect($sqlField)->orderBy($sqlField)->groupBy($sqlField);
     $this->addTranslations($query, $context);
     /**@var $statement \Doctrine\DBAL\Driver\ResultStatement */
     $statement = $query->execute();
     $result = $statement->fetchAll();
     if (empty($result)) {
         return null;
     }
     $actives = [];
     /**@var $condition ProductAttributeCondition*/
     if ($condition = $criteria->getCondition($facet->getName())) {
         $actives = $condition->getValue();
     }
     $items = array_map(function ($row) use($actives, $facet) {
         $viewName = $row[$facet->getField()];
         $translation = $this->extractTranslations($row, $facet->getField());
         if ($translation !== null) {
             $viewName = $translation;
         }
         return new ValueListItem($row[$facet->getField()], $viewName, in_array($row[$facet->getField()], $actives));
     }, $result);
     if ($facet->getMode() == ProductAttributeFacet::MODE_RADIO_LIST_RESULT) {
         return new RadioFacetResult($facet->getName(), $criteria->hasCondition($facet->getName()), $facet->getLabel(), $items, $facet->getFormFieldName());
     } else {
         return new ValueListFacetResult($facet->getName(), $criteria->hasCondition($facet->getName()), $facet->getLabel(), $items, $facet->getFormFieldName());
     }
 }
 /**
  * @param ProductAttributeFacet $criteriaPart
  * @param $data
  * @param Criteria $criteria
  * @return null|RadioFacetResult|ValueListFacetResult
  */
 private function createItemListResult(ProductAttributeFacet $criteriaPart, $data, Criteria $criteria)
 {
     $values = array_column($data['buckets'], 'key');
     if (empty($values)) {
         return null;
     }
     $actives = [];
     /**@var $condition ProductAttributeCondition*/
     if ($condition = $criteria->getCondition($criteriaPart->getName())) {
         $actives = $condition->getValue();
     }
     $items = array_map(function ($row) use($actives) {
         return new ValueListItem($row, $row, in_array($row, $actives));
     }, $values);
     if ($criteriaPart->getMode() == ProductAttributeFacet::MODE_RADIO_LIST_RESULT) {
         $template = $criteriaPart->getTemplate();
         if (!$template) {
             $template = 'frontend/listing/filter/facet-radio.tpl';
         }
         return new RadioFacetResult($criteriaPart->getName(), $criteria->hasCondition($criteriaPart->getName()), $criteriaPart->getLabel(), $items, $criteriaPart->getFormFieldName(), [], $template);
     } else {
         $template = $criteriaPart->getTemplate();
         if (!$template) {
             $template = 'frontend/listing/filter/facet-value-list.tpl';
         }
         return new ValueListFacetResult($criteriaPart->getName(), $criteria->hasCondition($criteriaPart->getName()), $criteriaPart->getLabel(), $items, $criteriaPart->getFormFieldName(), [], $template);
     }
 }