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:
// - '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)
}
})
)
)
}