feat(xo-server/collection/Redis): set of all indexes
This commit is contained in:
parent
af2d17b7a5
commit
7941284a1d
@ -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)
|
||||
}
|
||||
})
|
||||
)
|
||||
)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user