@cubejs-backend/query-orchestrator 0.24.0 → 0.24.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/src/driver/BaseDriver.d.ts +36 -0
  3. package/dist/src/driver/BaseDriver.d.ts.map +1 -0
  4. package/dist/src/driver/BaseDriver.js +175 -0
  5. package/dist/src/driver/BaseDriver.js.map +1 -0
  6. package/dist/src/driver/index.d.ts +3 -0
  7. package/dist/src/driver/index.d.ts.map +1 -0
  8. package/dist/src/driver/index.js +15 -0
  9. package/dist/src/driver/index.js.map +1 -0
  10. package/dist/src/driver/utils.d.ts +2 -0
  11. package/dist/src/driver/utils.d.ts.map +1 -0
  12. package/dist/src/driver/utils.js +17 -0
  13. package/dist/src/driver/utils.js.map +1 -0
  14. package/dist/src/index.d.ts +3 -0
  15. package/dist/src/index.d.ts.map +1 -0
  16. package/dist/src/index.js +15 -0
  17. package/dist/src/index.js.map +1 -0
  18. package/dist/src/orchestrator/BaseQueueDriver.d.ts +4 -0
  19. package/dist/src/orchestrator/BaseQueueDriver.d.ts.map +1 -0
  20. package/dist/src/orchestrator/BaseQueueDriver.js +16 -0
  21. package/dist/src/orchestrator/BaseQueueDriver.js.map +1 -0
  22. package/dist/src/orchestrator/ContinueWaitError.d.ts +3 -0
  23. package/dist/src/orchestrator/ContinueWaitError.d.ts.map +1 -0
  24. package/dist/src/orchestrator/ContinueWaitError.js +10 -0
  25. package/dist/src/orchestrator/ContinueWaitError.js.map +1 -0
  26. package/dist/src/orchestrator/LocalCacheDriver.d.ts +8 -0
  27. package/dist/src/orchestrator/LocalCacheDriver.d.ts.map +1 -0
  28. package/dist/src/orchestrator/LocalCacheDriver.js +30 -0
  29. package/dist/src/orchestrator/LocalCacheDriver.js.map +1 -0
  30. package/dist/src/orchestrator/LocalQueueDriver.d.ts +57 -0
  31. package/dist/src/orchestrator/LocalQueueDriver.d.ts.map +1 -0
  32. package/dist/src/orchestrator/LocalQueueDriver.js +230 -0
  33. package/dist/src/orchestrator/LocalQueueDriver.js.map +1 -0
  34. package/dist/src/orchestrator/PreAggregations.d.ts +26 -0
  35. package/dist/src/orchestrator/PreAggregations.d.ts.map +1 -0
  36. package/dist/src/orchestrator/PreAggregations.js +565 -0
  37. package/dist/src/orchestrator/PreAggregations.js.map +1 -0
  38. package/dist/src/orchestrator/QueryCache.d.ts +51 -0
  39. package/dist/src/orchestrator/QueryCache.d.ts.map +1 -0
  40. package/dist/src/orchestrator/QueryCache.js +293 -0
  41. package/dist/src/orchestrator/QueryCache.js.map +1 -0
  42. package/dist/src/orchestrator/QueryOrchestrator.d.ts +27 -0
  43. package/dist/src/orchestrator/QueryOrchestrator.d.ts.map +1 -0
  44. package/dist/src/orchestrator/QueryOrchestrator.js +79 -0
  45. package/dist/src/orchestrator/QueryOrchestrator.js.map +1 -0
  46. package/dist/src/orchestrator/QueryQueue.d.ts +36 -0
  47. package/dist/src/orchestrator/QueryQueue.d.ts.map +1 -0
  48. package/dist/src/orchestrator/QueryQueue.js +351 -0
  49. package/dist/src/orchestrator/QueryQueue.js.map +1 -0
  50. package/dist/src/orchestrator/RedisCacheDriver.d.ts +12 -0
  51. package/dist/src/orchestrator/RedisCacheDriver.d.ts.map +1 -0
  52. package/dist/src/orchestrator/RedisCacheDriver.js +50 -0
  53. package/dist/src/orchestrator/RedisCacheDriver.js.map +1 -0
  54. package/dist/src/orchestrator/RedisFactory.d.ts +3 -0
  55. package/dist/src/orchestrator/RedisFactory.d.ts.map +1 -0
  56. package/dist/src/orchestrator/RedisFactory.js +45 -0
  57. package/dist/src/orchestrator/RedisFactory.js.map +1 -0
  58. package/dist/src/orchestrator/RedisPool.d.ts +10 -0
  59. package/dist/src/orchestrator/RedisPool.d.ts.map +1 -0
  60. package/dist/src/orchestrator/RedisPool.js +57 -0
  61. package/dist/src/orchestrator/RedisPool.js.map +1 -0
  62. package/dist/src/orchestrator/RedisQueueDriver.d.ts +47 -0
  63. package/dist/src/orchestrator/RedisQueueDriver.d.ts.map +1 -0
  64. package/dist/src/orchestrator/RedisQueueDriver.js +253 -0
  65. package/dist/src/orchestrator/RedisQueueDriver.js.map +1 -0
  66. package/dist/src/orchestrator/TimeoutError.d.ts +4 -0
  67. package/dist/src/orchestrator/TimeoutError.d.ts.map +1 -0
  68. package/dist/src/orchestrator/TimeoutError.js +7 -0
  69. package/dist/src/orchestrator/TimeoutError.js.map +1 -0
  70. package/dist/src/orchestrator/index.d.ts +14 -0
  71. package/dist/src/orchestrator/index.d.ts.map +1 -0
  72. package/dist/src/orchestrator/index.js +26 -0
  73. package/dist/src/orchestrator/index.js.map +1 -0
  74. package/driver/BaseDriver.js +5 -221
  75. package/driver/README.md +3 -0
  76. package/driver/utils.js +8 -12
  77. package/orchestrator/BaseQueueDriver.js +5 -8
  78. package/orchestrator/ContinueWaitError.js +6 -5
  79. package/orchestrator/LocalCacheDriver.js +5 -29
  80. package/orchestrator/LocalQueueDriver.js +5 -256
  81. package/orchestrator/PreAggregations.js +4 -764
  82. package/orchestrator/QueryCache.js +5 -381
  83. package/orchestrator/QueryOrchestrator.js +5 -100
  84. package/orchestrator/QueryQueue.js +5 -378
  85. package/orchestrator/README.md +3 -0
  86. package/orchestrator/RedisCacheDriver.js +5 -45
  87. package/orchestrator/RedisFactory.js +6 -46
  88. package/orchestrator/RedisPool.js +5 -49
  89. package/orchestrator/RedisQueueDriver.js +5 -283
  90. package/orchestrator/TimeoutError.js +6 -1
  91. package/package.json +29 -11
  92. package/docker-compose.yml +0 -7
  93. package/test/integration/QueryQueueRedis.test.js +0 -5
  94. package/test/unit/PreAggregations.test.js +0 -337
  95. package/test/unit/QueryOrchestrator.test.js +0 -373
  96. package/test/unit/QueryQueue.test.js +0 -247
@@ -0,0 +1,51 @@
1
+ export class QueryCache {
2
+ static queryCacheKey(queryBody: any): any[];
3
+ static replaceAll(replaceThis: any, withThis: any, inThis: any): any;
4
+ static replacePreAggregationTableNames(queryAndParams: any, preAggregationsTablesToTempTables: any): any;
5
+ static createQueue(redisPrefix: any, clientFactory: any, executeFn: any, options: any): QueryQueue;
6
+ constructor(redisPrefix: any, clientFactory: any, logger: any, options: any);
7
+ options: any;
8
+ redisPrefix: any;
9
+ driverFactory: any;
10
+ externalDriverFactory: any;
11
+ logger: any;
12
+ cacheDriver: LocalCacheDriver | RedisCacheDriver;
13
+ cachedQueryResult(queryBody: any, preAggregationsTablesToTempTables: any): Promise<{
14
+ data: any;
15
+ refreshKeyValues: any[] | [any, any, any, any, any, any, any, any, any, any];
16
+ lastRefreshTime: Date;
17
+ } | {
18
+ data: any;
19
+ lastRefreshTime?: undefined;
20
+ } | {
21
+ data: any;
22
+ lastRefreshTime: Date;
23
+ }>;
24
+ queryWithRetryAndRelease(query: any, values: any, { priority, cacheKey, external, requestId }: {
25
+ priority: any;
26
+ cacheKey: any;
27
+ external: any;
28
+ requestId: any;
29
+ }): Promise<any>;
30
+ getQueue(): QueryQueue;
31
+ queue: QueryQueue;
32
+ getExternalQueue(): QueryQueue;
33
+ externalQueue: QueryQueue;
34
+ startRenewCycle(query: any, values: any, cacheKeyQueries: any, expireSecs: any, cacheKey: any, renewalThreshold: any, options: any): void;
35
+ renewQuery(query: any, values: any, cacheKeyQueries: any, expireSecs: any, cacheKey: any, renewalThreshold: any, options: any): Promise<{
36
+ data: any;
37
+ refreshKeyValues: any[] | [any, any, any, any, any, any, any, any, any, any];
38
+ lastRefreshTime: Date;
39
+ }>;
40
+ cacheQueryResult(query: any, values: any, cacheKey: any, expiration: any, options: any): Promise<any>;
41
+ lastRefreshTime(cacheKey: any): Promise<Date>;
42
+ resultFromCacheIfExists(queryBody: any): Promise<{
43
+ data: any;
44
+ lastRefreshTime: Date;
45
+ }>;
46
+ queryRedisKey(cacheKey: any): string;
47
+ }
48
+ import { LocalCacheDriver } from "./LocalCacheDriver";
49
+ import { RedisCacheDriver } from "./RedisCacheDriver";
50
+ import { QueryQueue } from "./QueryQueue";
51
+ //# sourceMappingURL=QueryCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryCache.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/QueryCache.js"],"names":[],"mappings":"AAOA;IAsGE,4CAEC;IAED,qEAMC;IAED,yGAOC;IAyDD,mGAmCC;IApND,6EASC;IARC,aAA4B;IAC5B,iBAA8B;IAC9B,mBAAkC;IAClC,2BAA0D;IAC1D,YAAoB;IACpB,iDAEwB;IAG1B;;;;;;;;;;OAwFC;IAuBD;;;;;qBAUC;IAED,uBAmBC;IAjBG,kBAcC;IAKL,+BAoBC;IAlBG,0BAeC;IA0CL,0IAUC;IAED;;;;OA8CC;IAED,sGA8EC;IAED,8CAGC;IAED;;;OAUC;IAED,qCAEC;CACF"}
@@ -0,0 +1,293 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.QueryCache = void 0;
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ const QueryQueue_1 = require("./QueryQueue");
9
+ const ContinueWaitError_1 = require("./ContinueWaitError");
10
+ const RedisCacheDriver_1 = require("./RedisCacheDriver");
11
+ const LocalCacheDriver_1 = require("./LocalCacheDriver");
12
+ class QueryCache {
13
+ constructor(redisPrefix, clientFactory, logger, options) {
14
+ this.options = options || {};
15
+ this.redisPrefix = redisPrefix;
16
+ this.driverFactory = clientFactory;
17
+ this.externalDriverFactory = options.externalDriverFactory;
18
+ this.logger = logger;
19
+ this.cacheDriver = options.cacheAndQueueDriver === 'redis' ?
20
+ new RedisCacheDriver_1.RedisCacheDriver({ pool: options.redisPool }) :
21
+ new LocalCacheDriver_1.LocalCacheDriver();
22
+ }
23
+ async cachedQueryResult(queryBody, preAggregationsTablesToTempTables) {
24
+ const replacePreAggregationTableNames = (queryAndParams) => QueryCache.replacePreAggregationTableNames(queryAndParams, preAggregationsTablesToTempTables);
25
+ const query = replacePreAggregationTableNames(queryBody.query);
26
+ let queuePriority = 10;
27
+ if (Number.isInteger(queryBody.queuePriority)) {
28
+ // eslint-disable-next-line prefer-destructuring
29
+ queuePriority = queryBody.queuePriority;
30
+ }
31
+ const forceNoCache = queryBody.forceNoCache || false;
32
+ const { values } = queryBody;
33
+ const cacheKeyQueries = (queryBody.cacheKeyQueries && queryBody.cacheKeyQueries.queries ||
34
+ queryBody.cacheKeyQueries ||
35
+ []).map(replacePreAggregationTableNames);
36
+ const renewalThreshold = queryBody.cacheKeyQueries && queryBody.cacheKeyQueries.renewalThreshold;
37
+ const refreshKeyRenewalThresholds = queryBody.cacheKeyQueries &&
38
+ queryBody.cacheKeyQueries.refreshKeyRenewalThresholds;
39
+ const expireSecs = queryBody.expireSecs || 24 * 3600;
40
+ if (!cacheKeyQueries) {
41
+ return {
42
+ data: await this.queryWithRetryAndRelease(query, values, {
43
+ external: queryBody.external,
44
+ requestId: queryBody.requestId
45
+ })
46
+ };
47
+ }
48
+ const cacheKey = QueryCache.queryCacheKey(queryBody);
49
+ if (queryBody.renewQuery) {
50
+ this.logger('Requested renew', { cacheKey, requestId: queryBody.requestId });
51
+ return this.renewQuery(query, values, cacheKeyQueries, expireSecs, cacheKey, renewalThreshold, {
52
+ external: queryBody.external,
53
+ requestId: queryBody.requestId,
54
+ refreshKeyRenewalThresholds
55
+ });
56
+ }
57
+ if (!this.options.backgroundRenew) {
58
+ const resultPromise = this.renewQuery(query, values, cacheKeyQueries, expireSecs, cacheKey, renewalThreshold, {
59
+ external: queryBody.external,
60
+ requestId: queryBody.requestId,
61
+ refreshKeyRenewalThresholds,
62
+ skipRefreshKeyWaitForRenew: true
63
+ });
64
+ this.startRenewCycle(query, values, cacheKeyQueries, expireSecs, cacheKey, renewalThreshold, {
65
+ external: queryBody.external,
66
+ requestId: queryBody.requestId,
67
+ refreshKeyRenewalThresholds
68
+ });
69
+ return resultPromise;
70
+ }
71
+ this.logger('Background fetch', { cacheKey, requestId: queryBody.requestId });
72
+ const mainPromise = this.cacheQueryResult(query, values, cacheKey, expireSecs, {
73
+ priority: queuePriority,
74
+ forceNoCache,
75
+ external: queryBody.external,
76
+ requestId: queryBody.requestId
77
+ });
78
+ if (!forceNoCache) {
79
+ this.startRenewCycle(query, values, cacheKeyQueries, expireSecs, cacheKey, renewalThreshold, {
80
+ external: queryBody.external,
81
+ requestId: queryBody.requestId,
82
+ refreshKeyRenewalThresholds
83
+ });
84
+ }
85
+ return {
86
+ data: await mainPromise,
87
+ lastRefreshTime: await this.lastRefreshTime(cacheKey)
88
+ };
89
+ }
90
+ static queryCacheKey(queryBody) {
91
+ return [queryBody.query, queryBody.values, (queryBody.preAggregations || []).map(p => p.loadSql)];
92
+ }
93
+ static replaceAll(replaceThis, withThis, inThis) {
94
+ withThis = withThis.replace(/\$/g, '$$$$');
95
+ return inThis.replace(new RegExp(replaceThis.replace(/([/,!\\^${}[\]().*+?|<>\-&])/g, '\\$&'), 'g'), withThis);
96
+ }
97
+ static replacePreAggregationTableNames(queryAndParams, preAggregationsTablesToTempTables) {
98
+ const [keyQuery, params] = Array.isArray(queryAndParams) ? queryAndParams : [queryAndParams, []];
99
+ const replacedKeqQuery = preAggregationsTablesToTempTables.reduce((query, [tableName, { targetTableName }]) => QueryCache.replaceAll(tableName, targetTableName, query), keyQuery);
100
+ return Array.isArray(queryAndParams) ? [replacedKeqQuery, params] : replacedKeqQuery;
101
+ }
102
+ queryWithRetryAndRelease(query, values, { priority, cacheKey, external, requestId }) {
103
+ const queue = external ? this.getExternalQueue() : this.getQueue();
104
+ return queue.executeInQueue('query', cacheKey, {
105
+ queryKey: cacheKey, query, values, requestId
106
+ }, priority, {
107
+ stageQueryKey: cacheKey,
108
+ requestId
109
+ });
110
+ }
111
+ getQueue() {
112
+ if (!this.queue) {
113
+ this.queue = QueryCache.createQueue(`SQL_QUERY_${this.redisPrefix}`, this.driverFactory, (client, q) => {
114
+ this.logger('Executing SQL', Object.assign({}, q));
115
+ return client.query(q.query, q.values, q);
116
+ }, Object.assign({ logger: this.logger, cacheAndQueueDriver: this.options.cacheAndQueueDriver, redisPool: this.options.redisPool }, this.options.queueOptions));
117
+ }
118
+ return this.queue;
119
+ }
120
+ getExternalQueue() {
121
+ if (!this.externalQueue) {
122
+ this.externalQueue = QueryCache.createQueue(`SQL_QUERY_EXT_${this.redisPrefix}`, this.externalDriverFactory, (client, q) => {
123
+ this.logger('Executing SQL', Object.assign({}, q));
124
+ return client.query(q.query, q.values, q);
125
+ }, Object.assign({ logger: this.logger, cacheAndQueueDriver: this.options.cacheAndQueueDriver, redisPool: this.options.redisPool }, this.options.externalQueueOptions));
126
+ }
127
+ return this.externalQueue;
128
+ }
129
+ static createQueue(redisPrefix, clientFactory, executeFn, options) {
130
+ options = options || {};
131
+ const queue = new QueryQueue_1.QueryQueue(redisPrefix, Object.assign({ queryHandlers: {
132
+ query: async (q, setCancelHandle) => {
133
+ const client = await clientFactory();
134
+ const resultPromise = executeFn(client, q);
135
+ let handle;
136
+ if (resultPromise.cancel) {
137
+ queue.cancelHandlerCounter += 1;
138
+ handle = queue.cancelHandlerCounter;
139
+ queue.handles[handle] = resultPromise;
140
+ await setCancelHandle(handle);
141
+ }
142
+ const result = await resultPromise;
143
+ if (handle) {
144
+ delete queue.handles[handle];
145
+ }
146
+ return result;
147
+ }
148
+ }, cancelHandlers: {
149
+ query: async (q) => {
150
+ if (q.cancelHandler && queue.handles[q.cancelHandler]) {
151
+ await queue.handles[q.cancelHandler].cancel();
152
+ delete queue.handles[q.cancelHandler];
153
+ }
154
+ }
155
+ }, logger: (msg, params) => options.logger(msg, params) }, options));
156
+ queue.cancelHandlerCounter = 0;
157
+ queue.handles = {};
158
+ return queue;
159
+ }
160
+ startRenewCycle(query, values, cacheKeyQueries, expireSecs, cacheKey, renewalThreshold, options) {
161
+ this.renewQuery(query, values, cacheKeyQueries, expireSecs, cacheKey, renewalThreshold, options).catch(e => {
162
+ if (!(e instanceof ContinueWaitError_1.ContinueWaitError)) {
163
+ this.logger('Error while renew cycle', {
164
+ query, query_values: values, error: e.stack || e, requestId: options.requestId
165
+ });
166
+ }
167
+ });
168
+ }
169
+ renewQuery(query, values, cacheKeyQueries, expireSecs, cacheKey, renewalThreshold, options) {
170
+ options = options || {};
171
+ return Promise.all(cacheKeyQueries.map((q, i) => this.cacheQueryResult(Array.isArray(q) ? q[0] : q, Array.isArray(q) ? q[1] : [], q, expireSecs, {
172
+ renewalThreshold: this.options.refreshKeyRenewalThreshold ||
173
+ (options.refreshKeyRenewalThresholds || [])[i] ||
174
+ 2 * 60,
175
+ renewalKey: q,
176
+ waitForRenew: !options.skipRefreshKeyWaitForRenew,
177
+ requestId: options.requestId
178
+ })))
179
+ .catch(e => {
180
+ if (e instanceof ContinueWaitError_1.ContinueWaitError) {
181
+ throw e;
182
+ }
183
+ this.logger('Error fetching cache key queries', { error: e.stack || e, requestId: options.requestId });
184
+ return [];
185
+ })
186
+ .then(async (cacheKeyQueryResults) => ({
187
+ data: await this.cacheQueryResult(query, values, cacheKey, expireSecs, {
188
+ renewalThreshold: renewalThreshold || 6 * 60 * 60,
189
+ renewalKey: cacheKeyQueryResults && [
190
+ cacheKeyQueries, cacheKeyQueryResults, this.queryRedisKey([query, values])
191
+ ],
192
+ waitForRenew: true,
193
+ external: options.external,
194
+ requestId: options.requestId
195
+ }),
196
+ refreshKeyValues: cacheKeyQueryResults,
197
+ lastRefreshTime: await this.lastRefreshTime(cacheKey)
198
+ }));
199
+ }
200
+ cacheQueryResult(query, values, cacheKey, expiration, options) {
201
+ options = options || {};
202
+ const { renewalThreshold } = options;
203
+ const renewalKey = options.renewalKey && this.queryRedisKey(options.renewalKey);
204
+ const redisKey = this.queryRedisKey(cacheKey);
205
+ const fetchNew = () => (this.queryWithRetryAndRelease(query, values, {
206
+ priority: options.priority, cacheKey, external: options.external, requestId: options.requestId
207
+ }).then(res => {
208
+ const result = {
209
+ time: (new Date()).getTime(),
210
+ result: res,
211
+ renewalKey
212
+ };
213
+ return this.cacheDriver.set(redisKey, result, expiration)
214
+ .then(() => {
215
+ this.logger('Renewed', { cacheKey, requestId: options.requestId });
216
+ return res;
217
+ });
218
+ }).catch(e => {
219
+ if (!(e instanceof ContinueWaitError_1.ContinueWaitError)) {
220
+ this.logger('Dropping Cache', { cacheKey, error: e.stack || e, requestId: options.requestId });
221
+ this.cacheDriver.remove(redisKey)
222
+ .catch(err => this.logger('Error removing key', {
223
+ cacheKey,
224
+ error: err.stack || err,
225
+ requestId: options.requestId
226
+ }));
227
+ }
228
+ throw e;
229
+ }));
230
+ if (options.forceNoCache) {
231
+ this.logger('Force no cache for', { cacheKey, requestId: options.requestId });
232
+ return fetchNew();
233
+ }
234
+ return this.cacheDriver.get(redisKey).then(res => {
235
+ if (res) {
236
+ const parsedResult = res;
237
+ const renewedAgo = (new Date()).getTime() - parsedResult.time;
238
+ this.logger('Found cache entry', {
239
+ cacheKey,
240
+ time: parsedResult.time,
241
+ renewedAgo,
242
+ renewalKey: parsedResult.renewalKey,
243
+ newRenewalKey: renewalKey,
244
+ renewalThreshold,
245
+ requestId: options.requestId
246
+ });
247
+ if (renewalKey && (!renewalThreshold ||
248
+ !parsedResult.time ||
249
+ renewedAgo > renewalThreshold * 1000 ||
250
+ parsedResult.renewalKey !== renewalKey)) {
251
+ if (options.waitForRenew) {
252
+ this.logger('Waiting for renew', { cacheKey, renewalThreshold, requestId: options.requestId });
253
+ return fetchNew();
254
+ }
255
+ else {
256
+ this.logger('Renewing existing key', { cacheKey, renewalThreshold, requestId: options.requestId });
257
+ fetchNew().catch(e => {
258
+ if (!(e instanceof ContinueWaitError_1.ContinueWaitError)) {
259
+ this.logger('Error renewing', { cacheKey, error: e.stack || e, requestId: options.requestId });
260
+ }
261
+ });
262
+ }
263
+ }
264
+ this.logger('Using cache for', { cacheKey, requestId: options.requestId });
265
+ return parsedResult.result;
266
+ }
267
+ else {
268
+ this.logger('Missing cache for', { cacheKey, requestId: options.requestId });
269
+ return fetchNew();
270
+ }
271
+ });
272
+ }
273
+ async lastRefreshTime(cacheKey) {
274
+ const cachedValue = await this.cacheDriver.get(this.queryRedisKey(cacheKey));
275
+ return cachedValue && new Date(cachedValue.time);
276
+ }
277
+ async resultFromCacheIfExists(queryBody) {
278
+ const cacheKey = QueryCache.queryCacheKey(queryBody);
279
+ const cachedValue = await this.cacheDriver.get(this.queryRedisKey(cacheKey));
280
+ if (cachedValue) {
281
+ return {
282
+ data: cachedValue.result,
283
+ lastRefreshTime: new Date(cachedValue.time)
284
+ };
285
+ }
286
+ return null;
287
+ }
288
+ queryRedisKey(cacheKey) {
289
+ return `SQL_QUERY_RESULT_${this.redisPrefix}_${crypto_1.default.createHash('md5').update(JSON.stringify(cacheKey)).digest('hex')}`;
290
+ }
291
+ }
292
+ exports.QueryCache = QueryCache;
293
+ //# sourceMappingURL=QueryCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryCache.js","sourceRoot":"","sources":["../../../src/orchestrator/QueryCache.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export class QueryOrchestrator {
2
+ constructor(redisPrefix: any, driverFactory: any, logger: any, options: any);
3
+ redisPrefix: any;
4
+ driverFactory: any;
5
+ logger: any;
6
+ redisPool: RedisPool;
7
+ queryCache: QueryCache;
8
+ preAggregations: PreAggregations;
9
+ rollupOnlyMode: any;
10
+ fetchQuery(queryBody: any): Promise<any>;
11
+ queryStage(queryBody: any): Promise<{
12
+ stage: string;
13
+ timeElapsed: number;
14
+ } | {
15
+ stage: string;
16
+ timeElapsed?: undefined;
17
+ }>;
18
+ resultFromCacheIfExists(queryBody: any): Promise<{
19
+ data: any;
20
+ lastRefreshTime: Date;
21
+ }>;
22
+ cleanup(): Promise<void>;
23
+ }
24
+ import { RedisPool } from "./RedisPool";
25
+ import { QueryCache } from "./QueryCache";
26
+ import { PreAggregations } from "./PreAggregations";
27
+ //# sourceMappingURL=QueryOrchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryOrchestrator.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/QueryOrchestrator.js"],"names":[],"mappings":"AAMA;IACE,6EAgCC;IA9BC,iBAA8B;IAC9B,mBAAkC;IAClC,YAAoB;IAUpB,qBAA0B;IAC1B,uBAOC;IACD,iCAOC;IACD,oBAA4C;IAG9C,yCAoBC;IAED;;;;;;OA2BC;IAED;;;OAEC;IAED,yBAIC;CACF"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.QueryOrchestrator = void 0;
7
+ const ramda_1 = __importDefault(require("ramda"));
8
+ const QueryCache_1 = require("./QueryCache");
9
+ const PreAggregations_1 = require("./PreAggregations");
10
+ const RedisPool_1 = require("./RedisPool");
11
+ class QueryOrchestrator {
12
+ constructor(redisPrefix, driverFactory, logger, options) {
13
+ options = options || {};
14
+ this.redisPrefix = redisPrefix;
15
+ this.driverFactory = driverFactory;
16
+ this.logger = logger;
17
+ const { externalDriverFactory } = options;
18
+ const cacheAndQueueDriver = options.cacheAndQueueDriver || process.env.CUBEJS_CACHE_AND_QUEUE_DRIVER || (process.env.NODE_ENV === 'production' || process.env.REDIS_URL ? 'redis' : 'memory');
19
+ if (cacheAndQueueDriver !== 'redis' && cacheAndQueueDriver !== 'memory') {
20
+ throw new Error('Only \'redis\' or \'memory\' are supported for cacheAndQueueDriver option');
21
+ }
22
+ const redisPool = cacheAndQueueDriver === 'redis' ? new RedisPool_1.RedisPool() : undefined;
23
+ this.redisPool = redisPool;
24
+ this.queryCache = new QueryCache_1.QueryCache(this.redisPrefix, this.driverFactory, this.logger, Object.assign({ externalDriverFactory,
25
+ cacheAndQueueDriver,
26
+ redisPool }, options.queryCacheOptions));
27
+ this.preAggregations = new PreAggregations_1.PreAggregations(this.redisPrefix, this.driverFactory, this.logger, this.queryCache, Object.assign({ externalDriverFactory,
28
+ cacheAndQueueDriver,
29
+ redisPool }, options.preAggregationsOptions));
30
+ this.rollupOnlyMode = options.rollupOnlyMode;
31
+ }
32
+ async fetchQuery(queryBody) {
33
+ return this.preAggregations.loadAllPreAggregationsIfNeeded(queryBody)
34
+ .then(async (preAggregationsTablesToTempTables) => {
35
+ const usedPreAggregations = ramda_1.default.fromPairs(preAggregationsTablesToTempTables);
36
+ if (this.rollupOnlyMode && Object.keys(usedPreAggregations).length === 0) {
37
+ throw new Error('No pre-aggregation exists for that query');
38
+ }
39
+ if (!queryBody.query) {
40
+ return {
41
+ usedPreAggregations
42
+ };
43
+ }
44
+ const result = await this.queryCache.cachedQueryResult(queryBody, preAggregationsTablesToTempTables);
45
+ return Object.assign(Object.assign({}, result), { usedPreAggregations });
46
+ });
47
+ }
48
+ async queryStage(queryBody) {
49
+ const queue = this.preAggregations.getQueue();
50
+ const preAggregationsQueryStageState = await queue.fetchQueryStageState();
51
+ const pendingPreAggregationIndex = (await Promise.all((queryBody.preAggregations || [])
52
+ .map(p => queue.getQueryStage(PreAggregations_1.PreAggregations.preAggregationQueryCacheKey(p), 10, preAggregationsQueryStageState)))).findIndex(p => !!p);
53
+ if (pendingPreAggregationIndex === -1) {
54
+ return this.queryCache.getQueue().getQueryStage(QueryCache_1.QueryCache.queryCacheKey(queryBody));
55
+ }
56
+ const preAggregation = queryBody.preAggregations[pendingPreAggregationIndex];
57
+ const preAggregationStage = await queue.getQueryStage(PreAggregations_1.PreAggregations.preAggregationQueryCacheKey(preAggregation), undefined, preAggregationsQueryStageState);
58
+ if (!preAggregationStage) {
59
+ return undefined;
60
+ }
61
+ const stageMessage = `Building pre-aggregation ${pendingPreAggregationIndex + 1}/${queryBody.preAggregations.length}`;
62
+ if (preAggregationStage.stage.indexOf('queue') !== -1) {
63
+ return Object.assign(Object.assign({}, preAggregationStage), { stage: `${stageMessage}: ${preAggregationStage.stage}` });
64
+ }
65
+ else {
66
+ return Object.assign(Object.assign({}, preAggregationStage), { stage: stageMessage });
67
+ }
68
+ }
69
+ resultFromCacheIfExists(queryBody) {
70
+ return this.queryCache.resultFromCacheIfExists(queryBody);
71
+ }
72
+ async cleanup() {
73
+ if (this.redisPool) {
74
+ await this.redisPool.cleanup();
75
+ }
76
+ }
77
+ }
78
+ exports.QueryOrchestrator = QueryOrchestrator;
79
+ //# sourceMappingURL=QueryOrchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryOrchestrator.js","sourceRoot":"","sources":["../../../src/orchestrator/QueryOrchestrator.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export class QueryQueue {
2
+ constructor(redisQueuePrefix: any, options: any);
3
+ redisQueuePrefix: any;
4
+ concurrency: any;
5
+ continueWaitTimeout: any;
6
+ executionTimeout: any;
7
+ orphanedTimeout: any;
8
+ heartBeatInterval: any;
9
+ sendProcessMessageFn: any;
10
+ sendCancelMessageFn: any;
11
+ queryHandlers: any;
12
+ cancelHandlers: any;
13
+ logger: any;
14
+ queueDriver: LocalQueueDriver | RedisQueueDriver;
15
+ executeInQueue(queryHandler: any, queryKey: any, query: any, priority: any, options: any): Promise<any>;
16
+ parseResult(result: any): any;
17
+ reconcileQueue(): Promise<any>;
18
+ reconcileAgain: boolean;
19
+ reconcilePromise: any;
20
+ reconcileQueueImpl(): Promise<void>;
21
+ queryTimeout(promise: any): Promise<any>;
22
+ fetchQueryStageState(): Promise<any[]>;
23
+ getQueryStage(stageQueryKey: any, priorityFilter: any, queryStageState: any): Promise<{
24
+ stage: string;
25
+ timeElapsed: number;
26
+ } | {
27
+ stage: string;
28
+ timeElapsed?: undefined;
29
+ }>;
30
+ processQuery(queryKey: any): Promise<void>;
31
+ processCancel(query: any): Promise<void>;
32
+ redisHash(queryKey: any): string;
33
+ }
34
+ import { LocalQueueDriver } from "./LocalQueueDriver";
35
+ import { RedisQueueDriver } from "./RedisQueueDriver";
36
+ //# sourceMappingURL=QueryQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryQueue.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/QueryQueue.js"],"names":[],"mappings":"AAOA;IACE,iDAuBC;IAtBC,sBAAwC;IACxC,iBAA2C;IAC3C,yBAA2D;IAC3D,sBAAuD;IACvD,qBAAqD;IACrD,uBAAwD;IACxD,0BAA4G;IAC5G,yBAAqG;IACrG,mBAA0C;IAC1C,oBAA4C;IAC5C,YAAwG;IASxG,iDAE0C;IAG5C,wGA2DC;IAED,8BAUC;IAED,+BAcC;IAZG,wBAA2B;IAC3B,sBAME;IAON,oCAiCC;IAED,yCAkBC;IAED,uCAOC;IAED;;;;;;OAqBC;IAED,2CAoJC;IAED,yCAeC;IAED,iCAEC;CACF"}