@milaboratories/pl-middle-layer 1.32.5 → 1.32.6

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.
@@ -23,8 +23,6 @@ export declare class PFrameDriver implements InternalPFrameDriver {
23
23
  private readonly pFrames;
24
24
  private readonly pTables;
25
25
  private readonly blobContentCache;
26
- /** Limits concurrent requests to PFrame API to prevent deadlock with Node's IO threads */
27
- private readonly concurrencyLimiter;
28
26
  constructor(blobDriver: DownloadDriver, logger: MiLogger);
29
27
  createPFrame(def: PFrameDef<PlTreeNodeAccessor | PColumnValues | DataInfo<PlTreeNodeAccessor>>, ctx: ComputableCtx): PFrameHandle;
30
28
  createPTable(def: PTableDef<PColumn<PlTreeNodeAccessor | PColumnValues | DataInfo<PlTreeNodeAccessor>>>, ctx: ComputableCtx, signal?: AbortSignal): PTableHandle;
@@ -1 +1 @@
1
- {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/pool/driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,yBAAyB,CAAC;AAEhF,OAAO,KAAK,EAAE,aAAa,EAA2B,MAAM,4BAA4B,CAAC;AACzF,OAAO,KAAK,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,EAEnB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,UAAU,EACV,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,IAAI,eAAe,EAC/B,OAAO,EACP,SAAS,EAET,SAAS,EAIT,aAAa,EACb,QAAQ,EACT,MAAM,sBAAsB,CAAC;AAW9B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAqN3D;;;GAGG;AACH,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IAC3D,0BAA0B;IAC1B,YAAY,CACV,GAAG,EAAE,SAAS,CAAC,kBAAkB,GAAG,aAAa,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC,EACjF,GAAG,EAAE,aAAa,GACjB,YAAY,CAAC;IAEhB,0BAA0B;IAC1B,YAAY,CACV,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,kBAAkB,GAAG,aAAa,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAC1F,GAAG,EAAE,aAAa,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,YAAY,CAAC;IAEhB,mFAAmF;IACnF,kBAAkB,CAChB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,yBAAyB,CAAC,SAAS,CAAC,EAC7C,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAEvC,yFAAyF;IACzF,eAAe,CACb,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,mBAAmB,EAC5B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAClC;AAED,qBAAa,YAAa,YAAW,oBAAoB;IAQrD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IARzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyD;IACjF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoD;IAC5E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA+B;IAChE,0FAA0F;IAC1F,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA8B;gBAG9C,UAAU,EAAE,cAAc,EAC1B,MAAM,EAAE,QAAQ;IAmG5B,YAAY,CACjB,GAAG,EAAE,SAAS,CAAC,kBAAkB,GAAG,aAAa,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC,EACjF,GAAG,EAAE,aAAa,GACjB,YAAY;IAiBR,YAAY,CACjB,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,kBAAkB,GAAG,aAAa,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAC1F,GAAG,EAAE,aAAa,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,YAAY;IAmBF,WAAW,CACtB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,mBAAmB,CAAC;IA2BlB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAI9E,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAI9D,kBAAkB,CAC7B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,yBAAyB,CAAC,SAAS,CAAC,EAC7C,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,0BAA0B,CAAC;IAoEzB,eAAe,CAC1B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,mBAAmB,EAC5B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,oBAAoB,CAAC;IAgCnB,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAKpD,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAK1D,OAAO,CAClB,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,MAAM,EAAE,EACvB,KAAK,CAAC,EAAE,UAAU,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC;CAM3B"}
1
+ {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/pool/driver.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milaboratories/pl-middle-layer",
3
- "version": "1.32.5",
3
+ "version": "1.32.6",
4
4
  "description": "Pl Middle Layer",
5
5
  "engines": {
6
6
  "node": ">=20.16.0"
@@ -22,8 +22,7 @@
22
22
  "keywords": [],
23
23
  "license": "UNLICENSED",
24
24
  "dependencies": {
25
- "@milaboratories/pframes-node": "2.1.20",
26
- "@milaboratories/pframes-rs-node": "1.0.24",
25
+ "@milaboratories/pframes-rs-node": "1.0.26",
27
26
  "canonicalize": "~2.1.0",
28
27
  "denque": "^2.1.0",
29
28
  "lru-cache": "^11.1.0",
@@ -34,20 +33,20 @@
34
33
  "zod": "~3.23.8",
35
34
  "@milaboratories/pl-http": "^1.1.2",
36
35
  "@milaboratories/computable": "^2.4.2",
37
- "@milaboratories/resolve-helper": "^1.1.0",
38
- "@platforma-sdk/block-tools": "^2.5.32",
39
- "@milaboratories/pl-drivers": "^1.5.38",
40
- "@milaboratories/pl-model-common": "^1.13.1",
41
36
  "@milaboratories/pl-client": "^2.7.14",
42
- "@milaboratories/pl-model-middle-layer": "^1.7.19",
37
+ "@milaboratories/resolve-helper": "^1.1.0",
38
+ "@milaboratories/pl-drivers": "^1.5.39",
39
+ "@platforma-sdk/block-tools": "^2.5.33",
40
+ "@milaboratories/pl-model-common": "^1.13.2",
43
41
  "@milaboratories/pl-model-backend": "^1.0.3",
44
- "@platforma-sdk/model": "^1.27.6",
42
+ "@milaboratories/pl-model-middle-layer": "^1.7.20",
43
+ "@platforma-sdk/model": "^1.27.8",
45
44
  "@milaboratories/pl-tree": "^1.5.2",
45
+ "@platforma-sdk/workflow-tengo": "3.2.1",
46
46
  "@milaboratories/ts-helpers": "^1.1.5",
47
+ "@milaboratories/pl-errors": "^1.0.3",
47
48
  "@milaboratories/pl-config": "^1.4.5",
48
- "@platforma-sdk/workflow-tengo": "3.2.1",
49
- "@milaboratories/pl-deployments": "^1.7.1",
50
- "@milaboratories/pl-errors": "^1.0.3"
49
+ "@milaboratories/pl-deployments": "^1.7.1"
51
50
  },
52
51
  "devDependencies": {
53
52
  "semver": "^7.6.3",
@@ -1,6 +1,5 @@
1
1
  export type MlDebugFlags = {
2
2
  logPFrameRequests: boolean;
3
- usePFrameRs: boolean;
4
3
  logTreeStats?: 'cumulative' | 'per-request';
5
4
  dumpInitialTreeState: boolean;
6
5
  };
@@ -10,7 +9,6 @@ export function getDebugFlags() {
10
9
  if (flags) return flags;
11
10
  flags = {
12
11
  logPFrameRequests: process.env.MI_LOG_PFRAMES !== undefined,
13
- usePFrameRs: process.env.MI_USE_PFRAMES_RS !== undefined,
14
12
  dumpInitialTreeState: process.env.MI_DUMP_INITIAL_TREE_STATE !== undefined,
15
13
  };
16
14
  if (process.env.MI_LOG_TREE_STAT)
@@ -44,11 +44,9 @@ import { createHash } from 'node:crypto';
44
44
  import type { MiLogger } from '@milaboratories/ts-helpers';
45
45
  import { assertNever } from '@milaboratories/ts-helpers';
46
46
  import canonicalize from 'canonicalize';
47
- import { PFrame } from '@milaboratories/pframes-node';
48
47
  import { PFrame as PFrameRs } from '@milaboratories/pframes-rs-node';
49
48
  import * as fsp from 'node:fs/promises';
50
49
  import { LRUCache } from 'lru-cache';
51
- import { ConcurrencyLimitingExecutor } from '@milaboratories/ts-helpers';
52
50
  import { getDebugFlags } from '../debug';
53
51
 
54
52
  function blobKey(res: ResourceInfo): string {
@@ -82,48 +80,16 @@ function migrateFilters(filters: PTableRecordFilter[]): PTableRecordFilter[] {
82
80
  return filtersV2;
83
81
  }
84
82
 
85
- function pframesDispatch<T>(params: {
86
- cppCallback: () => Promise<T>;
87
- rustCallback: () => Promise<T>;
88
- logger: MiLogger;
89
- filters?: PTableRecordFilter[];
90
- signal?: AbortSignal;
91
- }): Promise<T> {
92
- if (getDebugFlags().usePFrameRs) return params.rustCallback();
93
-
94
- return params.rustCallback().catch((error: unknown) => {
95
- if (params.signal?.aborted === false) {
96
- if (error instanceof Error) {
97
- params.logger.warn(`PFrames Rust failed, error: ${error.message}`);
98
- }
99
- return params.cppCallback();
100
- } else {
101
- throw error;
102
- }
103
- });
104
- }
105
-
106
83
  const bigintReplacer = (_: string, v: unknown) => (typeof v === 'bigint' ? v.toString() : v);
107
84
 
108
85
  class PFrameHolder implements PFrameInternal.PFrameDataSource, Disposable {
109
- public readonly rustPFrame: PFrameInternal.PFrameV3;
86
+ public readonly rustPFrame: PFrameInternal.PFrameV4;
110
87
  private readonly blobIdToResource = new Map<string, ResourceInfo>();
111
88
  private readonly blobHandleComputables = new Map<
112
89
  string,
113
90
  ComputableStableDefined<LocalBlobHandleAndSize>
114
91
  >();
115
92
 
116
- private readonly createDataPFrame: () => PFrameInternal.PFrameV3;
117
- public get disposableDataPFrame() {
118
- const dataPFrame = this.createDataPFrame();
119
- return {
120
- dataPFrame,
121
- [Symbol.dispose]: () => {
122
- dataPFrame.dispose();
123
- },
124
- };
125
- }
126
-
127
93
  constructor(
128
94
  private readonly blobDriver: DownloadDriver,
129
95
  private readonly logger: MiLogger,
@@ -156,43 +122,19 @@ class PFrameHolder implements PFrameInternal.PFrameDataSource, Disposable {
156
122
  )).values(),
157
123
  ];
158
124
 
159
- this.rustPFrame = ((): PFrameInternal.PFrameV3 => {
160
- try {
161
- const pFrame = new PFrameRs(getDebugFlags().logPFrameRequests ? logFunc : undefined);
162
- pFrame.setDataSource(this);
163
- for (const column of distinctСolumns) {
164
- pFrame.addColumnSpec(column.id, column.spec);
165
- pFrame.setColumnData(column.id, column.data);
166
- }
167
- return pFrame;
168
- } catch (err: unknown) {
169
- throw new Error(
170
- `Rust PFrame creation failed, columns: ${JSON.stringify(distinctСolumns)}, error: ${err as Error}`,
171
- );
172
- }
173
- })();
174
-
175
- this.createDataPFrame = (): PFrameInternal.PFrameV3 => {
176
- try {
177
- const pFrame = getDebugFlags().logPFrameRequests ? new PFrame(logFunc) : new PFrame();
178
- pFrame.setDataSource(this);
179
- for (const column of distinctСolumns) {
180
- try {
181
- pFrame.addColumnSpec(column.id, column.spec);
182
- pFrame.setColumnData(column.id, column.data);
183
- } catch (err: unknown) {
184
- throw new Error(
185
- `Adding column ${column.id} to PFrame failed: ${err as Error}; Spec: ${JSON.stringify(column.spec)}, DataInfo: ${JSON.stringify(column.data)}.`,
186
- );
187
- }
188
- }
189
- return pFrame;
190
- } catch (err: unknown) {
191
- throw new Error(
192
- `Data PFrame creation failed, columns: ${JSON.stringify(distinctСolumns)}, error: ${err as Error}`,
193
- );
125
+ try {
126
+ const pFrame = new PFrameRs(getDebugFlags().logPFrameRequests ? logFunc : undefined);
127
+ pFrame.setDataSource(this);
128
+ for (const column of distinctСolumns) {
129
+ pFrame.addColumnSpec(column.id, column.spec);
130
+ pFrame.setColumnData(column.id, column.data);
194
131
  }
195
- };
132
+ this.rustPFrame = pFrame;
133
+ } catch (err: unknown) {
134
+ throw new Error(
135
+ `Rust PFrame creation failed, columns: ${JSON.stringify(distinctСolumns)}, error: ${err as Error}`,
136
+ );
137
+ }
196
138
  }
197
139
 
198
140
  private getOrCreateComputableForBlob(blobId: string) {
@@ -291,8 +233,6 @@ export class PFrameDriver implements InternalPFrameDriver {
291
233
  private readonly pFrames: RefCountResourcePool<InternalPFrameData, PFrameHolder>;
292
234
  private readonly pTables: RefCountResourcePool<FullPTableDef, PTableHolder>;
293
235
  private readonly blobContentCache: LRUCache<string, Uint8Array>;
294
- /** Limits concurrent requests to PFrame API to prevent deadlock with Node's IO threads */
295
- private readonly concurrencyLimiter: ConcurrencyLimitingExecutor;
296
236
 
297
237
  constructor(
298
238
  private readonly blobDriver: DownloadDriver,
@@ -305,9 +245,6 @@ export class PFrameDriver implements InternalPFrameDriver {
305
245
  });
306
246
  this.blobContentCache = blobContentCache;
307
247
 
308
- const concurrencyLimiter = new ConcurrencyLimitingExecutor(1);
309
- this.concurrencyLimiter = concurrencyLimiter;
310
-
311
248
  this.pFrames = new (class extends RefCountResourcePool<InternalPFrameData, PFrameHolder> {
312
249
  constructor(
313
250
  private readonly blobDriver: DownloadDriver,
@@ -346,41 +283,16 @@ export class PFrameDriver implements InternalPFrameDriver {
346
283
  `PTable creation (pTableHandle = ${this.calculateParamsKey(params)}): ${JSON.stringify(params, bigintReplacer)}`,
347
284
  );
348
285
  }
349
- const tablePromise = pframesDispatch({
350
- cppCallback: () => {
351
- return concurrencyLimiter.run(async () => {
352
- using disposableDataPFrame = this.pFrames.getByKey(handle).disposableDataPFrame;
353
- return await disposableDataPFrame.dataPFrame.createTable({
354
- src: joinEntryToInternal(params.def.src),
355
- filters: migrateFilters(params.def.filters),
356
- }, params.signal);
357
- }).then(async (table) => {
358
- if (params.def.sorting.length === 0) return table;
359
- try {
360
- return await concurrencyLimiter.run(async () => {
361
- return await table.sort(params.def.sorting, params.signal);
362
- });
363
- } finally {
364
- table.dispose();
365
- }
366
- });
367
- },
368
- rustCallback: () => {
369
- return this.pFrames.getByKey(handle).rustPFrame.createTable({
370
- src: joinEntryToInternal(params.def.src),
371
- filters: migrateFilters(params.def.filters),
372
- }, params.signal).then(async (table) => {
373
- if (params.def.sorting.length === 0) return table;
374
- try {
375
- return await table.sort(params.def.sorting, params.signal);
376
- } finally {
377
- table.dispose();
378
- }
379
- });
380
- },
381
- logger,
382
- filters: params.def.filters,
383
- signal: params.signal,
286
+ const tablePromise = this.pFrames.getByKey(handle).rustPFrame.createTable({
287
+ src: joinEntryToInternal(params.def.src),
288
+ filters: migrateFilters(params.def.filters),
289
+ }, params.signal).then(async (table) => {
290
+ if (params.def.sorting.length === 0) return table;
291
+ try {
292
+ return await table.sort(params.def.sorting, params.signal);
293
+ } finally {
294
+ table.dispose();
295
+ }
384
296
  });
385
297
  return new PTableHolder(tablePromise);
386
298
  }
@@ -486,65 +398,27 @@ export class PFrameDriver implements InternalPFrameDriver {
486
398
  `Call calculateTableData, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,
487
399
  );
488
400
  }
489
- return await pframesDispatch({
490
- cppCallback: async () => {
491
- return await this.concurrencyLimiter.run(async () => {
492
- using disposableDataPFrame = this.pFrames.getByKey(handle).disposableDataPFrame;
493
- return await disposableDataPFrame.dataPFrame.createTable({
494
- src: joinEntryToInternal(request.src),
495
- filters: migrateFilters(request.filters),
496
- }, signal);
497
- }).then(async (table) => {
498
- if (request.sorting.length === 0) return table;
499
- try {
500
- return await this.concurrencyLimiter.run(async () => {
501
- return await table.sort(request.sorting, signal);
502
- });
503
- } finally {
504
- table.dispose();
505
- }
506
- }).then(async (table) => {
507
- try {
508
- const spec = table.getSpec();
509
- const data = await this.concurrencyLimiter.run(
510
- async () => await table.getData([...spec.keys()]),
511
- );
512
- return spec.map((spec, i) => ({
513
- spec: spec,
514
- data: data[i],
515
- }));
516
- } finally {
517
- table.dispose();
518
- }
519
- });
520
- },
521
- rustCallback: async () => {
522
- return await this.pFrames.getByKey(handle).rustPFrame.createTable({
523
- src: joinEntryToInternal(request.src),
524
- filters: migrateFilters(request.filters),
525
- }, signal).then(async (table) => {
526
- if (request.sorting.length === 0) return table;
527
- try {
528
- return await table.sort(request.sorting, signal);
529
- } finally {
530
- table.dispose();
531
- }
532
- }).then(async (table) => {
533
- try {
534
- const spec = table.getSpec();
535
- const data = await table.getData([...spec.keys()]);
536
- return spec.map((spec, i) => ({
537
- spec: spec,
538
- data: data[i],
539
- }));
540
- } finally {
541
- table.dispose();
542
- }
543
- });
544
- },
545
- logger: this.logger,
546
- filters: request.filters,
547
- signal,
401
+ return await this.pFrames.getByKey(handle).rustPFrame.createTable({
402
+ src: joinEntryToInternal(request.src),
403
+ filters: migrateFilters(request.filters),
404
+ }, signal).then(async (table) => {
405
+ if (request.sorting.length === 0) return table;
406
+ try {
407
+ return await table.sort(request.sorting, signal);
408
+ } finally {
409
+ table.dispose();
410
+ }
411
+ }).then(async (table) => {
412
+ try {
413
+ const spec = table.getSpec();
414
+ const data = await table.getData([...spec.keys()]);
415
+ return spec.map((spec, i) => ({
416
+ spec: spec,
417
+ data: data[i],
418
+ }));
419
+ } finally {
420
+ table.dispose();
421
+ }
548
422
  });
549
423
  }
550
424
 
@@ -558,26 +432,10 @@ export class PFrameDriver implements InternalPFrameDriver {
558
432
  `Call getUniqueValues, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,
559
433
  );
560
434
  }
561
- return await pframesDispatch({
562
- cppCallback: async () => {
563
- return await this.concurrencyLimiter.run(async () => {
564
- using disposableDataPFrame = this.pFrames.getByKey(handle).disposableDataPFrame;
565
- return await disposableDataPFrame.dataPFrame.getUniqueValues({
566
- ...request,
567
- filters: migrateFilters(request.filters),
568
- }, signal);
569
- });
570
- },
571
- rustCallback: async () => {
572
- return await this.pFrames.getByKey(handle).rustPFrame.getUniqueValues({
573
- ...request,
574
- filters: migrateFilters(request.filters),
575
- }, signal);
576
- },
577
- logger: this.logger,
578
- filters: request.filters,
579
- signal,
580
- });
435
+ return await this.pFrames.getByKey(handle).rustPFrame.getUniqueValues({
436
+ ...request,
437
+ filters: migrateFilters(request.filters),
438
+ }, signal);
581
439
  }
582
440
 
583
441
  //
@@ -600,19 +458,23 @@ export class PFrameDriver implements InternalPFrameDriver {
600
458
  range?: TableRange,
601
459
  ): Promise<PTableVector[]> {
602
460
  const pTable = await this.pTables.getByKey(handle).table;
603
- return await this.concurrencyLimiter.run(
604
- async () => await pTable.getData(columnIndices, range),
605
- );
461
+ return await pTable.getData(columnIndices, range);
606
462
  }
607
463
  }
608
464
 
609
- function joinEntryToInternal(entry: JoinEntry<PObjectId>): PFrameInternal.JoinEntry {
465
+ function joinEntryToInternal(entry: JoinEntry<PObjectId>): PFrameInternal.JoinEntryV2 {
610
466
  switch (entry.type) {
611
467
  case 'column':
612
468
  return {
613
469
  type: 'column',
614
470
  columnId: entry.column,
615
- qualifications: [],
471
+ };
472
+ case 'slicedColumn':
473
+ return {
474
+ type: 'slicedColumn',
475
+ columnId: entry.column,
476
+ newId: entry.newId,
477
+ axisFilters: entry.axisFilters,
616
478
  };
617
479
  case 'inner':
618
480
  case 'full':