mirror of
https://github.com/appwrite/appwrite.git
synced 2026-05-26 13:51:13 +00:00
(fix): add static cache for related collection lookups
The findOne query per relationship attribute ran on every getDatabasesDB call. Static cache keyed by database+internal name caches results across requests within the same Swoole worker process. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
4d85ab0dcd
commit
48a01919bc
+15
-2
@@ -785,6 +785,8 @@ Http::setResource('getDatabasesDB', function (Group $pools, Database $dbForProje
|
||||
}
|
||||
|
||||
// Also register related collections from relationship attributes
|
||||
// Use static cache to avoid repeated queries across requests
|
||||
static $relatedCache = [];
|
||||
$attributes = $collection->getAttribute('attributes', []);
|
||||
foreach ($attributes as $attr) {
|
||||
if ($attr->getAttribute('type') !== \Utopia\Query\Schema\ColumnType::Relationship->value) {
|
||||
@@ -796,6 +798,14 @@ Http::setResource('getDatabasesDB', function (Group $pools, Database $dbForProje
|
||||
if ($relatedInternalName === null) {
|
||||
continue;
|
||||
}
|
||||
// Check static cache first
|
||||
$cacheKey = $dbPrefix . ':' . $relatedInternalName;
|
||||
if (isset($relatedCache[$cacheKey])) {
|
||||
[$relKey, $fullKey, $externalId] = $relatedCache[$cacheKey];
|
||||
$metadata->setCollectionId($relKey, $externalId);
|
||||
$metadata->setCollectionId($fullKey, $externalId);
|
||||
continue;
|
||||
}
|
||||
// Extract sequence from internal name (e.g., 'collection_16' → '16')
|
||||
$parts = \explode('_', $relatedInternalName);
|
||||
$relSeq = \end($parts);
|
||||
@@ -813,8 +823,11 @@ Http::setResource('getDatabasesDB', function (Group $pools, Database $dbForProje
|
||||
)
|
||||
);
|
||||
if ($relatedCol !== null && !$relatedCol->isEmpty()) {
|
||||
$metadata->setCollectionId('collection_' . $relSeq, $relatedCol->getId());
|
||||
$metadata->setCollectionId($dbPrefix . '_collection_' . $relSeq, $relatedCol->getId());
|
||||
$relKey = 'collection_' . $relSeq;
|
||||
$fullKey = $dbPrefix . '_collection_' . $relSeq;
|
||||
$metadata->setCollectionId($relKey, $relatedCol->getId());
|
||||
$metadata->setCollectionId($fullKey, $relatedCol->getId());
|
||||
$relatedCache[$cacheKey] = [$relKey, $fullKey, $relatedCol->getId()];
|
||||
}
|
||||
} catch (\Throwable) {
|
||||
// Skip — related collection may not exist yet
|
||||
|
||||
Reference in New Issue
Block a user