(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:
Jake Barnby
2026-04-02 04:17:23 +13:00
co-authored by Claude Opus 4.6
parent 4d85ab0dcd
commit 48a01919bc
+15 -2
View File
@@ -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