Skip to content

Commit 5e49f32

Browse files
authored
Merge pull request #816 from utopia-php/feat-contains-all
Add contains all
2 parents a4398c1 + c9222c8 commit 5e49f32

File tree

11 files changed

+539
-149
lines changed

11 files changed

+539
-149
lines changed

src/Database/Adapter/MariaDB.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1618,7 +1618,14 @@ protected function getSQLCondition(Query $query, array &$binds): string
16181618
case Query::TYPE_IS_NOT_NULL:
16191619

16201620
return "{$alias}.{$attribute} {$this->getSQLOperator($query->getMethod())}";
1621+
case Query::TYPE_CONTAINS_ALL:
1622+
if ($query->onArray()) {
1623+
$binds[":{$placeholder}_0"] = json_encode($query->getValues());
1624+
return "JSON_CONTAINS({$alias}.{$attribute}, :{$placeholder}_0)";
1625+
}
1626+
// no break
16211627
case Query::TYPE_CONTAINS:
1628+
case Query::TYPE_CONTAINS_ANY:
16221629
case Query::TYPE_NOT_CONTAINS:
16231630
if ($this->getSupportForJSONOverlaps() && $query->onArray()) {
16241631
$binds[":{$placeholder}_0"] = json_encode($query->getValues());
@@ -1642,7 +1649,7 @@ protected function getSQLCondition(Query $query, array &$binds): string
16421649
Query::TYPE_NOT_STARTS_WITH => $this->escapeWildcards($value) . '%',
16431650
Query::TYPE_ENDS_WITH => '%' . $this->escapeWildcards($value),
16441651
Query::TYPE_NOT_ENDS_WITH => '%' . $this->escapeWildcards($value),
1645-
Query::TYPE_CONTAINS => ($query->onArray()) ? \json_encode($value) : '%' . $this->escapeWildcards($value) . '%',
1652+
Query::TYPE_CONTAINS, Query::TYPE_CONTAINS_ANY => ($query->onArray()) ? \json_encode($value) : '%' . $this->escapeWildcards($value) . '%',
16461653
Query::TYPE_NOT_CONTAINS => ($query->onArray()) ? \json_encode($value) : '%' . $this->escapeWildcards($value) . '%',
16471654
default => $value
16481655
};

src/Database/Adapter/Mongo.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2673,7 +2673,7 @@ protected function buildFilter(Query $query): array
26732673
};
26742674

26752675
$filter = [];
2676-
if ($query->isObjectAttribute() && !\str_contains($attribute, '.') && in_array($query->getMethod(), [Query::TYPE_EQUAL, Query::TYPE_CONTAINS, Query::TYPE_NOT_CONTAINS, Query::TYPE_NOT_EQUAL])) {
2676+
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])) {
26772677
$this->handleObjectFilters($query, $filter);
26782678
return $filter;
26792679
}
@@ -2682,8 +2682,10 @@ protected function buildFilter(Query $query): array
26822682
$filter[$attribute]['$in'] = $value;
26832683
} elseif ($operator == '$ne' && \is_array($value)) {
26842684
$filter[$attribute]['$nin'] = $value;
2685+
} elseif ($operator == '$all') {
2686+
$filter[$attribute]['$all'] = $query->getValues();
26852687
} elseif ($operator == '$in') {
2686-
if ($query->getMethod() === Query::TYPE_CONTAINS && !$query->onArray()) {
2688+
if (in_array($query->getMethod(), [Query::TYPE_CONTAINS, Query::TYPE_CONTAINS_ANY]) && !$query->onArray()) {
26872689
// contains support array values
26882690
if (is_array($value)) {
26892691
$filter['$or'] = array_map(function ($val) use ($attribute) {
@@ -2760,6 +2762,8 @@ private function handleObjectFilters(Query $query, array &$filter): void
27602762
switch ($query->getMethod()) {
27612763

27622764
case Query::TYPE_CONTAINS:
2765+
case Query::TYPE_CONTAINS_ANY:
2766+
case Query::TYPE_CONTAINS_ALL:
27632767
case Query::TYPE_NOT_CONTAINS: {
27642768
$arrayValue = \is_array($queryValue) ? $queryValue : [$queryValue];
27652769
$operator = $isNot ? '$nin' : '$in';
@@ -2844,6 +2848,8 @@ protected function getQueryOperator(string $operator): string
28442848
Query::TYPE_GREATER => '$gt',
28452849
Query::TYPE_GREATER_EQUAL => '$gte',
28462850
Query::TYPE_CONTAINS => '$in',
2851+
Query::TYPE_CONTAINS_ANY => '$in',
2852+
Query::TYPE_CONTAINS_ALL => '$all',
28472853
Query::TYPE_NOT_CONTAINS => 'notContains',
28482854
Query::TYPE_SEARCH => '$search',
28492855
Query::TYPE_NOT_SEARCH => '$search',

src/Database/Adapter/Postgres.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1712,6 +1712,8 @@ protected function handleObjectQueries(Query $query, array &$binds, string $attr
17121712
}
17131713

17141714
case Query::TYPE_CONTAINS:
1715+
case Query::TYPE_CONTAINS_ANY:
1716+
case Query::TYPE_CONTAINS_ALL:
17151717
case Query::TYPE_NOT_CONTAINS: {
17161718
$isNot = $query->getMethod() === Query::TYPE_NOT_CONTAINS;
17171719
$conditions = [];
@@ -1812,7 +1814,15 @@ protected function getSQLCondition(Query $query, array &$binds): string
18121814
case Query::TYPE_IS_NOT_NULL:
18131815
return "{$alias}.{$attribute} {$this->getSQLOperator($query->getMethod())}";
18141816

1817+
case Query::TYPE_CONTAINS_ALL:
1818+
if ($query->onArray()) {
1819+
// @> checks the array contains ALL specified values
1820+
$binds[":{$placeholder}_0"] = \json_encode($query->getValues());
1821+
return "{$alias}.{$attribute} @> :{$placeholder}_0::jsonb";
1822+
}
1823+
// no break
18151824
case Query::TYPE_CONTAINS:
1825+
case Query::TYPE_CONTAINS_ANY:
18161826
case Query::TYPE_NOT_CONTAINS:
18171827
if ($query->onArray()) {
18181828
$operator = '@>';
@@ -1834,7 +1844,7 @@ protected function getSQLCondition(Query $query, array &$binds): string
18341844
Query::TYPE_NOT_STARTS_WITH => $this->escapeWildcards($value) . '%',
18351845
Query::TYPE_ENDS_WITH => '%' . $this->escapeWildcards($value),
18361846
Query::TYPE_NOT_ENDS_WITH => '%' . $this->escapeWildcards($value),
1837-
Query::TYPE_CONTAINS => ($query->onArray()) ? \json_encode($value) : '%' . $this->escapeWildcards($value) . '%',
1847+
Query::TYPE_CONTAINS, Query::TYPE_CONTAINS_ANY => ($query->onArray()) ? \json_encode($value) : '%' . $this->escapeWildcards($value) . '%',
18381848
Query::TYPE_NOT_CONTAINS => ($query->onArray()) ? \json_encode($value) : '%' . $this->escapeWildcards($value) . '%',
18391849
default => $value
18401850
};

src/Database/Adapter/SQL.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1801,6 +1801,8 @@ protected function getSQLOperator(string $method): string
18011801
case Query::TYPE_STARTS_WITH:
18021802
case Query::TYPE_ENDS_WITH:
18031803
case Query::TYPE_CONTAINS:
1804+
case Query::TYPE_CONTAINS_ANY:
1805+
case Query::TYPE_CONTAINS_ALL:
18041806
case Query::TYPE_NOT_STARTS_WITH:
18051807
case Query::TYPE_NOT_ENDS_WITH:
18061808
case Query::TYPE_NOT_CONTAINS:

0 commit comments

Comments
 (0)