Path: blob/main/extensions/copilot/test/base/cachingCodeSearchClient.ts
13388 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/4import type { CancellationToken } from 'vscode';5import { ICodeOrDocsSearchBaseScopingQuery, ICodeOrDocsSearchItem, ICodeOrDocsSearchMultiRepoScopingQuery, ICodeOrDocsSearchOptions, ICodeOrDocsSearchResult, ICodeOrDocsSearchSingleRepoScopingQuery, IDocsSearchClient } from '../../src/platform/remoteSearch/common/codeOrDocsSearchClient';6import { SyncDescriptor } from '../../src/util/vs/platform/instantiation/common/descriptors';7import { IInstantiationService } from '../../src/util/vs/platform/instantiation/common/instantiation';8import { CODE_SEARCH_CACHE_SALT } from '../cacheSalt';9import { SQLiteCache } from './cache';10import { computeSHA256 } from './hash';11import { CurrentTestRunInfo } from './simulationContext';1213class CacheableCodeOrDocSearchRequest {1415readonly hash: string;16readonly obj: unknown;1718constructor(19readonly query: string,20readonly scopingQuery: ICodeOrDocsSearchBaseScopingQuery,21readonly requestOptions: ICodeOrDocsSearchOptions,22) {23this.obj = { query, scopingQuery, requestOptions };24this.hash = computeSHA256(CODE_SEARCH_CACHE_SALT + JSON.stringify(this.obj));25}2627toJSON() {28return this.obj;29}30}3132interface ICodeOrDocSearchCache {33get(req: CacheableCodeOrDocSearchRequest): Promise<ICodeOrDocsSearchItem[] | ICodeOrDocsSearchResult | undefined>;34set(req: CacheableCodeOrDocSearchRequest, cachedResponse: ICodeOrDocsSearchItem[] | ICodeOrDocsSearchResult): Promise<void>;35}3637export class CodeOrDocSearchSQLiteCache extends SQLiteCache<CacheableCodeOrDocSearchRequest, ICodeOrDocsSearchItem[] | ICodeOrDocsSearchResult> implements ICodeOrDocSearchCache {3839constructor(salt: string, currentTestRunInfo: CurrentTestRunInfo) {40super('docs-search', salt, currentTestRunInfo);41}42}4344export class CachingCodeOrDocSearchClient implements IDocsSearchClient {45declare readonly _serviceBrand: undefined;46private readonly searchClient: IDocsSearchClient;4748constructor(49searchClientDesc: SyncDescriptor<IDocsSearchClient>,50private readonly cache: ICodeOrDocSearchCache,51@IInstantiationService instantiationService: IInstantiationService,52) {53this.searchClient = instantiationService.createInstance(searchClientDesc);54}5556search(query: string, scopingQuery: ICodeOrDocsSearchSingleRepoScopingQuery, options?: ICodeOrDocsSearchOptions, cancellationToken?: CancellationToken | undefined): Promise<ICodeOrDocsSearchItem[]>;57search(query: string, scopingQuery: ICodeOrDocsSearchMultiRepoScopingQuery, options?: ICodeOrDocsSearchOptions, cancellationToken?: CancellationToken | undefined): Promise<ICodeOrDocsSearchResult>;58async search(query: string,59scopingQuery: ICodeOrDocsSearchSingleRepoScopingQuery | ICodeOrDocsSearchMultiRepoScopingQuery,60options: ICodeOrDocsSearchOptions = {},61cancellationToken?: CancellationToken62): Promise<ICodeOrDocsSearchItem[] | ICodeOrDocsSearchResult> {63options.limit ??= 6;64options.similarity ??= 0.766;6566const req = new CacheableCodeOrDocSearchRequest(query, scopingQuery, options);67const cacheValue = await this.cache.get(req);68if (cacheValue) {69return cacheValue;70}7172let result: ICodeOrDocsSearchItem[] | ICodeOrDocsSearchResult;73if (Array.isArray(scopingQuery.repo)) {74result = await this.searchClient.search(75query,76scopingQuery as ICodeOrDocsSearchMultiRepoScopingQuery,77options,78cancellationToken79);80} else {81result = await this.searchClient.search(82query,83scopingQuery as ICodeOrDocsSearchSingleRepoScopingQuery,84options,85cancellationToken86);87}88await this.cache.set(req, result);89return result;90}91}929394