Files
supabase/apps/studio/components/interfaces/QueryPerformance/hooks/useIndexInvalidation.ts
T
Jonathan Summers-MuirandJoshen Lim 2815dac7e0 Feat/index suggestions inline (#35107)
* init

* hovercard

* adds button to install index advisor

* hover card now now insert indexes

* update

* moved hook

* align alert dialog to design syste,

* Update index-advisor.utils.ts

* shows all index statements now

* Update query-performance.tsx

* Some refactors

* Clean up

* Fix

* One last nit refactor

---------

Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
2025-05-07 19:09:58 +08:00

50 lines
1.8 KiB
TypeScript

import { useQueryClient } from '@tanstack/react-query'
import { useRouter } from 'next/router'
import { parseAsString, useQueryStates } from 'nuqs'
import { useCallback } from 'react'
import {
QueryPerformanceSort,
useQueryPerformanceQuery,
} from 'components/interfaces/Reports/Reports.queries'
import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext'
import { databaseIndexesKeys } from 'data/database-indexes/keys'
import { databaseKeys } from 'data/database/keys'
import {
QUERY_PERFORMANCE_PRESET_MAP,
QUERY_PERFORMANCE_REPORT_TYPES,
} from '../QueryPerformance.constants'
import { useIsIndexAdvisorAvailable } from './useIsIndexAdvisorAvailable'
export function useIndexInvalidation() {
const router = useRouter()
const queryClient = useQueryClient()
const { project } = useProjectContext()
const isAdvisorAvailable = useIsIndexAdvisorAvailable()
const [{ preset: urlPreset, search: searchQuery, order, sort }] = useQueryStates({
sort: parseAsString,
search: parseAsString.withDefault(''),
order: parseAsString,
preset: parseAsString.withDefault(QUERY_PERFORMANCE_REPORT_TYPES.MOST_TIME_CONSUMING),
})
const preset = QUERY_PERFORMANCE_PRESET_MAP[urlPreset as QUERY_PERFORMANCE_REPORT_TYPES]
const orderBy = !!sort ? ({ column: sort, order } as QueryPerformanceSort) : undefined
const roles = router?.query?.roles ?? []
const queryPerformanceQuery = useQueryPerformanceQuery({
searchQuery,
orderBy,
preset,
roles: typeof roles === 'string' ? [roles] : roles,
runIndexAdvisor: isAdvisorAvailable,
})
return useCallback(() => {
queryPerformanceQuery.runQuery()
queryClient.invalidateQueries(databaseKeys.indexAdvisorFromQuery(project?.ref, ''))
queryClient.invalidateQueries(databaseIndexesKeys.list(project?.ref))
}, [queryPerformanceQuery, queryClient, project?.ref])
}