@milaboratories/pf-driver 1.3.10 → 1.4.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.
- package/dist/csv_writer.cjs +79 -0
- package/dist/csv_writer.cjs.map +1 -0
- package/dist/csv_writer.js +78 -0
- package/dist/csv_writer.js.map +1 -0
- package/dist/driver_decl.d.ts +4 -2
- package/dist/driver_decl.d.ts.map +1 -1
- package/dist/driver_double.cjs +1 -1
- package/dist/driver_double.js +1 -1
- package/dist/driver_impl.cjs +94 -17
- package/dist/driver_impl.cjs.map +1 -1
- package/dist/driver_impl.d.ts +2 -1
- package/dist/driver_impl.d.ts.map +1 -1
- package/dist/driver_impl.js +93 -18
- package/dist/driver_impl.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/package.json +4 -3
- package/src/__tests__/csv_writer.test.ts +419 -0
- package/src/__tests__/download_ptable.test.ts +617 -0
- package/src/csv_writer.ts +154 -0
- package/src/driver_decl.ts +14 -0
- package/src/driver_impl.ts +100 -3
package/dist/driver_impl.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { streamPTableRows } from "./csv_writer.js";
|
|
1
2
|
import { logPFrames } from "./logging.js";
|
|
2
3
|
import { PFramePool } from "./pframe_pool.js";
|
|
3
4
|
import { PTableDefPool } from "./ptable_def_pool.js";
|
|
@@ -6,10 +7,14 @@ import { PTableCachePerFrame, PTableCachePerFrameOpsDefaults } from "./ptable_ca
|
|
|
6
7
|
import { PTableCachePlain, PTableCachePlainOpsDefaults } from "./ptable_cache_plain.js";
|
|
7
8
|
import { _usingCtx } from "./_virtual/_@oxc-project_runtime@0.123.0/helpers/usingCtx.js";
|
|
8
9
|
import { ValueType, bigintReplacer, canonicalizeJson, collectSpecQueryColumns, extractAllColumns, mapPObjectData, mapPTableDef, mapSpecQueryColumns, resolveAnnotationParents, sortPTableDef, sortSpecQuery, uniqueBy } from "@milaboratories/pl-model-common";
|
|
9
|
-
import { ConcurrencyLimitingExecutor } from "@milaboratories/ts-helpers";
|
|
10
|
-
import { PoolEntryGuard } from "@milaboratories/helpers";
|
|
10
|
+
import { ConcurrencyLimitingExecutor, createPathAtomically } from "@milaboratories/ts-helpers";
|
|
11
|
+
import { PoolEntryGuard, isNil } from "@milaboratories/helpers";
|
|
11
12
|
import { PFrameFactory } from "@milaboratories/pframes-rs-node";
|
|
12
13
|
import { tmpdir } from "node:os";
|
|
14
|
+
import * as fs$1 from "node:fs";
|
|
15
|
+
import { Readable } from "node:stream";
|
|
16
|
+
import { pipeline } from "node:stream/promises";
|
|
17
|
+
import * as zlib from "node:zlib";
|
|
13
18
|
import { createPFrame } from "@milaboratories/pframes-rs-wasm";
|
|
14
19
|
//#region src/driver_impl.ts
|
|
15
20
|
const AbstractPFrameDriverOpsDefaults = {
|
|
@@ -130,6 +135,64 @@ var AbstractPFrameDriver = class {
|
|
|
130
135
|
_usingCtx3.d();
|
|
131
136
|
}
|
|
132
137
|
}
|
|
138
|
+
async writePTableToFs(handle, options) {
|
|
139
|
+
try {
|
|
140
|
+
var _usingCtx4 = _usingCtx();
|
|
141
|
+
this.logger("info", `[WritePTableToFs] ENTER (handle = ${handle}, path = ${options.path}, format = ${options.format}, compression = ${options.compression ?? "auto"}, columns = ${options.columnIndices.length})`);
|
|
142
|
+
const startTime = performance.now();
|
|
143
|
+
const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);
|
|
144
|
+
const tableGuard = _usingCtx4.u(new PoolEntryGuard(this.pTables.acquire(def)));
|
|
145
|
+
const { pTablePromise, disposeSignal } = tableGuard.resource;
|
|
146
|
+
const pTable = await pTablePromise;
|
|
147
|
+
const combinedSignal = AbortSignal.any([options.signal, disposeSignal].filter((s) => !isNil(s)));
|
|
148
|
+
return await this.tableConcurrencyLimiter.run(async () => {
|
|
149
|
+
const shape = await pTable.getShape({ signal: combinedSignal });
|
|
150
|
+
const clippedRange = clipRange(options.range, shape);
|
|
151
|
+
const specs = pTable.getSpec();
|
|
152
|
+
const separator = options.format === "tsv" ? " " : ",";
|
|
153
|
+
const iterable = streamPTableRows({
|
|
154
|
+
pTable,
|
|
155
|
+
specs,
|
|
156
|
+
columnIndices: options.columnIndices,
|
|
157
|
+
range: clippedRange,
|
|
158
|
+
chunkSize: options.chunkSize ?? 5e4,
|
|
159
|
+
separator,
|
|
160
|
+
includeHeader: options.includeHeader ?? true,
|
|
161
|
+
bom: options.bom ?? true,
|
|
162
|
+
signal: combinedSignal
|
|
163
|
+
});
|
|
164
|
+
const miLogger = {
|
|
165
|
+
info: (msg) => this.logger("info", String(msg)),
|
|
166
|
+
warn: (msg) => this.logger("warn", String(msg)),
|
|
167
|
+
error: (msg) => this.logger("error", String(msg))
|
|
168
|
+
};
|
|
169
|
+
let bytesWritten = 0;
|
|
170
|
+
await createPathAtomically(miLogger, options.path, async (tempPath) => {
|
|
171
|
+
const writeStream = fs$1.createWriteStream(tempPath, { flags: "wx" });
|
|
172
|
+
const source = Readable.from(iterable, { objectMode: false });
|
|
173
|
+
if (options.compression?.type === "gzip") await pipeline(source, zlib.createGzip({ level: options.compression.level ?? 6 }), writeStream, { signal: combinedSignal });
|
|
174
|
+
else await pipeline(source, writeStream, { signal: combinedSignal });
|
|
175
|
+
bytesWritten = writeStream.bytesWritten;
|
|
176
|
+
});
|
|
177
|
+
const overallSize = await pTable.getFootprint({ signal: combinedSignal });
|
|
178
|
+
this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);
|
|
179
|
+
const rowsWritten = clippedRange.length;
|
|
180
|
+
if (logPFrames()) {
|
|
181
|
+
const durationMs = Math.round(performance.now() - startTime);
|
|
182
|
+
this.logger("info", `[WritePTableToFs] complete (handle = ${handle}, columns = ${options.columnIndices.length}, rows = ${rowsWritten}, bytes = ${bytesWritten}, duration = ${durationMs}ms)`);
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
path: options.path,
|
|
186
|
+
rowsWritten,
|
|
187
|
+
bytesWritten
|
|
188
|
+
};
|
|
189
|
+
});
|
|
190
|
+
} catch (_) {
|
|
191
|
+
_usingCtx4.e = _;
|
|
192
|
+
} finally {
|
|
193
|
+
_usingCtx4.d();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
133
196
|
async findColumns(handle, request) {
|
|
134
197
|
const iRequest = {
|
|
135
198
|
...request,
|
|
@@ -151,9 +214,9 @@ var AbstractPFrameDriver = class {
|
|
|
151
214
|
}
|
|
152
215
|
async calculateTableData(handle, request, range, signal) {
|
|
153
216
|
try {
|
|
154
|
-
var
|
|
217
|
+
var _usingCtx5 = _usingCtx();
|
|
155
218
|
if (logPFrames()) this.logger("info", `Call calculateTableData, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`);
|
|
156
|
-
const tableGuard =
|
|
219
|
+
const tableGuard = _usingCtx5.u(new PoolEntryGuard(this.pTables.acquire({
|
|
157
220
|
type: "v1",
|
|
158
221
|
pFrameHandle: handle,
|
|
159
222
|
def: sortPTableDef(migrateTableFilter(request, this.logger))
|
|
@@ -175,9 +238,9 @@ var AbstractPFrameDriver = class {
|
|
|
175
238
|
}));
|
|
176
239
|
});
|
|
177
240
|
} catch (_) {
|
|
178
|
-
|
|
241
|
+
_usingCtx5.e = _;
|
|
179
242
|
} finally {
|
|
180
|
-
|
|
243
|
+
_usingCtx5.d();
|
|
181
244
|
}
|
|
182
245
|
}
|
|
183
246
|
async getUniqueValues(handle, request, signal) {
|
|
@@ -194,21 +257,21 @@ var AbstractPFrameDriver = class {
|
|
|
194
257
|
}
|
|
195
258
|
async getSpec(handle) {
|
|
196
259
|
try {
|
|
197
|
-
var
|
|
260
|
+
var _usingCtx6 = _usingCtx();
|
|
198
261
|
const { def } = this.pTableDefs.getByKey(handle);
|
|
199
|
-
const { pTablePromise } =
|
|
262
|
+
const { pTablePromise } = _usingCtx6.u(this.pTables.acquire(def)).resource;
|
|
200
263
|
return (await pTablePromise).getSpec();
|
|
201
264
|
} catch (_) {
|
|
202
|
-
|
|
265
|
+
_usingCtx6.e = _;
|
|
203
266
|
} finally {
|
|
204
|
-
|
|
267
|
+
_usingCtx6.d();
|
|
205
268
|
}
|
|
206
269
|
}
|
|
207
270
|
async getShape(handle, signal) {
|
|
208
271
|
try {
|
|
209
|
-
var
|
|
272
|
+
var _usingCtx7 = _usingCtx();
|
|
210
273
|
const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);
|
|
211
|
-
const tableGuard =
|
|
274
|
+
const tableGuard = _usingCtx7.u(new PoolEntryGuard(this.pTables.acquire(def)));
|
|
212
275
|
const { pTablePromise, disposeSignal } = tableGuard.resource;
|
|
213
276
|
const pTable = await pTablePromise;
|
|
214
277
|
const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));
|
|
@@ -221,16 +284,16 @@ var AbstractPFrameDriver = class {
|
|
|
221
284
|
this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);
|
|
222
285
|
return shape;
|
|
223
286
|
} catch (_) {
|
|
224
|
-
|
|
287
|
+
_usingCtx7.e = _;
|
|
225
288
|
} finally {
|
|
226
|
-
|
|
289
|
+
_usingCtx7.d();
|
|
227
290
|
}
|
|
228
291
|
}
|
|
229
292
|
async getData(handle, columnIndices, range, signal) {
|
|
230
293
|
try {
|
|
231
|
-
var
|
|
294
|
+
var _usingCtx8 = _usingCtx();
|
|
232
295
|
const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);
|
|
233
|
-
const tableGuard =
|
|
296
|
+
const tableGuard = _usingCtx8.u(new PoolEntryGuard(this.pTables.acquire(def)));
|
|
234
297
|
const { pTablePromise, disposeSignal } = tableGuard.resource;
|
|
235
298
|
const pTable = await pTablePromise;
|
|
236
299
|
const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));
|
|
@@ -246,12 +309,24 @@ var AbstractPFrameDriver = class {
|
|
|
246
309
|
this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);
|
|
247
310
|
return data;
|
|
248
311
|
} catch (_) {
|
|
249
|
-
|
|
312
|
+
_usingCtx8.e = _;
|
|
250
313
|
} finally {
|
|
251
|
-
|
|
314
|
+
_usingCtx8.d();
|
|
252
315
|
}
|
|
253
316
|
}
|
|
254
317
|
};
|
|
318
|
+
/** Clamp range to table shape. When range is undefined, returns full table range. */
|
|
319
|
+
function clipRange(range, shape) {
|
|
320
|
+
if (isNil(range)) return {
|
|
321
|
+
offset: 0,
|
|
322
|
+
length: shape.rows
|
|
323
|
+
};
|
|
324
|
+
const clampedOffset = Math.min(range.offset, shape.rows);
|
|
325
|
+
return {
|
|
326
|
+
offset: clampedOffset,
|
|
327
|
+
length: Math.min(range.length, shape.rows - clampedOffset)
|
|
328
|
+
};
|
|
329
|
+
}
|
|
255
330
|
function migrateFilters(filters, logger) {
|
|
256
331
|
const filtersV1 = [];
|
|
257
332
|
const filtersV2 = [];
|
package/dist/driver_impl.js.map
CHANGED
|
@@ -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 resolveAnnotationParents,\n} from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { ConcurrencyLimitingExecutor } from \"@milaboratories/ts-helpers\";\nimport { PoolEntryGuard, type PoolEntry } from \"@milaboratories/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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"}
|
|
1
|
+
{"version":3,"file":"driver_impl.js","names":["createSpecFrame","fs"],"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 createPathAtomically,\n type MiLogger,\n} from \"@milaboratories/ts-helpers\";\nimport { isNil, PoolEntryGuard, type PoolEntry } from \"@milaboratories/helpers\";\nimport { PFrameFactory } from \"@milaboratories/pframes-rs-node\";\nimport { tmpdir } from \"node:os\";\nimport * as fs from \"node:fs\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport * as zlib from \"node:zlib\";\nimport { streamPTableRows } from \"./csv_writer\";\nimport type {\n AbstractInternalPFrameDriver,\n WritePTableToFsOptions,\n WritePTableToFsResult,\n} 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 public async writePTableToFs(\n handle: PTableHandle,\n options: WritePTableToFsOptions,\n ): Promise<WritePTableToFsResult> {\n this.logger(\n \"info\",\n `[WritePTableToFs] ENTER (handle = ${handle}, path = ${options.path}, format = ${options.format}, compression = ${options.compression ?? \"auto\"}, columns = ${options.columnIndices.length})`,\n );\n const startTime = performance.now();\n const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);\n using tableGuard = new PoolEntryGuard(this.pTables.acquire(def));\n const { pTablePromise, disposeSignal } = tableGuard.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any(\n [options.signal, disposeSignal].filter((s): s is AbortSignal => !isNil(s)),\n );\n\n return await this.tableConcurrencyLimiter.run(async () => {\n const shape = await pTable.getShape({ signal: combinedSignal });\n const clippedRange = clipRange(options.range, shape);\n const specs = pTable.getSpec();\n const separator = options.format === \"tsv\" ? \"\\t\" : \",\";\n\n const iterable = streamPTableRows({\n pTable,\n specs,\n columnIndices: options.columnIndices,\n range: clippedRange,\n chunkSize: options.chunkSize ?? 50_000,\n separator,\n includeHeader: options.includeHeader ?? true,\n bom: options.bom ?? true,\n signal: combinedSignal,\n });\n\n const miLogger: MiLogger = {\n info: (msg) => this.logger(\"info\", String(msg)),\n warn: (msg) => this.logger(\"warn\", String(msg)),\n error: (msg) => this.logger(\"error\", String(msg)),\n };\n\n let bytesWritten = 0;\n await createPathAtomically(miLogger, options.path, async (tempPath) => {\n const writeStream = fs.createWriteStream(tempPath, { flags: \"wx\" });\n const source = Readable.from(iterable, { objectMode: false });\n if (options.compression?.type === \"gzip\") {\n const gzip = zlib.createGzip({ level: options.compression.level ?? 6 });\n await pipeline(source, gzip, writeStream, { signal: combinedSignal });\n } else {\n await pipeline(source, writeStream, { signal: combinedSignal });\n }\n bytesWritten = writeStream.bytesWritten;\n });\n\n const overallSize = await pTable.getFootprint({ signal: combinedSignal });\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\n\n // rowsWritten equals the clipped range length — the generator streams the\n // entire effective range without early termination, so this is accurate.\n const rowsWritten = clippedRange.length;\n\n if (logPFrames()) {\n const durationMs = Math.round(performance.now() - startTime);\n this.logger(\n \"info\",\n `[WritePTableToFs] complete (handle = ${handle}, columns = ${options.columnIndices.length}, rows = ${rowsWritten}, bytes = ${bytesWritten}, duration = ${durationMs}ms)`,\n );\n }\n\n return { path: options.path, rowsWritten, bytesWritten };\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\n/** Clamp range to table shape. When range is undefined, returns full table range. */\nfunction clipRange(range: undefined | TableRange, shape: PTableShape): TableRange {\n if (isNil(range)) {\n return { offset: 0, length: shape.rows };\n }\n const clampedOffset = Math.min(range.offset, shape.rows);\n const clampedLength = Math.min(range.length, shape.rows - clampedOffset);\n return { offset: clampedOffset, length: clampedLength };\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.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { AbstractInternalPFrameDriver } from "./driver_decl.js";
|
|
1
|
+
import { AbstractInternalPFrameDriver, PTableDownloadFormat, WritePTableToFsOptions, WritePTableToFsResult } 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
|
-
export { AbstractInternalPFrameDriver, AbstractPFrameDriver, AbstractPFrameDriverOps, AbstractPFrameDriverOpsDefaults, DataInfoResolver, FileName, FilePath, FolderPath, InternalPFrameDriverDouble, LocalBlobProvider, RemoteBlobProvider, createPFrameDriverDouble, makeFolderPath, makeJsonDataInfo };
|
|
5
|
+
export { AbstractInternalPFrameDriver, AbstractPFrameDriver, AbstractPFrameDriverOps, AbstractPFrameDriverOpsDefaults, DataInfoResolver, FileName, FilePath, FolderPath, InternalPFrameDriverDouble, LocalBlobProvider, PTableDownloadFormat, RemoteBlobProvider, WritePTableToFsOptions, WritePTableToFsResult, createPFrameDriverDouble, makeFolderPath, makeJsonDataInfo };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@milaboratories/pf-driver",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "PFrameDriver implementation abstracted from Middle Layer",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -25,13 +25,14 @@
|
|
|
25
25
|
"es-toolkit": "^1.39.10",
|
|
26
26
|
"lru-cache": "^11.2.2",
|
|
27
27
|
"@milaboratories/helpers": "1.14.1",
|
|
28
|
-
"@milaboratories/pl-model-
|
|
29
|
-
"@milaboratories/pl-model-
|
|
28
|
+
"@milaboratories/pl-model-middle-layer": "1.18.5",
|
|
29
|
+
"@milaboratories/pl-model-common": "1.36.0",
|
|
30
30
|
"@milaboratories/ts-helpers": "1.8.1"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/node": "~24.5.2",
|
|
34
34
|
"@vitest/coverage-istanbul": "^4.1.3",
|
|
35
|
+
"fast-csv": "5.0.5",
|
|
35
36
|
"typescript": "~5.9.3",
|
|
36
37
|
"vitest": "^4.1.3",
|
|
37
38
|
"@milaboratories/build-configs": "2.0.0",
|