Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion src/Database/Adapter/MariaDB.php
Original file line number Diff line number Diff line change
Expand Up @@ -1618,7 +1618,14 @@ protected function getSQLCondition(Query $query, array &$binds): string
case Query::TYPE_IS_NOT_NULL:

return "{$alias}.{$attribute} {$this->getSQLOperator($query->getMethod())}";
case Query::TYPE_CONTAINS_ALL:
if ($query->onArray()) {
$binds[":{$placeholder}_0"] = json_encode($query->getValues());
return "JSON_CONTAINS({$alias}.{$attribute}, :{$placeholder}_0)";
}
// no break
case Query::TYPE_CONTAINS:
case Query::TYPE_CONTAINS_ANY:
case Query::TYPE_NOT_CONTAINS:
if ($this->getSupportForJSONOverlaps() && $query->onArray()) {
$binds[":{$placeholder}_0"] = json_encode($query->getValues());
Expand All @@ -1642,7 +1649,7 @@ protected function getSQLCondition(Query $query, array &$binds): string
Query::TYPE_NOT_STARTS_WITH => $this->escapeWildcards($value) . '%',
Query::TYPE_ENDS_WITH => '%' . $this->escapeWildcards($value),
Query::TYPE_NOT_ENDS_WITH => '%' . $this->escapeWildcards($value),
Query::TYPE_CONTAINS => ($query->onArray()) ? \json_encode($value) : '%' . $this->escapeWildcards($value) . '%',
Query::TYPE_CONTAINS, Query::TYPE_CONTAINS_ANY => ($query->onArray()) ? \json_encode($value) : '%' . $this->escapeWildcards($value) . '%',
Query::TYPE_NOT_CONTAINS => ($query->onArray()) ? \json_encode($value) : '%' . $this->escapeWildcards($value) . '%',
default => $value
};
Expand Down
10 changes: 8 additions & 2 deletions src/Database/Adapter/Mongo.php
Original file line number Diff line number Diff line change
Expand Up @@ -2673,7 +2673,7 @@ protected function buildFilter(Query $query): array
};

$filter = [];
if ($query->isObjectAttribute() && !\str_contains($attribute, '.') && in_array($query->getMethod(), [Query::TYPE_EQUAL, Query::TYPE_CONTAINS, Query::TYPE_NOT_CONTAINS, Query::TYPE_NOT_EQUAL])) {
if ($query->isObjectAttribute() && !\str_contains($attribute, '.') && in_array($query->getMethod(), [Query::TYPE_EQUAL, Query::TYPE_CONTAINS, Query::TYPE_CONTAINS_ANY, Query::TYPE_CONTAINS_ALL, Query::TYPE_NOT_CONTAINS, Query::TYPE_NOT_EQUAL])) {
$this->handleObjectFilters($query, $filter);
return $filter;
}
Expand All @@ -2682,8 +2682,10 @@ protected function buildFilter(Query $query): array
$filter[$attribute]['$in'] = $value;
} elseif ($operator == '$ne' && \is_array($value)) {
$filter[$attribute]['$nin'] = $value;
} elseif ($operator == '$all') {
$filter[$attribute]['$all'] = $query->getValues();
} elseif ($operator == '$in') {
if ($query->getMethod() === Query::TYPE_CONTAINS && !$query->onArray()) {
if (in_array($query->getMethod(), [Query::TYPE_CONTAINS, Query::TYPE_CONTAINS_ANY]) && !$query->onArray()) {
// contains support array values
if (is_array($value)) {
$filter['$or'] = array_map(function ($val) use ($attribute) {
Expand Down Expand Up @@ -2760,6 +2762,8 @@ private function handleObjectFilters(Query $query, array &$filter): void
switch ($query->getMethod()) {

case Query::TYPE_CONTAINS:
case Query::TYPE_CONTAINS_ANY:
case Query::TYPE_CONTAINS_ALL:
case Query::TYPE_NOT_CONTAINS: {
$arrayValue = \is_array($queryValue) ? $queryValue : [$queryValue];
$operator = $isNot ? '$nin' : '$in';
Expand Down Expand Up @@ -2844,6 +2848,8 @@ protected function getQueryOperator(string $operator): string
Query::TYPE_GREATER => '$gt',
Query::TYPE_GREATER_EQUAL => '$gte',
Query::TYPE_CONTAINS => '$in',
Query::TYPE_CONTAINS_ANY => '$in',
Query::TYPE_CONTAINS_ALL => '$all',
Query::TYPE_NOT_CONTAINS => 'notContains',
Query::TYPE_SEARCH => '$search',
Query::TYPE_NOT_SEARCH => '$search',
Expand Down
12 changes: 11 additions & 1 deletion src/Database/Adapter/Postgres.php
Original file line number Diff line number Diff line change
Expand Up @@ -1712,6 +1712,8 @@ protected function handleObjectQueries(Query $query, array &$binds, string $attr
}

case Query::TYPE_CONTAINS:
case Query::TYPE_CONTAINS_ANY:
case Query::TYPE_CONTAINS_ALL:
case Query::TYPE_NOT_CONTAINS: {
$isNot = $query->getMethod() === Query::TYPE_NOT_CONTAINS;
$conditions = [];
Expand Down Expand Up @@ -1812,7 +1814,15 @@ protected function getSQLCondition(Query $query, array &$binds): string
case Query::TYPE_IS_NOT_NULL:
return "{$alias}.{$attribute} {$this->getSQLOperator($query->getMethod())}";

case Query::TYPE_CONTAINS_ALL:
if ($query->onArray()) {
// @> checks the array contains ALL specified values
$binds[":{$placeholder}_0"] = \json_encode($query->getValues());
return "{$alias}.{$attribute} @> :{$placeholder}_0::jsonb";
}
// no break
case Query::TYPE_CONTAINS:
case Query::TYPE_CONTAINS_ANY:
case Query::TYPE_NOT_CONTAINS:
if ($query->onArray()) {
$operator = '@>';
Expand All @@ -1834,7 +1844,7 @@ protected function getSQLCondition(Query $query, array &$binds): string
Query::TYPE_NOT_STARTS_WITH => $this->escapeWildcards($value) . '%',
Query::TYPE_ENDS_WITH => '%' . $this->escapeWildcards($value),
Query::TYPE_NOT_ENDS_WITH => '%' . $this->escapeWildcards($value),
Query::TYPE_CONTAINS => ($query->onArray()) ? \json_encode($value) : '%' . $this->escapeWildcards($value) . '%',
Query::TYPE_CONTAINS, Query::TYPE_CONTAINS_ANY => ($query->onArray()) ? \json_encode($value) : '%' . $this->escapeWildcards($value) . '%',
Query::TYPE_NOT_CONTAINS => ($query->onArray()) ? \json_encode($value) : '%' . $this->escapeWildcards($value) . '%',
default => $value
};
Expand Down
2 changes: 2 additions & 0 deletions src/Database/Adapter/SQL.php
Original file line number Diff line number Diff line change
Expand Up @@ -1801,6 +1801,8 @@ protected function getSQLOperator(string $method): string
case Query::TYPE_STARTS_WITH:
case Query::TYPE_ENDS_WITH:
case Query::TYPE_CONTAINS:
case Query::TYPE_CONTAINS_ANY:
case Query::TYPE_CONTAINS_ALL:
case Query::TYPE_NOT_STARTS_WITH:
case Query::TYPE_NOT_ENDS_WITH:
case Query::TYPE_NOT_CONTAINS:
Expand Down
Loading