cache total count of library items in page info only

This commit is contained in:
Hongbo Wu
2024-08-14 09:37:40 +08:00
parent 81ff5a05f9
commit bcdff19a3d
3 changed files with 36 additions and 26 deletions

View File

@ -665,7 +665,10 @@ export const typeaheadSearchResolver = authorized<
})
export const updatesSinceResolver = authorized<
Merge<UpdatesSinceSuccess, { edges: Array<PartialSearchItemEdge> }>,
Merge<
UpdatesSinceSuccess,
{ edges: Array<PartialSearchItemEdge>; pageInfo: PartialPageInfo }
>,
UpdatesSinceError,
QueryUpdatesSinceArgs
>(async (_obj, { since, first, after, sort: sortParams, folder }, { uid }) => {
@ -683,16 +686,15 @@ export const updatesSinceResolver = authorized<
folder ? ' in:' + folder : ''
} sort:${sort.by}-${sort.order}`
const libraryItems = await searchLibraryItems(
{
from: Number(startCursor),
size: size + 1, // fetch one more item to get next cursor
includeDeleted: true,
query,
includeContent: true, // by default include content for offline use for now
},
uid
)
const searchLibraryItemArgs = {
from: Number(startCursor),
size: size + 1, // fetch one more item to get next cursor
includeDeleted: true,
query,
includeContent: true, // by default include content for offline use for now
}
const libraryItems = await searchLibraryItems(searchLibraryItemArgs, uid)
const start =
startCursor && !isNaN(Number(startCursor)) ? Number(startCursor) : 0
@ -722,6 +724,7 @@ export const updatesSinceResolver = authorized<
startCursor,
hasNextPage,
endCursor,
searchLibraryItemArgs,
},
}
})

View File

@ -28,11 +28,17 @@ import {
PageType,
User,
} from '../generated/graphql'
import { redisDataSource } from '../redis_data_source'
import { getAISummary } from '../services/ai-summaries'
import { findUserFeatures } from '../services/features'
import { countLibraryItems } from '../services/library_item'
import { Merge } from '../util'
import { isBase64Image, validatedDate, wordsCount } from '../utils/helpers'
import {
isBase64Image,
stringToHash,
validatedDate,
wordsCount,
} from '../utils/helpers'
import { createImageProxyUrl } from '../utils/imageproxy'
import { contentConverter } from '../utils/parser'
import {
@ -599,7 +605,20 @@ export const functionResolvers = {
if (pageInfo.totalCount) return pageInfo.totalCount
if (pageInfo.searchLibraryItemArgs && ctx.claims) {
return countLibraryItems(pageInfo.searchLibraryItemArgs, ctx.claims.uid)
const args = pageInfo.searchLibraryItemArgs
const userId = ctx.claims.uid
// hash the arguments to create a unique cache key
const argsHash = stringToHash(JSON.stringify(args))
const cacheKey = `countLibraryItems:${userId}:${argsHash}`
const cachedCount = await redisDataSource.redisClient?.get(cacheKey)
if (cachedCount) {
return parseInt(cachedCount, 10)
}
const count = await countLibraryItems(args, userId)
await redisDataSource.redisClient?.set(cacheKey, count, 'EX', 600)
return count
}
return 0

View File

@ -35,7 +35,6 @@ import { logger } from '../utils/logger'
import { parseSearchQuery } from '../utils/search'
import { HighlightEvent } from './highlights'
import { addLabelsToLibraryItem, LabelEvent } from './labels'
import { stringToHash } from '../utils/helpers'
const columnsToDelete = [
'user',
@ -705,24 +704,13 @@ export const createSearchQueryBuilder = (
}
export const countLibraryItems = async (args: SearchArgs, userId: string) => {
// hash the arguments to create a unique cache key
const argsHash = stringToHash(JSON.stringify(args))
const cacheKey = `countLibraryItems:${userId}:${argsHash}`
const cachedCount = await redisDataSource.redisClient?.get(cacheKey)
if (cachedCount) {
return parseInt(cachedCount, 10)
}
const count = await authTrx(
return authTrx(
async (tx) => createSearchQueryBuilder(args, userId, tx).getCount(),
{
uid: userId,
replicationMode: 'replica',
}
)
await redisDataSource.redisClient?.set(cacheKey, count, 'EX', 600)
return count
}
export const searchLibraryItems = async (