/** * {@inheritdoc} */ public function build(RequestFilterInterface $filter) { switch ($filter->getType()) { case RequestFilterInterface::TYPE_BOOL: /** @var \Magento\Framework\Search\Request\Filter\Bool $filter */ $queries = []; $must = $this->buildFilters($filter->getMust(), Select::SQL_AND); if (!empty($must)) { $queries[] = $must; } $should = $this->buildFilters($filter->getShould(), Select::SQL_OR); if (!empty($should)) { $queries[] = $this->wrapBrackets($should); } $mustNot = $this->buildFilters($filter->getMustNot(), Select::SQL_AND); if (!empty($mustNot)) { $queries[] = '!' . $this->wrapBrackets($mustNot); } $query = $this->generateQuery($queries, Select::SQL_AND); break; case RequestFilterInterface::TYPE_TERM: /** @var \Magento\Framework\Search\Request\Filter\Term $filter */ $query = $this->term->buildFilter($filter); break; case RequestFilterInterface::TYPE_RANGE: /** @var \Magento\Framework\Search\Request\Filter\Range $filter */ $query = $this->range->buildFilter($filter); break; default: throw new \InvalidArgumentException(sprintf('Unknown filter type \'%s\'', $filter->getType())); } return $this->wrapBrackets($query); }
/** * @param RequestFilterInterface|\Magento\Framework\Search\Request\Filter\Bool $filter * @param bool $isNegation * @return string */ private function processBoolFilter(RequestFilterInterface $filter, $isNegation) { $must = $this->buildFilters($filter->getMust(), Select::SQL_AND, $isNegation); $should = $this->buildFilters($filter->getShould(), Select::SQL_OR, $isNegation); $mustNot = $this->buildFilters($filter->getMustNot(), Select::SQL_AND, !$isNegation); $queries = [$must, $this->conditionManager->wrapBrackets($should), $this->conditionManager->wrapBrackets($mustNot)]; return $this->conditionManager->combineQueries($queries, Select::SQL_AND); }