@milaboratories/pl-middle-layer 1.37.100 → 1.38.1
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.
- package/dist/block_registry/registry.d.ts.map +1 -1
- package/dist/debug/index.d.ts +1 -0
- package/dist/debug/index.d.ts.map +1 -1
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2035 -1974
- package/dist/index.mjs.map +1 -1
- package/dist/js_render/computable_context.d.ts +3 -2
- package/dist/js_render/computable_context.d.ts.map +1 -1
- package/dist/js_render/context.d.ts +2 -1
- package/dist/js_render/context.d.ts.map +1 -1
- package/dist/js_render/index.d.ts +3 -3
- package/dist/js_render/index.d.ts.map +1 -1
- package/dist/middle_layer/active_cfg.d.ts.map +1 -1
- package/dist/middle_layer/block.d.ts.map +1 -1
- package/dist/middle_layer/middle_layer.d.ts +4 -1
- package/dist/middle_layer/middle_layer.d.ts.map +1 -1
- package/dist/middle_layer/project_overview.d.ts.map +1 -1
- package/dist/middle_layer/render.d.ts +2 -2
- package/dist/middle_layer/render.d.ts.map +1 -1
- package/dist/middle_layer/render.test.d.ts.map +1 -1
- package/dist/model/project_helper.d.ts.map +1 -1
- package/dist/pool/driver.d.ts +5 -4
- package/dist/pool/driver.d.ts.map +1 -1
- package/package.json +13 -13
- package/src/block_registry/registry.ts +1 -0
- package/src/cfg_render/executor.test.ts +3 -3
- package/src/debug/index.ts +2 -0
- package/src/js_render/computable_context.ts +38 -16
- package/src/js_render/context.ts +4 -1
- package/src/js_render/index.ts +12 -4
- package/src/middle_layer/active_cfg.ts +2 -1
- package/src/middle_layer/block.ts +9 -2
- package/src/middle_layer/middle_layer.ts +14 -1
- package/src/middle_layer/navigation_states.ts +2 -2
- package/src/middle_layer/project_overview.ts +17 -6
- package/src/middle_layer/render.test.ts +2 -0
- package/src/middle_layer/render.ts +4 -4
- package/src/model/project_helper.ts +2 -2
- package/src/pool/driver.ts +116 -73
|
@@ -18,7 +18,7 @@ export class NavigationStates {
|
|
|
18
18
|
return;
|
|
19
19
|
}
|
|
20
20
|
entry.state = { ...state };
|
|
21
|
-
entry.change.markChanged();
|
|
21
|
+
entry.change.markChanged('navigation state changed');
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
private readState(ctx: ComputableCtx, blockId: string): NavigationState {
|
|
@@ -44,7 +44,7 @@ export class NavigationStates {
|
|
|
44
44
|
const entry = this.states.get(blockId);
|
|
45
45
|
if (entry !== undefined) {
|
|
46
46
|
this.states.delete(blockId);
|
|
47
|
-
entry.change.markChanged();
|
|
47
|
+
entry.change.markChanged('block deleted');
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
}
|
|
@@ -25,7 +25,7 @@ import type {
|
|
|
25
25
|
} from '@milaboratories/pl-model-middle-layer';
|
|
26
26
|
import { constructBlockContextArgsOnly } from './block_ctx';
|
|
27
27
|
import { ifNotUndef } from '../cfg_render/util';
|
|
28
|
-
import type
|
|
28
|
+
import { extractCodeWithInfo, type BlockSection } from '@platforma-sdk/model';
|
|
29
29
|
import { computableFromCfgOrRF } from './render';
|
|
30
30
|
import type { NavigationStates } from './navigation_states';
|
|
31
31
|
import { getBlockPackInfo } from './util';
|
|
@@ -154,15 +154,22 @@ export function projectOverview(
|
|
|
154
154
|
|
|
155
155
|
const bp = getBlockPackInfo(prj, id);
|
|
156
156
|
|
|
157
|
-
const { sections, title, inputsValid, sdkVersion }
|
|
157
|
+
const { sections, title, inputsValid, sdkVersion, featureFlags, isIncompatibleWithRuntime }
|
|
158
158
|
= ifNotUndef(bp, ({ bpId, cfg }) => {
|
|
159
|
+
if (!env.runtimeCapabilities.checkCompatibility(cfg.featureFlags)) {
|
|
160
|
+
return {
|
|
161
|
+
isIncompatibleWithRuntime: true,
|
|
162
|
+
featureFlags: cfg.featureFlags,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
159
165
|
const blockCtxArgsOnly = constructBlockContextArgsOnly(prjEntry, id);
|
|
166
|
+
const codeWithInfo = extractCodeWithInfo(cfg);
|
|
160
167
|
return {
|
|
161
168
|
sections: computableFromCfgOrRF(
|
|
162
169
|
env,
|
|
163
170
|
blockCtxArgsOnly,
|
|
164
171
|
cfg.sections,
|
|
165
|
-
|
|
172
|
+
codeWithInfo,
|
|
166
173
|
bpId,
|
|
167
174
|
).wrap({
|
|
168
175
|
recover: (e) => {
|
|
@@ -178,7 +185,7 @@ export function projectOverview(
|
|
|
178
185
|
env,
|
|
179
186
|
blockCtxArgsOnly,
|
|
180
187
|
title,
|
|
181
|
-
|
|
188
|
+
codeWithInfo,
|
|
182
189
|
bpId,
|
|
183
190
|
).wrap({
|
|
184
191
|
recover: (e) => {
|
|
@@ -192,7 +199,7 @@ export function projectOverview(
|
|
|
192
199
|
env,
|
|
193
200
|
blockCtxArgsOnly,
|
|
194
201
|
cfg.inputsValid,
|
|
195
|
-
|
|
202
|
+
codeWithInfo,
|
|
196
203
|
bpId,
|
|
197
204
|
).wrap({
|
|
198
205
|
recover: (e) => {
|
|
@@ -202,7 +209,9 @@ export function projectOverview(
|
|
|
202
209
|
return false;
|
|
203
210
|
},
|
|
204
211
|
}) as ComputableStableDefined<boolean>,
|
|
205
|
-
sdkVersion:
|
|
212
|
+
sdkVersion: codeWithInfo?.sdkVersion,
|
|
213
|
+
featureFlags: codeWithInfo?.featureFlags ?? {},
|
|
214
|
+
isIncompatibleWithRuntime: false,
|
|
206
215
|
};
|
|
207
216
|
}) || {};
|
|
208
217
|
|
|
@@ -239,6 +248,8 @@ export function projectOverview(
|
|
|
239
248
|
currentBlockPack: bp?.info?.source,
|
|
240
249
|
updates,
|
|
241
250
|
sdkVersion,
|
|
251
|
+
featureFlags,
|
|
252
|
+
isIncompatibleWithRuntime,
|
|
242
253
|
navigationState: navigationStates.getState(id),
|
|
243
254
|
};
|
|
244
255
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { BlockCodeWithInfo, TypedConfigOrConfigLambda } from '@platforma-sdk/model';
|
|
2
2
|
import { isConfigLambda } from '@platforma-sdk/model';
|
|
3
3
|
import type { Computable, ComputableRenderingOps } from '@milaboratories/computable';
|
|
4
4
|
import { computableFromCfg } from '../cfg_render/executor';
|
|
@@ -16,12 +16,12 @@ export function computableFromCfgOrRF(
|
|
|
16
16
|
env: MiddleLayerEnvironment,
|
|
17
17
|
ctx: BlockContextAny,
|
|
18
18
|
cfgOrFh: TypedConfigOrConfigLambda,
|
|
19
|
-
|
|
19
|
+
codeWithInfo: BlockCodeWithInfo | undefined,
|
|
20
20
|
configKey: string,
|
|
21
21
|
ops: Partial<ComputableRenderingOps> = {},
|
|
22
22
|
): Computable<unknown> {
|
|
23
23
|
if (isConfigLambda(cfgOrFh)) {
|
|
24
|
-
if (
|
|
25
|
-
return computableFromRF(env, ctx, cfgOrFh,
|
|
24
|
+
if (codeWithInfo === undefined) throw new Error('No code bundle.');
|
|
25
|
+
return computableFromRF(env, ctx, cfgOrFh, codeWithInfo, configKey, ops);
|
|
26
26
|
} else return computableFromCfg(env.driverKit, ctx, cfgOrFh, ops);
|
|
27
27
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { extractCodeWithInfo, type BlockConfig, type PlRef } from '@platforma-sdk/model';
|
|
2
2
|
import { LRUCache } from 'lru-cache';
|
|
3
3
|
import type { QuickJSWASMModule } from 'quickjs-emscripten';
|
|
4
4
|
import { executeSingleLambda } from '../js_render';
|
|
@@ -27,7 +27,7 @@ export class ProjectHelper {
|
|
|
27
27
|
const blockConfig = req.blockConfig();
|
|
28
28
|
if (blockConfig.enrichmentTargets === undefined) return undefined;
|
|
29
29
|
const args = req.args();
|
|
30
|
-
const result = executeSingleLambda(this.quickJs, blockConfig.enrichmentTargets, blockConfig
|
|
30
|
+
const result = executeSingleLambda(this.quickJs, blockConfig.enrichmentTargets, extractCodeWithInfo(blockConfig)!, args) as PlRef[];
|
|
31
31
|
return result;
|
|
32
32
|
}
|
|
33
33
|
|
package/src/pool/driver.ts
CHANGED
|
@@ -38,7 +38,10 @@ import {
|
|
|
38
38
|
extractAllColumns,
|
|
39
39
|
mapDataInfo,
|
|
40
40
|
isDataInfo,
|
|
41
|
+
ensureError,
|
|
41
42
|
} from '@platforma-sdk/model';
|
|
43
|
+
import { LRUCache } from 'lru-cache';
|
|
44
|
+
import type { UnrefFn } from './ref_count_pool';
|
|
42
45
|
import { RefCountResourcePool } from './ref_count_pool';
|
|
43
46
|
import { allBlobs, makeDataInfoFromPColumnValues, mapBlobs, parseDataInfoResource } from './data';
|
|
44
47
|
import { createHash } from 'node:crypto';
|
|
@@ -50,6 +53,8 @@ import * as fsp from 'node:fs/promises';
|
|
|
50
53
|
import * as path from 'node:path';
|
|
51
54
|
import { getDebugFlags } from '../debug';
|
|
52
55
|
|
|
56
|
+
export type PColumnDataUniversal = PlTreeNodeAccessor | DataInfo<PlTreeNodeAccessor> | PColumnValues;
|
|
57
|
+
|
|
53
58
|
function blobKey(res: ResourceInfo): string {
|
|
54
59
|
return String(res.id);
|
|
55
60
|
}
|
|
@@ -81,18 +86,22 @@ function migrateFilters(filters: PTableRecordFilter[]): PTableRecordFilter[] {
|
|
|
81
86
|
return filtersV2;
|
|
82
87
|
}
|
|
83
88
|
|
|
84
|
-
function
|
|
85
|
-
def: PTableDef<
|
|
86
|
-
): PTableDef<
|
|
87
|
-
if (!('partitionFilters' in
|
|
88
|
-
// For old blocks
|
|
89
|
+
function migratePTableFilters<T>(
|
|
90
|
+
def: Omit<PTableDef<T>, 'partitionFilters'> | PTableDef<T>,
|
|
91
|
+
): PTableDef<T> {
|
|
92
|
+
if (!('partitionFilters' in def)) {
|
|
93
|
+
// For old blocks assume all axes filters to be partition filters
|
|
89
94
|
return {
|
|
90
95
|
...def,
|
|
91
|
-
partitionFilters: def.filters,
|
|
92
|
-
filters:
|
|
96
|
+
partitionFilters: migrateFilters(def.filters.filter((f) => f.column.type === 'axis')),
|
|
97
|
+
filters: migrateFilters(def.filters.filter((f) => f.column.type === 'column')),
|
|
93
98
|
};
|
|
94
99
|
}
|
|
95
|
-
return
|
|
100
|
+
return {
|
|
101
|
+
...def,
|
|
102
|
+
partitionFilters: migrateFilters(def.partitionFilters),
|
|
103
|
+
filters: migrateFilters(def.filters),
|
|
104
|
+
};
|
|
96
105
|
}
|
|
97
106
|
|
|
98
107
|
const bigintReplacer = (_: string, v: unknown) => (typeof v === 'bigint' ? v.toString() : v);
|
|
@@ -100,6 +109,7 @@ const bigintReplacer = (_: string, v: unknown) => (typeof v === 'bigint' ? v.toS
|
|
|
100
109
|
class PFrameHolder implements PFrameInternal.PFrameDataSource, Disposable {
|
|
101
110
|
public readonly pFrame: PFrameInternal.PFrameV7;
|
|
102
111
|
private readonly abortController = new AbortController();
|
|
112
|
+
private readonly pTableCache: LRUCache<PTableHandle, UnrefFn>;
|
|
103
113
|
private readonly blobIdToResource = new Map<string, ResourceInfo>();
|
|
104
114
|
private readonly blobHandleComputables = new Map<
|
|
105
115
|
string,
|
|
@@ -141,6 +151,11 @@ class PFrameHolder implements PFrameInternal.PFrameDataSource, Disposable {
|
|
|
141
151
|
`Rust PFrame creation failed, columns: ${JSON.stringify(distinctСolumns)}, error: ${err as Error}`,
|
|
142
152
|
);
|
|
143
153
|
}
|
|
154
|
+
|
|
155
|
+
this.pTableCache = new LRUCache<PTableHandle, UnrefFn>({
|
|
156
|
+
max: 5, // TODO: calculate size on disk, not number of PTables
|
|
157
|
+
dispose: (unref) => unref(),
|
|
158
|
+
});
|
|
144
159
|
}
|
|
145
160
|
|
|
146
161
|
private getOrCreateComputableForBlob(blobId: string) {
|
|
@@ -173,26 +188,38 @@ class PFrameHolder implements PFrameInternal.PFrameDataSource, Disposable {
|
|
|
173
188
|
return this.abortController.signal;
|
|
174
189
|
}
|
|
175
190
|
|
|
191
|
+
public cache(handle: PTableHandle, unref: UnrefFn): void {
|
|
192
|
+
this.pTableCache.set(handle, unref);
|
|
193
|
+
}
|
|
194
|
+
|
|
176
195
|
[Symbol.dispose](): void {
|
|
177
196
|
this.abortController.abort();
|
|
197
|
+
this.pTableCache.clear();
|
|
178
198
|
for (const computable of this.blobHandleComputables.values()) computable.resetState();
|
|
179
199
|
this.pFrame.dispose();
|
|
180
200
|
}
|
|
181
201
|
}
|
|
182
202
|
|
|
183
203
|
class PTableHolder implements Disposable {
|
|
204
|
+
private readonly abortController = new AbortController();
|
|
205
|
+
private readonly combinedDisposeSignal: AbortSignal;
|
|
206
|
+
|
|
184
207
|
constructor(
|
|
208
|
+
pFrameDisposeSignal: AbortSignal,
|
|
185
209
|
public readonly pTable: PFrameInternal.PTableV5,
|
|
186
|
-
private readonly
|
|
187
|
-
) {
|
|
210
|
+
private readonly unrefPredecessor?: UnrefFn,
|
|
211
|
+
) {
|
|
212
|
+
this.combinedDisposeSignal = AbortSignal.any([pFrameDisposeSignal, this.abortController.signal]);
|
|
213
|
+
}
|
|
188
214
|
|
|
189
215
|
public get disposeSignal(): AbortSignal {
|
|
190
|
-
return this.
|
|
216
|
+
return this.combinedDisposeSignal;
|
|
191
217
|
}
|
|
192
218
|
|
|
193
219
|
[Symbol.dispose](): void {
|
|
194
220
|
this.abortController.abort();
|
|
195
221
|
this.pTable.dispose();
|
|
222
|
+
this.unrefPredecessor?.();
|
|
196
223
|
}
|
|
197
224
|
}
|
|
198
225
|
|
|
@@ -217,13 +244,13 @@ export interface InternalPFrameDriver extends SdkPFrameDriver {
|
|
|
217
244
|
|
|
218
245
|
/** Create a new PFrame */
|
|
219
246
|
createPFrame(
|
|
220
|
-
def: PFrameDef<
|
|
247
|
+
def: PFrameDef<PColumnDataUniversal>,
|
|
221
248
|
ctx: ComputableCtx,
|
|
222
249
|
): PFrameHandle;
|
|
223
250
|
|
|
224
251
|
/** Create a new PTable */
|
|
225
252
|
createPTable(
|
|
226
|
-
def: PTableDef<PColumn<
|
|
253
|
+
def: PTableDef<PColumn<PColumnDataUniversal>>,
|
|
227
254
|
ctx: ComputableCtx,
|
|
228
255
|
): PTableHandle;
|
|
229
256
|
|
|
@@ -326,31 +353,47 @@ export class PFrameDriver implements InternalPFrameDriver {
|
|
|
326
353
|
}
|
|
327
354
|
|
|
328
355
|
protected createNewResource(params: FullPTableDef): PTableHolder {
|
|
329
|
-
const handle: PFrameHandle = params.pFrameHandle;
|
|
330
356
|
if (getDebugFlags().logPFrameRequests) {
|
|
331
357
|
logger.info(
|
|
332
358
|
`PTable creation (pTableHandle = ${this.calculateParamsKey(params)}): ${JSON.stringify(params, bigintReplacer)}`,
|
|
333
359
|
);
|
|
334
360
|
}
|
|
335
361
|
|
|
336
|
-
const
|
|
337
|
-
const
|
|
362
|
+
const handle = params.pFrameHandle;
|
|
363
|
+
const { pFrame, disposeSignal } = this.pFrames.getByKey(handle);
|
|
338
364
|
|
|
339
|
-
|
|
340
|
-
src: joinEntryToInternal(params.def.src),
|
|
341
|
-
filters: migrateFilters([...params.def.partitionFilters, ...params.def.filters]),
|
|
342
|
-
});
|
|
343
|
-
|
|
344
|
-
let sortedTable = table;
|
|
365
|
+
// 3. Sort
|
|
345
366
|
if (params.def.sorting.length > 0) {
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
367
|
+
const { resource: { pTable }, unref } = this.acquire({
|
|
368
|
+
...params,
|
|
369
|
+
def: {
|
|
370
|
+
...params.def,
|
|
371
|
+
sorting: [],
|
|
372
|
+
},
|
|
373
|
+
});
|
|
374
|
+
const sortedTable = pTable.sort(params.def.sorting);
|
|
375
|
+
return new PTableHolder(disposeSignal, sortedTable, unref);
|
|
351
376
|
}
|
|
352
377
|
|
|
353
|
-
|
|
378
|
+
// 2. Filter
|
|
379
|
+
if (params.def.filters.length > 0) {
|
|
380
|
+
const { resource: { pTable }, unref } = this.acquire({
|
|
381
|
+
...params,
|
|
382
|
+
def: {
|
|
383
|
+
...params.def,
|
|
384
|
+
filters: [],
|
|
385
|
+
},
|
|
386
|
+
});
|
|
387
|
+
const filteredTable = pTable.filter(params.def.filters);
|
|
388
|
+
return new PTableHolder(disposeSignal, filteredTable, unref);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
// 1. Join
|
|
392
|
+
const table = pFrame.createTable({
|
|
393
|
+
src: joinEntryToInternal(params.def.src),
|
|
394
|
+
filters: params.def.partitionFilters,
|
|
395
|
+
});
|
|
396
|
+
return new PTableHolder(disposeSignal, table);
|
|
354
397
|
}
|
|
355
398
|
|
|
356
399
|
protected calculateParamsKey(params: FullPTableDef): string {
|
|
@@ -364,7 +407,7 @@ export class PFrameDriver implements InternalPFrameDriver {
|
|
|
364
407
|
//
|
|
365
408
|
|
|
366
409
|
public createPFrame(
|
|
367
|
-
def: PFrameDef<
|
|
410
|
+
def: PFrameDef<PColumnDataUniversal>,
|
|
368
411
|
ctx: ComputableCtx,
|
|
369
412
|
): PFrameHandle {
|
|
370
413
|
const internalData = def
|
|
@@ -384,10 +427,10 @@ export class PFrameDriver implements InternalPFrameDriver {
|
|
|
384
427
|
}
|
|
385
428
|
|
|
386
429
|
public createPTable(
|
|
387
|
-
rawDef: PTableDef<PColumn<
|
|
430
|
+
rawDef: PTableDef<PColumn<PColumnDataUniversal>>,
|
|
388
431
|
ctx: ComputableCtx,
|
|
389
432
|
): PTableHandle {
|
|
390
|
-
const def =
|
|
433
|
+
const def = migratePTableFilters(rawDef);
|
|
391
434
|
const pFrameHandle = this.createPFrame(extractAllColumns(def.src), ctx);
|
|
392
435
|
const defIds = mapPTableDef(def, (c) => c.id);
|
|
393
436
|
const res = this.pTables.acquire({ def: defIds, pFrameHandle });
|
|
@@ -424,7 +467,8 @@ export class PFrameDriver implements InternalPFrameDriver {
|
|
|
424
467
|
}]
|
|
425
468
|
: [],
|
|
426
469
|
};
|
|
427
|
-
const
|
|
470
|
+
const { pFrame } = this.pFrames.getByKey(handle);
|
|
471
|
+
const responce = await pFrame.findColumns(iRequest);
|
|
428
472
|
return {
|
|
429
473
|
hits: responce.hits
|
|
430
474
|
.filter((h) => // only exactly matching columns
|
|
@@ -437,11 +481,13 @@ export class PFrameDriver implements InternalPFrameDriver {
|
|
|
437
481
|
}
|
|
438
482
|
|
|
439
483
|
public async getColumnSpec(handle: PFrameHandle, columnId: PObjectId): Promise<PColumnSpec> {
|
|
440
|
-
|
|
484
|
+
const { pFrame } = this.pFrames.getByKey(handle);
|
|
485
|
+
return await pFrame.getColumnSpec(columnId);
|
|
441
486
|
}
|
|
442
487
|
|
|
443
488
|
public async listColumns(handle: PFrameHandle): Promise<PColumnIdAndSpec[]> {
|
|
444
|
-
|
|
489
|
+
const { pFrame } = this.pFrames.getByKey(handle);
|
|
490
|
+
return await pFrame.listColumns();
|
|
445
491
|
}
|
|
446
492
|
|
|
447
493
|
public async calculateTableData(
|
|
@@ -455,36 +501,24 @@ export class PFrameDriver implements InternalPFrameDriver {
|
|
|
455
501
|
`Call calculateTableData, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,
|
|
456
502
|
);
|
|
457
503
|
}
|
|
458
|
-
return await this.frameConcurrencyLimiter.run(async () => {
|
|
459
|
-
const pFrameHolder = this.pFrames.getByKey(handle);
|
|
460
|
-
const combinedSignal = AbortSignal.any([signal, pFrameHolder.disposeSignal].filter((s) => !!s));
|
|
461
|
-
const table = pFrameHolder.pFrame.createTable({
|
|
462
|
-
src: joinEntryToInternal(request.src),
|
|
463
|
-
filters: migrateFilters(request.filters),
|
|
464
|
-
});
|
|
465
504
|
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
table.dispose();
|
|
472
|
-
}
|
|
473
|
-
}
|
|
505
|
+
const { key: pTableHandle, resource: { pTable, disposeSignal }, unref } = this.pTables.acquire({
|
|
506
|
+
pFrameHandle: handle,
|
|
507
|
+
def: migratePTableFilters(request),
|
|
508
|
+
});
|
|
509
|
+
const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));
|
|
474
510
|
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
}
|
|
486
|
-
sortedTable.dispose();
|
|
487
|
-
}
|
|
511
|
+
return await this.frameConcurrencyLimiter.run(async () => {
|
|
512
|
+
this.pFrames.getByKey(handle).cache(pTableHandle as PTableHandle, unref);
|
|
513
|
+
const spec = pTable.getSpec();
|
|
514
|
+
const data = await pTable.getData([...spec.keys()], {
|
|
515
|
+
range,
|
|
516
|
+
signal: combinedSignal,
|
|
517
|
+
});
|
|
518
|
+
return spec.map((spec, i) => ({
|
|
519
|
+
spec: spec,
|
|
520
|
+
data: data[i],
|
|
521
|
+
}));
|
|
488
522
|
});
|
|
489
523
|
}
|
|
490
524
|
|
|
@@ -498,10 +532,12 @@ export class PFrameDriver implements InternalPFrameDriver {
|
|
|
498
532
|
`Call getUniqueValues, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,
|
|
499
533
|
);
|
|
500
534
|
}
|
|
535
|
+
|
|
536
|
+
const { pFrame, disposeSignal } = this.pFrames.getByKey(handle);
|
|
537
|
+
const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));
|
|
538
|
+
|
|
501
539
|
return await this.frameConcurrencyLimiter.run(async () => {
|
|
502
|
-
|
|
503
|
-
const combinedSignal = AbortSignal.any([signal, pFrameHolder.disposeSignal].filter((s) => !!s));
|
|
504
|
-
return await pFrameHolder.pFrame.getUniqueValues({
|
|
540
|
+
return await pFrame.getUniqueValues({
|
|
505
541
|
...request,
|
|
506
542
|
filters: migrateFilters(request.filters),
|
|
507
543
|
}, {
|
|
@@ -515,15 +551,21 @@ export class PFrameDriver implements InternalPFrameDriver {
|
|
|
515
551
|
//
|
|
516
552
|
|
|
517
553
|
public getSpec(handle: PTableHandle): Promise<PTableColumnSpec[]> {
|
|
518
|
-
const pTable = this.pTables.getByKey(handle)
|
|
519
|
-
|
|
554
|
+
const { pTable } = this.pTables.getByKey(handle);
|
|
555
|
+
// TODO: use Promise.try after Electron update
|
|
556
|
+
try {
|
|
557
|
+
return Promise.resolve(pTable.getSpec());
|
|
558
|
+
} catch (err: unknown) {
|
|
559
|
+
return Promise.reject(ensureError(err));
|
|
560
|
+
}
|
|
520
561
|
}
|
|
521
562
|
|
|
522
563
|
public async getShape(handle: PTableHandle, signal?: AbortSignal): Promise<PTableShape> {
|
|
564
|
+
const { pTable, disposeSignal } = this.pTables.getByKey(handle);
|
|
565
|
+
const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));
|
|
566
|
+
|
|
523
567
|
return await this.tableConcurrencyLimiter.run(async () => {
|
|
524
|
-
|
|
525
|
-
const combinedSignal = AbortSignal.any([signal, pTableHolder.disposeSignal].filter((s) => !!s));
|
|
526
|
-
return await pTableHolder.pTable.getShape({
|
|
568
|
+
return await pTable.getShape({
|
|
527
569
|
signal: combinedSignal,
|
|
528
570
|
});
|
|
529
571
|
});
|
|
@@ -535,10 +577,11 @@ export class PFrameDriver implements InternalPFrameDriver {
|
|
|
535
577
|
range: TableRange | undefined,
|
|
536
578
|
signal?: AbortSignal,
|
|
537
579
|
): Promise<PTableVector[]> {
|
|
580
|
+
const { pTable, disposeSignal } = this.pTables.getByKey(handle);
|
|
581
|
+
const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));
|
|
582
|
+
|
|
538
583
|
return await this.tableConcurrencyLimiter.run(async () => {
|
|
539
|
-
|
|
540
|
-
const combinedSignal = AbortSignal.any([signal, pTableHolder.disposeSignal].filter((s) => !!s));
|
|
541
|
-
return await pTableHolder.pTable.getData(columnIndices, {
|
|
584
|
+
return await pTable.getData(columnIndices, {
|
|
542
585
|
range,
|
|
543
586
|
signal: combinedSignal,
|
|
544
587
|
});
|