@milaboratories/pf-driver 1.1.1 → 1.3.0

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.
@@ -5,8 +5,8 @@ import { PTablePool } from "./ptable_pool.js";
5
5
  import { PTableCachePerFrame, PTableCachePerFrameOpsDefaults } from "./ptable_cache_per_frame.js";
6
6
  import { PTableCachePlain, PTableCachePlainOpsDefaults } from "./ptable_cache_plain.js";
7
7
  import { _usingCtx } from "./_virtual/_@oxc-project_runtime@0.114.0/helpers/usingCtx.js";
8
- import { ValueType, bigintReplacer, canonicalizeJson, collectSpecQueryColumns, extractAllColumns, mapPObjectData, mapPTableDef, mapSpecQueryColumns, sortPTableDef, sortSpecQuery, uniqueBy } from "@milaboratories/pl-model-common";
9
- import { ConcurrencyLimitingExecutor } from "@milaboratories/ts-helpers";
8
+ import { ValueType, bigintReplacer, canonicalizeJson, collectSpecQueryColumns, extractAllColumns, mapPObjectData, mapPTableDef, mapSpecQueryColumns, resolveAnnotationParents, sortPTableDef, sortSpecQuery, uniqueBy } from "@milaboratories/pl-model-common";
9
+ import { ConcurrencyLimitingExecutor, PoolEntryGuard } from "@milaboratories/ts-helpers";
10
10
  import { PFrameFactory } from "@milaboratories/pframes-rs-node";
11
11
  import { tmpdir } from "node:os";
12
12
  import { createPFrame } from "@milaboratories/pframes-rs-wasm";
@@ -47,62 +47,88 @@ var AbstractPFrameDriver = class {
47
47
  this.pTableCachePlain = new PTableCachePlain(this.logger, options);
48
48
  }
49
49
  async dispose() {
50
- return await this.remoteBlobProvider[Symbol.asyncDispose]();
50
+ await Promise.allSettled([
51
+ this.pTables[Symbol.asyncDispose](),
52
+ this.pTableDefs[Symbol.asyncDispose](),
53
+ this.pFrames[Symbol.asyncDispose](),
54
+ this.localBlobProvider[Symbol.asyncDispose](),
55
+ this.remoteBlobProvider[Symbol.asyncDispose]()
56
+ ]);
51
57
  }
52
58
  async [Symbol.asyncDispose]() {
53
59
  return await this.dispose();
54
60
  }
55
61
  createPFrame(def) {
56
62
  const ValueTypes = new Set(Object.values(ValueType));
57
- const columns = uniqueBy(def.filter((column) => ValueTypes.has(column.spec.valueType)), (column) => column.id).map((c) => mapPObjectData(c, (d) => this.resolveDataInfo(c.spec, d)));
63
+ const columns = uniqueBy(def.filter((column) => ValueTypes.has(column.spec.valueType)).map((c) => ({
64
+ ...c,
65
+ spec: resolveAnnotationParents(c.spec)
66
+ })), (column) => column.id).map((c) => mapPObjectData(c, (d) => this.resolveDataInfo(c.spec, d)));
58
67
  return this.pFrames.acquire(columns);
59
68
  }
60
69
  createPTable(rawDef) {
61
- const pFrameEntry = this.createPFrame(extractAllColumns(rawDef.src));
62
- const sortedDef = sortPTableDef(migrateTableFilter(mapPTableDef(rawDef, (c) => c.id), this.logger));
63
- const pTableEntry = this.pTableDefs.acquire({
64
- type: "v1",
65
- def: sortedDef,
66
- pFrameHandle: pFrameEntry.key
67
- });
68
- if (logPFrames()) this.logger("info", `Create PTable call (pFrameHandle = ${pFrameEntry.key}; pTableHandle = ${pTableEntry.key})`);
69
- const unref = () => {
70
- pTableEntry.unref();
71
- pFrameEntry.unref();
72
- };
73
- return {
74
- key: pTableEntry.key,
75
- resource: pTableEntry.resource,
76
- unref,
77
- [Symbol.dispose]: unref
78
- };
70
+ try {
71
+ var _usingCtx$1 = _usingCtx();
72
+ const pFrameGuard = _usingCtx$1.u(new PoolEntryGuard(this.createPFrame(extractAllColumns(rawDef.src))));
73
+ const sortedDef = sortPTableDef(migrateTableFilter(mapPTableDef(rawDef, (c) => c.id), this.logger));
74
+ const pTableEntry = this.pTableDefs.acquire({
75
+ type: "v1",
76
+ def: sortedDef,
77
+ pFrameHandle: pFrameGuard.key
78
+ });
79
+ if (logPFrames()) this.logger("info", `Create PTable call (pFrameHandle = ${pFrameGuard.key}; pTableHandle = ${pTableEntry.key})`);
80
+ const pFrameEntry = pFrameGuard.keep();
81
+ const unref = () => {
82
+ pTableEntry.unref();
83
+ pFrameEntry.unref();
84
+ };
85
+ return {
86
+ key: pTableEntry.key,
87
+ resource: pTableEntry.resource,
88
+ unref,
89
+ [Symbol.dispose]: unref
90
+ };
91
+ } catch (_) {
92
+ _usingCtx$1.e = _;
93
+ } finally {
94
+ _usingCtx$1.d();
95
+ }
79
96
  }
80
97
  createPTableV2(def) {
81
- const columns = uniqueBy(collectSpecQueryColumns(def.query), (c) => c.id);
82
- const columnsMap = columns.reduce((acc, col) => (acc[col.id] = col.spec, acc), {});
83
- const pFrameEntry = this.createPFrame(columns);
84
- const specFrame = createPFrame(columnsMap);
85
- const sortedQuery = sortSpecQuery(mapSpecQueryColumns(def.query, (c) => c.id));
86
- const { tableSpec, dataQuery } = specFrame.evaluateQuery(sortedQuery);
87
- const pTableEntry = this.pTableDefs.acquire({
88
- type: "v2",
89
- pFrameHandle: pFrameEntry.key,
90
- def: {
91
- tableSpec,
92
- dataQuery
93
- }
94
- });
95
- if (logPFrames()) this.logger("info", `Create PTable call (pFrameHandle = ${pFrameEntry.key}; pTableHandle = ${pTableEntry.key})`);
96
- const unref = () => {
97
- pTableEntry.unref();
98
- pFrameEntry.unref();
99
- };
100
- return {
101
- key: pTableEntry.key,
102
- resource: pTableEntry.resource,
103
- unref,
104
- [Symbol.dispose]: unref
105
- };
98
+ try {
99
+ var _usingCtx3 = _usingCtx();
100
+ const columns = uniqueBy(collectSpecQueryColumns(def.query), (c) => c.id);
101
+ const columnsMap = columns.reduce((acc, col) => (acc[col.id] = col.spec, acc), {});
102
+ const pFrameGuard = _usingCtx3.u(new PoolEntryGuard(this.createPFrame(columns)));
103
+ const ValueTypes = new Set(Object.values(ValueType));
104
+ const specFrame = createPFrame(Object.fromEntries(Object.entries(columnsMap).filter(([, spec]) => ValueTypes.has(spec.valueType)).map(([id, spec]) => [id, resolveAnnotationParents(spec)])));
105
+ const sortedQuery = sortSpecQuery(mapSpecQueryColumns(def.query, (c) => c.id));
106
+ const { tableSpec, dataQuery } = specFrame.evaluateQuery(sortedQuery);
107
+ const pTableEntry = this.pTableDefs.acquire({
108
+ type: "v2",
109
+ pFrameHandle: pFrameGuard.key,
110
+ def: {
111
+ tableSpec,
112
+ dataQuery
113
+ }
114
+ });
115
+ if (logPFrames()) this.logger("info", `Create PTable call (pFrameHandle = ${pFrameGuard.key}; pTableHandle = ${pTableEntry.key})`);
116
+ const pFrameEntry = pFrameGuard.keep();
117
+ const unref = () => {
118
+ pTableEntry.unref();
119
+ pFrameEntry.unref();
120
+ };
121
+ return {
122
+ key: pTableEntry.key,
123
+ resource: pTableEntry.resource,
124
+ unref,
125
+ [Symbol.dispose]: unref
126
+ };
127
+ } catch (_) {
128
+ _usingCtx3.e = _;
129
+ } finally {
130
+ _usingCtx3.d();
131
+ }
106
132
  }
107
133
  async findColumns(handle, request) {
108
134
  const iRequest = {
@@ -124,33 +150,35 @@ var AbstractPFrameDriver = class {
124
150
  return await (await pFramePromise).listColumns();
125
151
  }
126
152
  async calculateTableData(handle, request, range, signal) {
127
- if (logPFrames()) this.logger("info", `Call calculateTableData, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`);
128
- const table = this.pTables.acquire({
129
- type: "v1",
130
- pFrameHandle: handle,
131
- def: sortPTableDef(migrateTableFilter(request, this.logger))
132
- });
133
- const { pTablePromise, disposeSignal } = table.resource;
134
- const pTable = await pTablePromise;
135
- const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));
136
- return await this.frameConcurrencyLimiter.run(async () => {
137
- try {
153
+ try {
154
+ var _usingCtx4 = _usingCtx();
155
+ if (logPFrames()) this.logger("info", `Call calculateTableData, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`);
156
+ const tableGuard = _usingCtx4.u(new PoolEntryGuard(this.pTables.acquire({
157
+ type: "v1",
158
+ pFrameHandle: handle,
159
+ def: sortPTableDef(migrateTableFilter(request, this.logger))
160
+ })));
161
+ const { pTablePromise, disposeSignal } = tableGuard.resource;
162
+ const pTable = await pTablePromise;
163
+ const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));
164
+ return await this.frameConcurrencyLimiter.run(async () => {
138
165
  const spec = pTable.getSpec();
139
166
  const data = await pTable.getData([...spec.keys()], {
140
167
  range,
141
168
  signal: combinedSignal
142
169
  });
143
170
  const overallSize = await pTable.getFootprint({ signal: combinedSignal });
144
- this.pTableCachePerFrame.cache(table, overallSize);
171
+ this.pTableCachePerFrame.cache(tableGuard.keep(), overallSize);
145
172
  return spec.map((spec, i) => ({
146
173
  spec,
147
174
  data: data[i]
148
175
  }));
149
- } catch (err) {
150
- table.unref();
151
- throw err;
152
- }
153
- });
176
+ });
177
+ } catch (_) {
178
+ _usingCtx4.e = _;
179
+ } finally {
180
+ _usingCtx4.d();
181
+ }
154
182
  }
155
183
  async getUniqueValues(handle, request, signal) {
156
184
  if (logPFrames()) this.logger("info", `Call getUniqueValues, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`);
@@ -166,48 +194,62 @@ var AbstractPFrameDriver = class {
166
194
  }
167
195
  async getSpec(handle) {
168
196
  try {
169
- var _usingCtx$1 = _usingCtx();
197
+ var _usingCtx5 = _usingCtx();
170
198
  const { def } = this.pTableDefs.getByKey(handle);
171
- const { pTablePromise } = _usingCtx$1.u(this.pTables.acquire(def)).resource;
199
+ const { pTablePromise } = _usingCtx5.u(this.pTables.acquire(def)).resource;
172
200
  return (await pTablePromise).getSpec();
173
201
  } catch (_) {
174
- _usingCtx$1.e = _;
202
+ _usingCtx5.e = _;
175
203
  } finally {
176
- _usingCtx$1.d();
204
+ _usingCtx5.d();
177
205
  }
178
206
  }
179
207
  async getShape(handle, signal) {
180
- const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);
181
- const table = this.pTables.acquire(def);
182
- const { pTablePromise, disposeSignal } = table.resource;
183
- const pTable = await pTablePromise;
184
- const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));
185
- const { shape, overallSize } = await this.tableConcurrencyLimiter.run(async () => {
186
- return {
187
- shape: await pTable.getShape({ signal: combinedSignal }),
188
- overallSize: await pTable.getFootprint({ signal: combinedSignal })
189
- };
190
- });
191
- this.pTableCachePlain.cache(table, overallSize, defDisposeSignal);
192
- return shape;
208
+ try {
209
+ var _usingCtx6 = _usingCtx();
210
+ const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);
211
+ const tableGuard = _usingCtx6.u(new PoolEntryGuard(this.pTables.acquire(def)));
212
+ const { pTablePromise, disposeSignal } = tableGuard.resource;
213
+ const pTable = await pTablePromise;
214
+ const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));
215
+ const { shape, overallSize } = await this.tableConcurrencyLimiter.run(async () => {
216
+ return {
217
+ shape: await pTable.getShape({ signal: combinedSignal }),
218
+ overallSize: await pTable.getFootprint({ signal: combinedSignal })
219
+ };
220
+ });
221
+ this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);
222
+ return shape;
223
+ } catch (_) {
224
+ _usingCtx6.e = _;
225
+ } finally {
226
+ _usingCtx6.d();
227
+ }
193
228
  }
194
229
  async getData(handle, columnIndices, range, signal) {
195
- const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);
196
- const table = this.pTables.acquire(def);
197
- const { pTablePromise, disposeSignal } = table.resource;
198
- const pTable = await pTablePromise;
199
- const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));
200
- const { data, overallSize } = await this.tableConcurrencyLimiter.run(async () => {
201
- return {
202
- data: await pTable.getData(columnIndices, {
203
- range,
204
- signal: combinedSignal
205
- }),
206
- overallSize: await pTable.getFootprint({ signal: combinedSignal })
207
- };
208
- });
209
- this.pTableCachePlain.cache(table, overallSize, defDisposeSignal);
210
- return data;
230
+ try {
231
+ var _usingCtx7 = _usingCtx();
232
+ const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);
233
+ const tableGuard = _usingCtx7.u(new PoolEntryGuard(this.pTables.acquire(def)));
234
+ const { pTablePromise, disposeSignal } = tableGuard.resource;
235
+ const pTable = await pTablePromise;
236
+ const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));
237
+ const { data, overallSize } = await this.tableConcurrencyLimiter.run(async () => {
238
+ return {
239
+ data: await pTable.getData(columnIndices, {
240
+ range,
241
+ signal: combinedSignal
242
+ }),
243
+ overallSize: await pTable.getFootprint({ signal: combinedSignal })
244
+ };
245
+ });
246
+ this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);
247
+ return data;
248
+ } catch (_) {
249
+ _usingCtx7.e = _;
250
+ } finally {
251
+ _usingCtx7.d();
252
+ }
211
253
  }
212
254
  };
213
255
  function migrateFilters(filters, logger) {
@@ -1 +1 @@
1
- {"version":3,"file":"driver_impl.js","names":["createSpecFrame"],"sources":["../src/driver_impl.ts"],"sourcesContent":["import {\n mapPObjectData,\n mapPTableDef,\n extractAllColumns,\n uniqueBy,\n canonicalizeJson,\n bigintReplacer,\n ValueType,\n type CalculateTableDataRequest,\n type CalculateTableDataResponse,\n type FindColumnsRequest,\n type FindColumnsResponse,\n type PColumnIdAndSpec,\n type PColumnSpec,\n type PFrameHandle,\n type PObjectId,\n type PTableColumnSpec,\n type PTableHandle,\n type PTableShape,\n type PTableVector,\n type TableRange,\n type UniqueValuesRequest,\n type UniqueValuesResponse,\n type PColumn,\n type PFrameDef,\n type PTableDef,\n type PTableRecordSingleValueFilterV2,\n type PTableRecordFilter,\n type JsonSerializable,\n type PTableDefV2,\n mapSpecQueryColumns,\n collectSpecQueryColumns,\n sortSpecQuery,\n sortPTableDef,\n} from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { ConcurrencyLimitingExecutor, type PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { PFrameFactory } from \"@milaboratories/pframes-rs-node\";\nimport { tmpdir } from \"node:os\";\nimport type { AbstractInternalPFrameDriver } from \"./driver_decl\";\nimport { logPFrames } from \"./logging\";\nimport {\n PFramePool,\n type LocalBlobProvider as PoolLocalBlobProvider,\n type RemoteBlobProvider as PoolRemoteBlobProvider,\n} from \"./pframe_pool\";\nimport { PTableDefPool } from \"./ptable_def_pool\";\nimport { PTablePool } from \"./ptable_pool\";\nimport {\n PTableCachePerFrame,\n PTableCachePerFrameOpsDefaults,\n type PTableCachePerFrameOps,\n} from \"./ptable_cache_per_frame\";\nimport {\n PTableCachePlain,\n PTableCachePlainOpsDefaults,\n type PTableCachePlainOps,\n} from \"./ptable_cache_plain\";\nimport { createPFrame as createSpecFrame } from \"@milaboratories/pframes-rs-wasm\";\n\nexport interface LocalBlobProvider<\n TreeEntry extends JsonSerializable,\n> extends PoolLocalBlobProvider<TreeEntry> {}\n\nexport interface RemoteBlobProvider<TreeEntry extends JsonSerializable>\n extends PoolRemoteBlobProvider<TreeEntry>, AsyncDisposable {}\n\nexport type AbstractPFrameDriverOps = PTableCachePerFrameOps &\n PTableCachePlainOps & {\n /** Concurrency limits for `getUniqueValues` and `calculateTableData` requests */\n pFrameConcurrency: number;\n /** Concurrency limits for `getShape` and `getData` requests */\n pTableConcurrency: number;\n };\n\nexport const AbstractPFrameDriverOpsDefaults: AbstractPFrameDriverOps = {\n ...PTableCachePerFrameOpsDefaults,\n ...PTableCachePlainOpsDefaults,\n pFrameConcurrency: 1, // 1 join is executed in parallel and utilize all RAM and CPU cores\n pTableConcurrency: 1, // 1 joined table is read from disk at a time, which matches 1 table the user can view in the UI\n};\n\nexport type DataInfoResolver<PColumnData, TreeEntry extends JsonSerializable> = (\n spec: PColumnSpec,\n data: PColumnData,\n) => PFrameInternal.DataInfo<TreeEntry>;\n\nexport class AbstractPFrameDriver<\n PColumnData,\n TreeEntry extends JsonSerializable,\n> implements AbstractInternalPFrameDriver<PColumnData> {\n private readonly logger: PFrameInternal.Logger;\n\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>;\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>;\n\n private readonly resolveDataInfo: DataInfoResolver<PColumnData, TreeEntry>;\n\n private readonly pFrames: PFramePool<TreeEntry>;\n private readonly pTableDefs: PTableDefPool;\n private readonly pTables: PTablePool<TreeEntry>;\n\n private readonly pTableCachePerFrame: PTableCachePerFrame;\n private readonly pTableCachePlain: PTableCachePlain;\n\n private readonly frameConcurrencyLimiter: ConcurrencyLimitingExecutor;\n private readonly tableConcurrencyLimiter: ConcurrencyLimitingExecutor;\n\n public async pprofDump(): Promise<Uint8Array> {\n return await PFrameFactory.pprofDump();\n }\n\n public constructor({\n logger = () => {},\n localBlobProvider,\n remoteBlobProvider,\n spillPath = tmpdir(),\n options = AbstractPFrameDriverOpsDefaults,\n resolveDataInfo,\n }: {\n logger?: PFrameInternal.Logger;\n localBlobProvider: LocalBlobProvider<TreeEntry>;\n remoteBlobProvider: RemoteBlobProvider<TreeEntry>;\n spillPath?: string;\n options?: AbstractPFrameDriverOps;\n resolveDataInfo: DataInfoResolver<PColumnData, TreeEntry>;\n }) {\n this.logger = logger;\n\n this.localBlobProvider = localBlobProvider;\n this.remoteBlobProvider = remoteBlobProvider;\n\n this.resolveDataInfo = resolveDataInfo;\n\n this.frameConcurrencyLimiter = new ConcurrencyLimitingExecutor(options.pFrameConcurrency);\n this.tableConcurrencyLimiter = new ConcurrencyLimitingExecutor(options.pTableConcurrency);\n\n this.pFrames = new PFramePool(\n this.localBlobProvider,\n this.remoteBlobProvider,\n this.logger,\n spillPath,\n );\n this.pTableDefs = new PTableDefPool(this.logger);\n this.pTables = new PTablePool(this.pFrames, this.pTableDefs, this.logger);\n\n this.pTableCachePerFrame = new PTableCachePerFrame(this.logger, options);\n this.pTableCachePlain = new PTableCachePlain(this.logger, options);\n }\n\n async dispose(): Promise<void> {\n return await this.remoteBlobProvider[Symbol.asyncDispose]();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n return await this.dispose();\n }\n\n //\n // Internal / Config API Methods\n //\n\n public createPFrame(def: PFrameDef<PColumn<PColumnData>>): PoolEntry<PFrameHandle> {\n const ValueTypes = new Set(Object.values(ValueType));\n\n const supportedColumns = def.filter((column) => ValueTypes.has(column.spec.valueType));\n const uniqueColumns = uniqueBy(supportedColumns, (column) => column.id);\n const columns = uniqueColumns.map((c) =>\n mapPObjectData(c, (d) => this.resolveDataInfo(c.spec, d)),\n );\n\n return this.pFrames.acquire(columns);\n }\n\n public createPTable(rawDef: PTableDef<PColumn<PColumnData>>): PoolEntry<PTableHandle> {\n const pFrameEntry = this.createPFrame(extractAllColumns(rawDef.src));\n const sortedDef = sortPTableDef(\n migrateTableFilter(\n mapPTableDef(rawDef, (c) => c.id),\n this.logger,\n ),\n );\n const pTableEntry = this.pTableDefs.acquire({\n type: \"v1\",\n def: sortedDef,\n pFrameHandle: pFrameEntry.key,\n });\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Create PTable call (pFrameHandle = ${pFrameEntry.key}; pTableHandle = ${pTableEntry.key})`,\n );\n }\n\n const unref = () => {\n pTableEntry.unref();\n pFrameEntry.unref();\n };\n return {\n key: pTableEntry.key,\n resource: pTableEntry.resource,\n unref,\n [Symbol.dispose]: unref,\n };\n }\n\n public createPTableV2(def: PTableDefV2<PColumn<PColumnData>>): PoolEntry<PTableHandle> {\n const columns = uniqueBy(collectSpecQueryColumns(def.query), (c) => c.id);\n const columnsMap = columns.reduce(\n (acc, col) => ((acc[col.id] = col.spec), acc),\n {} as Record<string, PColumnSpec>,\n );\n\n const pFrameEntry = this.createPFrame(columns);\n const specFrame = createSpecFrame(columnsMap);\n const sortedQuery = sortSpecQuery(mapSpecQueryColumns(def.query, (c) => c.id));\n const { tableSpec, dataQuery } = specFrame.evaluateQuery(sortedQuery);\n\n const pTableEntry = this.pTableDefs.acquire({\n type: \"v2\",\n pFrameHandle: pFrameEntry.key,\n def: {\n tableSpec,\n dataQuery,\n },\n });\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Create PTable call (pFrameHandle = ${pFrameEntry.key}; pTableHandle = ${pTableEntry.key})`,\n );\n }\n\n const unref = () => {\n pTableEntry.unref();\n pFrameEntry.unref();\n };\n return {\n key: pTableEntry.key,\n resource: pTableEntry.resource,\n unref,\n [Symbol.dispose]: unref,\n };\n }\n\n //\n // PFrame instance methods\n //\n\n public async findColumns(\n handle: PFrameHandle,\n request: FindColumnsRequest,\n ): Promise<FindColumnsResponse> {\n const iRequest: PFrameInternal.FindColumnsRequest = {\n ...request,\n compatibleWith:\n request.compatibleWith.length !== 0\n ? [\n {\n axesSpec: [\n ...new Map(\n request.compatibleWith.map((item) => [canonicalizeJson(item), item] as const),\n ).values(),\n ],\n qualifications: [],\n },\n ]\n : [],\n };\n\n const { pFramePromise } = this.pFrames.getByKey(handle);\n const pFrame = await pFramePromise;\n\n const response = await pFrame.findColumns(iRequest);\n return {\n hits: response.hits\n .filter(\n (h) =>\n // only exactly matching columns\n h.mappingVariants.length === 0 ||\n h.mappingVariants.some(\n (v) =>\n v.qualifications.forHit.length === 0 &&\n v.qualifications.forQueries.every((q) => q.length === 0),\n ),\n )\n .map((h) => h.hit),\n };\n }\n\n public async getColumnSpec(\n handle: PFrameHandle,\n columnId: PObjectId,\n ): Promise<PColumnSpec | null> {\n const { pFramePromise } = this.pFrames.getByKey(handle);\n const pFrame = await pFramePromise;\n return await pFrame.getColumnSpec(columnId);\n }\n\n public async listColumns(handle: PFrameHandle): Promise<PColumnIdAndSpec[]> {\n const { pFramePromise } = this.pFrames.getByKey(handle);\n const pFrame = await pFramePromise;\n return await pFrame.listColumns();\n }\n\n public async calculateTableData(\n handle: PFrameHandle,\n request: CalculateTableDataRequest<PObjectId>,\n range: TableRange | undefined,\n signal?: AbortSignal,\n ): Promise<CalculateTableDataResponse> {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Call calculateTableData, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,\n );\n }\n\n const table = this.pTables.acquire({\n type: \"v1\",\n pFrameHandle: handle,\n def: sortPTableDef(migrateTableFilter(request, this.logger)),\n });\n const { pTablePromise, disposeSignal } = table.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n return await this.frameConcurrencyLimiter.run(async () => {\n try {\n // TODO: throw error when more then 150k rows is requested\n // after pf-plots migration to stream API\n\n const spec = pTable.getSpec();\n const data = await pTable.getData([...spec.keys()], {\n range,\n signal: combinedSignal,\n });\n\n const overallSize = await pTable.getFootprint({\n signal: combinedSignal,\n });\n this.pTableCachePerFrame.cache(table, overallSize);\n\n return spec.map((spec, i) => ({\n spec: spec,\n data: data[i],\n }));\n } catch (err: unknown) {\n table.unref();\n throw err;\n }\n });\n }\n\n public async getUniqueValues(\n handle: PFrameHandle,\n request: UniqueValuesRequest,\n signal?: AbortSignal,\n ): Promise<UniqueValuesResponse> {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Call getUniqueValues, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,\n );\n }\n\n const { pFramePromise, disposeSignal } = this.pFrames.getByKey(handle);\n const pFrame = await pFramePromise;\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n return await this.frameConcurrencyLimiter.run(async () => {\n return await pFrame.getUniqueValues(\n {\n ...request,\n filters: migrateFilters(request.filters, this.logger),\n },\n {\n signal: combinedSignal,\n },\n );\n });\n }\n\n //\n // PTable instance methods\n //\n\n public async getSpec(handle: PTableHandle): Promise<PTableColumnSpec[]> {\n const { def } = this.pTableDefs.getByKey(handle);\n using table = this.pTables.acquire(def);\n\n const { pTablePromise } = table.resource;\n const pTable = await pTablePromise;\n\n return pTable.getSpec();\n }\n\n public async getShape(handle: PTableHandle, signal?: AbortSignal): Promise<PTableShape> {\n const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);\n const table = this.pTables.acquire(def);\n\n const { pTablePromise, disposeSignal } = table.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n const { shape, overallSize } = await this.tableConcurrencyLimiter.run(async () => {\n const shape = await pTable.getShape({\n signal: combinedSignal,\n });\n\n const overallSize = await pTable.getFootprint({\n signal: combinedSignal,\n });\n\n return { shape, overallSize };\n });\n\n this.pTableCachePlain.cache(table, overallSize, defDisposeSignal);\n return shape;\n }\n\n public async getData(\n handle: PTableHandle,\n columnIndices: number[],\n range: TableRange | undefined,\n signal?: AbortSignal,\n ): Promise<PTableVector[]> {\n const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);\n const table = this.pTables.acquire(def);\n\n const { pTablePromise, disposeSignal } = table.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n const { data, overallSize } = await this.tableConcurrencyLimiter.run(async () => {\n const data = await pTable.getData(columnIndices, {\n range,\n signal: combinedSignal,\n });\n\n const overallSize = await pTable.getFootprint({\n signal: combinedSignal,\n });\n\n return { data, overallSize };\n });\n\n this.pTableCachePlain.cache(table, overallSize, defDisposeSignal);\n return data;\n }\n}\n\nfunction migrateFilters(\n filters: PTableRecordFilter[],\n logger: PFrameInternal.Logger,\n): PTableRecordFilter[] {\n const filtersV1 = [];\n const filtersV2: PTableRecordSingleValueFilterV2[] = [];\n for (const filter of filters) {\n if ((filter.type as unknown) === \"bySingleColumn\") {\n filtersV1.push(filter);\n filtersV2.push({\n ...filter,\n type: \"bySingleColumnV2\",\n });\n } else {\n filtersV2.push(filter);\n }\n }\n if (filtersV1.length > 0) {\n const filtersV1Json = JSON.stringify(filtersV1);\n logger(\n \"warn\",\n `type overwritten from 'bySingleColumn' to 'bySingleColumnV2' for filters: ${filtersV1Json}`,\n );\n }\n return filtersV2;\n}\n\nfunction migrateTableFilter<T>(\n def: Omit<PTableDef<T>, \"partitionFilters\"> | PTableDef<T>,\n logger: PFrameInternal.Logger,\n): PTableDef<T> {\n if (!(\"partitionFilters\" in def)) {\n // For old blocks assume all axes filters to be partition filters\n return {\n ...def,\n partitionFilters: migrateFilters(\n def.filters.filter((f) => f.column.type === \"axis\"),\n logger,\n ),\n filters: migrateFilters(\n def.filters.filter((f) => f.column.type === \"column\"),\n logger,\n ),\n };\n }\n return {\n ...def,\n partitionFilters: migrateFilters(def.partitionFilters, logger),\n filters: migrateFilters(def.filters, logger),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"driver_impl.js","names":["createSpecFrame"],"sources":["../src/driver_impl.ts"],"sourcesContent":["import {\n mapPObjectData,\n mapPTableDef,\n extractAllColumns,\n uniqueBy,\n canonicalizeJson,\n bigintReplacer,\n ValueType,\n type CalculateTableDataRequest,\n type CalculateTableDataResponse,\n type FindColumnsRequest,\n type FindColumnsResponse,\n type PColumnIdAndSpec,\n type PColumnSpec,\n type PFrameHandle,\n type PObjectId,\n type PTableColumnSpec,\n type PTableHandle,\n type PTableShape,\n type PTableVector,\n type TableRange,\n type UniqueValuesRequest,\n type UniqueValuesResponse,\n type PColumn,\n type PFrameDef,\n type PTableDef,\n type PTableRecordSingleValueFilterV2,\n type PTableRecordFilter,\n type JsonSerializable,\n type PTableDefV2,\n mapSpecQueryColumns,\n collectSpecQueryColumns,\n sortSpecQuery,\n sortPTableDef,\n resolveAnnotationParents,\n} from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport {\n ConcurrencyLimitingExecutor,\n PoolEntryGuard,\n type PoolEntry,\n} from \"@milaboratories/ts-helpers\";\nimport { PFrameFactory } from \"@milaboratories/pframes-rs-node\";\nimport { tmpdir } from \"node:os\";\nimport type { AbstractInternalPFrameDriver } from \"./driver_decl\";\nimport { logPFrames } from \"./logging\";\nimport {\n PFramePool,\n type LocalBlobProvider as PoolLocalBlobProvider,\n type RemoteBlobProvider as PoolRemoteBlobProvider,\n} from \"./pframe_pool\";\nimport { PTableDefPool } from \"./ptable_def_pool\";\nimport { PTablePool } from \"./ptable_pool\";\nimport {\n PTableCachePerFrame,\n PTableCachePerFrameOpsDefaults,\n type PTableCachePerFrameOps,\n} from \"./ptable_cache_per_frame\";\nimport {\n PTableCachePlain,\n PTableCachePlainOpsDefaults,\n type PTableCachePlainOps,\n} from \"./ptable_cache_plain\";\nimport { createPFrame as createSpecFrame } from \"@milaboratories/pframes-rs-wasm\";\n\nexport interface LocalBlobProvider<TreeEntry extends JsonSerializable>\n extends PoolLocalBlobProvider<TreeEntry>, AsyncDisposable {}\n\nexport interface RemoteBlobProvider<TreeEntry extends JsonSerializable>\n extends PoolRemoteBlobProvider<TreeEntry>, AsyncDisposable {}\n\nexport type AbstractPFrameDriverOps = PTableCachePerFrameOps &\n PTableCachePlainOps & {\n /** Concurrency limits for `getUniqueValues` and `calculateTableData` requests */\n pFrameConcurrency: number;\n /** Concurrency limits for `getShape` and `getData` requests */\n pTableConcurrency: number;\n };\n\nexport const AbstractPFrameDriverOpsDefaults: AbstractPFrameDriverOps = {\n ...PTableCachePerFrameOpsDefaults,\n ...PTableCachePlainOpsDefaults,\n pFrameConcurrency: 1, // 1 join is executed in parallel and utilize all RAM and CPU cores\n pTableConcurrency: 1, // 1 joined table is read from disk at a time, which matches 1 table the user can view in the UI\n};\n\nexport type DataInfoResolver<PColumnData, TreeEntry extends JsonSerializable> = (\n spec: PColumnSpec,\n data: PColumnData,\n) => PFrameInternal.DataInfo<TreeEntry>;\n\nexport class AbstractPFrameDriver<\n PColumnData,\n TreeEntry extends JsonSerializable,\n> implements AbstractInternalPFrameDriver<PColumnData> {\n private readonly logger: PFrameInternal.Logger;\n\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>;\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>;\n\n private readonly resolveDataInfo: DataInfoResolver<PColumnData, TreeEntry>;\n\n private readonly pFrames: PFramePool<TreeEntry>;\n private readonly pTableDefs: PTableDefPool;\n private readonly pTables: PTablePool<TreeEntry>;\n\n private readonly pTableCachePerFrame: PTableCachePerFrame;\n private readonly pTableCachePlain: PTableCachePlain;\n\n private readonly frameConcurrencyLimiter: ConcurrencyLimitingExecutor;\n private readonly tableConcurrencyLimiter: ConcurrencyLimitingExecutor;\n\n public async pprofDump(): Promise<Uint8Array> {\n return await PFrameFactory.pprofDump();\n }\n\n public constructor({\n logger = () => {},\n localBlobProvider,\n remoteBlobProvider,\n spillPath = tmpdir(),\n options = AbstractPFrameDriverOpsDefaults,\n resolveDataInfo,\n }: {\n logger?: PFrameInternal.Logger;\n localBlobProvider: LocalBlobProvider<TreeEntry>;\n remoteBlobProvider: RemoteBlobProvider<TreeEntry>;\n spillPath?: string;\n options?: AbstractPFrameDriverOps;\n resolveDataInfo: DataInfoResolver<PColumnData, TreeEntry>;\n }) {\n this.logger = logger;\n\n this.localBlobProvider = localBlobProvider;\n this.remoteBlobProvider = remoteBlobProvider;\n\n this.resolveDataInfo = resolveDataInfo;\n\n this.frameConcurrencyLimiter = new ConcurrencyLimitingExecutor(options.pFrameConcurrency);\n this.tableConcurrencyLimiter = new ConcurrencyLimitingExecutor(options.pTableConcurrency);\n\n this.pFrames = new PFramePool(\n this.localBlobProvider,\n this.remoteBlobProvider,\n this.logger,\n spillPath,\n );\n this.pTableDefs = new PTableDefPool(this.logger);\n this.pTables = new PTablePool(this.pFrames, this.pTableDefs, this.logger);\n\n this.pTableCachePerFrame = new PTableCachePerFrame(this.logger, options);\n this.pTableCachePlain = new PTableCachePlain(this.logger, options);\n }\n\n async dispose(): Promise<void> {\n void (await Promise.allSettled([\n this.pTables[Symbol.asyncDispose](),\n this.pTableDefs[Symbol.asyncDispose](),\n this.pFrames[Symbol.asyncDispose](),\n this.localBlobProvider[Symbol.asyncDispose](),\n this.remoteBlobProvider[Symbol.asyncDispose](),\n ]));\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n return await this.dispose();\n }\n\n //\n // Internal / Config API Methods\n //\n\n public createPFrame(def: PFrameDef<PColumn<PColumnData>>): PoolEntry<PFrameHandle> {\n const ValueTypes = new Set(Object.values(ValueType));\n const supportedColumns = def\n .filter((column) => ValueTypes.has(column.spec.valueType))\n .map((c) => ({ ...c, spec: resolveAnnotationParents(c.spec) }));\n const uniqueColumns = uniqueBy(supportedColumns, (column) => column.id);\n const columns = uniqueColumns.map((c) =>\n mapPObjectData(c, (d) => this.resolveDataInfo(c.spec, d)),\n );\n\n return this.pFrames.acquire(columns);\n }\n\n public createPTable(rawDef: PTableDef<PColumn<PColumnData>>): PoolEntry<PTableHandle> {\n using pFrameGuard = new PoolEntryGuard(this.createPFrame(extractAllColumns(rawDef.src)));\n const sortedDef = sortPTableDef(\n migrateTableFilter(\n mapPTableDef(rawDef, (c) => c.id),\n this.logger,\n ),\n );\n const pTableEntry = this.pTableDefs.acquire({\n type: \"v1\",\n def: sortedDef,\n pFrameHandle: pFrameGuard.key,\n });\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Create PTable call (pFrameHandle = ${pFrameGuard.key}; pTableHandle = ${pTableEntry.key})`,\n );\n }\n\n const pFrameEntry = pFrameGuard.keep();\n const unref = () => {\n pTableEntry.unref();\n pFrameEntry.unref();\n };\n return {\n key: pTableEntry.key,\n resource: pTableEntry.resource,\n unref,\n [Symbol.dispose]: unref,\n };\n }\n\n public createPTableV2(def: PTableDefV2<PColumn<PColumnData>>): PoolEntry<PTableHandle> {\n const columns = uniqueBy(collectSpecQueryColumns(def.query), (c) => c.id);\n const columnsMap = columns.reduce(\n (acc, col) => ((acc[col.id] = col.spec), acc),\n {} as Record<string, PColumnSpec>,\n );\n\n using pFrameGuard = new PoolEntryGuard(this.createPFrame(columns));\n const ValueTypes = new Set(Object.values(ValueType));\n const specColumnsMap = Object.fromEntries(\n Object.entries(columnsMap)\n .filter(([, spec]) => ValueTypes.has(spec.valueType))\n .map(([id, spec]) => [id, resolveAnnotationParents(spec)]),\n );\n const specFrame = createSpecFrame(specColumnsMap);\n const sortedQuery = sortSpecQuery(mapSpecQueryColumns(def.query, (c) => c.id));\n const { tableSpec, dataQuery } = specFrame.evaluateQuery(sortedQuery);\n\n const pTableEntry = this.pTableDefs.acquire({\n type: \"v2\",\n pFrameHandle: pFrameGuard.key,\n def: {\n tableSpec,\n dataQuery,\n },\n });\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Create PTable call (pFrameHandle = ${pFrameGuard.key}; pTableHandle = ${pTableEntry.key})`,\n );\n }\n\n const pFrameEntry = pFrameGuard.keep();\n const unref = () => {\n pTableEntry.unref();\n pFrameEntry.unref();\n };\n return {\n key: pTableEntry.key,\n resource: pTableEntry.resource,\n unref,\n [Symbol.dispose]: unref,\n };\n }\n\n //\n // PFrame instance methods\n //\n\n public async findColumns(\n handle: PFrameHandle,\n request: FindColumnsRequest,\n ): Promise<FindColumnsResponse> {\n const iRequest: PFrameInternal.FindColumnsRequest = {\n ...request,\n compatibleWith:\n request.compatibleWith.length !== 0\n ? [\n {\n axesSpec: [\n ...new Map(\n request.compatibleWith.map((item) => [canonicalizeJson(item), item] as const),\n ).values(),\n ],\n qualifications: [],\n },\n ]\n : [],\n };\n\n const { pFramePromise } = this.pFrames.getByKey(handle);\n const pFrame = await pFramePromise;\n\n const response = await pFrame.findColumns(iRequest);\n return {\n hits: response.hits\n .filter(\n (h) =>\n // only exactly matching columns\n h.mappingVariants.length === 0 ||\n h.mappingVariants.some(\n (v) =>\n v.qualifications.forHit.length === 0 &&\n v.qualifications.forQueries.every((q) => q.length === 0),\n ),\n )\n .map((h) => h.hit),\n };\n }\n\n public async getColumnSpec(\n handle: PFrameHandle,\n columnId: PObjectId,\n ): Promise<PColumnSpec | null> {\n const { pFramePromise } = this.pFrames.getByKey(handle);\n const pFrame = await pFramePromise;\n return await pFrame.getColumnSpec(columnId);\n }\n\n public async listColumns(handle: PFrameHandle): Promise<PColumnIdAndSpec[]> {\n const { pFramePromise } = this.pFrames.getByKey(handle);\n const pFrame = await pFramePromise;\n return await pFrame.listColumns();\n }\n\n public async calculateTableData(\n handle: PFrameHandle,\n request: CalculateTableDataRequest<PObjectId>,\n range: TableRange | undefined,\n signal?: AbortSignal,\n ): Promise<CalculateTableDataResponse> {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Call calculateTableData, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,\n );\n }\n\n using tableGuard = new PoolEntryGuard(\n this.pTables.acquire({\n type: \"v1\",\n pFrameHandle: handle,\n def: sortPTableDef(migrateTableFilter(request, this.logger)),\n }),\n );\n const { pTablePromise, disposeSignal } = tableGuard.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n return await this.frameConcurrencyLimiter.run(async () => {\n // TODO: throw error when more then 150k rows is requested\n // after pf-plots migration to stream API\n\n const spec = pTable.getSpec();\n const data = await pTable.getData([...spec.keys()], {\n range,\n signal: combinedSignal,\n });\n\n const overallSize = await pTable.getFootprint({\n signal: combinedSignal,\n });\n this.pTableCachePerFrame.cache(tableGuard.keep(), overallSize);\n\n return spec.map((spec, i) => ({\n spec: spec,\n data: data[i],\n }));\n });\n }\n\n public async getUniqueValues(\n handle: PFrameHandle,\n request: UniqueValuesRequest,\n signal?: AbortSignal,\n ): Promise<UniqueValuesResponse> {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Call getUniqueValues, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,\n );\n }\n\n const { pFramePromise, disposeSignal } = this.pFrames.getByKey(handle);\n const pFrame = await pFramePromise;\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n return await this.frameConcurrencyLimiter.run(async () => {\n return await pFrame.getUniqueValues(\n {\n ...request,\n filters: migrateFilters(request.filters, this.logger),\n },\n {\n signal: combinedSignal,\n },\n );\n });\n }\n\n //\n // PTable instance methods\n //\n\n public async getSpec(handle: PTableHandle): Promise<PTableColumnSpec[]> {\n const { def } = this.pTableDefs.getByKey(handle);\n using table = this.pTables.acquire(def);\n\n const { pTablePromise } = table.resource;\n const pTable = await pTablePromise;\n\n return pTable.getSpec();\n }\n\n public async getShape(handle: PTableHandle, signal?: AbortSignal): Promise<PTableShape> {\n const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);\n using tableGuard = new PoolEntryGuard(this.pTables.acquire(def));\n\n const { pTablePromise, disposeSignal } = tableGuard.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n const { shape, overallSize } = await this.tableConcurrencyLimiter.run(async () => {\n const shape = await pTable.getShape({\n signal: combinedSignal,\n });\n\n const overallSize = await pTable.getFootprint({\n signal: combinedSignal,\n });\n\n return { shape, overallSize };\n });\n\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\n return shape;\n }\n\n public async getData(\n handle: PTableHandle,\n columnIndices: number[],\n range: TableRange | undefined,\n signal?: AbortSignal,\n ): Promise<PTableVector[]> {\n const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);\n using tableGuard = new PoolEntryGuard(this.pTables.acquire(def));\n\n const { pTablePromise, disposeSignal } = tableGuard.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n const { data, overallSize } = await this.tableConcurrencyLimiter.run(async () => {\n const data = await pTable.getData(columnIndices, {\n range,\n signal: combinedSignal,\n });\n\n const overallSize = await pTable.getFootprint({\n signal: combinedSignal,\n });\n\n return { data, overallSize };\n });\n\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\n return data;\n }\n}\n\nfunction migrateFilters(\n filters: PTableRecordFilter[],\n logger: PFrameInternal.Logger,\n): PTableRecordFilter[] {\n const filtersV1 = [];\n const filtersV2: PTableRecordSingleValueFilterV2[] = [];\n for (const filter of filters) {\n if ((filter.type as unknown) === \"bySingleColumn\") {\n filtersV1.push(filter);\n filtersV2.push({\n ...filter,\n type: \"bySingleColumnV2\",\n });\n } else {\n filtersV2.push(filter);\n }\n }\n if (filtersV1.length > 0) {\n const filtersV1Json = JSON.stringify(filtersV1);\n logger(\n \"warn\",\n `type overwritten from 'bySingleColumn' to 'bySingleColumnV2' for filters: ${filtersV1Json}`,\n );\n }\n return filtersV2;\n}\n\nfunction migrateTableFilter<T>(\n def: Omit<PTableDef<T>, \"partitionFilters\"> | PTableDef<T>,\n logger: PFrameInternal.Logger,\n): PTableDef<T> {\n if (!(\"partitionFilters\" in def)) {\n // For old blocks assume all axes filters to be partition filters\n return {\n ...def,\n partitionFilters: migrateFilters(\n def.filters.filter((f) => f.column.type === \"axis\"),\n logger,\n ),\n filters: migrateFilters(\n def.filters.filter((f) => f.column.type === \"column\"),\n logger,\n ),\n };\n }\n return {\n ...def,\n partitionFilters: migrateFilters(def.partitionFilters, logger),\n filters: migrateFilters(def.filters, logger),\n };\n}\n"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -2,11 +2,9 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_driver_impl = require('./driver_impl.cjs');
3
3
  const require_data_info_helpers = require('./data_info_helpers.cjs');
4
4
  const require_driver_double = require('./driver_double.cjs');
5
- const require_spec_driver = require('./pl-middle-layer/src/js_render/spec_driver.cjs');
6
5
 
7
6
  exports.AbstractPFrameDriver = require_driver_impl.AbstractPFrameDriver;
8
7
  exports.AbstractPFrameDriverOpsDefaults = require_driver_impl.AbstractPFrameDriverOpsDefaults;
9
- exports.SpecDriver = require_spec_driver.SpecDriver;
10
8
  exports.createPFrameDriverDouble = require_driver_double.createPFrameDriverDouble;
11
9
  exports.makeFolderPath = require_driver_double.makeFolderPath;
12
10
  exports.makeJsonDataInfo = require_data_info_helpers.makeJsonDataInfo;
package/dist/index.d.ts CHANGED
@@ -2,5 +2,4 @@ import { AbstractInternalPFrameDriver } from "./driver_decl.js";
2
2
  import { AbstractPFrameDriver, AbstractPFrameDriverOps, AbstractPFrameDriverOpsDefaults, DataInfoResolver, LocalBlobProvider, RemoteBlobProvider } from "./driver_impl.js";
3
3
  import { makeJsonDataInfo } from "./data_info_helpers.js";
4
4
  import { FileName, FilePath, FolderPath, InternalPFrameDriverDouble, createPFrameDriverDouble, makeFolderPath } from "./driver_double.js";
5
- import { SpecDriver } from "./pl-middle-layer/src/js_render/spec_driver.js";
6
- export { AbstractInternalPFrameDriver, AbstractPFrameDriver, AbstractPFrameDriverOps, AbstractPFrameDriverOpsDefaults, DataInfoResolver, FileName, FilePath, FolderPath, InternalPFrameDriverDouble, LocalBlobProvider, RemoteBlobProvider, SpecDriver, createPFrameDriverDouble, makeFolderPath, makeJsonDataInfo };
5
+ export { AbstractInternalPFrameDriver, AbstractPFrameDriver, AbstractPFrameDriverOps, AbstractPFrameDriverOpsDefaults, DataInfoResolver, FileName, FilePath, FolderPath, InternalPFrameDriverDouble, LocalBlobProvider, RemoteBlobProvider, createPFrameDriverDouble, makeFolderPath, makeJsonDataInfo };
package/dist/index.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import { AbstractPFrameDriver, AbstractPFrameDriverOpsDefaults } from "./driver_impl.js";
2
2
  import { makeJsonDataInfo } from "./data_info_helpers.js";
3
3
  import { createPFrameDriverDouble, makeFolderPath } from "./driver_double.js";
4
- import { SpecDriver } from "./pl-middle-layer/src/js_render/spec_driver.js";
5
4
 
6
- export { AbstractPFrameDriver, AbstractPFrameDriverOpsDefaults, SpecDriver, createPFrameDriverDouble, makeFolderPath, makeJsonDataInfo };
5
+ export { AbstractPFrameDriver, AbstractPFrameDriverOpsDefaults, createPFrameDriverDouble, makeFolderPath, makeJsonDataInfo };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milaboratories/pf-driver",
3
- "version": "1.1.1",
3
+ "version": "1.3.0",
4
4
  "description": "PFrameDriver implementation abstracted from Middle Layer",
5
5
  "keywords": [],
6
6
  "license": "UNLICENSED",
@@ -20,13 +20,13 @@
20
20
  }
21
21
  },
22
22
  "dependencies": {
23
- "@milaboratories/pframes-rs-node": "1.1.14",
24
- "@milaboratories/pframes-rs-wasm": "1.1.14",
23
+ "@milaboratories/pframes-rs-node": "1.1.16",
24
+ "@milaboratories/pframes-rs-wasm": "1.1.16",
25
25
  "es-toolkit": "^1.39.10",
26
26
  "lru-cache": "^11.2.2",
27
- "@milaboratories/pl-model-common": "1.28.0",
28
- "@milaboratories/pl-model-middle-layer": "1.15.0",
29
- "@milaboratories/ts-helpers": "1.7.3"
27
+ "@milaboratories/ts-helpers": "1.8.0",
28
+ "@milaboratories/pl-model-common": "1.30.0",
29
+ "@milaboratories/pl-model-middle-layer": "1.16.1"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/node": "~24.5.2",
@@ -118,6 +118,7 @@ class RemoteBlobProviderImpl implements RemoteBlobProvider<FileName> {
118
118
 
119
119
  async [Symbol.asyncDispose](): Promise<void> {
120
120
  await this.server.stop();
121
+ await this.pool[Symbol.asyncDispose]();
121
122
  }
122
123
  }
123
124