cache total count of library items in page info only
This commit is contained in:
@ -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,
|
||||
},
|
||||
}
|
||||
})
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 (
|
||||
|
||||
Reference in New Issue
Block a user