From 7941284a1dddf5c1dc67466f27d2253099318fde Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Mon, 20 Jun 2022 15:44:43 +0200 Subject: [PATCH] feat(xo-server/collection/Redis): set of all indexes --- packages/xo-server/src/collection/redis.mjs | 37 ++++++++++++--------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/packages/xo-server/src/collection/redis.mjs b/packages/xo-server/src/collection/redis.mjs index 2a23ed60c..846b85509 100644 --- a/packages/xo-server/src/collection/redis.mjs +++ b/packages/xo-server/src/collection/redis.mjs @@ -18,6 +18,7 @@ import Collection, { ModelAlreadyExists } from '../collection.mjs' // /////////////////////////////////////////////////////////////////// // Data model: // - 'xo::namespaces': set of all available namespaces +// - prefix + '::indexes': set containing all indexes; // - prefix +'_ids': set containing identifier of all models; // - prefix +'_'+ index +':' + lowerCase(value): set of identifiers // which have value for the given index. @@ -69,28 +70,32 @@ export default class Redis extends Collection { ::ignoreErrors() } - rebuildIndexes() { + async rebuildIndexes() { const { indexes, prefix, redis } = this + await redis.del(`${prefix}::indexes`) + if (indexes.length === 0) { - return Promise.resolve() + return } - const idsIndex = `${prefix}_ids` - return asyncMapSettled(indexes, index => + await redis.sadd(`${prefix}::indexes`, indexes) + + await asyncMapSettled(indexes, index => redis.keys(`${prefix}_${index}:*`).then(keys => keys.length !== 0 && redis.del(keys)) - ).then(() => - asyncMapSettled(redis.smembers(idsIndex), id => - redis.hgetall(`${prefix}:${id}`).then(values => - values == null - ? redis.srem(idsIndex, id) // entry no longer exists - : asyncMapSettled(indexes, index => { - const value = values[index] - if (value !== undefined) { - return redis.sadd(`${prefix}_${index}:${String(value).toLowerCase()}`, id) - } - }) - ) + ) + + const idsIndex = `${prefix}_ids` + await asyncMapSettled(redis.smembers(idsIndex), id => + redis.hgetall(`${prefix}:${id}`).then(values => + values == null + ? redis.srem(idsIndex, id) // entry no longer exists + : asyncMapSettled(indexes, index => { + const value = values[index] + if (value !== undefined) { + return redis.sadd(`${prefix}_${index}:${String(value).toLowerCase()}`, id) + } + }) ) ) }