@milaboratories/pf-driver 1.7.8 → 1.7.10
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/driver_decl.d.ts +8 -0
- package/dist/driver_decl.d.ts.map +1 -1
- package/dist/driver_double.cjs +4 -0
- package/dist/driver_double.cjs.map +1 -1
- package/dist/driver_double.d.ts.map +1 -1
- package/dist/driver_double.js +4 -0
- package/dist/driver_double.js.map +1 -1
- package/dist/driver_impl.cjs +11 -3
- package/dist/driver_impl.cjs.map +1 -1
- package/dist/driver_impl.d.ts +6 -1
- package/dist/driver_impl.d.ts.map +1 -1
- package/dist/driver_impl.js +11 -3
- package/dist/driver_impl.js.map +1 -1
- package/dist/pframe_pool.cjs.map +1 -1
- package/dist/pframe_pool.js.map +1 -1
- package/dist/ptable_pool.cjs.map +1 -1
- package/dist/ptable_pool.js.map +1 -1
- package/package.json +6 -6
- package/src/driver_decl.ts +10 -0
- package/src/driver_double.ts +6 -0
- package/src/driver_impl.ts +17 -6
- package/src/pframe_pool.ts +1 -1
- package/src/ptable_pool.ts +1 -1
package/dist/driver_decl.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { CalculateTableDataRequest, CalculateTableDataResponse, ExportPTableOptions, ExportPTableOptions as ExportPTableOptions$1, PColumn, PFrameDef, PFrameDriver, PFrameHandle, PObjectId, PTableDef, PTableDefV2, PTableDownloadFormat, PTableHandle, PTableShape, PTableVector, TableRange, UniqueValuesRequest, UniqueValuesResponse, WritePTableToFsOptions, WritePTableToFsOptions as WritePTableToFsOptions$1, WritePTableToFsResult, WritePTableToFsResult as WritePTableToFsResult$1 } from "@milaboratories/pl-model-common";
|
|
2
2
|
import { PoolEntry } from "@milaboratories/helpers";
|
|
3
|
+
import { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
|
|
3
4
|
|
|
4
5
|
//#region src/driver_decl.d.ts
|
|
5
6
|
/**
|
|
@@ -17,6 +18,13 @@ interface AbstractInternalPFrameDriver<PColumnData> extends PFrameDriver, AsyncD
|
|
|
17
18
|
* @warning This method will always reject on Windows!
|
|
18
19
|
*/
|
|
19
20
|
pprofDump(): Promise<Uint8Array>;
|
|
21
|
+
/**
|
|
22
|
+
* Metrics from the byte-range cache backing the parquet object store,
|
|
23
|
+
* or `null` when no caching layer is configured.
|
|
24
|
+
*/
|
|
25
|
+
getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null>;
|
|
26
|
+
/** Drop all cached parquet byte ranges; no-op when no caching layer is configured. */
|
|
27
|
+
resetCache(): Promise<void>;
|
|
20
28
|
/** Create a new PFrame */
|
|
21
29
|
createPFrame(def: PFrameDef<PColumn<PColumnData>>): PoolEntry<PFrameHandle>;
|
|
22
30
|
/** Create a new PTable */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver_decl.d.ts","names":[],"sources":["../src/driver_decl.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"driver_decl.d.ts","names":[],"sources":["../src/driver_decl.ts"],"mappings":";;;;;;AAkCA;;;UAAiB,4BAAA,sBAAkD,YAAA,EAAc,eAAA;EAW1D;EATrB,OAAA,IAAW,OAAA;EAegB;;;;;;;EAN3B,SAAA,IAAa,OAAA,CAAQ,UAAA;EAee;;;;EATpC,eAAA,IAAmB,OAAA,CAAQ,cAAA,CAAe,YAAA;EAYF;EATxC,UAAA,IAAc,OAAA;EASM;EANpB,YAAA,CAAa,GAAA,EAAK,SAAA,CAAU,OAAA,CAAQ,WAAA,KAAgB,SAAA,CAAU,YAAA;EAMN;EAHxD,YAAA,CAAa,GAAA,EAAK,SAAA,CAAU,OAAA,CAAQ,WAAA,KAAgB,SAAA,CAAU,YAAA;EAQzB;EALrC,cAAA,CAAe,GAAA,EAAK,WAAA,CAAY,OAAA,CAAQ,WAAA,KAAgB,SAAA,CAAU,YAAA;EAMzD;EAHT,kBAAA,CACE,MAAA,EAAQ,YAAA,EACR,OAAA,EAAS,yBAAA,CAA0B,SAAA,GACnC,KAAA,EAAO,UAAA,cACP,MAAA,GAAS,WAAA,GACR,OAAA,CAAQ,0BAAA;EAAA;EAGX,eAAA,CACE,MAAA,EAAQ,YAAA,EACR,OAAA,EAAS,mBAAA,EACT,MAAA,GAAS,WAAA,GACR,OAAA,CAAQ,oBAAA;EAHD;EAMV,QAAA,CAAS,MAAA,EAAQ,YAAA,EAAc,MAAA,GAAS,WAAA,GAAc,OAAA,CAAQ,WAAA;EAJnD;;;;;;;;EAcX,OAAA,CACE,MAAA,EAAQ,YAAA,EACR,aAAA,YACA,KAAA,EAAO,UAAA,cACP,MAAA,GAAS,WAAA,GACR,OAAA,CAAQ,YAAA;EADA;EAIX,eAAA,CACE,MAAA,EAAQ,YAAA,EACR,OAAA,EAAS,sBAAA,GACR,OAAA,CAAQ,qBAAA;EANR;;;;;;EAcH,YAAA,CACE,MAAA,EAAQ,YAAA,EACR,OAAA,EAAS,mBAAA,EACT,MAAA,GAAS,WAAA,GACR,OAAA;AAAA"}
|
package/dist/driver_double.cjs
CHANGED
|
@@ -84,6 +84,10 @@ var RemoteBlobProviderImpl = class RemoteBlobProviderImpl {
|
|
|
84
84
|
httpServerInfo() {
|
|
85
85
|
return this.server.info;
|
|
86
86
|
}
|
|
87
|
+
async getCacheMetrics() {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
async resetCache() {}
|
|
87
91
|
async [Symbol.asyncDispose]() {
|
|
88
92
|
await this.server.stop();
|
|
89
93
|
await this.pool[Symbol.asyncDispose]();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver_double.cjs","names":["fs","PFrameDriverError","RefCountPoolBase","path","HttpHelpers","PFrameInternal","makeJsonDataInfo","AbstractPFrameDriver"],"sources":["../src/driver_double.ts"],"sourcesContent":["import {\n isDataInfo,\n PFrameDriverError,\n type Branded,\n type PColumnSpec,\n type PColumnValues,\n} from \"@milaboratories/pl-model-common\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/helpers\";\nimport { HttpHelpers } from \"@milaboratories/pframes-rs-node\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { AbstractInternalPFrameDriver } from \"./driver_decl\";\nimport {\n AbstractPFrameDriver,\n type LocalBlobProvider,\n type RemoteBlobProvider,\n} from \"./driver_impl\";\nimport { makeJsonDataInfo } from \"./data_info_helpers\";\n\nexport type FileName = Branded<string, \"FileName\">;\nexport type FilePath = Branded<string, \"FilePath\">;\nexport type FolderPath = Branded<string, \"FolderPath\">;\n\nexport function makeFolderPath(dataFolder: string): FolderPath {\n if (!fs.statSync(dataFolder, { throwIfNoEntry: false })?.isDirectory()) {\n const error = new PFrameDriverError(`Invalid data folder`);\n error.cause = new Error(`Folder ${dataFolder} does not exist`);\n throw error;\n }\n return dataFolder as FolderPath;\n}\n\nfunction makeBlobId(res: FileName): PFrameInternal.PFrameBlobId {\n return res as string as PFrameInternal.PFrameBlobId;\n}\n\nclass LocalBlobProviderImpl\n extends RefCountPoolBase<FileName, PFrameInternal.PFrameBlobId, FilePath>\n implements LocalBlobProvider<FileName>\n{\n constructor(private readonly dataFolder: FolderPath) {\n super();\n }\n\n protected calculateParamsKey(params: FileName): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(params: FileName, _key: PFrameInternal.PFrameBlobId): FilePath {\n const filePath = path.join(this.dataFolder, params);\n if (!fs.statSync(filePath, { throwIfNoEntry: false })?.isFile()) {\n const error = new PFrameDriverError(`Invalid file name`);\n error.cause = new Error(`File ${filePath} does not exist`);\n throw error;\n }\n return filePath as FilePath;\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): FilePath {\n const resource = super.tryGetByKey(blobId);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid blob id`);\n error.cause = new Error(`Blob with id ${blobId} not found.`);\n throw error;\n }\n return resource;\n }\n\n public makeDataSource(\n signal: AbortSignal,\n ): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\"> {\n return {\n preloadBlob: async (_blobIds: PFrameInternal.PFrameBlobId[]) => {},\n resolveBlobContent: async (blobId: PFrameInternal.PFrameBlobId) => {\n const filePath = this.getByKey(blobId);\n return await fs.promises.readFile(filePath, { signal });\n },\n };\n }\n}\n\nclass RemoteBlobProviderImpl implements RemoteBlobProvider<FileName> {\n constructor(\n private readonly pool: LocalBlobProviderImpl,\n private readonly server: PFrameInternal.HttpServer,\n ) {}\n\n public static async init(\n dataFolder: FolderPath,\n logger: PFrameInternal.Logger,\n serverOptions: Omit<PFrameInternal.HttpServerOptions, \"handler\">,\n ): Promise<RemoteBlobProviderImpl> {\n const pool = new LocalBlobProviderImpl(dataFolder);\n\n const underlyingStore = await HttpHelpers.createFsStore({ rootDir: dataFolder, logger });\n const store: PFrameInternal.ObjectStore = {\n request: (filename, params) => {\n const blobId = filename.slice(0, -PFrameInternal.ParquetExtension.length);\n return underlyingStore.request(blobId as PFrameInternal.ParquetFileName, params);\n },\n };\n\n const handler = HttpHelpers.createRequestHandler({ store });\n const server = await HttpHelpers.createHttpServer({ ...serverOptions, handler });\n\n return new RemoteBlobProviderImpl(pool, server);\n }\n\n public acquire(params: FileName): PoolEntry<PFrameInternal.PFrameBlobId> {\n return this.pool.acquire(params);\n }\n\n public httpServerInfo(): PFrameInternal.HttpServerInfo {\n return this.server.info;\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.server.stop();\n await this.pool[Symbol.asyncDispose]();\n }\n}\n\nexport type InternalPFrameDriverDouble = AbstractInternalPFrameDriver<\n PFrameInternal.DataInfo<FileName> | PColumnValues\n>;\n\n// It's mock for testing purposes, not a real test!\nexport async function createPFrameDriverDouble({\n dataFolder = tmpdir() as FolderPath,\n logger = console.log,\n}: {\n dataFolder?: FolderPath;\n logger?: PFrameInternal.Logger;\n}): Promise<InternalPFrameDriverDouble> {\n const localBlobProvider = new LocalBlobProviderImpl(dataFolder);\n const remoteBlobProvider = await RemoteBlobProviderImpl.init(dataFolder, logger, {});\n\n const resolveDataInfo = (\n spec: PColumnSpec,\n data: PFrameInternal.DataInfo<FileName> | PColumnValues,\n ) => (isDataInfo(data) ? data : makeJsonDataInfo(spec, data));\n\n return new AbstractPFrameDriver({\n logger,\n localBlobProvider,\n remoteBlobProvider,\n resolveDataInfo,\n });\n}\n"],"mappings":";;;;;;;;;;;;;AAyBA,SAAgB,eAAe,YAAgC;AAC7D,KAAI,CAACA,QAAAA,QAAG,SAAS,YAAY,EAAE,gBAAgB,OAAO,CAAC,EAAE,aAAa,EAAE;EACtE,MAAM,QAAQ,IAAIC,gCAAAA,kBAAkB,sBAAsB;AAC1D,QAAM,wBAAQ,IAAI,MAAM,UAAU,WAAW,iBAAiB;AAC9D,QAAM;;AAER,QAAO;;AAGT,SAAS,WAAW,KAA4C;AAC9D,QAAO;;AAGT,IAAM,wBAAN,cACUC,wBAAAA,iBAEV;CACE,YAAY,YAAyC;AACnD,SAAO;AADoB,OAAA,aAAA;;CAI7B,mBAA6B,QAA+C;AAC1E,SAAO,WAAW,OAAO;;CAG3B,kBAA4B,QAAkB,MAA6C;EACzF,MAAM,WAAWC,UAAAA,QAAK,KAAK,KAAK,YAAY,OAAO;AACnD,MAAI,CAACH,QAAAA,QAAG,SAAS,UAAU,EAAE,gBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE;GAC/D,MAAM,QAAQ,IAAIC,gCAAAA,kBAAkB,oBAAoB;AACxD,SAAM,wBAAQ,IAAI,MAAM,QAAQ,SAAS,iBAAiB;AAC1D,SAAM;;AAER,SAAO;;CAGT,SAAgB,QAA+C;EAC7D,MAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,MAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAIA,gCAAAA,kBAAkB,kBAAkB;AACtD,SAAM,wBAAQ,IAAI,MAAM,gBAAgB,OAAO,aAAa;AAC5D,SAAM;;AAER,SAAO;;CAGT,eACE,QAC0D;AAC1D,SAAO;GACL,aAAa,OAAO,aAA4C;GAChE,oBAAoB,OAAO,WAAwC;IACjE,MAAM,WAAW,KAAK,SAAS,OAAO;AACtC,WAAO,MAAMD,QAAAA,QAAG,SAAS,SAAS,UAAU,EAAE,QAAQ,CAAC;;GAE1D;;;AAIL,IAAM,yBAAN,MAAM,uBAA+D;CACnE,YACE,MACA,QACA;AAFiB,OAAA,OAAA;AACA,OAAA,SAAA;;CAGnB,aAAoB,KAClB,YACA,QACA,eACiC;EACjC,MAAM,OAAO,IAAI,sBAAsB,WAAW;EAElD,MAAM,kBAAkB,MAAMI,gCAAAA,YAAY,cAAc;GAAE,SAAS;GAAY;GAAQ,CAAC;EAQxF,MAAM,UAAUA,gCAAAA,YAAY,qBAAqB,EAAE,OAPT,EACxC,UAAU,UAAU,WAAW;GAC7B,MAAM,SAAS,SAAS,MAAM,GAAG,CAACC,sCAAAA,eAAe,iBAAiB,OAAO;AACzE,UAAO,gBAAgB,QAAQ,QAA0C,OAAO;KAEnF,EAEyD,CAAC;AAG3D,SAAO,IAAI,uBAAuB,MAFnB,MAAMD,gCAAAA,YAAY,iBAAiB;GAAE,GAAG;GAAe;GAAS,CAAC,CAEjC;;CAGjD,QAAe,QAA0D;AACvE,SAAO,KAAK,KAAK,QAAQ,OAAO;;CAGlC,iBAAuD;AACrD,SAAO,KAAK,OAAO;;CAGrB,OAAO,OAAO,gBAA+B;AAC3C,QAAM,KAAK,OAAO,MAAM;AACxB,QAAM,KAAK,KAAK,OAAO,eAAe;;;AAS1C,eAAsB,yBAAyB,EAC7C,cAAA,GAAA,QAAA,SAAqB,EACrB,SAAS,QAAQ,OAIqB;CACtC,MAAM,oBAAoB,IAAI,sBAAsB,WAAW;CAC/D,MAAM,qBAAqB,MAAM,uBAAuB,KAAK,YAAY,QAAQ,EAAE,CAAC;CAEpF,MAAM,mBACJ,MACA,UAAA,GAAA,gCAAA,YACe,KAAK,GAAG,OAAOE,0BAAAA,iBAAiB,MAAM,KAAK;AAE5D,QAAO,IAAIC,oBAAAA,qBAAqB;EAC9B;EACA;EACA;EACA;EACD,CAAC"}
|
|
1
|
+
{"version":3,"file":"driver_double.cjs","names":["fs","PFrameDriverError","RefCountPoolBase","path","HttpHelpers","PFrameInternal","makeJsonDataInfo","AbstractPFrameDriver"],"sources":["../src/driver_double.ts"],"sourcesContent":["import {\n isDataInfo,\n PFrameDriverError,\n type Branded,\n type PColumnSpec,\n type PColumnValues,\n} from \"@milaboratories/pl-model-common\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/helpers\";\nimport { HttpHelpers } from \"@milaboratories/pframes-rs-node\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { AbstractInternalPFrameDriver } from \"./driver_decl\";\nimport {\n AbstractPFrameDriver,\n type LocalBlobProvider,\n type RemoteBlobProvider,\n} from \"./driver_impl\";\nimport { makeJsonDataInfo } from \"./data_info_helpers\";\n\nexport type FileName = Branded<string, \"FileName\">;\nexport type FilePath = Branded<string, \"FilePath\">;\nexport type FolderPath = Branded<string, \"FolderPath\">;\n\nexport function makeFolderPath(dataFolder: string): FolderPath {\n if (!fs.statSync(dataFolder, { throwIfNoEntry: false })?.isDirectory()) {\n const error = new PFrameDriverError(`Invalid data folder`);\n error.cause = new Error(`Folder ${dataFolder} does not exist`);\n throw error;\n }\n return dataFolder as FolderPath;\n}\n\nfunction makeBlobId(res: FileName): PFrameInternal.PFrameBlobId {\n return res as string as PFrameInternal.PFrameBlobId;\n}\n\nclass LocalBlobProviderImpl\n extends RefCountPoolBase<FileName, PFrameInternal.PFrameBlobId, FilePath>\n implements LocalBlobProvider<FileName>\n{\n constructor(private readonly dataFolder: FolderPath) {\n super();\n }\n\n protected calculateParamsKey(params: FileName): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(params: FileName, _key: PFrameInternal.PFrameBlobId): FilePath {\n const filePath = path.join(this.dataFolder, params);\n if (!fs.statSync(filePath, { throwIfNoEntry: false })?.isFile()) {\n const error = new PFrameDriverError(`Invalid file name`);\n error.cause = new Error(`File ${filePath} does not exist`);\n throw error;\n }\n return filePath as FilePath;\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): FilePath {\n const resource = super.tryGetByKey(blobId);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid blob id`);\n error.cause = new Error(`Blob with id ${blobId} not found.`);\n throw error;\n }\n return resource;\n }\n\n public makeDataSource(\n signal: AbortSignal,\n ): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\"> {\n return {\n preloadBlob: async (_blobIds: PFrameInternal.PFrameBlobId[]) => {},\n resolveBlobContent: async (blobId: PFrameInternal.PFrameBlobId) => {\n const filePath = this.getByKey(blobId);\n return await fs.promises.readFile(filePath, { signal });\n },\n };\n }\n}\n\nclass RemoteBlobProviderImpl implements RemoteBlobProvider<FileName> {\n constructor(\n private readonly pool: LocalBlobProviderImpl,\n private readonly server: PFrameInternal.HttpServer,\n ) {}\n\n public static async init(\n dataFolder: FolderPath,\n logger: PFrameInternal.Logger,\n serverOptions: Omit<PFrameInternal.HttpServerOptions, \"handler\">,\n ): Promise<RemoteBlobProviderImpl> {\n const pool = new LocalBlobProviderImpl(dataFolder);\n\n const underlyingStore = await HttpHelpers.createFsStore({ rootDir: dataFolder, logger });\n const store: PFrameInternal.ObjectStore = {\n request: (filename, params) => {\n const blobId = filename.slice(0, -PFrameInternal.ParquetExtension.length);\n return underlyingStore.request(blobId as PFrameInternal.ParquetFileName, params);\n },\n };\n\n const handler = HttpHelpers.createRequestHandler({ store });\n const server = await HttpHelpers.createHttpServer({ ...serverOptions, handler });\n\n return new RemoteBlobProviderImpl(pool, server);\n }\n\n public acquire(params: FileName): PoolEntry<PFrameInternal.PFrameBlobId> {\n return this.pool.acquire(params);\n }\n\n public httpServerInfo(): PFrameInternal.HttpServerInfo {\n return this.server.info;\n }\n\n public async getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null> {\n return null;\n }\n\n public async resetCache(): Promise<void> {}\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.server.stop();\n await this.pool[Symbol.asyncDispose]();\n }\n}\n\nexport type InternalPFrameDriverDouble = AbstractInternalPFrameDriver<\n PFrameInternal.DataInfo<FileName> | PColumnValues\n>;\n\n// It's mock for testing purposes, not a real test!\nexport async function createPFrameDriverDouble({\n dataFolder = tmpdir() as FolderPath,\n logger = console.log,\n}: {\n dataFolder?: FolderPath;\n logger?: PFrameInternal.Logger;\n}): Promise<InternalPFrameDriverDouble> {\n const localBlobProvider = new LocalBlobProviderImpl(dataFolder);\n const remoteBlobProvider = await RemoteBlobProviderImpl.init(dataFolder, logger, {});\n\n const resolveDataInfo = (\n spec: PColumnSpec,\n data: PFrameInternal.DataInfo<FileName> | PColumnValues,\n ) => (isDataInfo(data) ? data : makeJsonDataInfo(spec, data));\n\n return new AbstractPFrameDriver({\n logger,\n localBlobProvider,\n remoteBlobProvider,\n resolveDataInfo,\n });\n}\n"],"mappings":";;;;;;;;;;;;;AAyBA,SAAgB,eAAe,YAAgC;AAC7D,KAAI,CAACA,QAAAA,QAAG,SAAS,YAAY,EAAE,gBAAgB,OAAO,CAAC,EAAE,aAAa,EAAE;EACtE,MAAM,QAAQ,IAAIC,gCAAAA,kBAAkB,sBAAsB;AAC1D,QAAM,wBAAQ,IAAI,MAAM,UAAU,WAAW,iBAAiB;AAC9D,QAAM;;AAER,QAAO;;AAGT,SAAS,WAAW,KAA4C;AAC9D,QAAO;;AAGT,IAAM,wBAAN,cACUC,wBAAAA,iBAEV;CACE,YAAY,YAAyC;AACnD,SAAO;AADoB,OAAA,aAAA;;CAI7B,mBAA6B,QAA+C;AAC1E,SAAO,WAAW,OAAO;;CAG3B,kBAA4B,QAAkB,MAA6C;EACzF,MAAM,WAAWC,UAAAA,QAAK,KAAK,KAAK,YAAY,OAAO;AACnD,MAAI,CAACH,QAAAA,QAAG,SAAS,UAAU,EAAE,gBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE;GAC/D,MAAM,QAAQ,IAAIC,gCAAAA,kBAAkB,oBAAoB;AACxD,SAAM,wBAAQ,IAAI,MAAM,QAAQ,SAAS,iBAAiB;AAC1D,SAAM;;AAER,SAAO;;CAGT,SAAgB,QAA+C;EAC7D,MAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,MAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAIA,gCAAAA,kBAAkB,kBAAkB;AACtD,SAAM,wBAAQ,IAAI,MAAM,gBAAgB,OAAO,aAAa;AAC5D,SAAM;;AAER,SAAO;;CAGT,eACE,QAC0D;AAC1D,SAAO;GACL,aAAa,OAAO,aAA4C;GAChE,oBAAoB,OAAO,WAAwC;IACjE,MAAM,WAAW,KAAK,SAAS,OAAO;AACtC,WAAO,MAAMD,QAAAA,QAAG,SAAS,SAAS,UAAU,EAAE,QAAQ,CAAC;;GAE1D;;;AAIL,IAAM,yBAAN,MAAM,uBAA+D;CACnE,YACE,MACA,QACA;AAFiB,OAAA,OAAA;AACA,OAAA,SAAA;;CAGnB,aAAoB,KAClB,YACA,QACA,eACiC;EACjC,MAAM,OAAO,IAAI,sBAAsB,WAAW;EAElD,MAAM,kBAAkB,MAAMI,gCAAAA,YAAY,cAAc;GAAE,SAAS;GAAY;GAAQ,CAAC;EAQxF,MAAM,UAAUA,gCAAAA,YAAY,qBAAqB,EAAE,OAPT,EACxC,UAAU,UAAU,WAAW;GAC7B,MAAM,SAAS,SAAS,MAAM,GAAG,CAACC,sCAAAA,eAAe,iBAAiB,OAAO;AACzE,UAAO,gBAAgB,QAAQ,QAA0C,OAAO;KAEnF,EAEyD,CAAC;AAG3D,SAAO,IAAI,uBAAuB,MAFnB,MAAMD,gCAAAA,YAAY,iBAAiB;GAAE,GAAG;GAAe;GAAS,CAAC,CAEjC;;CAGjD,QAAe,QAA0D;AACvE,SAAO,KAAK,KAAK,QAAQ,OAAO;;CAGlC,iBAAuD;AACrD,SAAO,KAAK,OAAO;;CAGrB,MAAa,kBAA+D;AAC1E,SAAO;;CAGT,MAAa,aAA4B;CAEzC,OAAO,OAAO,gBAA+B;AAC3C,QAAM,KAAK,OAAO,MAAM;AACxB,QAAM,KAAK,KAAK,OAAO,eAAe;;;AAS1C,eAAsB,yBAAyB,EAC7C,cAAA,GAAA,QAAA,SAAqB,EACrB,SAAS,QAAQ,OAIqB;CACtC,MAAM,oBAAoB,IAAI,sBAAsB,WAAW;CAC/D,MAAM,qBAAqB,MAAM,uBAAuB,KAAK,YAAY,QAAQ,EAAE,CAAC;CAEpF,MAAM,mBACJ,MACA,UAAA,GAAA,gCAAA,YACe,KAAK,GAAG,OAAOE,0BAAAA,iBAAiB,MAAM,KAAK;AAE5D,QAAO,IAAIC,oBAAAA,qBAAqB;EAC9B;EACA;EACA;EACA;EACD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver_double.d.ts","names":[],"sources":["../src/driver_double.ts"],"mappings":";;;;;KAqBY,QAAA,GAAW,OAAA;AAAA,KACX,QAAA,GAAW,OAAA;AAAA,KACX,UAAA,GAAa,OAAA;AAAA,iBAET,cAAA,CAAe,UAAA,WAAqB,UAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"driver_double.d.ts","names":[],"sources":["../src/driver_double.ts"],"mappings":";;;;;KAqBY,QAAA,GAAW,OAAA;AAAA,KACX,QAAA,GAAW,OAAA;AAAA,KACX,UAAA,GAAa,OAAA;AAAA,iBAET,cAAA,CAAe,UAAA,WAAqB,UAAA;AAAA,KAyGxC,0BAAA,GAA6B,4BAAA,CACvC,cAAA,CAAe,QAAA,CAAS,QAAA,IAAY,aAAA;AAAA,iBAIhB,wBAAA,CAAA;EACpB,UAAA;EACA;AAAA;EAEA,UAAA,GAAa,UAAA;EACb,MAAA,GAAS,cAAA,CAAe,MAAA;AAAA,IACtB,OAAA,CAAQ,0BAAA"}
|
package/dist/driver_double.js
CHANGED
|
@@ -81,6 +81,10 @@ var RemoteBlobProviderImpl = class RemoteBlobProviderImpl {
|
|
|
81
81
|
httpServerInfo() {
|
|
82
82
|
return this.server.info;
|
|
83
83
|
}
|
|
84
|
+
async getCacheMetrics() {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
async resetCache() {}
|
|
84
88
|
async [Symbol.asyncDispose]() {
|
|
85
89
|
await this.server.stop();
|
|
86
90
|
await this.pool[Symbol.asyncDispose]();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver_double.js","names":[],"sources":["../src/driver_double.ts"],"sourcesContent":["import {\n isDataInfo,\n PFrameDriverError,\n type Branded,\n type PColumnSpec,\n type PColumnValues,\n} from \"@milaboratories/pl-model-common\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/helpers\";\nimport { HttpHelpers } from \"@milaboratories/pframes-rs-node\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { AbstractInternalPFrameDriver } from \"./driver_decl\";\nimport {\n AbstractPFrameDriver,\n type LocalBlobProvider,\n type RemoteBlobProvider,\n} from \"./driver_impl\";\nimport { makeJsonDataInfo } from \"./data_info_helpers\";\n\nexport type FileName = Branded<string, \"FileName\">;\nexport type FilePath = Branded<string, \"FilePath\">;\nexport type FolderPath = Branded<string, \"FolderPath\">;\n\nexport function makeFolderPath(dataFolder: string): FolderPath {\n if (!fs.statSync(dataFolder, { throwIfNoEntry: false })?.isDirectory()) {\n const error = new PFrameDriverError(`Invalid data folder`);\n error.cause = new Error(`Folder ${dataFolder} does not exist`);\n throw error;\n }\n return dataFolder as FolderPath;\n}\n\nfunction makeBlobId(res: FileName): PFrameInternal.PFrameBlobId {\n return res as string as PFrameInternal.PFrameBlobId;\n}\n\nclass LocalBlobProviderImpl\n extends RefCountPoolBase<FileName, PFrameInternal.PFrameBlobId, FilePath>\n implements LocalBlobProvider<FileName>\n{\n constructor(private readonly dataFolder: FolderPath) {\n super();\n }\n\n protected calculateParamsKey(params: FileName): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(params: FileName, _key: PFrameInternal.PFrameBlobId): FilePath {\n const filePath = path.join(this.dataFolder, params);\n if (!fs.statSync(filePath, { throwIfNoEntry: false })?.isFile()) {\n const error = new PFrameDriverError(`Invalid file name`);\n error.cause = new Error(`File ${filePath} does not exist`);\n throw error;\n }\n return filePath as FilePath;\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): FilePath {\n const resource = super.tryGetByKey(blobId);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid blob id`);\n error.cause = new Error(`Blob with id ${blobId} not found.`);\n throw error;\n }\n return resource;\n }\n\n public makeDataSource(\n signal: AbortSignal,\n ): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\"> {\n return {\n preloadBlob: async (_blobIds: PFrameInternal.PFrameBlobId[]) => {},\n resolveBlobContent: async (blobId: PFrameInternal.PFrameBlobId) => {\n const filePath = this.getByKey(blobId);\n return await fs.promises.readFile(filePath, { signal });\n },\n };\n }\n}\n\nclass RemoteBlobProviderImpl implements RemoteBlobProvider<FileName> {\n constructor(\n private readonly pool: LocalBlobProviderImpl,\n private readonly server: PFrameInternal.HttpServer,\n ) {}\n\n public static async init(\n dataFolder: FolderPath,\n logger: PFrameInternal.Logger,\n serverOptions: Omit<PFrameInternal.HttpServerOptions, \"handler\">,\n ): Promise<RemoteBlobProviderImpl> {\n const pool = new LocalBlobProviderImpl(dataFolder);\n\n const underlyingStore = await HttpHelpers.createFsStore({ rootDir: dataFolder, logger });\n const store: PFrameInternal.ObjectStore = {\n request: (filename, params) => {\n const blobId = filename.slice(0, -PFrameInternal.ParquetExtension.length);\n return underlyingStore.request(blobId as PFrameInternal.ParquetFileName, params);\n },\n };\n\n const handler = HttpHelpers.createRequestHandler({ store });\n const server = await HttpHelpers.createHttpServer({ ...serverOptions, handler });\n\n return new RemoteBlobProviderImpl(pool, server);\n }\n\n public acquire(params: FileName): PoolEntry<PFrameInternal.PFrameBlobId> {\n return this.pool.acquire(params);\n }\n\n public httpServerInfo(): PFrameInternal.HttpServerInfo {\n return this.server.info;\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.server.stop();\n await this.pool[Symbol.asyncDispose]();\n }\n}\n\nexport type InternalPFrameDriverDouble = AbstractInternalPFrameDriver<\n PFrameInternal.DataInfo<FileName> | PColumnValues\n>;\n\n// It's mock for testing purposes, not a real test!\nexport async function createPFrameDriverDouble({\n dataFolder = tmpdir() as FolderPath,\n logger = console.log,\n}: {\n dataFolder?: FolderPath;\n logger?: PFrameInternal.Logger;\n}): Promise<InternalPFrameDriverDouble> {\n const localBlobProvider = new LocalBlobProviderImpl(dataFolder);\n const remoteBlobProvider = await RemoteBlobProviderImpl.init(dataFolder, logger, {});\n\n const resolveDataInfo = (\n spec: PColumnSpec,\n data: PFrameInternal.DataInfo<FileName> | PColumnValues,\n ) => (isDataInfo(data) ? data : makeJsonDataInfo(spec, data));\n\n return new AbstractPFrameDriver({\n logger,\n localBlobProvider,\n remoteBlobProvider,\n resolveDataInfo,\n });\n}\n"],"mappings":";;;;;;;;;;AAyBA,SAAgB,eAAe,YAAgC;AAC7D,KAAI,CAAC,GAAG,SAAS,YAAY,EAAE,gBAAgB,OAAO,CAAC,EAAE,aAAa,EAAE;EACtE,MAAM,QAAQ,IAAI,kBAAkB,sBAAsB;AAC1D,QAAM,wBAAQ,IAAI,MAAM,UAAU,WAAW,iBAAiB;AAC9D,QAAM;;AAER,QAAO;;AAGT,SAAS,WAAW,KAA4C;AAC9D,QAAO;;AAGT,IAAM,wBAAN,cACU,iBAEV;CACE,YAAY,YAAyC;AACnD,SAAO;AADoB,OAAA,aAAA;;CAI7B,mBAA6B,QAA+C;AAC1E,SAAO,WAAW,OAAO;;CAG3B,kBAA4B,QAAkB,MAA6C;EACzF,MAAM,WAAW,KAAK,KAAK,KAAK,YAAY,OAAO;AACnD,MAAI,CAAC,GAAG,SAAS,UAAU,EAAE,gBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE;GAC/D,MAAM,QAAQ,IAAI,kBAAkB,oBAAoB;AACxD,SAAM,wBAAQ,IAAI,MAAM,QAAQ,SAAS,iBAAiB;AAC1D,SAAM;;AAER,SAAO;;CAGT,SAAgB,QAA+C;EAC7D,MAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,MAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAI,kBAAkB,kBAAkB;AACtD,SAAM,wBAAQ,IAAI,MAAM,gBAAgB,OAAO,aAAa;AAC5D,SAAM;;AAER,SAAO;;CAGT,eACE,QAC0D;AAC1D,SAAO;GACL,aAAa,OAAO,aAA4C;GAChE,oBAAoB,OAAO,WAAwC;IACjE,MAAM,WAAW,KAAK,SAAS,OAAO;AACtC,WAAO,MAAM,GAAG,SAAS,SAAS,UAAU,EAAE,QAAQ,CAAC;;GAE1D;;;AAIL,IAAM,yBAAN,MAAM,uBAA+D;CACnE,YACE,MACA,QACA;AAFiB,OAAA,OAAA;AACA,OAAA,SAAA;;CAGnB,aAAoB,KAClB,YACA,QACA,eACiC;EACjC,MAAM,OAAO,IAAI,sBAAsB,WAAW;EAElD,MAAM,kBAAkB,MAAM,YAAY,cAAc;GAAE,SAAS;GAAY;GAAQ,CAAC;EAQxF,MAAM,UAAU,YAAY,qBAAqB,EAAE,OAPT,EACxC,UAAU,UAAU,WAAW;GAC7B,MAAM,SAAS,SAAS,MAAM,GAAG,CAAC,eAAe,iBAAiB,OAAO;AACzE,UAAO,gBAAgB,QAAQ,QAA0C,OAAO;KAEnF,EAEyD,CAAC;AAG3D,SAAO,IAAI,uBAAuB,MAFnB,MAAM,YAAY,iBAAiB;GAAE,GAAG;GAAe;GAAS,CAAC,CAEjC;;CAGjD,QAAe,QAA0D;AACvE,SAAO,KAAK,KAAK,QAAQ,OAAO;;CAGlC,iBAAuD;AACrD,SAAO,KAAK,OAAO;;CAGrB,OAAO,OAAO,gBAA+B;AAC3C,QAAM,KAAK,OAAO,MAAM;AACxB,QAAM,KAAK,KAAK,OAAO,eAAe;;;AAS1C,eAAsB,yBAAyB,EAC7C,aAAa,QAAQ,EACrB,SAAS,QAAQ,OAIqB;CACtC,MAAM,oBAAoB,IAAI,sBAAsB,WAAW;CAC/D,MAAM,qBAAqB,MAAM,uBAAuB,KAAK,YAAY,QAAQ,EAAE,CAAC;CAEpF,MAAM,mBACJ,MACA,SACI,WAAW,KAAK,GAAG,OAAO,iBAAiB,MAAM,KAAK;AAE5D,QAAO,IAAI,qBAAqB;EAC9B;EACA;EACA;EACA;EACD,CAAC"}
|
|
1
|
+
{"version":3,"file":"driver_double.js","names":[],"sources":["../src/driver_double.ts"],"sourcesContent":["import {\n isDataInfo,\n PFrameDriverError,\n type Branded,\n type PColumnSpec,\n type PColumnValues,\n} from \"@milaboratories/pl-model-common\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/helpers\";\nimport { HttpHelpers } from \"@milaboratories/pframes-rs-node\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { AbstractInternalPFrameDriver } from \"./driver_decl\";\nimport {\n AbstractPFrameDriver,\n type LocalBlobProvider,\n type RemoteBlobProvider,\n} from \"./driver_impl\";\nimport { makeJsonDataInfo } from \"./data_info_helpers\";\n\nexport type FileName = Branded<string, \"FileName\">;\nexport type FilePath = Branded<string, \"FilePath\">;\nexport type FolderPath = Branded<string, \"FolderPath\">;\n\nexport function makeFolderPath(dataFolder: string): FolderPath {\n if (!fs.statSync(dataFolder, { throwIfNoEntry: false })?.isDirectory()) {\n const error = new PFrameDriverError(`Invalid data folder`);\n error.cause = new Error(`Folder ${dataFolder} does not exist`);\n throw error;\n }\n return dataFolder as FolderPath;\n}\n\nfunction makeBlobId(res: FileName): PFrameInternal.PFrameBlobId {\n return res as string as PFrameInternal.PFrameBlobId;\n}\n\nclass LocalBlobProviderImpl\n extends RefCountPoolBase<FileName, PFrameInternal.PFrameBlobId, FilePath>\n implements LocalBlobProvider<FileName>\n{\n constructor(private readonly dataFolder: FolderPath) {\n super();\n }\n\n protected calculateParamsKey(params: FileName): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(params: FileName, _key: PFrameInternal.PFrameBlobId): FilePath {\n const filePath = path.join(this.dataFolder, params);\n if (!fs.statSync(filePath, { throwIfNoEntry: false })?.isFile()) {\n const error = new PFrameDriverError(`Invalid file name`);\n error.cause = new Error(`File ${filePath} does not exist`);\n throw error;\n }\n return filePath as FilePath;\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): FilePath {\n const resource = super.tryGetByKey(blobId);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid blob id`);\n error.cause = new Error(`Blob with id ${blobId} not found.`);\n throw error;\n }\n return resource;\n }\n\n public makeDataSource(\n signal: AbortSignal,\n ): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\"> {\n return {\n preloadBlob: async (_blobIds: PFrameInternal.PFrameBlobId[]) => {},\n resolveBlobContent: async (blobId: PFrameInternal.PFrameBlobId) => {\n const filePath = this.getByKey(blobId);\n return await fs.promises.readFile(filePath, { signal });\n },\n };\n }\n}\n\nclass RemoteBlobProviderImpl implements RemoteBlobProvider<FileName> {\n constructor(\n private readonly pool: LocalBlobProviderImpl,\n private readonly server: PFrameInternal.HttpServer,\n ) {}\n\n public static async init(\n dataFolder: FolderPath,\n logger: PFrameInternal.Logger,\n serverOptions: Omit<PFrameInternal.HttpServerOptions, \"handler\">,\n ): Promise<RemoteBlobProviderImpl> {\n const pool = new LocalBlobProviderImpl(dataFolder);\n\n const underlyingStore = await HttpHelpers.createFsStore({ rootDir: dataFolder, logger });\n const store: PFrameInternal.ObjectStore = {\n request: (filename, params) => {\n const blobId = filename.slice(0, -PFrameInternal.ParquetExtension.length);\n return underlyingStore.request(blobId as PFrameInternal.ParquetFileName, params);\n },\n };\n\n const handler = HttpHelpers.createRequestHandler({ store });\n const server = await HttpHelpers.createHttpServer({ ...serverOptions, handler });\n\n return new RemoteBlobProviderImpl(pool, server);\n }\n\n public acquire(params: FileName): PoolEntry<PFrameInternal.PFrameBlobId> {\n return this.pool.acquire(params);\n }\n\n public httpServerInfo(): PFrameInternal.HttpServerInfo {\n return this.server.info;\n }\n\n public async getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null> {\n return null;\n }\n\n public async resetCache(): Promise<void> {}\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.server.stop();\n await this.pool[Symbol.asyncDispose]();\n }\n}\n\nexport type InternalPFrameDriverDouble = AbstractInternalPFrameDriver<\n PFrameInternal.DataInfo<FileName> | PColumnValues\n>;\n\n// It's mock for testing purposes, not a real test!\nexport async function createPFrameDriverDouble({\n dataFolder = tmpdir() as FolderPath,\n logger = console.log,\n}: {\n dataFolder?: FolderPath;\n logger?: PFrameInternal.Logger;\n}): Promise<InternalPFrameDriverDouble> {\n const localBlobProvider = new LocalBlobProviderImpl(dataFolder);\n const remoteBlobProvider = await RemoteBlobProviderImpl.init(dataFolder, logger, {});\n\n const resolveDataInfo = (\n spec: PColumnSpec,\n data: PFrameInternal.DataInfo<FileName> | PColumnValues,\n ) => (isDataInfo(data) ? data : makeJsonDataInfo(spec, data));\n\n return new AbstractPFrameDriver({\n logger,\n localBlobProvider,\n remoteBlobProvider,\n resolveDataInfo,\n });\n}\n"],"mappings":";;;;;;;;;;AAyBA,SAAgB,eAAe,YAAgC;AAC7D,KAAI,CAAC,GAAG,SAAS,YAAY,EAAE,gBAAgB,OAAO,CAAC,EAAE,aAAa,EAAE;EACtE,MAAM,QAAQ,IAAI,kBAAkB,sBAAsB;AAC1D,QAAM,wBAAQ,IAAI,MAAM,UAAU,WAAW,iBAAiB;AAC9D,QAAM;;AAER,QAAO;;AAGT,SAAS,WAAW,KAA4C;AAC9D,QAAO;;AAGT,IAAM,wBAAN,cACU,iBAEV;CACE,YAAY,YAAyC;AACnD,SAAO;AADoB,OAAA,aAAA;;CAI7B,mBAA6B,QAA+C;AAC1E,SAAO,WAAW,OAAO;;CAG3B,kBAA4B,QAAkB,MAA6C;EACzF,MAAM,WAAW,KAAK,KAAK,KAAK,YAAY,OAAO;AACnD,MAAI,CAAC,GAAG,SAAS,UAAU,EAAE,gBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE;GAC/D,MAAM,QAAQ,IAAI,kBAAkB,oBAAoB;AACxD,SAAM,wBAAQ,IAAI,MAAM,QAAQ,SAAS,iBAAiB;AAC1D,SAAM;;AAER,SAAO;;CAGT,SAAgB,QAA+C;EAC7D,MAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,MAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAI,kBAAkB,kBAAkB;AACtD,SAAM,wBAAQ,IAAI,MAAM,gBAAgB,OAAO,aAAa;AAC5D,SAAM;;AAER,SAAO;;CAGT,eACE,QAC0D;AAC1D,SAAO;GACL,aAAa,OAAO,aAA4C;GAChE,oBAAoB,OAAO,WAAwC;IACjE,MAAM,WAAW,KAAK,SAAS,OAAO;AACtC,WAAO,MAAM,GAAG,SAAS,SAAS,UAAU,EAAE,QAAQ,CAAC;;GAE1D;;;AAIL,IAAM,yBAAN,MAAM,uBAA+D;CACnE,YACE,MACA,QACA;AAFiB,OAAA,OAAA;AACA,OAAA,SAAA;;CAGnB,aAAoB,KAClB,YACA,QACA,eACiC;EACjC,MAAM,OAAO,IAAI,sBAAsB,WAAW;EAElD,MAAM,kBAAkB,MAAM,YAAY,cAAc;GAAE,SAAS;GAAY;GAAQ,CAAC;EAQxF,MAAM,UAAU,YAAY,qBAAqB,EAAE,OAPT,EACxC,UAAU,UAAU,WAAW;GAC7B,MAAM,SAAS,SAAS,MAAM,GAAG,CAAC,eAAe,iBAAiB,OAAO;AACzE,UAAO,gBAAgB,QAAQ,QAA0C,OAAO;KAEnF,EAEyD,CAAC;AAG3D,SAAO,IAAI,uBAAuB,MAFnB,MAAM,YAAY,iBAAiB;GAAE,GAAG;GAAe;GAAS,CAAC,CAEjC;;CAGjD,QAAe,QAA0D;AACvE,SAAO,KAAK,KAAK,QAAQ,OAAO;;CAGlC,iBAAuD;AACrD,SAAO,KAAK,OAAO;;CAGrB,MAAa,kBAA+D;AAC1E,SAAO;;CAGT,MAAa,aAA4B;CAEzC,OAAO,OAAO,gBAA+B;AAC3C,QAAM,KAAK,OAAO,MAAM;AACxB,QAAM,KAAK,KAAK,OAAO,eAAe;;;AAS1C,eAAsB,yBAAyB,EAC7C,aAAa,QAAQ,EACrB,SAAS,QAAQ,OAIqB;CACtC,MAAM,oBAAoB,IAAI,sBAAsB,WAAW;CAC/D,MAAM,qBAAqB,MAAM,uBAAuB,KAAK,YAAY,QAAQ,EAAE,CAAC;CAEpF,MAAM,mBACJ,MACA,SACI,WAAW,KAAK,GAAG,OAAO,iBAAiB,MAAM,KAAK;AAE5D,QAAO,IAAI,qBAAqB;EAC9B;EACA;EACA;EACA;EACD,CAAC"}
|
package/dist/driver_impl.cjs
CHANGED
|
@@ -42,6 +42,12 @@ var AbstractPFrameDriver = class {
|
|
|
42
42
|
async pprofDump() {
|
|
43
43
|
return await _milaboratories_pframes_rs_node.PFrameFactory.pprofDump();
|
|
44
44
|
}
|
|
45
|
+
async getCacheMetrics() {
|
|
46
|
+
return await this.remoteBlobProvider.getCacheMetrics();
|
|
47
|
+
}
|
|
48
|
+
async resetCache() {
|
|
49
|
+
await this.remoteBlobProvider.resetCache();
|
|
50
|
+
}
|
|
45
51
|
constructor({ logger = () => {}, localBlobProvider, remoteBlobProvider, spillPath = (0, node_os.tmpdir)(), options = AbstractPFrameDriverOpsDefaults, resolveDataInfo }) {
|
|
46
52
|
this.logger = logger;
|
|
47
53
|
this.localBlobProvider = localBlobProvider;
|
|
@@ -211,8 +217,7 @@ var AbstractPFrameDriver = class {
|
|
|
211
217
|
const { pTablePromise, disposeSignal } = tableGuard.resource;
|
|
212
218
|
const pTable = await pTablePromise;
|
|
213
219
|
const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !(0, _milaboratories_helpers.isNil)(s)));
|
|
214
|
-
const headers =
|
|
215
|
-
for (const index of columnIndices) headers[index] = require_csv_writer.columnLabel(def.tableSpec[index]);
|
|
220
|
+
const headers = columnIndices.map((index) => [index, require_csv_writer.columnLabel(def.tableSpec[index])]);
|
|
216
221
|
const overallSize = await this.tableConcurrencyLimiter.run(async () => {
|
|
217
222
|
if (path.toLowerCase().endsWith(".xlsx")) {
|
|
218
223
|
const shape = await pTable.getShape({ signal: combinedSignal });
|
|
@@ -222,7 +227,10 @@ var AbstractPFrameDriver = class {
|
|
|
222
227
|
throw error;
|
|
223
228
|
}
|
|
224
229
|
}
|
|
225
|
-
await pTable.export(path,
|
|
230
|
+
await pTable.export(path, {
|
|
231
|
+
headers,
|
|
232
|
+
signal: combinedSignal
|
|
233
|
+
});
|
|
226
234
|
const overallSize = await tableGuard.resource.cacheSize;
|
|
227
235
|
if (require_logging.logPFrames()) {
|
|
228
236
|
const durationMs = Math.round(performance.now() - startTime);
|
package/dist/driver_impl.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver_impl.cjs","names":["PTableCachePerFrameOpsDefaults","PTableCachePlainOpsDefaults","PFrameFactory","ConcurrencyLimitingExecutor","PFramePool","PTableDefPool","PTablePool","PTableCachePerFrame","PTableCachePlain","ValueType","PoolEntryGuard","logPFrames","embedInlineColumnTypeSpecs","streamPTableRows","fs","Readable","zlib","columnLabel","XLSX_MAX_ROWS_PER_SHEET","PFrameDriverError","bigintReplacer"],"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 PFrameDriverError,\n XLSX_MAX_ROWS_PER_SHEET,\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 { expandAxes, findTableColumn, rewriteLegacyFilters } from \"@milaboratories/pframes-rs-wasm\";\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 { columnLabel, streamPTableRows } from \"./csv_writer\";\nimport type {\n AbstractInternalPFrameDriver,\n WritePTableToFsOptions,\n WritePTableToFsResult,\n ExportPTableOptions,\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 { embedInlineColumnTypeSpecs } from \"./ptable_shared\";\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\";\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 const columns = uniqueBy(extractAllColumns(rawDef.src), (c) => c.id);\n using pFrameGuard = new PoolEntryGuard(this.createPFrame(columns));\n const sortedDef = sortPTableDef(\n migrateTableFilter(\n mapPTableDef(rawDef, (c) => c.id),\n this.logger,\n ),\n );\n const pFrameSpec = this.pFrames.getByKey(pFrameGuard.key).pFrameSpec;\n using pTableGuard = new PoolEntryGuard(\n this.pTableDefs.acquireFromLegacy({\n pFrameHandle: pFrameGuard.key,\n def: sortedDef,\n pFrameSpec,\n }).entry,\n );\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Create PTable call (pFrameHandle = ${pFrameGuard.key}; pTableHandle = ${pTableGuard.key})`,\n );\n }\n\n const pFrameEntry = pFrameGuard.keep();\n const pTableEntry = pTableGuard.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 using pFrameGuard = new PoolEntryGuard(this.createPFrame(columns));\n const pFrameSpec = this.pFrames.getByKey(pFrameGuard.key).pFrameSpec;\n const sortedQuery = sortSpecQuery(mapSpecQueryColumns(def.query, (c) => c.id));\n const { tableSpec, dataQuery } = pFrameSpec.evaluateQuery(\n embedInlineColumnTypeSpecs(sortedQuery),\n );\n\n using pTableGuard = new PoolEntryGuard(\n this.pTableDefs.acquire({\n pFrameHandle: pFrameGuard.key,\n tableSpec,\n dataQuery,\n }),\n );\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Create PTable call (pFrameHandle = ${pFrameGuard.key}; pTableHandle = ${pTableGuard.key})`,\n );\n }\n\n const pFrameEntry = pFrameGuard.keep();\n const pTableEntry = pTableGuard.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 // `combinedSignal` is passed twice on purpose: into the native calls for cooperative\n // cancellation, and into `run` so the concurrency slot is released on abort even if a\n // native call fails to unwind. Dropping the `run` signal reintroduces the queue wedge.\n // keep()/cache live outside the limiter task: on abort `run` rejects and they are\n // skipped, so an abandoned (detached) operation never caches its result nor touches\n // `tableGuard` after the `using` block has already unref'd it.\n const { result, overallSize } = await this.tableConcurrencyLimiter.run(async () => {\n const shape = await pTable.getShape({ signal: combinedSignal });\n const clippedRange = clipRange(options.range, shape);\n const specs = def.tableSpec;\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 tableGuard.resource.cacheSize;\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 { result: { path: options.path, rowsWritten, bytesWritten }, overallSize };\n }, combinedSignal);\n\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\n return result;\n }\n\n public async exportPTable(\n handle: PTableHandle,\n options: ExportPTableOptions,\n signal?: AbortSignal,\n ): Promise<void> {\n const { path, columnIndices } = options;\n\n this.logger(\"info\", `[ExportPTable] ENTER (handle = ${handle}, path = ${path})`);\n const startTime = performance.now();\n\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 [signal, disposeSignal].filter((s): s is AbortSignal => !isNil(s)),\n );\n\n const headers: Record<number, string> = {};\n for (const index of columnIndices) {\n headers[index] = columnLabel(def.tableSpec[index]);\n }\n\n // keep()/cache live outside the limiter task: on abort `run` rejects and they are\n // skipped, so an abandoned (detached) operation never caches its result nor touches\n // `tableGuard` after the `using` block has already unref'd it.\n const overallSize = await this.tableConcurrencyLimiter.run(async () => {\n // Cap data rows per xlsx sheet below Excel's hard limit of 1,048,576.\n if (path.toLowerCase().endsWith(\".xlsx\")) {\n const shape = await pTable.getShape({ signal: combinedSignal });\n if (shape.rows > XLSX_MAX_ROWS_PER_SHEET) {\n const error = new PFrameDriverError(`exportPTable failed`);\n error.cause = new Error(\n `xlsx export rejected: ${shape.rows} rows exceed the per-sheet ` +\n `limit of ${XLSX_MAX_ROWS_PER_SHEET} rows`,\n );\n throw error;\n }\n }\n\n await pTable.export(path, headers, { signal: combinedSignal });\n\n const overallSize = await tableGuard.resource.cacheSize;\n\n if (logPFrames()) {\n const durationMs = Math.round(performance.now() - startTime);\n this.logger(\n \"info\",\n `[ExportPTable] complete (handle = ${handle}, path = ${path}), ` +\n `duration = ${durationMs}ms`,\n );\n }\n\n return overallSize;\n }, combinedSignal);\n\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\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 { pFrameSpec } = this.pFrames.getByKey(handle);\n const response = pFrameSpec.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 { columnSpecs } = this.pFrames.getByKey(handle);\n return columnSpecs[columnId] ?? null;\n }\n\n public async listColumns(handle: PFrameHandle): Promise<PColumnIdAndSpec[]> {\n const { pFrameSpec } = this.pFrames.getByKey(handle);\n return pFrameSpec.listColumns().map(({ columnId, spec }) => ({ columnId, spec }));\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 { pFrameSpec } = this.pFrames.getByKey(handle);\n const sortedDef = sortPTableDef(migrateTableFilter(request, this.logger));\n const { def, entry } = this.pTables.acquireFromLegacy({\n pFrameHandle: handle,\n def: sortedDef,\n pFrameSpec,\n });\n using tableGuard = new PoolEntryGuard(entry);\n const tableSpec = def.tableSpec;\n const { pTablePromise, disposeSignal } = tableGuard.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n // keep()/cache live outside the limiter task: on abort `run` rejects and they are\n // skipped, so an abandoned (detached) operation never caches its result nor touches\n // `tableGuard` after the `using` block has already unref'd it.\n const { data, overallSize } = await this.frameConcurrencyLimiter.run(async () => {\n // TODO: throw error when more then 200k rows is requested\n // after pf-plots migration to stream API\n\n const data = await pTable.getData([...tableSpec.keys()], {\n range,\n signal: combinedSignal,\n });\n\n const overallSize = await tableGuard.resource.cacheSize;\n return { data, overallSize };\n }, combinedSignal);\n\n this.pTableCachePerFrame.cache(tableGuard.keep(), overallSize);\n return tableSpec.map((spec, i) => ({\n spec: spec,\n data: data[i],\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 { pFrameDataPromise, columnSpecs, disposeSignal } = this.pFrames.getByKey(handle);\n const pFrameData = await pFrameDataPromise;\n\n const columnSpec = columnSpecs[request.columnId];\n if (!columnSpec) {\n const error = new PFrameDriverError(`getUniqueValues failed`);\n error.cause = new Error(`column ${request.columnId} is not registered in the PFrame`);\n throw error;\n }\n\n const axisIds = expandAxes(columnSpec.axesSpec);\n const tableSpec: PTableColumnSpec[] = [\n ...columnSpec.axesSpec.map(\n (axisSpec, i): PTableColumnSpec => ({\n type: \"axis\",\n id: axisIds[i],\n spec: axisSpec,\n }),\n ),\n { type: \"column\", id: request.columnId, spec: columnSpec },\n ];\n\n let axisIndex: number | undefined;\n if (request.axis !== undefined) {\n const index = findTableColumn(tableSpec, { type: \"axis\", id: request.axis });\n if (index < 0) {\n const error = new PFrameDriverError(`getUniqueValues failed`);\n error.cause = new Error(\n `axis ${JSON.stringify(request.axis)} not found among axes of column ${request.columnId}`,\n );\n throw error;\n }\n axisIndex = index;\n }\n\n const resolvedRequest: PFrameInternal.UniqueValuesRequestV2 = {\n columnId: request.columnId,\n axisIndex,\n filters: rewriteLegacyFilters({\n tableSpec,\n filters: migrateFilters(request.filters, this.logger),\n }),\n limit: request.limit,\n };\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n return await this.frameConcurrencyLimiter.run(async () => {\n return await pFrameData.getUniqueValues(resolvedRequest, { signal: combinedSignal });\n }, combinedSignal);\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 return def.tableSpec;\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 tableGuard.resource.cacheSize;\n\n return { shape, overallSize };\n }, combinedSignal);\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 tableGuard.resource.cacheSize;\n\n return { data, overallSize };\n }, combinedSignal);\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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"}
|
|
1
|
+
{"version":3,"file":"driver_impl.cjs","names":["PTableCachePerFrameOpsDefaults","PTableCachePlainOpsDefaults","PFrameFactory","ConcurrencyLimitingExecutor","PFramePool","PTableDefPool","PTablePool","PTableCachePerFrame","PTableCachePlain","ValueType","PoolEntryGuard","logPFrames","embedInlineColumnTypeSpecs","streamPTableRows","fs","Readable","zlib","columnLabel","XLSX_MAX_ROWS_PER_SHEET","PFrameDriverError","bigintReplacer"],"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 PFrameDriverError,\n XLSX_MAX_ROWS_PER_SHEET,\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 { expandAxes, findTableColumn, rewriteLegacyFilters } from \"@milaboratories/pframes-rs-wasm\";\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 { columnLabel, streamPTableRows } from \"./csv_writer\";\nimport type {\n AbstractInternalPFrameDriver,\n WritePTableToFsOptions,\n WritePTableToFsResult,\n ExportPTableOptions,\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 { embedInlineColumnTypeSpecs } from \"./ptable_shared\";\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\";\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 getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null>;\n resetCache(): Promise<void>;\n}\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 async getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null> {\n return await this.remoteBlobProvider.getCacheMetrics();\n }\n\n public async resetCache(): Promise<void> {\n await this.remoteBlobProvider.resetCache();\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 const columns = uniqueBy(extractAllColumns(rawDef.src), (c) => c.id);\n using pFrameGuard = new PoolEntryGuard(this.createPFrame(columns));\n const sortedDef = sortPTableDef(\n migrateTableFilter(\n mapPTableDef(rawDef, (c) => c.id),\n this.logger,\n ),\n );\n const pFrameSpec = this.pFrames.getByKey(pFrameGuard.key).pFrameSpec;\n using pTableGuard = new PoolEntryGuard(\n this.pTableDefs.acquireFromLegacy({\n pFrameHandle: pFrameGuard.key,\n def: sortedDef,\n pFrameSpec,\n }).entry,\n );\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Create PTable call (pFrameHandle = ${pFrameGuard.key}; pTableHandle = ${pTableGuard.key})`,\n );\n }\n\n const pFrameEntry = pFrameGuard.keep();\n const pTableEntry = pTableGuard.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 using pFrameGuard = new PoolEntryGuard(this.createPFrame(columns));\n const pFrameSpec = this.pFrames.getByKey(pFrameGuard.key).pFrameSpec;\n const sortedQuery = sortSpecQuery(mapSpecQueryColumns(def.query, (c) => c.id));\n const { tableSpec, dataQuery } = pFrameSpec.evaluateQuery(\n embedInlineColumnTypeSpecs(sortedQuery),\n );\n\n using pTableGuard = new PoolEntryGuard(\n this.pTableDefs.acquire({\n pFrameHandle: pFrameGuard.key,\n tableSpec,\n dataQuery,\n }),\n );\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Create PTable call (pFrameHandle = ${pFrameGuard.key}; pTableHandle = ${pTableGuard.key})`,\n );\n }\n\n const pFrameEntry = pFrameGuard.keep();\n const pTableEntry = pTableGuard.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 // `combinedSignal` is passed twice on purpose: into the native calls for cooperative\n // cancellation, and into `run` so the concurrency slot is released on abort even if a\n // native call fails to unwind. Dropping the `run` signal reintroduces the queue wedge.\n // keep()/cache live outside the limiter task: on abort `run` rejects and they are\n // skipped, so an abandoned (detached) operation never caches its result nor touches\n // `tableGuard` after the `using` block has already unref'd it.\n const { result, overallSize } = await this.tableConcurrencyLimiter.run(async () => {\n const shape = await pTable.getShape({ signal: combinedSignal });\n const clippedRange = clipRange(options.range, shape);\n const specs = def.tableSpec;\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 tableGuard.resource.cacheSize;\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 { result: { path: options.path, rowsWritten, bytesWritten }, overallSize };\n }, combinedSignal);\n\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\n return result;\n }\n\n public async exportPTable(\n handle: PTableHandle,\n options: ExportPTableOptions,\n signal?: AbortSignal,\n ): Promise<void> {\n const { path, columnIndices } = options;\n\n this.logger(\"info\", `[ExportPTable] ENTER (handle = ${handle}, path = ${path})`);\n const startTime = performance.now();\n\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 [signal, disposeSignal].filter((s): s is AbortSignal => !isNil(s)),\n );\n\n const headers: [number, string][] = columnIndices.map((index): [number, string] => [\n index,\n columnLabel(def.tableSpec[index]),\n ]);\n\n // keep()/cache live outside the limiter task: on abort `run` rejects and they are\n // skipped, so an abandoned (detached) operation never caches its result nor touches\n // `tableGuard` after the `using` block has already unref'd it.\n const overallSize = await this.tableConcurrencyLimiter.run(async () => {\n // Cap data rows per xlsx sheet below Excel's hard limit of 1,048,576.\n if (path.toLowerCase().endsWith(\".xlsx\")) {\n const shape = await pTable.getShape({ signal: combinedSignal });\n if (shape.rows > XLSX_MAX_ROWS_PER_SHEET) {\n const error = new PFrameDriverError(`exportPTable failed`);\n error.cause = new Error(\n `xlsx export rejected: ${shape.rows} rows exceed the per-sheet ` +\n `limit of ${XLSX_MAX_ROWS_PER_SHEET} rows`,\n );\n throw error;\n }\n }\n\n await pTable.export(path, { headers, signal: combinedSignal });\n\n const overallSize = await tableGuard.resource.cacheSize;\n\n if (logPFrames()) {\n const durationMs = Math.round(performance.now() - startTime);\n this.logger(\n \"info\",\n `[ExportPTable] complete (handle = ${handle}, path = ${path}), ` +\n `duration = ${durationMs}ms`,\n );\n }\n\n return overallSize;\n }, combinedSignal);\n\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\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 { pFrameSpec } = this.pFrames.getByKey(handle);\n const response = pFrameSpec.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 { columnSpecs } = this.pFrames.getByKey(handle);\n return columnSpecs[columnId] ?? null;\n }\n\n public async listColumns(handle: PFrameHandle): Promise<PColumnIdAndSpec[]> {\n const { pFrameSpec } = this.pFrames.getByKey(handle);\n return pFrameSpec.listColumns().map(({ columnId, spec }) => ({ columnId, spec }));\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 { pFrameSpec } = this.pFrames.getByKey(handle);\n const sortedDef = sortPTableDef(migrateTableFilter(request, this.logger));\n const { def, entry } = this.pTables.acquireFromLegacy({\n pFrameHandle: handle,\n def: sortedDef,\n pFrameSpec,\n });\n using tableGuard = new PoolEntryGuard(entry);\n const tableSpec = def.tableSpec;\n const { pTablePromise, disposeSignal } = tableGuard.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n // keep()/cache live outside the limiter task: on abort `run` rejects and they are\n // skipped, so an abandoned (detached) operation never caches its result nor touches\n // `tableGuard` after the `using` block has already unref'd it.\n const { data, overallSize } = await this.frameConcurrencyLimiter.run(async () => {\n // TODO: throw error when more then 200k rows is requested\n // after pf-plots migration to stream API\n\n const data = await pTable.getData([...tableSpec.keys()], {\n range,\n signal: combinedSignal,\n });\n\n const overallSize = await tableGuard.resource.cacheSize;\n return { data, overallSize };\n }, combinedSignal);\n\n this.pTableCachePerFrame.cache(tableGuard.keep(), overallSize);\n return tableSpec.map((spec, i) => ({\n spec: spec,\n data: data[i],\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 { pFrameDataPromise, columnSpecs, disposeSignal } = this.pFrames.getByKey(handle);\n const pFrameData = await pFrameDataPromise;\n\n const columnSpec = columnSpecs[request.columnId];\n if (!columnSpec) {\n const error = new PFrameDriverError(`getUniqueValues failed`);\n error.cause = new Error(`column ${request.columnId} is not registered in the PFrame`);\n throw error;\n }\n\n const axisIds = expandAxes(columnSpec.axesSpec);\n const tableSpec: PTableColumnSpec[] = [\n ...columnSpec.axesSpec.map(\n (axisSpec, i): PTableColumnSpec => ({\n type: \"axis\",\n id: axisIds[i],\n spec: axisSpec,\n }),\n ),\n { type: \"column\", id: request.columnId, spec: columnSpec },\n ];\n\n let axisIndex: number | undefined;\n if (request.axis !== undefined) {\n const index = findTableColumn(tableSpec, { type: \"axis\", id: request.axis });\n if (index < 0) {\n const error = new PFrameDriverError(`getUniqueValues failed`);\n error.cause = new Error(\n `axis ${JSON.stringify(request.axis)} not found among axes of column ${request.columnId}`,\n );\n throw error;\n }\n axisIndex = index;\n }\n\n const resolvedRequest: PFrameInternal.UniqueValuesRequestV2 = {\n columnId: request.columnId,\n axisIndex,\n filters: rewriteLegacyFilters({\n tableSpec,\n filters: migrateFilters(request.filters, this.logger),\n }),\n limit: request.limit,\n };\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n return await this.frameConcurrencyLimiter.run(async () => {\n return await pFrameData.getUniqueValues(resolvedRequest, { signal: combinedSignal });\n }, combinedSignal);\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 return def.tableSpec;\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 tableGuard.resource.cacheSize;\n\n return { shape, overallSize };\n }, combinedSignal);\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 tableGuard.resource.cacheSize;\n\n return { data, overallSize };\n }, combinedSignal);\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/driver_impl.d.ts
CHANGED
|
@@ -8,7 +8,10 @@ import { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
|
|
|
8
8
|
|
|
9
9
|
//#region src/driver_impl.d.ts
|
|
10
10
|
interface LocalBlobProvider<TreeEntry extends JsonSerializable> extends LocalBlobProvider$1<TreeEntry>, AsyncDisposable {}
|
|
11
|
-
interface RemoteBlobProvider<TreeEntry extends JsonSerializable> extends RemoteBlobProvider$1<TreeEntry>, AsyncDisposable {
|
|
11
|
+
interface RemoteBlobProvider<TreeEntry extends JsonSerializable> extends RemoteBlobProvider$1<TreeEntry>, AsyncDisposable {
|
|
12
|
+
getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null>;
|
|
13
|
+
resetCache(): Promise<void>;
|
|
14
|
+
}
|
|
12
15
|
type AbstractPFrameDriverOps = PTableCachePerFrameOps & PTableCachePlainOps & {
|
|
13
16
|
/** Concurrency limits for `getUniqueValues` and `calculateTableData` requests */pFrameConcurrency: number; /** Concurrency limits for `getShape` and `getData` requests */
|
|
14
17
|
pTableConcurrency: number;
|
|
@@ -28,6 +31,8 @@ declare class AbstractPFrameDriver<PColumnData, TreeEntry extends JsonSerializab
|
|
|
28
31
|
private readonly frameConcurrencyLimiter;
|
|
29
32
|
private readonly tableConcurrencyLimiter;
|
|
30
33
|
pprofDump(): Promise<Uint8Array>;
|
|
34
|
+
getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null>;
|
|
35
|
+
resetCache(): Promise<void>;
|
|
31
36
|
constructor({
|
|
32
37
|
logger,
|
|
33
38
|
localBlobProvider,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver_impl.d.ts","names":[],"sources":["../src/driver_impl.ts"],"mappings":";;;;;;;;;UA+EiB,iBAAA,mBAAoC,gBAAA,UAC3C,mBAAA,CAAsB,SAAA,GAAY,eAAA;AAAA,UAE3B,kBAAA,mBAAqC,gBAAA,UAC5C,oBAAA,CAAuB,SAAA,GAAY,eAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"driver_impl.d.ts","names":[],"sources":["../src/driver_impl.ts"],"mappings":"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"}
|
package/dist/driver_impl.js
CHANGED
|
@@ -39,6 +39,12 @@ var AbstractPFrameDriver = class {
|
|
|
39
39
|
async pprofDump() {
|
|
40
40
|
return await PFrameFactory.pprofDump();
|
|
41
41
|
}
|
|
42
|
+
async getCacheMetrics() {
|
|
43
|
+
return await this.remoteBlobProvider.getCacheMetrics();
|
|
44
|
+
}
|
|
45
|
+
async resetCache() {
|
|
46
|
+
await this.remoteBlobProvider.resetCache();
|
|
47
|
+
}
|
|
42
48
|
constructor({ logger = () => {}, localBlobProvider, remoteBlobProvider, spillPath = tmpdir(), options = AbstractPFrameDriverOpsDefaults, resolveDataInfo }) {
|
|
43
49
|
this.logger = logger;
|
|
44
50
|
this.localBlobProvider = localBlobProvider;
|
|
@@ -208,8 +214,7 @@ var AbstractPFrameDriver = class {
|
|
|
208
214
|
const { pTablePromise, disposeSignal } = tableGuard.resource;
|
|
209
215
|
const pTable = await pTablePromise;
|
|
210
216
|
const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !isNil(s)));
|
|
211
|
-
const headers =
|
|
212
|
-
for (const index of columnIndices) headers[index] = columnLabel(def.tableSpec[index]);
|
|
217
|
+
const headers = columnIndices.map((index) => [index, columnLabel(def.tableSpec[index])]);
|
|
213
218
|
const overallSize = await this.tableConcurrencyLimiter.run(async () => {
|
|
214
219
|
if (path.toLowerCase().endsWith(".xlsx")) {
|
|
215
220
|
const shape = await pTable.getShape({ signal: combinedSignal });
|
|
@@ -219,7 +224,10 @@ var AbstractPFrameDriver = class {
|
|
|
219
224
|
throw error;
|
|
220
225
|
}
|
|
221
226
|
}
|
|
222
|
-
await pTable.export(path,
|
|
227
|
+
await pTable.export(path, {
|
|
228
|
+
headers,
|
|
229
|
+
signal: combinedSignal
|
|
230
|
+
});
|
|
223
231
|
const overallSize = await tableGuard.resource.cacheSize;
|
|
224
232
|
if (logPFrames()) {
|
|
225
233
|
const durationMs = Math.round(performance.now() - startTime);
|
package/dist/driver_impl.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver_impl.js","names":["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 PFrameDriverError,\n XLSX_MAX_ROWS_PER_SHEET,\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 { expandAxes, findTableColumn, rewriteLegacyFilters } from \"@milaboratories/pframes-rs-wasm\";\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 { columnLabel, streamPTableRows } from \"./csv_writer\";\nimport type {\n AbstractInternalPFrameDriver,\n WritePTableToFsOptions,\n WritePTableToFsResult,\n ExportPTableOptions,\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 { embedInlineColumnTypeSpecs } from \"./ptable_shared\";\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\";\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 const columns = uniqueBy(extractAllColumns(rawDef.src), (c) => c.id);\n using pFrameGuard = new PoolEntryGuard(this.createPFrame(columns));\n const sortedDef = sortPTableDef(\n migrateTableFilter(\n mapPTableDef(rawDef, (c) => c.id),\n this.logger,\n ),\n );\n const pFrameSpec = this.pFrames.getByKey(pFrameGuard.key).pFrameSpec;\n using pTableGuard = new PoolEntryGuard(\n this.pTableDefs.acquireFromLegacy({\n pFrameHandle: pFrameGuard.key,\n def: sortedDef,\n pFrameSpec,\n }).entry,\n );\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Create PTable call (pFrameHandle = ${pFrameGuard.key}; pTableHandle = ${pTableGuard.key})`,\n );\n }\n\n const pFrameEntry = pFrameGuard.keep();\n const pTableEntry = pTableGuard.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 using pFrameGuard = new PoolEntryGuard(this.createPFrame(columns));\n const pFrameSpec = this.pFrames.getByKey(pFrameGuard.key).pFrameSpec;\n const sortedQuery = sortSpecQuery(mapSpecQueryColumns(def.query, (c) => c.id));\n const { tableSpec, dataQuery } = pFrameSpec.evaluateQuery(\n embedInlineColumnTypeSpecs(sortedQuery),\n );\n\n using pTableGuard = new PoolEntryGuard(\n this.pTableDefs.acquire({\n pFrameHandle: pFrameGuard.key,\n tableSpec,\n dataQuery,\n }),\n );\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Create PTable call (pFrameHandle = ${pFrameGuard.key}; pTableHandle = ${pTableGuard.key})`,\n );\n }\n\n const pFrameEntry = pFrameGuard.keep();\n const pTableEntry = pTableGuard.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 // `combinedSignal` is passed twice on purpose: into the native calls for cooperative\n // cancellation, and into `run` so the concurrency slot is released on abort even if a\n // native call fails to unwind. Dropping the `run` signal reintroduces the queue wedge.\n // keep()/cache live outside the limiter task: on abort `run` rejects and they are\n // skipped, so an abandoned (detached) operation never caches its result nor touches\n // `tableGuard` after the `using` block has already unref'd it.\n const { result, overallSize } = await this.tableConcurrencyLimiter.run(async () => {\n const shape = await pTable.getShape({ signal: combinedSignal });\n const clippedRange = clipRange(options.range, shape);\n const specs = def.tableSpec;\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 tableGuard.resource.cacheSize;\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 { result: { path: options.path, rowsWritten, bytesWritten }, overallSize };\n }, combinedSignal);\n\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\n return result;\n }\n\n public async exportPTable(\n handle: PTableHandle,\n options: ExportPTableOptions,\n signal?: AbortSignal,\n ): Promise<void> {\n const { path, columnIndices } = options;\n\n this.logger(\"info\", `[ExportPTable] ENTER (handle = ${handle}, path = ${path})`);\n const startTime = performance.now();\n\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 [signal, disposeSignal].filter((s): s is AbortSignal => !isNil(s)),\n );\n\n const headers: Record<number, string> = {};\n for (const index of columnIndices) {\n headers[index] = columnLabel(def.tableSpec[index]);\n }\n\n // keep()/cache live outside the limiter task: on abort `run` rejects and they are\n // skipped, so an abandoned (detached) operation never caches its result nor touches\n // `tableGuard` after the `using` block has already unref'd it.\n const overallSize = await this.tableConcurrencyLimiter.run(async () => {\n // Cap data rows per xlsx sheet below Excel's hard limit of 1,048,576.\n if (path.toLowerCase().endsWith(\".xlsx\")) {\n const shape = await pTable.getShape({ signal: combinedSignal });\n if (shape.rows > XLSX_MAX_ROWS_PER_SHEET) {\n const error = new PFrameDriverError(`exportPTable failed`);\n error.cause = new Error(\n `xlsx export rejected: ${shape.rows} rows exceed the per-sheet ` +\n `limit of ${XLSX_MAX_ROWS_PER_SHEET} rows`,\n );\n throw error;\n }\n }\n\n await pTable.export(path, headers, { signal: combinedSignal });\n\n const overallSize = await tableGuard.resource.cacheSize;\n\n if (logPFrames()) {\n const durationMs = Math.round(performance.now() - startTime);\n this.logger(\n \"info\",\n `[ExportPTable] complete (handle = ${handle}, path = ${path}), ` +\n `duration = ${durationMs}ms`,\n );\n }\n\n return overallSize;\n }, combinedSignal);\n\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\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 { pFrameSpec } = this.pFrames.getByKey(handle);\n const response = pFrameSpec.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 { columnSpecs } = this.pFrames.getByKey(handle);\n return columnSpecs[columnId] ?? null;\n }\n\n public async listColumns(handle: PFrameHandle): Promise<PColumnIdAndSpec[]> {\n const { pFrameSpec } = this.pFrames.getByKey(handle);\n return pFrameSpec.listColumns().map(({ columnId, spec }) => ({ columnId, spec }));\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 { pFrameSpec } = this.pFrames.getByKey(handle);\n const sortedDef = sortPTableDef(migrateTableFilter(request, this.logger));\n const { def, entry } = this.pTables.acquireFromLegacy({\n pFrameHandle: handle,\n def: sortedDef,\n pFrameSpec,\n });\n using tableGuard = new PoolEntryGuard(entry);\n const tableSpec = def.tableSpec;\n const { pTablePromise, disposeSignal } = tableGuard.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n // keep()/cache live outside the limiter task: on abort `run` rejects and they are\n // skipped, so an abandoned (detached) operation never caches its result nor touches\n // `tableGuard` after the `using` block has already unref'd it.\n const { data, overallSize } = await this.frameConcurrencyLimiter.run(async () => {\n // TODO: throw error when more then 200k rows is requested\n // after pf-plots migration to stream API\n\n const data = await pTable.getData([...tableSpec.keys()], {\n range,\n signal: combinedSignal,\n });\n\n const overallSize = await tableGuard.resource.cacheSize;\n return { data, overallSize };\n }, combinedSignal);\n\n this.pTableCachePerFrame.cache(tableGuard.keep(), overallSize);\n return tableSpec.map((spec, i) => ({\n spec: spec,\n data: data[i],\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 { pFrameDataPromise, columnSpecs, disposeSignal } = this.pFrames.getByKey(handle);\n const pFrameData = await pFrameDataPromise;\n\n const columnSpec = columnSpecs[request.columnId];\n if (!columnSpec) {\n const error = new PFrameDriverError(`getUniqueValues failed`);\n error.cause = new Error(`column ${request.columnId} is not registered in the PFrame`);\n throw error;\n }\n\n const axisIds = expandAxes(columnSpec.axesSpec);\n const tableSpec: PTableColumnSpec[] = [\n ...columnSpec.axesSpec.map(\n (axisSpec, i): PTableColumnSpec => ({\n type: \"axis\",\n id: axisIds[i],\n spec: axisSpec,\n }),\n ),\n { type: \"column\", id: request.columnId, spec: columnSpec },\n ];\n\n let axisIndex: number | undefined;\n if (request.axis !== undefined) {\n const index = findTableColumn(tableSpec, { type: \"axis\", id: request.axis });\n if (index < 0) {\n const error = new PFrameDriverError(`getUniqueValues failed`);\n error.cause = new Error(\n `axis ${JSON.stringify(request.axis)} not found among axes of column ${request.columnId}`,\n );\n throw error;\n }\n axisIndex = index;\n }\n\n const resolvedRequest: PFrameInternal.UniqueValuesRequestV2 = {\n columnId: request.columnId,\n axisIndex,\n filters: rewriteLegacyFilters({\n tableSpec,\n filters: migrateFilters(request.filters, this.logger),\n }),\n limit: request.limit,\n };\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n return await this.frameConcurrencyLimiter.run(async () => {\n return await pFrameData.getUniqueValues(resolvedRequest, { signal: combinedSignal });\n }, combinedSignal);\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 return def.tableSpec;\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 tableGuard.resource.cacheSize;\n\n return { shape, overallSize };\n }, combinedSignal);\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 tableGuard.resource.cacheSize;\n\n return { data, overallSize };\n }, combinedSignal);\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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"}
|
|
1
|
+
{"version":3,"file":"driver_impl.js","names":["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 PFrameDriverError,\n XLSX_MAX_ROWS_PER_SHEET,\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 { expandAxes, findTableColumn, rewriteLegacyFilters } from \"@milaboratories/pframes-rs-wasm\";\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 { columnLabel, streamPTableRows } from \"./csv_writer\";\nimport type {\n AbstractInternalPFrameDriver,\n WritePTableToFsOptions,\n WritePTableToFsResult,\n ExportPTableOptions,\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 { embedInlineColumnTypeSpecs } from \"./ptable_shared\";\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\";\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 getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null>;\n resetCache(): Promise<void>;\n}\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 async getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null> {\n return await this.remoteBlobProvider.getCacheMetrics();\n }\n\n public async resetCache(): Promise<void> {\n await this.remoteBlobProvider.resetCache();\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 const columns = uniqueBy(extractAllColumns(rawDef.src), (c) => c.id);\n using pFrameGuard = new PoolEntryGuard(this.createPFrame(columns));\n const sortedDef = sortPTableDef(\n migrateTableFilter(\n mapPTableDef(rawDef, (c) => c.id),\n this.logger,\n ),\n );\n const pFrameSpec = this.pFrames.getByKey(pFrameGuard.key).pFrameSpec;\n using pTableGuard = new PoolEntryGuard(\n this.pTableDefs.acquireFromLegacy({\n pFrameHandle: pFrameGuard.key,\n def: sortedDef,\n pFrameSpec,\n }).entry,\n );\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Create PTable call (pFrameHandle = ${pFrameGuard.key}; pTableHandle = ${pTableGuard.key})`,\n );\n }\n\n const pFrameEntry = pFrameGuard.keep();\n const pTableEntry = pTableGuard.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 using pFrameGuard = new PoolEntryGuard(this.createPFrame(columns));\n const pFrameSpec = this.pFrames.getByKey(pFrameGuard.key).pFrameSpec;\n const sortedQuery = sortSpecQuery(mapSpecQueryColumns(def.query, (c) => c.id));\n const { tableSpec, dataQuery } = pFrameSpec.evaluateQuery(\n embedInlineColumnTypeSpecs(sortedQuery),\n );\n\n using pTableGuard = new PoolEntryGuard(\n this.pTableDefs.acquire({\n pFrameHandle: pFrameGuard.key,\n tableSpec,\n dataQuery,\n }),\n );\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Create PTable call (pFrameHandle = ${pFrameGuard.key}; pTableHandle = ${pTableGuard.key})`,\n );\n }\n\n const pFrameEntry = pFrameGuard.keep();\n const pTableEntry = pTableGuard.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 // `combinedSignal` is passed twice on purpose: into the native calls for cooperative\n // cancellation, and into `run` so the concurrency slot is released on abort even if a\n // native call fails to unwind. Dropping the `run` signal reintroduces the queue wedge.\n // keep()/cache live outside the limiter task: on abort `run` rejects and they are\n // skipped, so an abandoned (detached) operation never caches its result nor touches\n // `tableGuard` after the `using` block has already unref'd it.\n const { result, overallSize } = await this.tableConcurrencyLimiter.run(async () => {\n const shape = await pTable.getShape({ signal: combinedSignal });\n const clippedRange = clipRange(options.range, shape);\n const specs = def.tableSpec;\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 tableGuard.resource.cacheSize;\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 { result: { path: options.path, rowsWritten, bytesWritten }, overallSize };\n }, combinedSignal);\n\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\n return result;\n }\n\n public async exportPTable(\n handle: PTableHandle,\n options: ExportPTableOptions,\n signal?: AbortSignal,\n ): Promise<void> {\n const { path, columnIndices } = options;\n\n this.logger(\"info\", `[ExportPTable] ENTER (handle = ${handle}, path = ${path})`);\n const startTime = performance.now();\n\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 [signal, disposeSignal].filter((s): s is AbortSignal => !isNil(s)),\n );\n\n const headers: [number, string][] = columnIndices.map((index): [number, string] => [\n index,\n columnLabel(def.tableSpec[index]),\n ]);\n\n // keep()/cache live outside the limiter task: on abort `run` rejects and they are\n // skipped, so an abandoned (detached) operation never caches its result nor touches\n // `tableGuard` after the `using` block has already unref'd it.\n const overallSize = await this.tableConcurrencyLimiter.run(async () => {\n // Cap data rows per xlsx sheet below Excel's hard limit of 1,048,576.\n if (path.toLowerCase().endsWith(\".xlsx\")) {\n const shape = await pTable.getShape({ signal: combinedSignal });\n if (shape.rows > XLSX_MAX_ROWS_PER_SHEET) {\n const error = new PFrameDriverError(`exportPTable failed`);\n error.cause = new Error(\n `xlsx export rejected: ${shape.rows} rows exceed the per-sheet ` +\n `limit of ${XLSX_MAX_ROWS_PER_SHEET} rows`,\n );\n throw error;\n }\n }\n\n await pTable.export(path, { headers, signal: combinedSignal });\n\n const overallSize = await tableGuard.resource.cacheSize;\n\n if (logPFrames()) {\n const durationMs = Math.round(performance.now() - startTime);\n this.logger(\n \"info\",\n `[ExportPTable] complete (handle = ${handle}, path = ${path}), ` +\n `duration = ${durationMs}ms`,\n );\n }\n\n return overallSize;\n }, combinedSignal);\n\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\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 { pFrameSpec } = this.pFrames.getByKey(handle);\n const response = pFrameSpec.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 { columnSpecs } = this.pFrames.getByKey(handle);\n return columnSpecs[columnId] ?? null;\n }\n\n public async listColumns(handle: PFrameHandle): Promise<PColumnIdAndSpec[]> {\n const { pFrameSpec } = this.pFrames.getByKey(handle);\n return pFrameSpec.listColumns().map(({ columnId, spec }) => ({ columnId, spec }));\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 { pFrameSpec } = this.pFrames.getByKey(handle);\n const sortedDef = sortPTableDef(migrateTableFilter(request, this.logger));\n const { def, entry } = this.pTables.acquireFromLegacy({\n pFrameHandle: handle,\n def: sortedDef,\n pFrameSpec,\n });\n using tableGuard = new PoolEntryGuard(entry);\n const tableSpec = def.tableSpec;\n const { pTablePromise, disposeSignal } = tableGuard.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n // keep()/cache live outside the limiter task: on abort `run` rejects and they are\n // skipped, so an abandoned (detached) operation never caches its result nor touches\n // `tableGuard` after the `using` block has already unref'd it.\n const { data, overallSize } = await this.frameConcurrencyLimiter.run(async () => {\n // TODO: throw error when more then 200k rows is requested\n // after pf-plots migration to stream API\n\n const data = await pTable.getData([...tableSpec.keys()], {\n range,\n signal: combinedSignal,\n });\n\n const overallSize = await tableGuard.resource.cacheSize;\n return { data, overallSize };\n }, combinedSignal);\n\n this.pTableCachePerFrame.cache(tableGuard.keep(), overallSize);\n return tableSpec.map((spec, i) => ({\n spec: spec,\n data: data[i],\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 { pFrameDataPromise, columnSpecs, disposeSignal } = this.pFrames.getByKey(handle);\n const pFrameData = await pFrameDataPromise;\n\n const columnSpec = columnSpecs[request.columnId];\n if (!columnSpec) {\n const error = new PFrameDriverError(`getUniqueValues failed`);\n error.cause = new Error(`column ${request.columnId} is not registered in the PFrame`);\n throw error;\n }\n\n const axisIds = expandAxes(columnSpec.axesSpec);\n const tableSpec: PTableColumnSpec[] = [\n ...columnSpec.axesSpec.map(\n (axisSpec, i): PTableColumnSpec => ({\n type: \"axis\",\n id: axisIds[i],\n spec: axisSpec,\n }),\n ),\n { type: \"column\", id: request.columnId, spec: columnSpec },\n ];\n\n let axisIndex: number | undefined;\n if (request.axis !== undefined) {\n const index = findTableColumn(tableSpec, { type: \"axis\", id: request.axis });\n if (index < 0) {\n const error = new PFrameDriverError(`getUniqueValues failed`);\n error.cause = new Error(\n `axis ${JSON.stringify(request.axis)} not found among axes of column ${request.columnId}`,\n );\n throw error;\n }\n axisIndex = index;\n }\n\n const resolvedRequest: PFrameInternal.UniqueValuesRequestV2 = {\n columnId: request.columnId,\n axisIndex,\n filters: rewriteLegacyFilters({\n tableSpec,\n filters: migrateFilters(request.filters, this.logger),\n }),\n limit: request.limit,\n };\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n return await this.frameConcurrencyLimiter.run(async () => {\n return await pFrameData.getUniqueValues(resolvedRequest, { signal: combinedSignal });\n }, combinedSignal);\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 return def.tableSpec;\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 tableGuard.resource.cacheSize;\n\n return { shape, overallSize };\n }, combinedSignal);\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 tableGuard.resource.cacheSize;\n\n return { data, overallSize };\n }, combinedSignal);\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/pframe_pool.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pframe_pool.cjs","names":["ValueType","PFrameInternal","PFrameFactory","PFrameDriverError","RefCountPoolBase","logPFrames","bigintReplacer"],"sources":["../src/pframe_pool.ts"],"sourcesContent":["import {\n assertNever,\n bigintReplacer,\n canonicalizeJson,\n ensureError,\n mapPObjectData,\n PFrameDriverError,\n ValueType,\n resolveAnnotationParents,\n type JsonSerializable,\n type PColumn,\n type PColumnSpec,\n type PFrameHandle,\n type PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport { hashJson, PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/helpers\";\nimport { PFrameFactory } from \"@milaboratories/pframes-rs-node\";\nimport { createPFrame as createPFrameSpec } from \"@milaboratories/pframes-rs-wasm\";\nimport { mapValues } from \"es-toolkit\";\nimport { logPFrames } from \"./logging\";\n\nexport interface LocalBlobProvider<TreeEntry extends JsonSerializable> {\n acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;\n makeDataSource(signal: AbortSignal): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\">;\n}\n\nexport interface RemoteBlobProvider<TreeEntry extends JsonSerializable> {\n acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;\n httpServerInfo(): PFrameInternal.HttpServerInfo;\n}\n\nexport class PFrameHolder<TreeEntry extends JsonSerializable> implements Disposable {\n public readonly pFrameDataPromise: Promise<PFrameInternal.PFrameV17>;\n /**\n * WASM-spec frame built from this PFrame's columns. Source of truth\n * for spec-side operations: column discovery, selector resolution,\n * legacy-query lowering.\n */\n public readonly pFrameSpec: PFrameInternal.PFrameWasmV3;\n public readonly columnSpecs: Readonly<Record<PObjectId, PColumnSpec>>;\n private readonly abortController = new AbortController();\n\n private readonly localBlobs: PoolEntry<PFrameInternal.PFrameBlobId>[] = [];\n private readonly remoteBlobs: PoolEntry<PFrameInternal.PFrameBlobId>[] = [];\n\n constructor(\n frameId: PFrameInternal.PFrameId,\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>,\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>,\n logger: PFrameInternal.Logger,\n private readonly spillPath: string,\n columns: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n ) {\n const ValueTypes = new Set(Object.values(ValueType));\n const specColumnsMap: Record<PObjectId, PColumnSpec> = Object.create(null);\n for (const c of columns) {\n if (ValueTypes.has(c.spec.valueType)) {\n specColumnsMap[c.id] = resolveAnnotationParents(c.spec);\n }\n }\n this.pFrameSpec = createPFrameSpec(specColumnsMap);\n this.columnSpecs = specColumnsMap;\n\n try {\n const makeLocalBlobId = (blob: TreeEntry): PFrameInternal.PFrameBlobId => {\n const localBlob = this.localBlobProvider.acquire(blob);\n this.localBlobs.push(localBlob);\n return localBlob.key;\n };\n\n const makeRemoteBlobId = (blob: TreeEntry): PFrameInternal.PFrameBlobId => {\n const remoteBlob = this.remoteBlobProvider.acquire(blob);\n this.remoteBlobs.push(remoteBlob);\n return `${remoteBlob.key}${PFrameInternal.ParquetExtension}` as PFrameInternal.PFrameBlobId;\n };\n\n const mapColumnData = (\n data: PFrameInternal.DataInfo<TreeEntry>,\n ): PFrameInternal.DataInfo<PFrameInternal.PFrameBlobId> => {\n switch (data.type) {\n case \"Json\":\n return { ...data };\n case \"JsonPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, makeLocalBlobId),\n };\n case \"BinaryPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n index: makeLocalBlobId(v.index),\n values: makeLocalBlobId(v.values),\n })),\n };\n case \"ParquetPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n ...v,\n data: makeRemoteBlobId(v.data),\n })),\n };\n default:\n assertNever(data);\n }\n };\n\n const jsonifiedColumns = columns.map((column) => ({\n ...column,\n data: mapColumnData(column.data),\n }));\n\n const pFrameData = PFrameFactory.createPFrame({ frameId, spillPath: this.spillPath, logger });\n try {\n pFrameData.setDataSource({\n ...this.localBlobProvider.makeDataSource(this.disposeSignal),\n parquetServer: this.remoteBlobProvider.httpServerInfo(),\n });\n\n this.pFrameDataPromise = pFrameData\n .addColumns(\n jsonifiedColumns.map((c) => ({\n id: c.id,\n data: {\n ...c.data,\n typeSpec: {\n axes: c.spec.axesSpec.map((a) => a.type),\n column: c.spec.valueType,\n },\n },\n })),\n { signal: this.disposeSignal },\n )\n .then(() => pFrameData)\n .catch((err: unknown) => {\n this.dispose();\n pFrameData.dispose();\n const error = new PFrameDriverError(\"PFrame creation failed asynchronously\");\n error.cause = new Error(\n `PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`,\n { cause: ensureError(err) },\n );\n throw error;\n });\n } catch (err: unknown) {\n // setDataSource / addColumns threw synchronously before\n // pFrameDataPromise was assigned — dispose the addon's pFrameData\n // explicitly (the dispose() path can't reach it yet).\n pFrameData.dispose();\n throw err;\n }\n } catch (err: unknown) {\n // Release everything allocated so far in this constructor:\n // acquired blobs, the WASM spec frame, and the abort signal.\n this.abortController.abort();\n this.localBlobs.forEach((entry) => entry.unref());\n this.remoteBlobs.forEach((entry) => entry.unref());\n this.pFrameSpec[Symbol.dispose]();\n const error = new PFrameDriverError(\"PFrame creation failed synchronously\");\n error.cause = new Error(`PFrame cannot be created from columns: ${JSON.stringify(columns)}`, {\n cause: ensureError(err),\n });\n throw error;\n }\n }\n\n public get disposeSignal(): AbortSignal {\n return this.abortController.signal;\n }\n\n private dispose(): void {\n this.abortController.abort();\n this.localBlobs.forEach((entry) => entry.unref());\n this.remoteBlobs.forEach((entry) => entry.unref());\n this.pFrameSpec[Symbol.dispose]();\n void this.pFrameDataPromise\n .then((pFrameData) => pFrameData.dispose())\n .catch(() => {\n /* mute error */\n });\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n }\n}\n\nexport class PFramePool<TreeEntry extends JsonSerializable> extends RefCountPoolBase<\n PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n PFrameHandle,\n PFrameHolder<TreeEntry>\n> {\n constructor(\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>,\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>,\n private readonly logger: PFrameInternal.Logger,\n private readonly spillPath: string,\n ) {\n super();\n }\n\n protected calculateParamsKey(\n params: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n ): PFrameHandle {\n return stableKeyFromPFrameData(params);\n }\n\n protected createNewResource(\n params: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n key: PFrameHandle,\n ): PFrameHolder<TreeEntry> {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `PFrame creation (pFrameHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n return new PFrameHolder(\n key,\n this.localBlobProvider,\n this.remoteBlobProvider,\n this.logger,\n this.spillPath,\n params,\n );\n }\n\n public getByKey(key: PFrameHandle): PFrameHolder<TreeEntry> {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PFrame handle`);\n error.cause = new Error(`PFrame with handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n\nfunction stableKeyFromPFrameData<TreeEntry extends JsonSerializable>(\n data: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n): PFrameHandle {\n const orderedData = [...data].map((column) =>\n mapPObjectData(column, (r) => {\n let result: {\n type: string;\n keyLength: number;\n payload: {\n key: string;\n value: null | number | string | [string, string];\n }[];\n };\n const type = r.type;\n switch (type) {\n case \"Json\":\n result = {\n type: r.type,\n keyLength: r.keyLength,\n payload: Object.entries(r.data).map(([part, value]) => ({\n key: part,\n value,\n })),\n };\n break;\n case \"JsonPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: canonicalizeJson(info),\n })),\n };\n break;\n case \"BinaryPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: [canonicalizeJson(info.index), canonicalizeJson(info.values)] as const,\n })),\n };\n break;\n case \"ParquetPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value:\n info.dataDigest ||\n ([\n canonicalizeJson(info.data),\n JSON.stringify({ axes: info.axes, column: info.column }),\n ] as const),\n })),\n };\n break;\n default:\n throw new PFrameDriverError(\n `unsupported resource type: ${JSON.stringify(type satisfies never)}`,\n );\n }\n result.payload.sort((lhs, rhs) => (lhs.key < rhs.key ? -1 : 1));\n return result;\n }),\n );\n orderedData.sort((lhs, rhs) => (lhs.id < rhs.id ? -1 : 1));\n return hashJson(orderedData) as string as PFrameHandle;\n}\n"],"mappings":";;;;;;;;;AAgCA,IAAa,eAAb,MAAoF;CAClF;;;;;;CAMA;CACA;CACA,kBAAmC,IAAI,iBAAiB;CAExD,aAAwE,EAAE;CAC1E,cAAyE,EAAE;CAE3E,YACE,SACA,mBACA,oBACA,QACA,WACA,SACA;AALiB,OAAA,oBAAA;AACA,OAAA,qBAAA;AAEA,OAAA,YAAA;EAGjB,MAAM,aAAa,IAAI,IAAI,OAAO,OAAOA,gCAAAA,UAAU,CAAC;EACpD,MAAM,iBAAiD,OAAO,OAAO,KAAK;AAC1E,OAAK,MAAM,KAAK,QACd,KAAI,WAAW,IAAI,EAAE,KAAK,UAAU,CAClC,gBAAe,EAAE,OAAA,GAAA,gCAAA,0BAA+B,EAAE,KAAK;AAG3D,OAAK,cAAA,GAAA,gCAAA,cAA8B,eAAe;AAClD,OAAK,cAAc;AAEnB,MAAI;GACF,MAAM,mBAAmB,SAAiD;IACxE,MAAM,YAAY,KAAK,kBAAkB,QAAQ,KAAK;AACtD,SAAK,WAAW,KAAK,UAAU;AAC/B,WAAO,UAAU;;GAGnB,MAAM,oBAAoB,SAAiD;IACzE,MAAM,aAAa,KAAK,mBAAmB,QAAQ,KAAK;AACxD,SAAK,YAAY,KAAK,WAAW;AACjC,WAAO,GAAG,WAAW,MAAMC,sCAAAA,eAAe;;GAG5C,MAAM,iBACJ,SACyD;AACzD,YAAQ,KAAK,MAAb;KACE,KAAK,OACH,QAAO,EAAE,GAAG,MAAM;KACpB,KAAK,kBACH,QAAO;MACL,GAAG;MACH,QAAA,GAAA,WAAA,WAAiB,KAAK,OAAO,gBAAgB;MAC9C;KACH,KAAK,oBACH,QAAO;MACL,GAAG;MACH,QAAA,GAAA,WAAA,WAAiB,KAAK,QAAQ,OAAO;OACnC,OAAO,gBAAgB,EAAE,MAAM;OAC/B,QAAQ,gBAAgB,EAAE,OAAO;OAClC,EAAE;MACJ;KACH,KAAK,qBACH,QAAO;MACL,GAAG;MACH,QAAA,GAAA,WAAA,WAAiB,KAAK,QAAQ,OAAO;OACnC,GAAG;OACH,MAAM,iBAAiB,EAAE,KAAK;OAC/B,EAAE;MACJ;KACH,QACE,EAAA,GAAA,gCAAA,aAAY,KAAK;;;GAIvB,MAAM,mBAAmB,QAAQ,KAAK,YAAY;IAChD,GAAG;IACH,MAAM,cAAc,OAAO,KAAK;IACjC,EAAE;GAEH,MAAM,aAAaC,gCAAAA,cAAc,aAAa;IAAE;IAAS,WAAW,KAAK;IAAW;IAAQ,CAAC;AAC7F,OAAI;AACF,eAAW,cAAc;KACvB,GAAG,KAAK,kBAAkB,eAAe,KAAK,cAAc;KAC5D,eAAe,KAAK,mBAAmB,gBAAgB;KACxD,CAAC;AAEF,SAAK,oBAAoB,WACtB,WACC,iBAAiB,KAAK,OAAO;KAC3B,IAAI,EAAE;KACN,MAAM;MACJ,GAAG,EAAE;MACL,UAAU;OACR,MAAM,EAAE,KAAK,SAAS,KAAK,MAAM,EAAE,KAAK;OACxC,QAAQ,EAAE,KAAK;OAChB;MACF;KACF,EAAE,EACH,EAAE,QAAQ,KAAK,eAAe,CAC/B,CACA,WAAW,WAAW,CACtB,OAAO,QAAiB;AACvB,UAAK,SAAS;AACd,gBAAW,SAAS;KACpB,MAAM,QAAQ,IAAIC,gCAAAA,kBAAkB,wCAAwC;AAC5E,WAAM,QAAQ,IAAI,MAChB,0CAA0C,KAAK,UAAU,iBAAiB,IAC1E,EAAE,QAAA,GAAA,gCAAA,aAAmB,IAAI,EAAE,CAC5B;AACD,WAAM;MACN;YACG,KAAc;AAIrB,eAAW,SAAS;AACpB,UAAM;;WAED,KAAc;AAGrB,QAAK,gBAAgB,OAAO;AAC5B,QAAK,WAAW,SAAS,UAAU,MAAM,OAAO,CAAC;AACjD,QAAK,YAAY,SAAS,UAAU,MAAM,OAAO,CAAC;AAClD,QAAK,WAAW,OAAO,UAAU;GACjC,MAAM,QAAQ,IAAIA,gCAAAA,kBAAkB,uCAAuC;AAC3E,SAAM,QAAQ,IAAI,MAAM,0CAA0C,KAAK,UAAU,QAAQ,IAAI,EAC3F,QAAA,GAAA,gCAAA,aAAmB,IAAI,EACxB,CAAC;AACF,SAAM;;;CAIV,IAAW,gBAA6B;AACtC,SAAO,KAAK,gBAAgB;;CAG9B,UAAwB;AACtB,OAAK,gBAAgB,OAAO;AAC5B,OAAK,WAAW,SAAS,UAAU,MAAM,OAAO,CAAC;AACjD,OAAK,YAAY,SAAS,UAAU,MAAM,OAAO,CAAC;AAClD,OAAK,WAAW,OAAO,UAAU;AAC5B,OAAK,kBACP,MAAM,eAAe,WAAW,SAAS,CAAC,CAC1C,YAAY,GAEX;;CAGN,CAAC,OAAO,WAAiB;AACvB,OAAK,SAAS;;;AAIlB,IAAa,aAAb,cAAoEC,wBAAAA,iBAIlE;CACA,YACE,mBACA,oBACA,QACA,WACA;AACA,SAAO;AALU,OAAA,oBAAA;AACA,OAAA,qBAAA;AACA,OAAA,SAAA;AACA,OAAA,YAAA;;CAKnB,mBACE,QACc;AACd,SAAO,wBAAwB,OAAO;;CAGxC,kBACE,QACA,KACyB;AACzB,MAAIC,gBAAAA,YAAY,CACd,MAAK,OACH,QACA,mCAAmC,IAAI,KAAU,KAAK,UAAU,QAAQC,gCAAAA,eAAe,GACxF;AAEH,SAAO,IAAI,aACT,KACA,KAAK,mBACL,KAAK,oBACL,KAAK,QACL,KAAK,WACL,OACD;;CAGH,SAAgB,KAA4C;EAC1D,MAAM,WAAW,MAAM,YAAY,IAAI;AACvC,MAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAIH,gCAAAA,kBAAkB,wBAAwB;AAC5D,SAAM,wBAAQ,IAAI,MAAM,sBAAsB,IAAI,YAAY;AAC9D,SAAM;;AAER,SAAO;;;AAIX,SAAS,wBACP,MACc;CACd,MAAM,cAAc,CAAC,GAAG,KAAK,CAAC,KAAK,YAAA,GAAA,gCAAA,gBAClB,SAAS,MAAM;EAC5B,IAAI;EAQJ,MAAM,OAAO,EAAE;AACf,UAAQ,MAAR;GACE,KAAK;AACH,aAAS;KACP,MAAM,EAAE;KACR,WAAW,EAAE;KACb,SAAS,OAAO,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,YAAY;MACtD,KAAK;MACL;MACD,EAAE;KACJ;AACD;GACF,KAAK;AACH,aAAS;KACP,MAAM,EAAE;KACR,WAAW,EAAE;KACb,SAAS,OAAO,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,WAAW;MACtD,KAAK;MACL,QAAA,GAAA,gCAAA,kBAAwB,KAAK;MAC9B,EAAE;KACJ;AACD;GACF,KAAK;AACH,aAAS;KACP,MAAM,EAAE;KACR,WAAW,EAAE;KACb,SAAS,OAAO,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,WAAW;MACtD,KAAK;MACL,OAAO,EAAA,GAAA,gCAAA,kBAAkB,KAAK,MAAM,GAAA,GAAA,gCAAA,kBAAmB,KAAK,OAAO,CAAC;MACrE,EAAE;KACJ;AACD;GACF,KAAK;AACH,aAAS;KACP,MAAM,EAAE;KACR,WAAW,EAAE;KACb,SAAS,OAAO,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,WAAW;MACtD,KAAK;MACL,OACE,KAAK,cACJ,EAAA,GAAA,gCAAA,kBACkB,KAAK,KAAK,EAC3B,KAAK,UAAU;OAAE,MAAM,KAAK;OAAM,QAAQ,KAAK;OAAQ,CAAC,CACzD;MACJ,EAAE;KACJ;AACD;GACF,QACE,OAAM,IAAIA,gCAAAA,kBACR,8BAA8B,KAAK,UAAU,KAAqB,GACnE;;AAEL,SAAO,QAAQ,MAAM,KAAK,QAAS,IAAI,MAAM,IAAI,MAAM,KAAK,EAAG;AAC/D,SAAO;GACP,CACH;AACD,aAAY,MAAM,KAAK,QAAS,IAAI,KAAK,IAAI,KAAK,KAAK,EAAG;AAC1D,SAAA,GAAA,sCAAA,UAAgB,YAAY"}
|
|
1
|
+
{"version":3,"file":"pframe_pool.cjs","names":["ValueType","PFrameInternal","PFrameFactory","PFrameDriverError","RefCountPoolBase","logPFrames","bigintReplacer"],"sources":["../src/pframe_pool.ts"],"sourcesContent":["import {\n assertNever,\n bigintReplacer,\n canonicalizeJson,\n ensureError,\n mapPObjectData,\n PFrameDriverError,\n ValueType,\n resolveAnnotationParents,\n type JsonSerializable,\n type PColumn,\n type PColumnSpec,\n type PFrameHandle,\n type PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport { hashJson, PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/helpers\";\nimport { PFrameFactory } from \"@milaboratories/pframes-rs-node\";\nimport { createPFrame as createPFrameSpec } from \"@milaboratories/pframes-rs-wasm\";\nimport { mapValues } from \"es-toolkit\";\nimport { logPFrames } from \"./logging\";\n\nexport interface LocalBlobProvider<TreeEntry extends JsonSerializable> {\n acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;\n makeDataSource(signal: AbortSignal): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\">;\n}\n\nexport interface RemoteBlobProvider<TreeEntry extends JsonSerializable> {\n acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;\n httpServerInfo(): PFrameInternal.HttpServerInfo;\n}\n\nexport class PFrameHolder<TreeEntry extends JsonSerializable> implements Disposable {\n public readonly pFrameDataPromise: Promise<PFrameInternal.PFrameV18>;\n /**\n * WASM-spec frame built from this PFrame's columns. Source of truth\n * for spec-side operations: column discovery, selector resolution,\n * legacy-query lowering.\n */\n public readonly pFrameSpec: PFrameInternal.PFrameWasmV3;\n public readonly columnSpecs: Readonly<Record<PObjectId, PColumnSpec>>;\n private readonly abortController = new AbortController();\n\n private readonly localBlobs: PoolEntry<PFrameInternal.PFrameBlobId>[] = [];\n private readonly remoteBlobs: PoolEntry<PFrameInternal.PFrameBlobId>[] = [];\n\n constructor(\n frameId: PFrameInternal.PFrameId,\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>,\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>,\n logger: PFrameInternal.Logger,\n private readonly spillPath: string,\n columns: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n ) {\n const ValueTypes = new Set(Object.values(ValueType));\n const specColumnsMap: Record<PObjectId, PColumnSpec> = Object.create(null);\n for (const c of columns) {\n if (ValueTypes.has(c.spec.valueType)) {\n specColumnsMap[c.id] = resolveAnnotationParents(c.spec);\n }\n }\n this.pFrameSpec = createPFrameSpec(specColumnsMap);\n this.columnSpecs = specColumnsMap;\n\n try {\n const makeLocalBlobId = (blob: TreeEntry): PFrameInternal.PFrameBlobId => {\n const localBlob = this.localBlobProvider.acquire(blob);\n this.localBlobs.push(localBlob);\n return localBlob.key;\n };\n\n const makeRemoteBlobId = (blob: TreeEntry): PFrameInternal.PFrameBlobId => {\n const remoteBlob = this.remoteBlobProvider.acquire(blob);\n this.remoteBlobs.push(remoteBlob);\n return `${remoteBlob.key}${PFrameInternal.ParquetExtension}` as PFrameInternal.PFrameBlobId;\n };\n\n const mapColumnData = (\n data: PFrameInternal.DataInfo<TreeEntry>,\n ): PFrameInternal.DataInfo<PFrameInternal.PFrameBlobId> => {\n switch (data.type) {\n case \"Json\":\n return { ...data };\n case \"JsonPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, makeLocalBlobId),\n };\n case \"BinaryPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n index: makeLocalBlobId(v.index),\n values: makeLocalBlobId(v.values),\n })),\n };\n case \"ParquetPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n ...v,\n data: makeRemoteBlobId(v.data),\n })),\n };\n default:\n assertNever(data);\n }\n };\n\n const jsonifiedColumns = columns.map((column) => ({\n ...column,\n data: mapColumnData(column.data),\n }));\n\n const pFrameData = PFrameFactory.createPFrame({ frameId, spillPath: this.spillPath, logger });\n try {\n pFrameData.setDataSource({\n ...this.localBlobProvider.makeDataSource(this.disposeSignal),\n parquetServer: this.remoteBlobProvider.httpServerInfo(),\n });\n\n this.pFrameDataPromise = pFrameData\n .addColumns(\n jsonifiedColumns.map((c) => ({\n id: c.id,\n data: {\n ...c.data,\n typeSpec: {\n axes: c.spec.axesSpec.map((a) => a.type),\n column: c.spec.valueType,\n },\n },\n })),\n { signal: this.disposeSignal },\n )\n .then(() => pFrameData)\n .catch((err: unknown) => {\n this.dispose();\n pFrameData.dispose();\n const error = new PFrameDriverError(\"PFrame creation failed asynchronously\");\n error.cause = new Error(\n `PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`,\n { cause: ensureError(err) },\n );\n throw error;\n });\n } catch (err: unknown) {\n // setDataSource / addColumns threw synchronously before\n // pFrameDataPromise was assigned — dispose the addon's pFrameData\n // explicitly (the dispose() path can't reach it yet).\n pFrameData.dispose();\n throw err;\n }\n } catch (err: unknown) {\n // Release everything allocated so far in this constructor:\n // acquired blobs, the WASM spec frame, and the abort signal.\n this.abortController.abort();\n this.localBlobs.forEach((entry) => entry.unref());\n this.remoteBlobs.forEach((entry) => entry.unref());\n this.pFrameSpec[Symbol.dispose]();\n const error = new PFrameDriverError(\"PFrame creation failed synchronously\");\n error.cause = new Error(`PFrame cannot be created from columns: ${JSON.stringify(columns)}`, {\n cause: ensureError(err),\n });\n throw error;\n }\n }\n\n public get disposeSignal(): AbortSignal {\n return this.abortController.signal;\n }\n\n private dispose(): void {\n this.abortController.abort();\n this.localBlobs.forEach((entry) => entry.unref());\n this.remoteBlobs.forEach((entry) => entry.unref());\n this.pFrameSpec[Symbol.dispose]();\n void this.pFrameDataPromise\n .then((pFrameData) => pFrameData.dispose())\n .catch(() => {\n /* mute error */\n });\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n }\n}\n\nexport class PFramePool<TreeEntry extends JsonSerializable> extends RefCountPoolBase<\n PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n PFrameHandle,\n PFrameHolder<TreeEntry>\n> {\n constructor(\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>,\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>,\n private readonly logger: PFrameInternal.Logger,\n private readonly spillPath: string,\n ) {\n super();\n }\n\n protected calculateParamsKey(\n params: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n ): PFrameHandle {\n return stableKeyFromPFrameData(params);\n }\n\n protected createNewResource(\n params: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n key: PFrameHandle,\n ): PFrameHolder<TreeEntry> {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `PFrame creation (pFrameHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n return new PFrameHolder(\n key,\n this.localBlobProvider,\n this.remoteBlobProvider,\n this.logger,\n this.spillPath,\n params,\n );\n }\n\n public getByKey(key: PFrameHandle): PFrameHolder<TreeEntry> {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PFrame handle`);\n error.cause = new Error(`PFrame with handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n\nfunction stableKeyFromPFrameData<TreeEntry extends JsonSerializable>(\n data: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n): PFrameHandle {\n const orderedData = [...data].map((column) =>\n mapPObjectData(column, (r) => {\n let result: {\n type: string;\n keyLength: number;\n payload: {\n key: string;\n value: null | number | string | [string, string];\n }[];\n };\n const type = r.type;\n switch (type) {\n case \"Json\":\n result = {\n type: r.type,\n keyLength: r.keyLength,\n payload: Object.entries(r.data).map(([part, value]) => ({\n key: part,\n value,\n })),\n };\n break;\n case \"JsonPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: canonicalizeJson(info),\n })),\n };\n break;\n case \"BinaryPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: [canonicalizeJson(info.index), canonicalizeJson(info.values)] as const,\n })),\n };\n break;\n case \"ParquetPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value:\n info.dataDigest ||\n ([\n canonicalizeJson(info.data),\n JSON.stringify({ axes: info.axes, column: info.column }),\n ] as const),\n })),\n };\n break;\n default:\n throw new PFrameDriverError(\n `unsupported resource type: ${JSON.stringify(type satisfies never)}`,\n );\n }\n result.payload.sort((lhs, rhs) => (lhs.key < rhs.key ? -1 : 1));\n return result;\n }),\n );\n orderedData.sort((lhs, rhs) => (lhs.id < rhs.id ? -1 : 1));\n return hashJson(orderedData) as string as PFrameHandle;\n}\n"],"mappings":"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"}
|
package/dist/pframe_pool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pframe_pool.js","names":["createPFrameSpec"],"sources":["../src/pframe_pool.ts"],"sourcesContent":["import {\n assertNever,\n bigintReplacer,\n canonicalizeJson,\n ensureError,\n mapPObjectData,\n PFrameDriverError,\n ValueType,\n resolveAnnotationParents,\n type JsonSerializable,\n type PColumn,\n type PColumnSpec,\n type PFrameHandle,\n type PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport { hashJson, PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/helpers\";\nimport { PFrameFactory } from \"@milaboratories/pframes-rs-node\";\nimport { createPFrame as createPFrameSpec } from \"@milaboratories/pframes-rs-wasm\";\nimport { mapValues } from \"es-toolkit\";\nimport { logPFrames } from \"./logging\";\n\nexport interface LocalBlobProvider<TreeEntry extends JsonSerializable> {\n acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;\n makeDataSource(signal: AbortSignal): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\">;\n}\n\nexport interface RemoteBlobProvider<TreeEntry extends JsonSerializable> {\n acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;\n httpServerInfo(): PFrameInternal.HttpServerInfo;\n}\n\nexport class PFrameHolder<TreeEntry extends JsonSerializable> implements Disposable {\n public readonly pFrameDataPromise: Promise<PFrameInternal.PFrameV17>;\n /**\n * WASM-spec frame built from this PFrame's columns. Source of truth\n * for spec-side operations: column discovery, selector resolution,\n * legacy-query lowering.\n */\n public readonly pFrameSpec: PFrameInternal.PFrameWasmV3;\n public readonly columnSpecs: Readonly<Record<PObjectId, PColumnSpec>>;\n private readonly abortController = new AbortController();\n\n private readonly localBlobs: PoolEntry<PFrameInternal.PFrameBlobId>[] = [];\n private readonly remoteBlobs: PoolEntry<PFrameInternal.PFrameBlobId>[] = [];\n\n constructor(\n frameId: PFrameInternal.PFrameId,\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>,\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>,\n logger: PFrameInternal.Logger,\n private readonly spillPath: string,\n columns: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n ) {\n const ValueTypes = new Set(Object.values(ValueType));\n const specColumnsMap: Record<PObjectId, PColumnSpec> = Object.create(null);\n for (const c of columns) {\n if (ValueTypes.has(c.spec.valueType)) {\n specColumnsMap[c.id] = resolveAnnotationParents(c.spec);\n }\n }\n this.pFrameSpec = createPFrameSpec(specColumnsMap);\n this.columnSpecs = specColumnsMap;\n\n try {\n const makeLocalBlobId = (blob: TreeEntry): PFrameInternal.PFrameBlobId => {\n const localBlob = this.localBlobProvider.acquire(blob);\n this.localBlobs.push(localBlob);\n return localBlob.key;\n };\n\n const makeRemoteBlobId = (blob: TreeEntry): PFrameInternal.PFrameBlobId => {\n const remoteBlob = this.remoteBlobProvider.acquire(blob);\n this.remoteBlobs.push(remoteBlob);\n return `${remoteBlob.key}${PFrameInternal.ParquetExtension}` as PFrameInternal.PFrameBlobId;\n };\n\n const mapColumnData = (\n data: PFrameInternal.DataInfo<TreeEntry>,\n ): PFrameInternal.DataInfo<PFrameInternal.PFrameBlobId> => {\n switch (data.type) {\n case \"Json\":\n return { ...data };\n case \"JsonPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, makeLocalBlobId),\n };\n case \"BinaryPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n index: makeLocalBlobId(v.index),\n values: makeLocalBlobId(v.values),\n })),\n };\n case \"ParquetPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n ...v,\n data: makeRemoteBlobId(v.data),\n })),\n };\n default:\n assertNever(data);\n }\n };\n\n const jsonifiedColumns = columns.map((column) => ({\n ...column,\n data: mapColumnData(column.data),\n }));\n\n const pFrameData = PFrameFactory.createPFrame({ frameId, spillPath: this.spillPath, logger });\n try {\n pFrameData.setDataSource({\n ...this.localBlobProvider.makeDataSource(this.disposeSignal),\n parquetServer: this.remoteBlobProvider.httpServerInfo(),\n });\n\n this.pFrameDataPromise = pFrameData\n .addColumns(\n jsonifiedColumns.map((c) => ({\n id: c.id,\n data: {\n ...c.data,\n typeSpec: {\n axes: c.spec.axesSpec.map((a) => a.type),\n column: c.spec.valueType,\n },\n },\n })),\n { signal: this.disposeSignal },\n )\n .then(() => pFrameData)\n .catch((err: unknown) => {\n this.dispose();\n pFrameData.dispose();\n const error = new PFrameDriverError(\"PFrame creation failed asynchronously\");\n error.cause = new Error(\n `PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`,\n { cause: ensureError(err) },\n );\n throw error;\n });\n } catch (err: unknown) {\n // setDataSource / addColumns threw synchronously before\n // pFrameDataPromise was assigned — dispose the addon's pFrameData\n // explicitly (the dispose() path can't reach it yet).\n pFrameData.dispose();\n throw err;\n }\n } catch (err: unknown) {\n // Release everything allocated so far in this constructor:\n // acquired blobs, the WASM spec frame, and the abort signal.\n this.abortController.abort();\n this.localBlobs.forEach((entry) => entry.unref());\n this.remoteBlobs.forEach((entry) => entry.unref());\n this.pFrameSpec[Symbol.dispose]();\n const error = new PFrameDriverError(\"PFrame creation failed synchronously\");\n error.cause = new Error(`PFrame cannot be created from columns: ${JSON.stringify(columns)}`, {\n cause: ensureError(err),\n });\n throw error;\n }\n }\n\n public get disposeSignal(): AbortSignal {\n return this.abortController.signal;\n }\n\n private dispose(): void {\n this.abortController.abort();\n this.localBlobs.forEach((entry) => entry.unref());\n this.remoteBlobs.forEach((entry) => entry.unref());\n this.pFrameSpec[Symbol.dispose]();\n void this.pFrameDataPromise\n .then((pFrameData) => pFrameData.dispose())\n .catch(() => {\n /* mute error */\n });\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n }\n}\n\nexport class PFramePool<TreeEntry extends JsonSerializable> extends RefCountPoolBase<\n PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n PFrameHandle,\n PFrameHolder<TreeEntry>\n> {\n constructor(\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>,\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>,\n private readonly logger: PFrameInternal.Logger,\n private readonly spillPath: string,\n ) {\n super();\n }\n\n protected calculateParamsKey(\n params: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n ): PFrameHandle {\n return stableKeyFromPFrameData(params);\n }\n\n protected createNewResource(\n params: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n key: PFrameHandle,\n ): PFrameHolder<TreeEntry> {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `PFrame creation (pFrameHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n return new PFrameHolder(\n key,\n this.localBlobProvider,\n this.remoteBlobProvider,\n this.logger,\n this.spillPath,\n params,\n );\n }\n\n public getByKey(key: PFrameHandle): PFrameHolder<TreeEntry> {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PFrame handle`);\n error.cause = new Error(`PFrame with handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n\nfunction stableKeyFromPFrameData<TreeEntry extends JsonSerializable>(\n data: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n): PFrameHandle {\n const orderedData = [...data].map((column) =>\n mapPObjectData(column, (r) => {\n let result: {\n type: string;\n keyLength: number;\n payload: {\n key: string;\n value: null | number | string | [string, string];\n }[];\n };\n const type = r.type;\n switch (type) {\n case \"Json\":\n result = {\n type: r.type,\n keyLength: r.keyLength,\n payload: Object.entries(r.data).map(([part, value]) => ({\n key: part,\n value,\n })),\n };\n break;\n case \"JsonPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: canonicalizeJson(info),\n })),\n };\n break;\n case \"BinaryPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: [canonicalizeJson(info.index), canonicalizeJson(info.values)] as const,\n })),\n };\n break;\n case \"ParquetPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value:\n info.dataDigest ||\n ([\n canonicalizeJson(info.data),\n JSON.stringify({ axes: info.axes, column: info.column }),\n ] as const),\n })),\n };\n break;\n default:\n throw new PFrameDriverError(\n `unsupported resource type: ${JSON.stringify(type satisfies never)}`,\n );\n }\n result.payload.sort((lhs, rhs) => (lhs.key < rhs.key ? -1 : 1));\n return result;\n }),\n );\n orderedData.sort((lhs, rhs) => (lhs.id < rhs.id ? -1 : 1));\n return hashJson(orderedData) as string as PFrameHandle;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pframe_pool.js","names":["createPFrameSpec"],"sources":["../src/pframe_pool.ts"],"sourcesContent":["import {\n assertNever,\n bigintReplacer,\n canonicalizeJson,\n ensureError,\n mapPObjectData,\n PFrameDriverError,\n ValueType,\n resolveAnnotationParents,\n type JsonSerializable,\n type PColumn,\n type PColumnSpec,\n type PFrameHandle,\n type PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport { hashJson, PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/helpers\";\nimport { PFrameFactory } from \"@milaboratories/pframes-rs-node\";\nimport { createPFrame as createPFrameSpec } from \"@milaboratories/pframes-rs-wasm\";\nimport { mapValues } from \"es-toolkit\";\nimport { logPFrames } from \"./logging\";\n\nexport interface LocalBlobProvider<TreeEntry extends JsonSerializable> {\n acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;\n makeDataSource(signal: AbortSignal): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\">;\n}\n\nexport interface RemoteBlobProvider<TreeEntry extends JsonSerializable> {\n acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;\n httpServerInfo(): PFrameInternal.HttpServerInfo;\n}\n\nexport class PFrameHolder<TreeEntry extends JsonSerializable> implements Disposable {\n public readonly pFrameDataPromise: Promise<PFrameInternal.PFrameV18>;\n /**\n * WASM-spec frame built from this PFrame's columns. Source of truth\n * for spec-side operations: column discovery, selector resolution,\n * legacy-query lowering.\n */\n public readonly pFrameSpec: PFrameInternal.PFrameWasmV3;\n public readonly columnSpecs: Readonly<Record<PObjectId, PColumnSpec>>;\n private readonly abortController = new AbortController();\n\n private readonly localBlobs: PoolEntry<PFrameInternal.PFrameBlobId>[] = [];\n private readonly remoteBlobs: PoolEntry<PFrameInternal.PFrameBlobId>[] = [];\n\n constructor(\n frameId: PFrameInternal.PFrameId,\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>,\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>,\n logger: PFrameInternal.Logger,\n private readonly spillPath: string,\n columns: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n ) {\n const ValueTypes = new Set(Object.values(ValueType));\n const specColumnsMap: Record<PObjectId, PColumnSpec> = Object.create(null);\n for (const c of columns) {\n if (ValueTypes.has(c.spec.valueType)) {\n specColumnsMap[c.id] = resolveAnnotationParents(c.spec);\n }\n }\n this.pFrameSpec = createPFrameSpec(specColumnsMap);\n this.columnSpecs = specColumnsMap;\n\n try {\n const makeLocalBlobId = (blob: TreeEntry): PFrameInternal.PFrameBlobId => {\n const localBlob = this.localBlobProvider.acquire(blob);\n this.localBlobs.push(localBlob);\n return localBlob.key;\n };\n\n const makeRemoteBlobId = (blob: TreeEntry): PFrameInternal.PFrameBlobId => {\n const remoteBlob = this.remoteBlobProvider.acquire(blob);\n this.remoteBlobs.push(remoteBlob);\n return `${remoteBlob.key}${PFrameInternal.ParquetExtension}` as PFrameInternal.PFrameBlobId;\n };\n\n const mapColumnData = (\n data: PFrameInternal.DataInfo<TreeEntry>,\n ): PFrameInternal.DataInfo<PFrameInternal.PFrameBlobId> => {\n switch (data.type) {\n case \"Json\":\n return { ...data };\n case \"JsonPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, makeLocalBlobId),\n };\n case \"BinaryPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n index: makeLocalBlobId(v.index),\n values: makeLocalBlobId(v.values),\n })),\n };\n case \"ParquetPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n ...v,\n data: makeRemoteBlobId(v.data),\n })),\n };\n default:\n assertNever(data);\n }\n };\n\n const jsonifiedColumns = columns.map((column) => ({\n ...column,\n data: mapColumnData(column.data),\n }));\n\n const pFrameData = PFrameFactory.createPFrame({ frameId, spillPath: this.spillPath, logger });\n try {\n pFrameData.setDataSource({\n ...this.localBlobProvider.makeDataSource(this.disposeSignal),\n parquetServer: this.remoteBlobProvider.httpServerInfo(),\n });\n\n this.pFrameDataPromise = pFrameData\n .addColumns(\n jsonifiedColumns.map((c) => ({\n id: c.id,\n data: {\n ...c.data,\n typeSpec: {\n axes: c.spec.axesSpec.map((a) => a.type),\n column: c.spec.valueType,\n },\n },\n })),\n { signal: this.disposeSignal },\n )\n .then(() => pFrameData)\n .catch((err: unknown) => {\n this.dispose();\n pFrameData.dispose();\n const error = new PFrameDriverError(\"PFrame creation failed asynchronously\");\n error.cause = new Error(\n `PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`,\n { cause: ensureError(err) },\n );\n throw error;\n });\n } catch (err: unknown) {\n // setDataSource / addColumns threw synchronously before\n // pFrameDataPromise was assigned — dispose the addon's pFrameData\n // explicitly (the dispose() path can't reach it yet).\n pFrameData.dispose();\n throw err;\n }\n } catch (err: unknown) {\n // Release everything allocated so far in this constructor:\n // acquired blobs, the WASM spec frame, and the abort signal.\n this.abortController.abort();\n this.localBlobs.forEach((entry) => entry.unref());\n this.remoteBlobs.forEach((entry) => entry.unref());\n this.pFrameSpec[Symbol.dispose]();\n const error = new PFrameDriverError(\"PFrame creation failed synchronously\");\n error.cause = new Error(`PFrame cannot be created from columns: ${JSON.stringify(columns)}`, {\n cause: ensureError(err),\n });\n throw error;\n }\n }\n\n public get disposeSignal(): AbortSignal {\n return this.abortController.signal;\n }\n\n private dispose(): void {\n this.abortController.abort();\n this.localBlobs.forEach((entry) => entry.unref());\n this.remoteBlobs.forEach((entry) => entry.unref());\n this.pFrameSpec[Symbol.dispose]();\n void this.pFrameDataPromise\n .then((pFrameData) => pFrameData.dispose())\n .catch(() => {\n /* mute error */\n });\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n }\n}\n\nexport class PFramePool<TreeEntry extends JsonSerializable> extends RefCountPoolBase<\n PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n PFrameHandle,\n PFrameHolder<TreeEntry>\n> {\n constructor(\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>,\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>,\n private readonly logger: PFrameInternal.Logger,\n private readonly spillPath: string,\n ) {\n super();\n }\n\n protected calculateParamsKey(\n params: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n ): PFrameHandle {\n return stableKeyFromPFrameData(params);\n }\n\n protected createNewResource(\n params: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n key: PFrameHandle,\n ): PFrameHolder<TreeEntry> {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `PFrame creation (pFrameHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n return new PFrameHolder(\n key,\n this.localBlobProvider,\n this.remoteBlobProvider,\n this.logger,\n this.spillPath,\n params,\n );\n }\n\n public getByKey(key: PFrameHandle): PFrameHolder<TreeEntry> {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PFrame handle`);\n error.cause = new Error(`PFrame with handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n\nfunction stableKeyFromPFrameData<TreeEntry extends JsonSerializable>(\n data: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n): PFrameHandle {\n const orderedData = [...data].map((column) =>\n mapPObjectData(column, (r) => {\n let result: {\n type: string;\n keyLength: number;\n payload: {\n key: string;\n value: null | number | string | [string, string];\n }[];\n };\n const type = r.type;\n switch (type) {\n case \"Json\":\n result = {\n type: r.type,\n keyLength: r.keyLength,\n payload: Object.entries(r.data).map(([part, value]) => ({\n key: part,\n value,\n })),\n };\n break;\n case \"JsonPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: canonicalizeJson(info),\n })),\n };\n break;\n case \"BinaryPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: [canonicalizeJson(info.index), canonicalizeJson(info.values)] as const,\n })),\n };\n break;\n case \"ParquetPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value:\n info.dataDigest ||\n ([\n canonicalizeJson(info.data),\n JSON.stringify({ axes: info.axes, column: info.column }),\n ] as const),\n })),\n };\n break;\n default:\n throw new PFrameDriverError(\n `unsupported resource type: ${JSON.stringify(type satisfies never)}`,\n );\n }\n result.payload.sort((lhs, rhs) => (lhs.key < rhs.key ? -1 : 1));\n return result;\n }),\n );\n orderedData.sort((lhs, rhs) => (lhs.id < rhs.id ? -1 : 1));\n return hashJson(orderedData) as string as PFrameHandle;\n}\n"],"mappings":"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"}
|
package/dist/ptable_pool.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ptable_pool.cjs","names":["RefCountPoolBase","stableKeyFromFullPTableDef","logPFrames","bigintReplacer","PFrameDriverError","buildFullPTableDefFromLegacy"],"sources":["../src/ptable_pool.ts"],"sourcesContent":["import {\n bigintReplacer,\n PFrameDriverError,\n type PFrameHandle,\n type PTableDef,\n type PTableHandle,\n type JsonSerializable,\n type PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/helpers\";\nimport { logPFrames } from \"./logging\";\nimport type { PFramePool } from \"./pframe_pool\";\nimport {\n buildFullPTableDefFromLegacy,\n stableKeyFromFullPTableDef,\n type FullPTableDef,\n} from \"./ptable_shared\";\nimport type { PTableDefPool } from \"./ptable_def_pool\";\n\nexport class PTableHolder implements Disposable {\n private readonly abortController = new AbortController();\n private readonly combinedDisposeSignal: AbortSignal;\n private cacheSizePromise?: Promise<number>;\n\n constructor(\n public readonly pFrame: PFrameHandle,\n pFrameDisposeSignal: AbortSignal,\n public readonly pTablePromise: Promise<PFrameInternal.
|
|
1
|
+
{"version":3,"file":"ptable_pool.cjs","names":["RefCountPoolBase","stableKeyFromFullPTableDef","logPFrames","bigintReplacer","PFrameDriverError","buildFullPTableDefFromLegacy"],"sources":["../src/ptable_pool.ts"],"sourcesContent":["import {\n bigintReplacer,\n PFrameDriverError,\n type PFrameHandle,\n type PTableDef,\n type PTableHandle,\n type JsonSerializable,\n type PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/helpers\";\nimport { logPFrames } from \"./logging\";\nimport type { PFramePool } from \"./pframe_pool\";\nimport {\n buildFullPTableDefFromLegacy,\n stableKeyFromFullPTableDef,\n type FullPTableDef,\n} from \"./ptable_shared\";\nimport type { PTableDefPool } from \"./ptable_def_pool\";\n\nexport class PTableHolder implements Disposable {\n private readonly abortController = new AbortController();\n private readonly combinedDisposeSignal: AbortSignal;\n private cacheSizePromise?: Promise<number>;\n\n constructor(\n public readonly pFrame: PFrameHandle,\n pFrameDisposeSignal: AbortSignal,\n public readonly pTablePromise: Promise<PFrameInternal.PTableV12>,\n private readonly predecessor?: PoolEntry<PTableHandle, PTableHolder>,\n ) {\n this.combinedDisposeSignal = AbortSignal.any([\n pFrameDisposeSignal,\n this.abortController.signal,\n ]);\n }\n\n public get disposeSignal(): AbortSignal {\n return this.combinedDisposeSignal;\n }\n\n public get cacheSize(): Promise<number> {\n if (this.cacheSizePromise === undefined) {\n this.cacheSizePromise = this.pTablePromise.then((pTable) =>\n pTable.getFootprint({\n withPredecessors: false,\n signal: this.abortController.signal,\n }),\n );\n }\n return this.cacheSizePromise;\n }\n\n [Symbol.dispose](): void {\n this.abortController.abort();\n this.predecessor?.unref();\n void this.pTablePromise\n .then((pTable) => pTable.dispose())\n .catch(() => {\n /* mute error */\n });\n }\n}\n\nexport class PTablePool<TreeEntry extends JsonSerializable> extends RefCountPoolBase<\n FullPTableDef,\n PTableHandle,\n PTableHolder\n> {\n constructor(\n private readonly pFrames: PFramePool<TreeEntry>,\n private readonly pTableDefs: PTableDefPool,\n private readonly logger: PFrameInternal.Logger,\n ) {\n super();\n }\n\n protected calculateParamsKey(params: FullPTableDef): PTableHandle {\n return stableKeyFromFullPTableDef(params);\n }\n\n protected createNewResource(params: FullPTableDef, key: PTableHandle): PTableHolder {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `PTable creation (pTableHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n\n const { pFrameHandle } = params;\n const { pFrameDataPromise: pFramePromise, disposeSignal } = this.pFrames.getByKey(pFrameHandle);\n\n const defDisposeSignal = this.pTableDefs.tryGetByKey(key)?.disposeSignal;\n const combinedSignal = AbortSignal.any([disposeSignal, defDisposeSignal].filter((s) => !!s));\n\n const { dataQuery } = params;\n const table = pFramePromise.then((pFrame) => pFrame.createTable(key, dataQuery));\n return new PTableHolder(pFrameHandle, combinedSignal, table);\n }\n\n public getByKey(key: PTableHandle): PTableHolder {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PTable handle`);\n error.cause = new Error(`PTable with handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n\n /**\n * Acquire a PTable from a legacy `PTableDef` + column specs map.\n * Lowers the input via WASM-spec and stores the resulting\n * `{ tableSpec, dataQuery }` shape. Returns the lowered def\n * alongside the pool entry.\n */\n public acquireFromLegacy(opts: {\n pFrameHandle: PFrameHandle;\n def: PTableDef<PObjectId>;\n pFrameSpec: PFrameInternal.PFrameWasmV3;\n }): { def: FullPTableDef; entry: PoolEntry<PTableHandle, PTableHolder> } {\n const def = buildFullPTableDefFromLegacy(opts);\n return { def, entry: this.acquire(def) };\n }\n}\n"],"mappings":";;;;;;AAoBA,IAAa,eAAb,MAAgD;CAC9C,kBAAmC,IAAI,iBAAiB;CACxD;CACA;CAEA,YACE,QACA,qBACA,eACA,aACA;AAJgB,OAAA,SAAA;AAEA,OAAA,gBAAA;AACC,OAAA,cAAA;AAEjB,OAAK,wBAAwB,YAAY,IAAI,CAC3C,qBACA,KAAK,gBAAgB,OACtB,CAAC;;CAGJ,IAAW,gBAA6B;AACtC,SAAO,KAAK;;CAGd,IAAW,YAA6B;AACtC,MAAI,KAAK,qBAAqB,KAAA,EAC5B,MAAK,mBAAmB,KAAK,cAAc,MAAM,WAC/C,OAAO,aAAa;GAClB,kBAAkB;GAClB,QAAQ,KAAK,gBAAgB;GAC9B,CAAC,CACH;AAEH,SAAO,KAAK;;CAGd,CAAC,OAAO,WAAiB;AACvB,OAAK,gBAAgB,OAAO;AAC5B,OAAK,aAAa,OAAO;AACpB,OAAK,cACP,MAAM,WAAW,OAAO,SAAS,CAAC,CAClC,YAAY,GAEX;;;AAIR,IAAa,aAAb,cAAoEA,wBAAAA,iBAIlE;CACA,YACE,SACA,YACA,QACA;AACA,SAAO;AAJU,OAAA,UAAA;AACA,OAAA,aAAA;AACA,OAAA,SAAA;;CAKnB,mBAA6B,QAAqC;AAChE,SAAOC,sBAAAA,2BAA2B,OAAO;;CAG3C,kBAA4B,QAAuB,KAAiC;AAClF,MAAIC,gBAAAA,YAAY,CACd,MAAK,OACH,QACA,mCAAmC,IAAI,KAAU,KAAK,UAAU,QAAQC,gCAAAA,eAAe,GACxF;EAGH,MAAM,EAAE,iBAAiB;EACzB,MAAM,EAAE,mBAAmB,eAAe,kBAAkB,KAAK,QAAQ,SAAS,aAAa;EAE/F,MAAM,mBAAmB,KAAK,WAAW,YAAY,IAAI,EAAE;EAC3D,MAAM,iBAAiB,YAAY,IAAI,CAAC,eAAe,iBAAiB,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC;EAE5F,MAAM,EAAE,cAAc;AAEtB,SAAO,IAAI,aAAa,cAAc,gBADxB,cAAc,MAAM,WAAW,OAAO,YAAY,KAAK,UAAU,CAAC,CACpB;;CAG9D,SAAgB,KAAiC;EAC/C,MAAM,WAAW,MAAM,YAAY,IAAI;AACvC,MAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAIC,gCAAAA,kBAAkB,wBAAwB;AAC5D,SAAM,wBAAQ,IAAI,MAAM,sBAAsB,IAAI,YAAY;AAC9D,SAAM;;AAER,SAAO;;;;;;;;CAST,kBAAyB,MAIgD;EACvE,MAAM,MAAMC,sBAAAA,6BAA6B,KAAK;AAC9C,SAAO;GAAE;GAAK,OAAO,KAAK,QAAQ,IAAI;GAAE"}
|
package/dist/ptable_pool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ptable_pool.js","names":[],"sources":["../src/ptable_pool.ts"],"sourcesContent":["import {\n bigintReplacer,\n PFrameDriverError,\n type PFrameHandle,\n type PTableDef,\n type PTableHandle,\n type JsonSerializable,\n type PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/helpers\";\nimport { logPFrames } from \"./logging\";\nimport type { PFramePool } from \"./pframe_pool\";\nimport {\n buildFullPTableDefFromLegacy,\n stableKeyFromFullPTableDef,\n type FullPTableDef,\n} from \"./ptable_shared\";\nimport type { PTableDefPool } from \"./ptable_def_pool\";\n\nexport class PTableHolder implements Disposable {\n private readonly abortController = new AbortController();\n private readonly combinedDisposeSignal: AbortSignal;\n private cacheSizePromise?: Promise<number>;\n\n constructor(\n public readonly pFrame: PFrameHandle,\n pFrameDisposeSignal: AbortSignal,\n public readonly pTablePromise: Promise<PFrameInternal.
|
|
1
|
+
{"version":3,"file":"ptable_pool.js","names":[],"sources":["../src/ptable_pool.ts"],"sourcesContent":["import {\n bigintReplacer,\n PFrameDriverError,\n type PFrameHandle,\n type PTableDef,\n type PTableHandle,\n type JsonSerializable,\n type PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/helpers\";\nimport { logPFrames } from \"./logging\";\nimport type { PFramePool } from \"./pframe_pool\";\nimport {\n buildFullPTableDefFromLegacy,\n stableKeyFromFullPTableDef,\n type FullPTableDef,\n} from \"./ptable_shared\";\nimport type { PTableDefPool } from \"./ptable_def_pool\";\n\nexport class PTableHolder implements Disposable {\n private readonly abortController = new AbortController();\n private readonly combinedDisposeSignal: AbortSignal;\n private cacheSizePromise?: Promise<number>;\n\n constructor(\n public readonly pFrame: PFrameHandle,\n pFrameDisposeSignal: AbortSignal,\n public readonly pTablePromise: Promise<PFrameInternal.PTableV12>,\n private readonly predecessor?: PoolEntry<PTableHandle, PTableHolder>,\n ) {\n this.combinedDisposeSignal = AbortSignal.any([\n pFrameDisposeSignal,\n this.abortController.signal,\n ]);\n }\n\n public get disposeSignal(): AbortSignal {\n return this.combinedDisposeSignal;\n }\n\n public get cacheSize(): Promise<number> {\n if (this.cacheSizePromise === undefined) {\n this.cacheSizePromise = this.pTablePromise.then((pTable) =>\n pTable.getFootprint({\n withPredecessors: false,\n signal: this.abortController.signal,\n }),\n );\n }\n return this.cacheSizePromise;\n }\n\n [Symbol.dispose](): void {\n this.abortController.abort();\n this.predecessor?.unref();\n void this.pTablePromise\n .then((pTable) => pTable.dispose())\n .catch(() => {\n /* mute error */\n });\n }\n}\n\nexport class PTablePool<TreeEntry extends JsonSerializable> extends RefCountPoolBase<\n FullPTableDef,\n PTableHandle,\n PTableHolder\n> {\n constructor(\n private readonly pFrames: PFramePool<TreeEntry>,\n private readonly pTableDefs: PTableDefPool,\n private readonly logger: PFrameInternal.Logger,\n ) {\n super();\n }\n\n protected calculateParamsKey(params: FullPTableDef): PTableHandle {\n return stableKeyFromFullPTableDef(params);\n }\n\n protected createNewResource(params: FullPTableDef, key: PTableHandle): PTableHolder {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `PTable creation (pTableHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n\n const { pFrameHandle } = params;\n const { pFrameDataPromise: pFramePromise, disposeSignal } = this.pFrames.getByKey(pFrameHandle);\n\n const defDisposeSignal = this.pTableDefs.tryGetByKey(key)?.disposeSignal;\n const combinedSignal = AbortSignal.any([disposeSignal, defDisposeSignal].filter((s) => !!s));\n\n const { dataQuery } = params;\n const table = pFramePromise.then((pFrame) => pFrame.createTable(key, dataQuery));\n return new PTableHolder(pFrameHandle, combinedSignal, table);\n }\n\n public getByKey(key: PTableHandle): PTableHolder {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PTable handle`);\n error.cause = new Error(`PTable with handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n\n /**\n * Acquire a PTable from a legacy `PTableDef` + column specs map.\n * Lowers the input via WASM-spec and stores the resulting\n * `{ tableSpec, dataQuery }` shape. Returns the lowered def\n * alongside the pool entry.\n */\n public acquireFromLegacy(opts: {\n pFrameHandle: PFrameHandle;\n def: PTableDef<PObjectId>;\n pFrameSpec: PFrameInternal.PFrameWasmV3;\n }): { def: FullPTableDef; entry: PoolEntry<PTableHandle, PTableHolder> } {\n const def = buildFullPTableDefFromLegacy(opts);\n return { def, entry: this.acquire(def) };\n }\n}\n"],"mappings":";;;;;AAoBA,IAAa,eAAb,MAAgD;CAC9C,kBAAmC,IAAI,iBAAiB;CACxD;CACA;CAEA,YACE,QACA,qBACA,eACA,aACA;AAJgB,OAAA,SAAA;AAEA,OAAA,gBAAA;AACC,OAAA,cAAA;AAEjB,OAAK,wBAAwB,YAAY,IAAI,CAC3C,qBACA,KAAK,gBAAgB,OACtB,CAAC;;CAGJ,IAAW,gBAA6B;AACtC,SAAO,KAAK;;CAGd,IAAW,YAA6B;AACtC,MAAI,KAAK,qBAAqB,KAAA,EAC5B,MAAK,mBAAmB,KAAK,cAAc,MAAM,WAC/C,OAAO,aAAa;GAClB,kBAAkB;GAClB,QAAQ,KAAK,gBAAgB;GAC9B,CAAC,CACH;AAEH,SAAO,KAAK;;CAGd,CAAC,OAAO,WAAiB;AACvB,OAAK,gBAAgB,OAAO;AAC5B,OAAK,aAAa,OAAO;AACpB,OAAK,cACP,MAAM,WAAW,OAAO,SAAS,CAAC,CAClC,YAAY,GAEX;;;AAIR,IAAa,aAAb,cAAoE,iBAIlE;CACA,YACE,SACA,YACA,QACA;AACA,SAAO;AAJU,OAAA,UAAA;AACA,OAAA,aAAA;AACA,OAAA,SAAA;;CAKnB,mBAA6B,QAAqC;AAChE,SAAO,2BAA2B,OAAO;;CAG3C,kBAA4B,QAAuB,KAAiC;AAClF,MAAI,YAAY,CACd,MAAK,OACH,QACA,mCAAmC,IAAI,KAAU,KAAK,UAAU,QAAQ,eAAe,GACxF;EAGH,MAAM,EAAE,iBAAiB;EACzB,MAAM,EAAE,mBAAmB,eAAe,kBAAkB,KAAK,QAAQ,SAAS,aAAa;EAE/F,MAAM,mBAAmB,KAAK,WAAW,YAAY,IAAI,EAAE;EAC3D,MAAM,iBAAiB,YAAY,IAAI,CAAC,eAAe,iBAAiB,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC;EAE5F,MAAM,EAAE,cAAc;AAEtB,SAAO,IAAI,aAAa,cAAc,gBADxB,cAAc,MAAM,WAAW,OAAO,YAAY,KAAK,UAAU,CAAC,CACpB;;CAG9D,SAAgB,KAAiC;EAC/C,MAAM,WAAW,MAAM,YAAY,IAAI;AACvC,MAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAI,kBAAkB,wBAAwB;AAC5D,SAAM,wBAAQ,IAAI,MAAM,sBAAsB,IAAI,YAAY;AAC9D,SAAM;;AAER,SAAO;;;;;;;;CAST,kBAAyB,MAIgD;EACvE,MAAM,MAAM,6BAA6B,KAAK;AAC9C,SAAO;GAAE;GAAK,OAAO,KAAK,QAAQ,IAAI;GAAE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@milaboratories/pf-driver",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.10",
|
|
4
4
|
"description": "PFrameDriver implementation abstracted from Middle Layer",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -20,14 +20,14 @@
|
|
|
20
20
|
}
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@milaboratories/pframes-rs-node": "1.1.
|
|
24
|
-
"@milaboratories/pframes-rs-wasm": "1.1.
|
|
23
|
+
"@milaboratories/pframes-rs-node": "1.1.46",
|
|
24
|
+
"@milaboratories/pframes-rs-wasm": "1.1.46",
|
|
25
25
|
"es-toolkit": "^1.39.10",
|
|
26
26
|
"lru-cache": "^11.2.2",
|
|
27
|
-
"@milaboratories/pl-model-common": "1.46.1",
|
|
28
|
-
"@milaboratories/pl-model-middle-layer": "1.30.4",
|
|
29
27
|
"@milaboratories/helpers": "1.14.2",
|
|
30
|
-
"@milaboratories/
|
|
28
|
+
"@milaboratories/pl-model-middle-layer": "1.30.6",
|
|
29
|
+
"@milaboratories/ts-helpers": "1.8.3",
|
|
30
|
+
"@milaboratories/pl-model-common": "1.46.1"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/node": "~24.5.2",
|
package/src/driver_decl.ts
CHANGED
|
@@ -19,6 +19,7 @@ import type {
|
|
|
19
19
|
ExportPTableOptions,
|
|
20
20
|
} from "@milaboratories/pl-model-common";
|
|
21
21
|
import type { PoolEntry } from "@milaboratories/helpers";
|
|
22
|
+
import type { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
|
|
22
23
|
|
|
23
24
|
export type {
|
|
24
25
|
WritePTableToFsOptions,
|
|
@@ -44,6 +45,15 @@ export interface AbstractInternalPFrameDriver<PColumnData> extends PFrameDriver,
|
|
|
44
45
|
*/
|
|
45
46
|
pprofDump(): Promise<Uint8Array>;
|
|
46
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Metrics from the byte-range cache backing the parquet object store,
|
|
50
|
+
* or `null` when no caching layer is configured.
|
|
51
|
+
*/
|
|
52
|
+
getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null>;
|
|
53
|
+
|
|
54
|
+
/** Drop all cached parquet byte ranges; no-op when no caching layer is configured. */
|
|
55
|
+
resetCache(): Promise<void>;
|
|
56
|
+
|
|
47
57
|
/** Create a new PFrame */
|
|
48
58
|
createPFrame(def: PFrameDef<PColumn<PColumnData>>): PoolEntry<PFrameHandle>;
|
|
49
59
|
|
package/src/driver_double.ts
CHANGED
|
@@ -116,6 +116,12 @@ class RemoteBlobProviderImpl implements RemoteBlobProvider<FileName> {
|
|
|
116
116
|
return this.server.info;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
+
public async getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null> {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
public async resetCache(): Promise<void> {}
|
|
124
|
+
|
|
119
125
|
async [Symbol.asyncDispose](): Promise<void> {
|
|
120
126
|
await this.server.stop();
|
|
121
127
|
await this.pool[Symbol.asyncDispose]();
|
package/src/driver_impl.ts
CHANGED
|
@@ -81,7 +81,10 @@ export interface LocalBlobProvider<TreeEntry extends JsonSerializable>
|
|
|
81
81
|
extends PoolLocalBlobProvider<TreeEntry>, AsyncDisposable {}
|
|
82
82
|
|
|
83
83
|
export interface RemoteBlobProvider<TreeEntry extends JsonSerializable>
|
|
84
|
-
extends PoolRemoteBlobProvider<TreeEntry>, AsyncDisposable {
|
|
84
|
+
extends PoolRemoteBlobProvider<TreeEntry>, AsyncDisposable {
|
|
85
|
+
getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null>;
|
|
86
|
+
resetCache(): Promise<void>;
|
|
87
|
+
}
|
|
85
88
|
|
|
86
89
|
export type AbstractPFrameDriverOps = PTableCachePerFrameOps &
|
|
87
90
|
PTableCachePlainOps & {
|
|
@@ -128,6 +131,14 @@ export class AbstractPFrameDriver<
|
|
|
128
131
|
return await PFrameFactory.pprofDump();
|
|
129
132
|
}
|
|
130
133
|
|
|
134
|
+
public async getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null> {
|
|
135
|
+
return await this.remoteBlobProvider.getCacheMetrics();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
public async resetCache(): Promise<void> {
|
|
139
|
+
await this.remoteBlobProvider.resetCache();
|
|
140
|
+
}
|
|
141
|
+
|
|
131
142
|
public constructor({
|
|
132
143
|
logger = () => {},
|
|
133
144
|
localBlobProvider,
|
|
@@ -373,10 +384,10 @@ export class AbstractPFrameDriver<
|
|
|
373
384
|
[signal, disposeSignal].filter((s): s is AbortSignal => !isNil(s)),
|
|
374
385
|
);
|
|
375
386
|
|
|
376
|
-
const headers:
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
387
|
+
const headers: [number, string][] = columnIndices.map((index): [number, string] => [
|
|
388
|
+
index,
|
|
389
|
+
columnLabel(def.tableSpec[index]),
|
|
390
|
+
]);
|
|
380
391
|
|
|
381
392
|
// keep()/cache live outside the limiter task: on abort `run` rejects and they are
|
|
382
393
|
// skipped, so an abandoned (detached) operation never caches its result nor touches
|
|
@@ -395,7 +406,7 @@ export class AbstractPFrameDriver<
|
|
|
395
406
|
}
|
|
396
407
|
}
|
|
397
408
|
|
|
398
|
-
await pTable.export(path, headers,
|
|
409
|
+
await pTable.export(path, { headers, signal: combinedSignal });
|
|
399
410
|
|
|
400
411
|
const overallSize = await tableGuard.resource.cacheSize;
|
|
401
412
|
|
package/src/pframe_pool.ts
CHANGED
|
@@ -31,7 +31,7 @@ export interface RemoteBlobProvider<TreeEntry extends JsonSerializable> {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
export class PFrameHolder<TreeEntry extends JsonSerializable> implements Disposable {
|
|
34
|
-
public readonly pFrameDataPromise: Promise<PFrameInternal.
|
|
34
|
+
public readonly pFrameDataPromise: Promise<PFrameInternal.PFrameV18>;
|
|
35
35
|
/**
|
|
36
36
|
* WASM-spec frame built from this PFrame's columns. Source of truth
|
|
37
37
|
* for spec-side operations: column discovery, selector resolution,
|
package/src/ptable_pool.ts
CHANGED
|
@@ -26,7 +26,7 @@ export class PTableHolder implements Disposable {
|
|
|
26
26
|
constructor(
|
|
27
27
|
public readonly pFrame: PFrameHandle,
|
|
28
28
|
pFrameDisposeSignal: AbortSignal,
|
|
29
|
-
public readonly pTablePromise: Promise<PFrameInternal.
|
|
29
|
+
public readonly pTablePromise: Promise<PFrameInternal.PTableV12>,
|
|
30
30
|
private readonly predecessor?: PoolEntry<PTableHandle, PTableHolder>,
|
|
31
31
|
) {
|
|
32
32
|
this.combinedDisposeSignal = AbortSignal.any([
|