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,28 +70,32 @@ 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 =>
redis.hgetall(`${prefix}:${id}`).then(values => const idsIndex = `${prefix}_ids`
values == null await asyncMapSettled(redis.smembers(idsIndex), id =>
? redis.srem(idsIndex, id) // entry no longer exists redis.hgetall(`${prefix}:${id}`).then(values =>
: asyncMapSettled(indexes, index => { values == null
const value = values[index] ? redis.srem(idsIndex, id) // entry no longer exists
if (value !== undefined) { : asyncMapSettled(indexes, index => {
return redis.sadd(`${prefix}_${index}:${String(value).toLowerCase()}`, id) const value = values[index]
} if (value !== undefined) {
}) return redis.sadd(`${prefix}_${index}:${String(value).toLowerCase()}`, id)
) }
})
) )
) )
} }