diff --git a/packages/cubejs-query-orchestrator/src/orchestrator/QueryCache.ts b/packages/cubejs-query-orchestrator/src/orchestrator/QueryCache.ts index 0887aac625065..1629cb2e8f371 100644 --- a/packages/cubejs-query-orchestrator/src/orchestrator/QueryCache.ts +++ b/packages/cubejs-query-orchestrator/src/orchestrator/QueryCache.ts @@ -280,6 +280,26 @@ export class QueryCache { } } + if (forceNoCache) { + return { + data: this.cacheQueryResult( + query, + values, + cacheKey, + expireSecs, + { + priority: queuePriority, + forceNoCache, + external: queryBody.external, + requestId: queryBody.requestId, + dataSource: queryBody.dataSource, + persistent: queryBody.persistent, + } + ), + lastRefreshTime: await this.lastRefreshTime(cacheKey) + }; + } + // renewQuery has been deprecated, but keeping it for now if (queryBody.cacheMode === 'must-revalidate' || queryBody.renewQuery) { this.logger('Requested renew', { cacheKey, requestId: queryBody.requestId }); @@ -343,7 +363,6 @@ export class QueryCache { expireSecs, { priority: queuePriority, - forceNoCache, external: queryBody.external, requestId: queryBody.requestId, dataSource: queryBody.dataSource, @@ -351,22 +370,20 @@ export class QueryCache { } ); - if (!forceNoCache) { - this.startRenewCycle( - query, - values, - cacheKeyQueries, - expireSecs, - cacheKey, - renewalThreshold, - { - external: queryBody.external, - requestId: queryBody.requestId, - dataSource: queryBody.dataSource, - persistent: queryBody.persistent, - } - ); - } + this.startRenewCycle( + query, + values, + cacheKeyQueries, + expireSecs, + cacheKey, + renewalThreshold, + { + external: queryBody.external, + requestId: queryBody.requestId, + dataSource: queryBody.dataSource, + persistent: queryBody.persistent, + } + ); return { data: await mainPromise, diff --git a/packages/cubejs-query-orchestrator/test/unit/QueryCache.abstract.ts b/packages/cubejs-query-orchestrator/test/unit/QueryCache.abstract.ts index 58403e93f6504..3c687b2d2cd1a 100644 --- a/packages/cubejs-query-orchestrator/test/unit/QueryCache.abstract.ts +++ b/packages/cubejs-query-orchestrator/test/unit/QueryCache.abstract.ts @@ -163,5 +163,33 @@ export const QueryCacheTest = (name: string, options: QueryCacheTestOptions) => // @ts-ignore expect(key4.persistent).toEqual(false); }); + + it('bypass cache when forceNoCache=true', async () => { + let queryExecutionCount = 0; + + const mockDriverFactory = jest.fn(() => ({ + query: jest.fn(async () => { + queryExecutionCount++; + }) + })) as any; + + const cacheInstance = new QueryCache( + crypto.randomBytes(16).toString('hex'), + mockDriverFactory, + jest.fn(), + { + ...options, + queueOptions: async () => ({ concurrency: 1 }), + } + ); + + const queryBody = { query: 'select 1', values: [], forceNoCache: true }; + + await cacheInstance.cachedQueryResult(queryBody, []); + await cacheInstance.cachedQueryResult(queryBody, []); + + expect(queryExecutionCount).toBe(2); + await cacheInstance.cleanup(); + }); }); };