From 5b8751d270b83219e9b25518ab9f0d31958ea51f Mon Sep 17 00:00:00 2001 From: Darshan Date: Thu, 17 Jul 2025 18:23:33 +0530 Subject: [PATCH] add: changes to module structure. --- .../Databases/Collections/Documents/Get.php | 10 +++- .../Databases/Collections/Documents/XList.php | 59 ++++++++++++++----- 2 files changed, 53 insertions(+), 16 deletions(-) diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Get.php index 7376fe770a..0542123ee7 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Get.php @@ -87,7 +87,15 @@ class Get extends Action } try { - $document = $dbForProject->getDocument('database_' . $database->getSequence() . '_collection_' . $collection->getSequence(), $documentId, $queries); + $selects = Query::groupByType($queries)['selections'] ?? []; + + if (! empty($selects)) { + // has selects, allow relationship on documents! + $document = $dbForProject->getDocument('database_' . $database->getSequence() . '_collection_' . $collection->getSequence(), $documentId, $queries); + } else { + // has no selects, disable relationship looping on documents! + $document = $dbForProject->skipRelationships(fn () => $dbForProject->getDocument('database_' . $database->getSequence() . '_collection_' . $collection->getSequence(), $documentId, $queries)); + } } catch (QueryException $e) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/XList.php index 2e76942db1..961ca2d5fd 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/XList.php @@ -114,8 +114,21 @@ class XList extends Action $cursor->setValue($cursorDocument); } + + $selectQueries = []; + try { - $documents = $dbForProject->find('database_' . $database->getSequence() . '_collection_' . $collection->getSequence(), $queries); + $selectQueries = Query::groupByType($queries)['selections'] ?? []; + + if (! empty($selectQueries)) { + // has selects, allow relationship on documents! + $documents = $dbForProject->find('database_' . $database->getSequence() . '_collection_' . $collection->getSequence(), $queries); + } else { + // has no selects, disable relationship looping on documents! + /* @type Document[] $documents */ + $documents = $dbForProject->skipRelationships(fn () => $dbForProject->find('database_' . $database->getSequence() . '_collection_' . $collection->getSequence(), $queries)); + } + $total = $dbForProject->count('database_' . $database->getSequence() . '_collection_' . $collection->getSequence(), $queries, APP_LIMIT_COUNT); } catch (OrderException $e) { $documents = $this->isCollectionsAPI() ? 'documents' : 'rows'; @@ -150,24 +163,40 @@ class XList extends Action }, false); // Check if the SELECT query includes $databaseId and $collectionId + $hasWildcard = false; $hasDatabaseId = false; $hasCollectionId = false; - if ($select) { - $hasDatabaseId = \array_reduce($queries, function ($result, $query) { - return $result || ($query->getMethod() === Query::TYPE_SELECT && \in_array('$databaseId', $query->getValues())); - }, false); - $hasCollectionId = \array_reduce($queries, function ($result, $query) { - return $result || ($query->getMethod() === Query::TYPE_SELECT && \in_array('$collectionId', $query->getValues())); - }, false); - } + $hasSelectQueries = !empty($selectQueries); - if ($select) { - foreach ($documents as $document) { - if (!$hasDatabaseId) { - $document->removeAttribute('$databaseId'); + if ($hasSelectQueries) { + foreach ($selectQueries as $query) { + if ($query->getMethod() !== Query::TYPE_SELECT) { + continue; } - if (!$hasCollectionId) { - $document->removeAttribute('$collectionId'); + + $values = $query->getValues(); + if (\in_array('*', $values, true)) { + $hasWildcard = true; + break; + } + + if (\in_array('$databaseId', $values, true)) { + $hasDatabaseId = true; + } + + if (\in_array('$collectionId', $values, true)) { + $hasCollectionId = true; + } + } + + if (!$hasWildcard) { + foreach ($documents as $document) { + if (!$hasDatabaseId) { + $document->removeAttribute('$databaseId'); + } + if (!$hasCollectionId) { + $document->removeAttribute('$collectionId'); + } } } }