/**
  * {@inheritdoc}
  */
 public function generateCondition(ConditionInterface $condition, QueryBuilder $query, ShopContextInterface $context)
 {
     /** @var ProductAttributeCondition $condition */
     if (!$condition->getField()) {
         throw new \Exception('ProductAttributeCondition class requires a defined attribute field!');
     }
     if (!$condition->getOperator()) {
         throw new \Exception('ProductAttributeCondition class requires a defined operator!');
     }
     $placeholder = ':' . $condition->getField();
     $field = 'productAttribute.' . $condition->getField();
     switch (true) {
         case $condition->getValue() === null:
             if ($condition->getOperator() === ProductAttributeCondition::OPERATOR_EQ) {
                 $query->andWhere($field . ' IS NULL');
             } else {
                 $query->andWhere($field . ' IS NOT NULL');
             }
             break;
         case $condition->getOperator() === ProductAttributeCondition::OPERATOR_IN:
             $query->andWhere($field . ' IN (' . $placeholder . ')');
             $query->setParameter($placeholder, $condition->getValue(), Connection::PARAM_STR_ARRAY);
             break;
         case $condition->getOperator() === ProductAttributeCondition::OPERATOR_CONTAINS:
             $query->andWhere($field . ' LIKE ' . $placeholder);
             $query->setParameter($placeholder, '%' . $condition->getValue() . '%');
             break;
         case $condition->getOperator() === ProductAttributeCondition::OPERATOR_BETWEEN:
             $value = $condition->getValue();
             if (isset($value['min'])) {
                 $query->andWhere($field . ' >= ' . $placeholder . 'Min')->setParameter($placeholder . 'Min', $value['min']);
             }
             if (isset($value['max'])) {
                 $query->andWhere($field . ' <= ' . $placeholder . 'Max')->setParameter($placeholder . 'Max', $value['max']);
             }
             break;
         case $condition->getOperator() === ProductAttributeCondition::OPERATOR_STARTS_WITH:
             $query->andWhere($field . ' LIKE ' . $placeholder);
             $query->setParameter($placeholder, $condition->getValue() . '%');
             break;
         case $condition->getOperator() === ProductAttributeCondition::OPERATOR_ENDS_WITH:
             $query->andWhere($field . ' LIKE ' . $placeholder);
             $query->setParameter($placeholder, '%' . $condition->getValue());
             break;
         default:
             $query->andWhere($field . ' ' . $condition->getOperator() . ' ' . $placeholder);
             $query->setParameter($placeholder, $condition->getValue());
             break;
     }
 }