Skip to content

Commit e2248ed

Browse files
authored
Merge pull request #769 from utopia-php/count-with-find
Throw Auth in count and Sum methods - Remove order queries too
2 parents 14250d3 + b5e3d1d commit e2248ed

File tree

3 files changed

+19
-40
lines changed

3 files changed

+19
-40
lines changed

src/Database/Adapter/SQL.php

Lines changed: 2 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2963,7 +2963,6 @@ protected function convertArrayToWKT(array $geometry): string
29632963
*/
29642964
public function find(Document $collection, array $queries = [], ?int $limit = 25, ?int $offset = null, array $orderAttributes = [], array $orderTypes = [], array $cursor = [], string $cursorDirection = Database::CURSOR_AFTER, string $forPermission = Database::PERMISSION_READ): array
29652965
{
2966-
$attributes = $collection->getAttribute('attributes', []);
29672966
$collection = $collection->getId();
29682967
$name = $this->filter($collection);
29692968
$roles = $this->authorization->getRoles();
@@ -3180,7 +3179,6 @@ public function find(Document $collection, array $queries = [], ?int $limit = 25
31803179
*/
31813180
public function count(Document $collection, array $queries = [], ?int $max = null): int
31823181
{
3183-
$attributes = $collection->getAttribute("attributes", []);
31843182
$collection = $collection->getId();
31853183
$name = $this->filter($collection);
31863184
$roles = $this->authorization->getRoles();
@@ -3196,13 +3194,9 @@ public function count(Document $collection, array $queries = [], ?int $max = nul
31963194

31973195
$queries = array_map(fn ($query) => clone $query, $queries);
31983196

3199-
// Extract vector queries (used for ORDER BY) and keep non-vector for WHERE
3200-
$vectorQueries = [];
32013197
$otherQueries = [];
32023198
foreach ($queries as $query) {
3203-
if (in_array($query->getMethod(), Query::VECTOR_TYPES)) {
3204-
$vectorQueries[] = $query;
3205-
} else {
3199+
if (!in_array($query->getMethod(), Query::VECTOR_TYPES)) {
32063200
$otherQueries[] = $query;
32073201
}
32083202
}
@@ -3225,22 +3219,11 @@ public function count(Document $collection, array $queries = [], ?int $max = nul
32253219
? 'WHERE ' . \implode(' AND ', $where)
32263220
: '';
32273221

3228-
// Add vector distance calculations to ORDER BY (similarity-aware LIMIT)
3229-
$vectorOrders = [];
3230-
foreach ($vectorQueries as $query) {
3231-
$vectorOrder = $this->getVectorDistanceOrder($query, $binds, $alias);
3232-
if ($vectorOrder) {
3233-
$vectorOrders[] = $vectorOrder;
3234-
}
3235-
}
3236-
$sqlOrder = !empty($vectorOrders) ? 'ORDER BY ' . implode(', ', $vectorOrders) : '';
3237-
32383222
$sql = "
32393223
SELECT COUNT(1) as sum FROM (
32403224
SELECT 1
32413225
FROM {$this->getSQLTable($name)} AS {$this->quote($alias)}
32423226
{$sqlWhere}
3243-
{$sqlOrder}
32443227
{$limit}
32453228
) table_count
32463229
";
@@ -3277,7 +3260,6 @@ public function count(Document $collection, array $queries = [], ?int $max = nul
32773260
*/
32783261
public function sum(Document $collection, string $attribute, array $queries = [], ?int $max = null): int|float
32793262
{
3280-
$collectionAttributes = $collection->getAttribute("attributes", []);
32813263
$collection = $collection->getId();
32823264
$name = $this->filter($collection);
32833265
$attribute = $this->filter($attribute);
@@ -3294,13 +3276,9 @@ public function sum(Document $collection, string $attribute, array $queries = []
32943276

32953277
$queries = array_map(fn ($query) => clone $query, $queries);
32963278

3297-
// Extract vector queries (used for ORDER BY) and keep non-vector for WHERE
3298-
$vectorQueries = [];
32993279
$otherQueries = [];
33003280
foreach ($queries as $query) {
3301-
if (in_array($query->getMethod(), Query::VECTOR_TYPES)) {
3302-
$vectorQueries[] = $query;
3303-
} else {
3281+
if (!in_array($query->getMethod(), Query::VECTOR_TYPES)) {
33043282
$otherQueries[] = $query;
33053283
}
33063284
}
@@ -3323,22 +3301,11 @@ public function sum(Document $collection, string $attribute, array $queries = []
33233301
? 'WHERE ' . \implode(' AND ', $where)
33243302
: '';
33253303

3326-
// Add vector distance calculations to ORDER BY (similarity-aware LIMIT)
3327-
$vectorOrders = [];
3328-
foreach ($vectorQueries as $query) {
3329-
$vectorOrder = $this->getVectorDistanceOrder($query, $binds, $alias);
3330-
if ($vectorOrder) {
3331-
$vectorOrders[] = $vectorOrder;
3332-
}
3333-
}
3334-
$sqlOrder = !empty($vectorOrders) ? 'ORDER BY ' . implode(', ', $vectorOrders) : '';
3335-
33363304
$sql = "
33373305
SELECT SUM({$this->quote($attribute)}) as sum FROM (
33383306
SELECT {$this->quote($attribute)}
33393307
FROM {$this->getSQLTable($name)} AS {$this->quote($alias)}
33403308
{$sqlWhere}
3341-
{$sqlOrder}
33423309
{$limit}
33433310
) table_count
33443311
";

src/Database/Database.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7729,7 +7729,6 @@ public function find(string $collection, array $queries = [], string $forPermiss
77297729
$documentSecurity = $collection->getAttribute('documentSecurity', false);
77307730
$skipAuth = $this->authorization->isValid(new Input($forPermission, $collection->getPermissionsByType($forPermission)));
77317731

7732-
77337732
if (!$skipAuth && !$documentSecurity && $collection->getId() !== self::METADATA) {
77347733
throw new AuthorizationException($this->authorization->getDescription());
77357734
}
@@ -7963,7 +7962,13 @@ public function count(string $collection, array $queries = [], ?int $max = null)
79637962
}
79647963
}
79657964

7965+
$documentSecurity = $collection->getAttribute('documentSecurity', false);
79667966
$skipAuth = $this->authorization->isValid(new Input(self::PERMISSION_READ, $collection->getRead()));
7967+
7968+
if (!$skipAuth && !$documentSecurity && $collection->getId() !== self::METADATA) {
7969+
throw new AuthorizationException($this->authorization->getDescription());
7970+
}
7971+
79677972
$relationships = \array_filter(
79687973
$collection->getAttribute('attributes', []),
79697974
fn (Document $attribute) => $attribute->getAttribute('type') === self::VAR_RELATIONSHIP
@@ -8025,8 +8030,13 @@ public function sum(string $collection, string $attribute, array $queries = [],
80258030
}
80268031
}
80278032

8033+
$documentSecurity = $collection->getAttribute('documentSecurity', false);
80288034
$skipAuth = $this->authorization->isValid(new Input(self::PERMISSION_READ, $collection->getRead()));
80298035

8036+
if (!$skipAuth && !$documentSecurity && $collection->getId() !== self::METADATA) {
8037+
throw new AuthorizationException($this->authorization->getDescription());
8038+
}
8039+
80308040
$relationships = \array_filter(
80318041
$collection->getAttribute('attributes', []),
80328042
fn (Document $attribute) => $attribute->getAttribute('type') === self::VAR_RELATIONSHIP

tests/e2e/Adapter/Scopes/PermissionTests.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -460,10 +460,12 @@ public function testCollectionPermissionsCountThrowsException(array $data): void
460460
/** @var Database $database */
461461
$database = $this->getDatabase();
462462

463-
$count = $database->count(
464-
$collection->getId()
465-
);
466-
$this->assertEmpty($count);
463+
try {
464+
$database->count($collection->getId());
465+
$this->fail('Failed to throw exception');
466+
} catch (\Throwable $th) {
467+
$this->assertInstanceOf(AuthorizationException::class, $th);
468+
}
467469
}
468470

469471
/**

0 commit comments

Comments
 (0)