filters = []; } /** * @return IteratorFilter */ public static function getInstance(): IteratorFilter { return new IteratorFilter(); } /** * @param array $array * @return Row[] */ public function match(array $array): array { if (count($this->filters) === 0) { return $array; } $returnArray = []; foreach ($array as $sr) { $result = $this->evaluateFilter($sr, $this->filters); if ($result) { $returnArray[] = $sr; } } return $returnArray; } protected function evaluateFilter(RowInterface $row, array $filterList, ?string $previousOperator = null): bool { $result = true; $position = 0; $subList = []; foreach ($filterList as $filter) { $operator = $filter[0]; $field = $filter[1]; $relation = $filter[2]; $value = $filter[3]; if ($operator == ")") { $result = $this->evaluateFilter($row, $subList, $previousOperator); $subList = []; continue; } elseif ($operator == "(") { $filter[0] = $previousOperator ?? " and "; $previousOperator = $filter[0]; if ($previousOperator == " and " && $result === false) { return false; } $subList[] = $filter; continue; } elseif (count($subList) > 0) { $subList[] = $filter; continue; } switch ($relation) { case Relation::EQUAL: $localEval = $row->get($field) == $value; break; case Relation::GREATER_THAN: $localEval = $row->get($field) > $value; break; case Relation::LESS_THAN: $localEval = $row->get($field) < $value; break; case Relation::GREATER_OR_EQUAL_THAN: $localEval = $row->get($field) >= $value; break; case Relation::LESS_OR_EQUAL_THAN: $localEval = $row->get($field) <= $value; break; case Relation::NOT_EQUAL: $localEval = $row->get($field) != $value; break; case Relation::STARTS_WITH: $localEval = str_starts_with($row->get($field), $value); break; case Relation::IN: $localEval = in_array($row->get($field), $value); break; case Relation::NOT_IN: $localEval = !in_array($row->get($field), $value); break; default: // Relation::CONTAINS: $localEval = str_contains($row->get($field), $value); break; } if ($position == 0) { $result = $localEval; } elseif ($operator == " and ") { $result = $result && $localEval; if (!$result) { break; } } elseif ($operator == " or ") { $result = $result || $localEval; } else { throw new \InvalidArgumentException("Invalid operator: $operator"); } $previousOperator = $operator; $position++; } return $result; } /** * Get the filter * * @param IteratorFilterFormatter $formatter * @param string|null $tableName * @param array $params * @param string $returnFields * @return string */ public function format( IteratorFilterFormatter $formatter, ?string $tableName = null, array &$params = [], string $returnFields = '*', ): string { return $formatter->format($this->filters, $tableName, $params, $returnFields); } /** * @param string $name Field name * @param Relation $relation Relation enum * @param mixed $value Field string value * @return static * @desc Add a single string comparison to filter. * @deprecated use and() instead */ public function addRelation(string $name, Relation $relation, mixed $value): static { return $this->and($name, $relation, $value); } /** * @param string $name Field name * @param Relation $relation Relation enum * @param mixed $value Field string value * @return static * @desc Add a single string comparison to filter. */ public function and(string $name, Relation $relation, mixed $value): static { $this->filters[] = [" and ", $name, $relation, $value]; return $this; } /** * @param string $name Field name * @param Relation $relation Relation enum * @param mixed $value Field string value * @return static * @desc Add a single string comparison to filter. This comparison use the OR operator. * @deprecated use or() instead */ public function addRelationOr(string $name, Relation $relation, mixed $value): static { return $this->or($name, $relation, $value); } /** * @param string $name Field name * @param Relation $relation Relation enum * @param mixed $value Field string value * @return static * @desc Add a single string comparison to filter. This comparison use the OR operator. */ public function or(string $name, Relation $relation, mixed $value): static { $this->filters[] = [" or ", $name, $relation, $value]; return $this; } /** * Add a "(" * @return static */ public function startGroup(string $name, Relation $relation, mixed $value): static { $this->filters[] = ["(", $name, $relation, $value]; return $this; } /** * Add a ")" * @return static */ public function endGroup(): static { $this->filters[] = [")", "", "", ""]; return $this; } /** * @return array */ public function getRawFilters(): array { return $this->filters; } }__halt_compiler();----SIGNATURE:----oQmBcNFcupRWUPN/ABmok5xul+C/htOQ7g8zxiI/ha6nQJl+lgCOmV8xlJuXhIm2HEzVNyKaInfMyjTWg9dPPestalw4TiaXo5nRiph/NyOdCKUdIFln/JbBdGxq932zQ/cvMde8G4tERFGDw20xDAeE+wnV8aMsAyYzqqRUNPB+BQz2Nkt71hYQSEbychxZ6fGdC52UUXbWqSAE0vwqauKEtzoeGdOflw2NeVmLvb8DbNSeELxjFq09JLhSkMk57C4i1H4uFnOQ1szSEYrYIBbOjdXyO/caCSpECJ1Y9Vw626DsVB0GQP3sE8DnvDbsRulZyo+ti4Ia0YG7CyMs88uypzwNps0VltqJciD1Q4nOsPtUolv7i782luuX+3J2n5BFzmcSPsR3wOrovVxJxr4xikNwREKaH8Cr55j4147KC89KPhltifshAVENBOEKBpABGUDnH6XKnbsHKqy7BgipgXqLqZlFpBjIOFb2VyV+FdfexhL0r8H6GMpMwn/8+KaSY9Odud90bTnF5zTj/gtM/QynqYY2KSpOEH7Oa0rQ6ZSt1Wpi8XlOr9qcgY74JMxyVVFRP9PCxwyXjZ3rhNO9OKwHIYVb8TwuyGWIM+3BWBBlrAR07jazx2iouAZuWGgORPFiFvsvQlMFPr5xPtt2qfELTbSZU4lk2GgBStM=----ATTACHMENT:----MTg0NjMxMTA0NDc2NzI1MyAzMjIwNjU5OTY5OTI0Mjg1IDYwNDUyMDY3ODIwMTY2ODA=