Merge pull request #4020 from mikiher/invalidate-count-cache-on-entity-update

Invalidate count cache on entity update
This commit is contained in:
advplyr 2025-02-23 15:21:36 -06:00 committed by GitHub
commit a864c6bcc6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 44 additions and 35 deletions

View File

@ -344,22 +344,28 @@ module.exports = {
countCache.clear() countCache.clear()
}, },
async findAndCountAll(findOptions, limit, offset) { async findAndCountAll(findOptions, limit, offset, useCountCache) {
const findOptionsKey = stringifySequelizeQuery(findOptions) const model = Database.bookModel
Logger.debug(`[LibraryItemsBookFilters] findOptionsKey: ${findOptionsKey}`) if (useCountCache) {
const countCacheKey = stringifySequelizeQuery(findOptions)
Logger.debug(`[LibraryItemsBookFilters] countCacheKey: ${countCacheKey}`)
if (!countCache.has(countCacheKey)) {
const count = await model.count(findOptions)
countCache.set(countCacheKey, count)
}
findOptions.limit = limit || null findOptions.limit = limit || null
findOptions.offset = offset findOptions.offset = offset
if (countCache.has(findOptionsKey)) { const rows = await model.findAll(findOptions)
const rows = await Database.bookModel.findAll(findOptions)
return { rows, count: countCache.get(findOptionsKey) } return { rows, count: countCache.get(countCacheKey) }
} else {
const result = await Database.bookModel.findAndCountAll(findOptions)
countCache.set(findOptionsKey, result.count)
return result
} }
findOptions.limit = limit || null
findOptions.offset = offset
return await model.findAndCountAll(findOptions)
}, },
/** /**
@ -434,19 +440,17 @@ module.exports = {
const libraryItemIncludes = [] const libraryItemIncludes = []
const bookIncludes = [] const bookIncludes = []
if (includeRSSFeed) {
if (filterGroup === 'feed-open' || includeRSSFeed) {
const rssFeedRequired = filterGroup === 'feed-open'
libraryItemIncludes.push({ libraryItemIncludes.push({
model: Database.feedModel, model: Database.feedModel,
required: filterGroup === 'feed-open', required: rssFeedRequired,
separate: true separate: !rssFeedRequired
}) })
} }
if (filterGroup === 'feed-open' && !includeRSSFeed) {
libraryItemIncludes.push({ if (filterGroup === 'share-open') {
model: Database.feedModel,
required: true
})
} else if (filterGroup === 'share-open') {
bookIncludes.push({ bookIncludes.push({
model: Database.mediaItemShareModel, model: Database.mediaItemShareModel,
required: true required: true
@ -608,7 +612,7 @@ module.exports = {
} }
const findAndCountAll = process.env.QUERY_PROFILING ? profile(this.findAndCountAll) : this.findAndCountAll const findAndCountAll = process.env.QUERY_PROFILING ? profile(this.findAndCountAll) : this.findAndCountAll
const { rows: books, count } = await findAndCountAll(findOptions, limit, offset) const { rows: books, count } = await findAndCountAll(findOptions, limit, offset, !filterGroup)
const libraryItems = books.map((bookExpanded) => { const libraryItems = books.map((bookExpanded) => {
const libraryItem = bookExpanded.libraryItem const libraryItem = bookExpanded.libraryItem

View File

@ -105,11 +105,13 @@ module.exports = {
countCache.clear() countCache.clear()
}, },
async findAndCountAll(findOptions, model, limit, offset) { async findAndCountAll(findOptions, model, limit, offset, useCountCache) {
const cacheKey = stringifySequelizeQuery(findOptions) if (useCountCache) {
if (!countCache.has(cacheKey)) { const countCacheKey = stringifySequelizeQuery(findOptions)
Logger.debug(`[LibraryItemsPodcastFilters] countCacheKey: ${countCacheKey}`)
if (!countCache.has(countCacheKey)) {
const count = await model.count(findOptions) const count = await model.count(findOptions)
countCache.set(cacheKey, count) countCache.set(countCacheKey, count)
} }
findOptions.limit = limit || null findOptions.limit = limit || null
@ -117,10 +119,13 @@ module.exports = {
const rows = await model.findAll(findOptions) const rows = await model.findAll(findOptions)
return { return { rows, count: countCache.get(countCacheKey) }
rows,
count: countCache.get(cacheKey)
} }
findOptions.limit = limit || null
findOptions.offset = offset
return await model.findAndCountAll(findOptions)
}, },
/** /**
@ -199,7 +204,7 @@ module.exports = {
const findAndCountAll = process.env.QUERY_PROFILING ? profile(this.findAndCountAll) : this.findAndCountAll const findAndCountAll = process.env.QUERY_PROFILING ? profile(this.findAndCountAll) : this.findAndCountAll
const { rows: podcasts, count } = await findAndCountAll(findOptions, Database.podcastModel, limit, offset) const { rows: podcasts, count } = await findAndCountAll(findOptions, Database.podcastModel, limit, offset, !filterGroup)
const libraryItems = podcasts.map((podcastExpanded) => { const libraryItems = podcasts.map((podcastExpanded) => {
const libraryItem = podcastExpanded.libraryItem const libraryItem = podcastExpanded.libraryItem
@ -323,7 +328,7 @@ module.exports = {
const findAndCountAll = process.env.QUERY_PROFILING ? profile(this.findAndCountAll) : this.findAndCountAll const findAndCountAll = process.env.QUERY_PROFILING ? profile(this.findAndCountAll) : this.findAndCountAll
const { rows: podcastEpisodes, count } = await findAndCountAll(findOptions, Database.podcastEpisodeModel, limit, offset) const { rows: podcastEpisodes, count } = await findAndCountAll(findOptions, Database.podcastEpisodeModel, limit, offset, !filterGroup)
const libraryItems = podcastEpisodes.map((ep) => { const libraryItems = podcastEpisodes.map((ep) => {
const libraryItem = ep.podcast.libraryItem const libraryItem = ep.podcast.libraryItem