Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Mapper.php
Go to the documentation of this file.
1 <?php
7 
9 use Magento\Framework\Search\Request\QueryInterface as RequestQueryInterface;
16 
22 class Mapper
23 {
28  protected $queryBuilder;
29 
34  protected $matchQueryBuilder;
35 
40  protected $filterBuilder;
41 
47  public function __construct(
49  MatchQueryBuilder $matchQueryBuilder,
51  ) {
52  $this->queryBuilder = $queryBuilder;
53  $this->matchQueryBuilder = $matchQueryBuilder;
54  $this->filterBuilder = $filterBuilder;
55  }
56 
65  {
66  $searchQuery = $this->queryBuilder->initQuery($request);
67  $searchQuery['body']['query'] = array_merge(
68  $searchQuery['body']['query'],
69  $this->processQuery(
70  $request->getQuery(),
71  [],
72  BoolQuery::QUERY_CONDITION_MUST
73  )
74  );
75 
76  if (isset($searchQuery['body']['query']['bool']['should'])) {
77  $searchQuery['body']['query']['bool']['minimum_should_match'] = 1;
78  }
79 
80  $searchQuery = $this->queryBuilder->initAggregations($request, $searchQuery);
81  return $searchQuery;
82  }
83 
94  protected function processQuery(
95  RequestQueryInterface $requestQuery,
96  array $selectQuery,
97  $conditionType
98  ) {
99  switch ($requestQuery->getType()) {
100  case RequestQueryInterface::TYPE_MATCH:
102  $selectQuery = $this->matchQueryBuilder->build(
103  $selectQuery,
104  $requestQuery,
105  $conditionType
106  );
107  break;
108  case RequestQueryInterface::TYPE_BOOL:
110  $selectQuery = $this->processBoolQuery($requestQuery, $selectQuery);
111  break;
112  case RequestQueryInterface::TYPE_FILTER:
114  $selectQuery = $this->processFilterQuery($requestQuery, $selectQuery, $conditionType);
115  break;
116  default:
117  throw new \InvalidArgumentException(sprintf('Unknown query type \'%s\'', $requestQuery->getType()));
118  }
119 
120  return $selectQuery;
121  }
122 
131  protected function processBoolQuery(
132  BoolQuery $query,
133  array $selectQuery
134  ) {
135  $selectQuery = $this->processBoolQueryCondition(
136  $query->getMust(),
137  $selectQuery,
138  BoolQuery::QUERY_CONDITION_MUST
139  );
140 
141  $selectQuery = $this->processBoolQueryCondition(
142  $query->getShould(),
143  $selectQuery,
144  BoolQuery::QUERY_CONDITION_SHOULD
145  );
146 
147  $selectQuery = $this->processBoolQueryCondition(
148  $query->getMustNot(),
149  $selectQuery,
150  BoolQuery::QUERY_CONDITION_NOT
151  );
152 
153  return $selectQuery;
154  }
155 
165  protected function processBoolQueryCondition(
166  array $subQueryList,
167  array $selectQuery,
168  $conditionType
169  ) {
170  foreach ($subQueryList as $subQuery) {
171  $selectQuery = $this->processQuery($subQuery, $selectQuery, $conditionType);
172  }
173 
174  return $selectQuery;
175  }
176 
185  private function processFilterQuery(
186  FilterQuery $query,
187  array $selectQuery,
188  $conditionType
189  ) {
190  switch ($query->getReferenceType()) {
191  case FilterQuery::REFERENCE_QUERY:
192  $selectQuery = $this->processQuery($query->getReference(), $selectQuery, $conditionType);
193  break;
194  case FilterQuery::REFERENCE_FILTER:
195  $conditionType = $conditionType === BoolQuery::QUERY_CONDITION_NOT ?
196  MatchQueryBuilder::QUERY_CONDITION_MUST_NOT : $conditionType;
197  $filterQuery = $this->filterBuilder->build($query->getReference(), $conditionType);
198  foreach ($filterQuery['bool'] as $condition => $filter) {
199  $selectQuery['bool'][$condition]= array_merge(
200  isset($selectQuery['bool'][$condition]) ? $selectQuery['bool'][$condition] : [],
201  $filter
202  );
203  }
204  break;
205  }
206 
207  return $selectQuery;
208  }
209 }
processBoolQueryCondition(array $subQueryList, array $selectQuery, $conditionType)
Definition: Mapper.php:165
processBoolQuery(BoolQuery $query, array $selectQuery)
Definition: Mapper.php:131
__construct(QueryBuilder $queryBuilder, MatchQueryBuilder $matchQueryBuilder, FilterBuilder $filterBuilder)
Definition: Mapper.php:47