27 private $mappedQueries;
32 private $mappedFilters;
37 private $aggregationStatus;
44 public function __construct(AggregationStatus $aggregationStatus)
46 $this->aggregationStatus = $aggregationStatus;
55 public function clean(array $requestData)
60 $this->cleanAggregations();
66 new Phrase(
"The request query and filters aren't set. Verify the query and filters and try again.")
83 private function cleanQuery($queryName)
85 if (!isset($this->requestData[
'queries'][$queryName])) {
86 throw new \Exception(
'Query ' . $queryName .
' does not exist');
87 }
elseif (in_array($queryName, $this->mappedQueries)) {
88 throw new StateException(
89 new Phrase(
'A cycle was found. The "%1" query is already used in the request hierarchy.', [$queryName])
92 $this->mappedQueries[] = $queryName;
93 $query = $this->requestData[
'queries'][$queryName];
96 $queryReference = $this->processQueryReference(
$query[
'queryReference']);
97 if (empty($queryReference)) {
98 unset($this->requestData[
'queries'][$queryName]);
100 $this->requestData[
'queries'][$queryName][
'queryReference'] = array_values($queryReference);
104 if (!array_key_exists(
'is_bind',
$query)) {
105 unset($this->requestData[
'queries'][$queryName]);
109 if (isset(
$query[
'queryReference'][0])) {
110 $fQueryName =
$query[
'queryReference'][0][
'ref'];
111 $this->cleanQuery($fQueryName);
112 if (!isset($this->requestData[
'queries'][$fQueryName])) {
113 unset($this->requestData[
'queries'][$queryName]);
116 $filterName =
$query[
'filterReference'][0][
'ref'];
117 $this->cleanFilter($filterName);
118 if (!isset($this->requestData[
'filters'][$filterName])) {
119 unset($this->requestData[
'queries'][$queryName]);
122 throw new \Exception(
'Reference is not provided');
126 throw new \InvalidArgumentException(
'Invalid query type');
135 private function cleanAggregations()
137 if (!$this->aggregationStatus->isEnabled()) {
138 $this->requestData[
'aggregations'] = [];
140 if (array_key_exists(
'aggregations', $this->requestData) && is_array($this->requestData[
'aggregations'])) {
141 foreach ($this->requestData[
'aggregations'] as $aggregationName => $aggregationValue) {
142 switch ($aggregationValue[
'type']) {
143 case 'dynamicBucket':
144 if (is_string($aggregationValue[
'method'])
145 && preg_match(
'/^\$(.+)\$$/si', $aggregationValue[
'method'])
147 unset($this->requestData[
'aggregations'][$aggregationName]);
164 private function cleanFilter($filterName)
166 if (!isset($this->requestData[
'filters'][$filterName])) {
167 throw new \Exception(
'Filter ' . $filterName .
' does not exist');
168 }
elseif (in_array($filterName, $this->mappedFilters)) {
169 throw new StateException(
171 'A cycle was found. The "%1" filter is already used in the request hierarchy.',
176 $this->mappedFilters[] = $filterName;
177 $filter = $this->requestData[
'filters'][$filterName];
178 switch ($filter[
'type']) {
181 if (!array_key_exists(
'is_bind', $filter)) {
182 unset($this->requestData[
'filters'][$filterName]);
186 $keys = [
'from',
'to'];
187 foreach ($keys as $key) {
188 if (isset($filter[$key]) && preg_match(
'/^\$(.+)\$$/si', $filter[$key])) {
189 unset($this->requestData[
'filters'][$filterName][$key]);
192 $filterKeys = array_keys($this->requestData[
'filters'][$filterName]);
193 if (count(array_diff($keys, $filterKeys)) == count($keys)) {
194 unset($this->requestData[
'filters'][$filterName]);
198 $filterReference = $this->processFilterReference($filter[
'filterReference']);
199 if (empty($filterReference)) {
200 unset($this->requestData[
'filters'][$filterName]);
202 $this->requestData[
'filters'][$filterName][
'filterReference'] = array_values($filterReference);
206 throw new \InvalidArgumentException(
'Invalid filter type');
216 private function processQueryReference($queryReference)
218 foreach ($queryReference as $key =>
$value) {
219 $this->cleanQuery(
$value[
'ref']);
220 if (!isset($this->requestData[
'queries'][
$value[
'ref']])) {
221 unset($queryReference[$key]);
224 return $queryReference;
233 private function processFilterReference($filterReference)
235 foreach ($filterReference as $key =>
$value) {
236 $this->cleanFilter(
$value[
'ref']);
237 if (!isset($this->requestData[
'filters'][
$value[
'ref']])) {
238 unset($filterReference[$key]);
241 return $filterReference;
249 private function clear()
251 $this->mappedQueries = [];
252 $this->mappedFilters = [];
253 $this->requestData = [];
elseif(isset( $params[ 'redirect_parent']))
clean(array $requestData)
__construct(AggregationStatus $aggregationStatus)