feat(xo-server/collection/Redis): set of all indexes

This commit is contained in:
Julien Fontanet 2022-06-20 15:44:43 +02:00
parent af2d17b7a5
commit 7941284a1d

View File

@ -18,6 +18,7 @@ import Collection, { ModelAlreadyExists } from '../collection.mjs'
// /////////////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////////
// Data model: // Data model:
// - 'xo::namespaces': set of all available namespaces // - 'xo::namespaces': set of all available namespaces
// - prefix + '::indexes': set containing all indexes;
// - prefix +'_ids': set containing identifier of all models; // - prefix +'_ids': set containing identifier of all models;
// - prefix +'_'+ index +':' + lowerCase(value): set of identifiers // - prefix +'_'+ index +':' + lowerCase(value): set of identifiers
// which have value for the given index. // which have value for the given index.
@ -69,18 +70,23 @@ export default class Redis extends Collection {
::ignoreErrors() ::ignoreErrors()
} }
rebuildIndexes() { async rebuildIndexes() {
const { indexes, prefix, redis } = this const { indexes, prefix, redis } = this
await redis.del(`${prefix}::indexes`)
if (indexes.length === 0) { if (indexes.length === 0) {
return Promise.resolve() return
} }
const idsIndex = `${prefix}_ids` await redis.sadd(`${prefix}::indexes`, indexes)
return asyncMapSettled(indexes, index =>
await asyncMapSettled(indexes, index =>
redis.keys(`${prefix}_${index}:*`).then(keys => keys.length !== 0 && redis.del(keys)) redis.keys(`${prefix}_${index}:*`).then(keys => keys.length !== 0 && redis.del(keys))
).then(() => )
asyncMapSettled(redis.smembers(idsIndex), id =>
const idsIndex = `${prefix}_ids`
await asyncMapSettled(redis.smembers(idsIndex), id =>
redis.hgetall(`${prefix}:${id}`).then(values => redis.hgetall(`${prefix}:${id}`).then(values =>
values == null values == null
? redis.srem(idsIndex, id) // entry no longer exists ? redis.srem(idsIndex, id) // entry no longer exists
@ -92,7 +98,6 @@ export default class Redis extends Collection {
}) })
) )
) )
)
} }
_extract(ids) { _extract(ids) {