/**
  * Generates the facet data for the passed query, criteria and context object.
  *
  * @param FacetInterface|ProductAttributeFacet $facet
  * @param Criteria $criteria
  * @param Struct\ShopContextInterface $context
  * @return BooleanFacetResult|ValueListFacetResult
  */
 public function generateFacet(FacetInterface $facet, Criteria $criteria, Struct\ShopContextInterface $context)
 {
     $queryCriteria = clone $criteria;
     $queryCriteria->resetConditions();
     $queryCriteria->resetSorting();
     $query = $this->queryBuilderFactory->createQuery($queryCriteria, $context);
     $query->resetQueryPart('orderBy');
     $query->resetQueryPart('groupBy');
     $sqlField = 'productAttribute.' . $facet->getField();
     $query->andWhere($sqlField . ' IS NOT NULL')->andWhere($sqlField . " != ''");
     switch ($facet->getMode()) {
         case ProductAttributeFacet::MODE_VALUE_LIST_RESULT:
         case ProductAttributeFacet::MODE_RADIO_LIST_RESULT:
             $result = $this->createValueListFacetResult($query, $facet, $criteria, $context);
             break;
         case ProductAttributeFacet::MODE_BOOLEAN_RESULT:
             $result = $this->createBooleanFacetResult($query, $facet, $criteria);
             break;
         case ProductAttributeFacet::MODE_RANGE_RESULT:
             $result = $this->createRangeFacetResult($query, $facet, $criteria);
             break;
         default:
             $result = null;
             break;
     }
     if ($result !== null && $facet->getTemplate()) {
         $result->setTemplate($facet->getTemplate());
     }
     return $result;
 }