/** * @param PatternMatch $patternMatch * * @throws \RuntimeException When an unsupported pattern-match type is provided * * @return string */ protected function getPatternMatchType(PatternMatch $patternMatch) { $type = ''; if ($patternMatch->isExclusive()) { $type .= 'NOT_'; } switch ($patternMatch->getType()) { case PatternMatch::PATTERN_CONTAINS: case PatternMatch::PATTERN_NOT_CONTAINS: $type .= 'CONTAINS'; break; case PatternMatch::PATTERN_STARTS_WITH: case PatternMatch::PATTERN_NOT_STARTS_WITH: $type .= 'STARTS_WITH'; break; case PatternMatch::PATTERN_ENDS_WITH: case PatternMatch::PATTERN_NOT_ENDS_WITH: $type .= 'ENDS_WITH'; break; case PatternMatch::PATTERN_REGEX: case PatternMatch::PATTERN_NOT_REGEX: $type .= 'REGEX'; break; case PatternMatch::PATTERN_EQUALS: case PatternMatch::PATTERN_NOT_EQUALS: $type .= 'EQUALS'; break; default: throw new \RuntimeException(sprintf('Unsupported pattern-match type "%s" found. Please report this bug.', $patternMatch->getType())); } return $type; }
/** * {@inheritdoc} */ public function getPatternMatcher(PatternMatch $patternMatch, $column) { if ($patternMatch->isRegex()) { return $this->getMatchSqlRegex($column, $this->connection->quote($patternMatch->getValue()), $patternMatch->isCaseInsensitive(), $patternMatch->isExclusive()); } if (in_array($patternMatch->getType(), [PatternMatch::PATTERN_EQUALS, PatternMatch::PATTERN_NOT_EQUALS], true)) { $value = $this->connection->quote($patternMatch->getValue()); if ($patternMatch->isCaseInsensitive()) { $column = "LOWER({$column})"; $value = "LOWER({$value})"; } return $column . ($patternMatch->isExclusive() ? ' <>' : ' =') . " {$value}"; } $patternMap = [PatternMatch::PATTERN_STARTS_WITH => '%%%s', PatternMatch::PATTERN_NOT_STARTS_WITH => '%%%s', PatternMatch::PATTERN_CONTAINS => '%%%s%%', PatternMatch::PATTERN_NOT_CONTAINS => '%%%s%%', PatternMatch::PATTERN_ENDS_WITH => '%s%%', PatternMatch::PATTERN_NOT_ENDS_WITH => '%s%%']; $value = addcslashes($patternMatch->getValue(), $this->getLikeEscapeChars()); $value = $this->connection->quote(sprintf($patternMap[$patternMatch->getType()], $value)); $escape = $this->connection->quote('\\'); if ($patternMatch->isCaseInsensitive()) { $column = "LOWER({$column})"; $value = "LOWER({$value})"; } return $column . ($patternMatch->isExclusive() ? ' NOT' : '') . " LIKE {$value} ESCAPE {$escape}"; }
/** * @param PatternMatch $patternMatch * * @throws \RuntimeException When an unsupported pattern-match type is found * * @return string */ private function getPatternMatchOperator(PatternMatch $patternMatch) { $operator = $patternMatch->isCaseInsensitive() ? '~i' : '~'; if ($patternMatch->isExclusive()) { $operator .= '!'; } switch ($patternMatch->getType()) { case PatternMatch::PATTERN_CONTAINS: case PatternMatch::PATTERN_NOT_CONTAINS: $operator .= '*'; break; case PatternMatch::PATTERN_STARTS_WITH: case PatternMatch::PATTERN_NOT_STARTS_WITH: $operator .= '>'; break; case PatternMatch::PATTERN_ENDS_WITH: case PatternMatch::PATTERN_NOT_ENDS_WITH: $operator .= '<'; break; case PatternMatch::PATTERN_REGEX: case PatternMatch::PATTERN_NOT_REGEX: $operator .= '?'; break; case PatternMatch::PATTERN_EQUALS: case PatternMatch::PATTERN_NOT_EQUALS: $operator .= '='; break; default: throw new \RuntimeException(sprintf('Unsupported pattern-match type "%s" found. Please report this bug.', $patternMatch->getType())); } return $operator; }