Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Builder.php
Go to the documentation of this file.
1 <?php
7 
14 use Magento\Framework\Search\Request\FilterInterface as RequestFilterInterface;
16 
21 class Builder implements BuilderInterface
22 {
26  private $conditionManager;
27 
31  private $filters;
32 
36  private $preprocessor;
37 
45  public function __construct(
46  Range $range,
47  Term $term,
48  Wildcard $wildcard,
49  ConditionManager $conditionManager,
50  PreprocessorInterface $preprocessor
51  ) {
52  $this->filters = [
53  RequestFilterInterface::TYPE_RANGE => $range,
54  RequestFilterInterface::TYPE_TERM => $term,
55  RequestFilterInterface::TYPE_WILDCARD => $wildcard,
56  ];
57  $this->conditionManager = $conditionManager;
58  $this->preprocessor = $preprocessor;
59  }
60 
64  public function build(RequestFilterInterface $filter, $conditionType)
65  {
66  return $this->processFilter($filter, $this->isNegation($conditionType));
67  }
68 
76  private function processFilter(RequestFilterInterface $filter, $isNegation)
77  {
78  if ($filter->getType() === RequestFilterInterface::TYPE_BOOL) {
79  $query = $this->processBoolFilter($filter, $isNegation);
80  $query = $this->conditionManager->wrapBrackets($query);
81  } else {
82  if (!isset($this->filters[$filter->getType()])) {
83  throw new \InvalidArgumentException('Unknown filter type ' . $filter->getType());
84  }
85  $query = $this->filters[$filter->getType()]->buildFilter($filter, $isNegation);
86  $query = $this->preprocessor->process($filter, $isNegation, $query);
87  }
88 
89  return $query;
90  }
91 
99  private function processBoolFilter(RequestFilterInterface $filter, $isNegation)
100  {
101  $must = $this->buildFilters($filter->getMust(), Select::SQL_AND, $isNegation);
102  $should = $this->buildFilters($filter->getShould(), Select::SQL_OR, $isNegation);
103  $mustNot = $this->buildFilters(
104  $filter->getMustNot(),
106  !$isNegation
107  );
108 
109  $queries = [
110  $must,
111  $this->conditionManager->wrapBrackets($should),
112  $this->conditionManager->wrapBrackets($mustNot),
113  ];
114 
115  return $this->conditionManager->combineQueries($queries, Select::SQL_AND);
116  }
117 
126  private function buildFilters(array $filters, $unionOperator, $isNegation)
127  {
128  $queries = [];
129  foreach ($filters as $filter) {
130  $filterQuery = $this->processFilter($filter, $isNegation);
131  $queries[] = $this->conditionManager->wrapBrackets($filterQuery);
132  }
133  return $this->conditionManager->combineQueries($queries, $unionOperator);
134  }
135 
142  private function isNegation($conditionType)
143  {
144  return BoolExpression::QUERY_CONDITION_NOT === $conditionType;
145  }
146 }
build(RequestFilterInterface $filter, $conditionType)
Definition: Builder.php:64
__construct(Range $range, Term $term, Wildcard $wildcard, ConditionManager $conditionManager, PreprocessorInterface $preprocessor)
Definition: Builder.php:45
const SQL_AND
Definition: Select.php:77
const SQL_OR
Definition: Select.php:79