Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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