@milaboratories/pf-driver 1.0.61 → 1.0.62

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.
Files changed (78) hide show
  1. package/dist/_virtual/_@oxc-project_runtime@0.114.0/helpers/usingCtx.cjs +59 -0
  2. package/dist/_virtual/_@oxc-project_runtime@0.114.0/helpers/usingCtx.js +58 -0
  3. package/dist/_virtual/_rolldown/runtime.cjs +29 -0
  4. package/dist/data_info_helpers.cjs +20 -19
  5. package/dist/data_info_helpers.cjs.map +1 -1
  6. package/dist/data_info_helpers.d.ts +6 -2
  7. package/dist/data_info_helpers.js +19 -17
  8. package/dist/data_info_helpers.js.map +1 -1
  9. package/dist/driver_decl.d.ts +38 -34
  10. package/dist/driver_double.cjs +98 -97
  11. package/dist/driver_double.cjs.map +1 -1
  12. package/dist/driver_double.d.ts +17 -10
  13. package/dist/driver_double.js +95 -95
  14. package/dist/driver_double.js.map +1 -1
  15. package/dist/driver_impl.cjs +233 -296
  16. package/dist/driver_impl.cjs.map +1 -1
  17. package/dist/driver_impl.d.ts +59 -52
  18. package/dist/driver_impl.js +232 -294
  19. package/dist/driver_impl.js.map +1 -1
  20. package/dist/index.cjs +10 -14
  21. package/dist/index.d.ts +5 -5
  22. package/dist/index.js +5 -4
  23. package/dist/logging.cjs +4 -3
  24. package/dist/logging.cjs.map +1 -1
  25. package/dist/logging.js +4 -2
  26. package/dist/logging.js.map +1 -1
  27. package/dist/pframe_pool.cjs +177 -196
  28. package/dist/pframe_pool.cjs.map +1 -1
  29. package/dist/pframe_pool.d.ts +12 -31
  30. package/dist/pframe_pool.js +177 -194
  31. package/dist/pframe_pool.js.map +1 -1
  32. package/dist/ptable_cache_per_frame.cjs +52 -63
  33. package/dist/ptable_cache_per_frame.cjs.map +1 -1
  34. package/dist/ptable_cache_per_frame.d.ts +16 -23
  35. package/dist/ptable_cache_per_frame.js +51 -61
  36. package/dist/ptable_cache_per_frame.js.map +1 -1
  37. package/dist/ptable_cache_plain.cjs +41 -49
  38. package/dist/ptable_cache_plain.cjs.map +1 -1
  39. package/dist/ptable_cache_plain.d.ts +15 -19
  40. package/dist/ptable_cache_plain.js +40 -47
  41. package/dist/ptable_cache_plain.js.map +1 -1
  42. package/dist/ptable_def_pool.cjs +45 -53
  43. package/dist/ptable_def_pool.cjs.map +1 -1
  44. package/dist/ptable_def_pool.d.ts +3 -20
  45. package/dist/ptable_def_pool.js +45 -51
  46. package/dist/ptable_def_pool.js.map +1 -1
  47. package/dist/ptable_pool.cjs +145 -185
  48. package/dist/ptable_pool.cjs.map +1 -1
  49. package/dist/ptable_pool.d.ts +6 -28
  50. package/dist/ptable_pool.js +145 -183
  51. package/dist/ptable_pool.js.map +1 -1
  52. package/dist/ptable_shared.cjs +6 -5
  53. package/dist/ptable_shared.cjs.map +1 -1
  54. package/dist/ptable_shared.d.ts +1 -17
  55. package/dist/ptable_shared.js +5 -3
  56. package/dist/ptable_shared.js.map +1 -1
  57. package/package.json +7 -7
  58. package/dist/__external/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.52.4_tslib@2.8.1_typescript@5.6.3/__external/tslib/tslib.es6.cjs +0 -77
  59. package/dist/__external/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.52.4_tslib@2.8.1_typescript@5.6.3/__external/tslib/tslib.es6.cjs.map +0 -1
  60. package/dist/__external/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.52.4_tslib@2.8.1_typescript@5.6.3/__external/tslib/tslib.es6.js +0 -74
  61. package/dist/__external/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.52.4_tslib@2.8.1_typescript@5.6.3/__external/tslib/tslib.es6.js.map +0 -1
  62. package/dist/data_info_helpers.d.ts.map +0 -1
  63. package/dist/driver_decl.d.ts.map +0 -1
  64. package/dist/driver_double.d.ts.map +0 -1
  65. package/dist/driver_double.test.d.ts +0 -2
  66. package/dist/driver_double.test.d.ts.map +0 -1
  67. package/dist/driver_impl.d.ts.map +0 -1
  68. package/dist/index.cjs.map +0 -1
  69. package/dist/index.d.ts.map +0 -1
  70. package/dist/index.js.map +0 -1
  71. package/dist/logging.d.ts +0 -2
  72. package/dist/logging.d.ts.map +0 -1
  73. package/dist/pframe_pool.d.ts.map +0 -1
  74. package/dist/ptable_cache_per_frame.d.ts.map +0 -1
  75. package/dist/ptable_cache_plain.d.ts.map +0 -1
  76. package/dist/ptable_def_pool.d.ts.map +0 -1
  77. package/dist/ptable_pool.d.ts.map +0 -1
  78. package/dist/ptable_shared.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"pframe_pool.cjs","sources":["../src/pframe_pool.ts"],"sourcesContent":["import {\n assertNever,\n bigintReplacer,\n canonicalizeJson,\n ensureError,\n mapPObjectData,\n PFrameDriverError,\n type JsonSerializable,\n type PColumn,\n type PFrameHandle,\n} from \"@platforma-sdk/model\";\nimport { hashJson, PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { PFrameFactory } from \"@milaboratories/pframes-rs-node\";\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 pFramePromise: Promise<PFrameInternal.PFrameV13>;\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 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 try {\n const pFrame = PFrameFactory.createPFrame({ frameId, spillPath: this.spillPath, logger });\n pFrame.setDataSource({\n ...this.localBlobProvider.makeDataSource(this.disposeSignal),\n parquetServer: this.remoteBlobProvider.httpServerInfo(),\n });\n\n const promises: Promise<void>[] = [];\n for (const column of jsonifiedColumns) {\n pFrame.addColumnSpec(column.id, column.spec);\n promises.push(pFrame.setColumnData(column.id, column.data, { signal: this.disposeSignal }));\n }\n\n this.pFramePromise = Promise.all(promises)\n .then(() => pFrame)\n .catch((err) => {\n this.dispose();\n pFrame.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 const error = new PFrameDriverError(\"PFrame creation failed synchronously\");\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 }\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 }\n\n [Symbol.dispose](): void {\n this.dispose();\n void this.pFramePromise\n .then((pFrame) => pFrame.dispose())\n .catch(() => {\n /* mute error */\n });\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"],"names":["PFrameInternal","mapValues","assertNever","PFrameFactory","PFrameDriverError","ensureError","RefCountPoolBase","logPFrames","bigintReplacer","mapPObjectData","canonicalizeJson","hashJson"],"mappings":"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"}
1
+ {"version":3,"file":"pframe_pool.cjs","names":["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 type JsonSerializable,\n type PColumn,\n type PFrameHandle,\n} from \"@platforma-sdk/model\";\nimport { hashJson, PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { PFrameFactory } from \"@milaboratories/pframes-rs-node\";\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 pFramePromise: Promise<PFrameInternal.PFrameV13>;\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 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 try {\n const pFrame = PFrameFactory.createPFrame({ frameId, spillPath: this.spillPath, logger });\n pFrame.setDataSource({\n ...this.localBlobProvider.makeDataSource(this.disposeSignal),\n parquetServer: this.remoteBlobProvider.httpServerInfo(),\n });\n\n const promises: Promise<void>[] = [];\n for (const column of jsonifiedColumns) {\n pFrame.addColumnSpec(column.id, column.spec);\n promises.push(pFrame.setColumnData(column.id, column.data, { signal: this.disposeSignal }));\n }\n\n this.pFramePromise = Promise.all(promises)\n .then(() => pFrame)\n .catch((err) => {\n this.dispose();\n pFrame.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 const error = new PFrameDriverError(\"PFrame creation failed synchronously\");\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 }\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 }\n\n [Symbol.dispose](): void {\n this.dispose();\n void this.pFramePromise\n .then((pFrame) => pFrame.dispose())\n .catch(() => {\n /* mute error */\n });\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,35 +1,16 @@
1
- import { type JsonSerializable, type PColumn, type PFrameHandle } from "@platforma-sdk/model";
1
+ import { JsonSerializable, PColumn, PFrameHandle } from "@platforma-sdk/model";
2
+ import { PoolEntry, RefCountPoolBase } from "@milaboratories/ts-helpers";
2
3
  import { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
3
- import { RefCountPoolBase, type PoolEntry } from "@milaboratories/ts-helpers";
4
- export interface LocalBlobProvider<TreeEntry extends JsonSerializable> {
5
- acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;
6
- makeDataSource(signal: AbortSignal): Omit<PFrameInternal.PFrameDataSourceV2, "parquetServer">;
4
+
5
+ //#region src/pframe_pool.d.ts
6
+ interface LocalBlobProvider<TreeEntry extends JsonSerializable> {
7
+ acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;
8
+ makeDataSource(signal: AbortSignal): Omit<PFrameInternal.PFrameDataSourceV2, "parquetServer">;
7
9
  }
8
- export interface RemoteBlobProvider<TreeEntry extends JsonSerializable> {
9
- acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;
10
- httpServerInfo(): PFrameInternal.HttpServerInfo;
11
- }
12
- export declare class PFrameHolder<TreeEntry extends JsonSerializable> implements Disposable {
13
- private readonly localBlobProvider;
14
- private readonly remoteBlobProvider;
15
- private readonly spillPath;
16
- readonly pFramePromise: Promise<PFrameInternal.PFrameV13>;
17
- private readonly abortController;
18
- private readonly localBlobs;
19
- private readonly remoteBlobs;
20
- constructor(frameId: PFrameInternal.PFrameId, localBlobProvider: LocalBlobProvider<TreeEntry>, remoteBlobProvider: RemoteBlobProvider<TreeEntry>, logger: PFrameInternal.Logger, spillPath: string, columns: PColumn<PFrameInternal.DataInfo<TreeEntry>>[]);
21
- get disposeSignal(): AbortSignal;
22
- private dispose;
23
- [Symbol.dispose](): void;
24
- }
25
- export declare class PFramePool<TreeEntry extends JsonSerializable> extends RefCountPoolBase<PColumn<PFrameInternal.DataInfo<TreeEntry>>[], PFrameHandle, PFrameHolder<TreeEntry>> {
26
- private readonly localBlobProvider;
27
- private readonly remoteBlobProvider;
28
- private readonly logger;
29
- private readonly spillPath;
30
- constructor(localBlobProvider: LocalBlobProvider<TreeEntry>, remoteBlobProvider: RemoteBlobProvider<TreeEntry>, logger: PFrameInternal.Logger, spillPath: string);
31
- protected calculateParamsKey(params: PColumn<PFrameInternal.DataInfo<TreeEntry>>[]): PFrameHandle;
32
- protected createNewResource(params: PColumn<PFrameInternal.DataInfo<TreeEntry>>[], key: PFrameHandle): PFrameHolder<TreeEntry>;
33
- getByKey(key: PFrameHandle): PFrameHolder<TreeEntry>;
10
+ interface RemoteBlobProvider<TreeEntry extends JsonSerializable> {
11
+ acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;
12
+ httpServerInfo(): PFrameInternal.HttpServerInfo;
34
13
  }
14
+ //#endregion
15
+ export { LocalBlobProvider, RemoteBlobProvider };
35
16
  //# sourceMappingURL=pframe_pool.d.ts.map
@@ -1,198 +1,181 @@
1
- import { bigintReplacer, PFrameDriverError, mapPObjectData, canonicalizeJson, ensureError, assertNever } from '@platforma-sdk/model';
2
- import { hashJson, PFrameInternal } from '@milaboratories/pl-model-middle-layer';
3
- import { RefCountPoolBase } from '@milaboratories/ts-helpers';
4
- import { PFrameFactory } from '@milaboratories/pframes-rs-node';
5
- import { mapValues } from 'es-toolkit';
6
- import { logPFrames } from './logging.js';
1
+ import { logPFrames } from "./logging.js";
2
+ import { PFrameDriverError, assertNever, bigintReplacer, canonicalizeJson, ensureError, mapPObjectData } from "@platforma-sdk/model";
3
+ import { RefCountPoolBase } from "@milaboratories/ts-helpers";
4
+ import { PFrameFactory } from "@milaboratories/pframes-rs-node";
5
+ import { PFrameInternal, hashJson } from "@milaboratories/pl-model-middle-layer";
6
+ import { mapValues } from "es-toolkit";
7
7
 
8
- class PFrameHolder {
9
- localBlobProvider;
10
- remoteBlobProvider;
11
- spillPath;
12
- pFramePromise;
13
- abortController = new AbortController();
14
- localBlobs = [];
15
- remoteBlobs = [];
16
- constructor(frameId, localBlobProvider, remoteBlobProvider, logger, spillPath, columns) {
17
- this.localBlobProvider = localBlobProvider;
18
- this.remoteBlobProvider = remoteBlobProvider;
19
- this.spillPath = spillPath;
20
- const makeLocalBlobId = (blob) => {
21
- const localBlob = this.localBlobProvider.acquire(blob);
22
- this.localBlobs.push(localBlob);
23
- return localBlob.key;
24
- };
25
- const makeRemoteBlobId = (blob) => {
26
- const remoteBlob = this.remoteBlobProvider.acquire(blob);
27
- this.remoteBlobs.push(remoteBlob);
28
- return `${remoteBlob.key}${PFrameInternal.ParquetExtension}`;
29
- };
30
- const mapColumnData = (data) => {
31
- switch (data.type) {
32
- case "Json":
33
- return { ...data };
34
- case "JsonPartitioned":
35
- return {
36
- ...data,
37
- parts: mapValues(data.parts, makeLocalBlobId),
38
- };
39
- case "BinaryPartitioned":
40
- return {
41
- ...data,
42
- parts: mapValues(data.parts, (v) => ({
43
- index: makeLocalBlobId(v.index),
44
- values: makeLocalBlobId(v.values),
45
- })),
46
- };
47
- case "ParquetPartitioned":
48
- return {
49
- ...data,
50
- parts: mapValues(data.parts, (v) => ({
51
- ...v,
52
- data: makeRemoteBlobId(v.data),
53
- })),
54
- };
55
- default:
56
- assertNever(data);
57
- }
58
- };
59
- const jsonifiedColumns = columns.map((column) => ({
60
- ...column,
61
- data: mapColumnData(column.data),
62
- }));
63
- try {
64
- const pFrame = PFrameFactory.createPFrame({ frameId, spillPath: this.spillPath, logger });
65
- pFrame.setDataSource({
66
- ...this.localBlobProvider.makeDataSource(this.disposeSignal),
67
- parquetServer: this.remoteBlobProvider.httpServerInfo(),
68
- });
69
- const promises = [];
70
- for (const column of jsonifiedColumns) {
71
- pFrame.addColumnSpec(column.id, column.spec);
72
- promises.push(pFrame.setColumnData(column.id, column.data, { signal: this.disposeSignal }));
73
- }
74
- this.pFramePromise = Promise.all(promises)
75
- .then(() => pFrame)
76
- .catch((err) => {
77
- this.dispose();
78
- pFrame.dispose();
79
- const error = new PFrameDriverError("PFrame creation failed asynchronously");
80
- error.cause = new Error(`PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`, { cause: ensureError(err) });
81
- throw error;
82
- });
83
- }
84
- catch (err) {
85
- const error = new PFrameDriverError("PFrame creation failed synchronously");
86
- error.cause = new Error(`PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`, { cause: ensureError(err) });
87
- throw error;
88
- }
89
- }
90
- get disposeSignal() {
91
- return this.abortController.signal;
92
- }
93
- dispose() {
94
- this.abortController.abort();
95
- this.localBlobs.forEach((entry) => entry.unref());
96
- this.remoteBlobs.forEach((entry) => entry.unref());
97
- }
98
- [Symbol.dispose]() {
99
- this.dispose();
100
- void this.pFramePromise
101
- .then((pFrame) => pFrame.dispose())
102
- .catch(() => {
103
- /* mute error */
104
- });
105
- }
106
- }
107
- class PFramePool extends RefCountPoolBase {
108
- localBlobProvider;
109
- remoteBlobProvider;
110
- logger;
111
- spillPath;
112
- constructor(localBlobProvider, remoteBlobProvider, logger, spillPath) {
113
- super();
114
- this.localBlobProvider = localBlobProvider;
115
- this.remoteBlobProvider = remoteBlobProvider;
116
- this.logger = logger;
117
- this.spillPath = spillPath;
118
- }
119
- calculateParamsKey(params) {
120
- return stableKeyFromPFrameData(params);
121
- }
122
- createNewResource(params, key) {
123
- if (logPFrames()) {
124
- this.logger("info", `PFrame creation (pFrameHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`);
125
- }
126
- return new PFrameHolder(key, this.localBlobProvider, this.remoteBlobProvider, this.logger, this.spillPath, params);
127
- }
128
- getByKey(key) {
129
- const resource = super.tryGetByKey(key);
130
- if (!resource) {
131
- const error = new PFrameDriverError(`Invalid PFrame handle`);
132
- error.cause = new Error(`PFrame with handle ${key} not found`);
133
- throw error;
134
- }
135
- return resource;
136
- }
137
- }
8
+ //#region src/pframe_pool.ts
9
+ var PFrameHolder = class {
10
+ pFramePromise;
11
+ abortController = new AbortController();
12
+ localBlobs = [];
13
+ remoteBlobs = [];
14
+ constructor(frameId, localBlobProvider, remoteBlobProvider, logger, spillPath, columns) {
15
+ this.localBlobProvider = localBlobProvider;
16
+ this.remoteBlobProvider = remoteBlobProvider;
17
+ this.spillPath = spillPath;
18
+ const makeLocalBlobId = (blob) => {
19
+ const localBlob = this.localBlobProvider.acquire(blob);
20
+ this.localBlobs.push(localBlob);
21
+ return localBlob.key;
22
+ };
23
+ const makeRemoteBlobId = (blob) => {
24
+ const remoteBlob = this.remoteBlobProvider.acquire(blob);
25
+ this.remoteBlobs.push(remoteBlob);
26
+ return `${remoteBlob.key}${PFrameInternal.ParquetExtension}`;
27
+ };
28
+ const mapColumnData = (data) => {
29
+ switch (data.type) {
30
+ case "Json": return { ...data };
31
+ case "JsonPartitioned": return {
32
+ ...data,
33
+ parts: mapValues(data.parts, makeLocalBlobId)
34
+ };
35
+ case "BinaryPartitioned": return {
36
+ ...data,
37
+ parts: mapValues(data.parts, (v) => ({
38
+ index: makeLocalBlobId(v.index),
39
+ values: makeLocalBlobId(v.values)
40
+ }))
41
+ };
42
+ case "ParquetPartitioned": return {
43
+ ...data,
44
+ parts: mapValues(data.parts, (v) => ({
45
+ ...v,
46
+ data: makeRemoteBlobId(v.data)
47
+ }))
48
+ };
49
+ default: assertNever(data);
50
+ }
51
+ };
52
+ const jsonifiedColumns = columns.map((column) => ({
53
+ ...column,
54
+ data: mapColumnData(column.data)
55
+ }));
56
+ try {
57
+ const pFrame = PFrameFactory.createPFrame({
58
+ frameId,
59
+ spillPath: this.spillPath,
60
+ logger
61
+ });
62
+ pFrame.setDataSource({
63
+ ...this.localBlobProvider.makeDataSource(this.disposeSignal),
64
+ parquetServer: this.remoteBlobProvider.httpServerInfo()
65
+ });
66
+ const promises = [];
67
+ for (const column of jsonifiedColumns) {
68
+ pFrame.addColumnSpec(column.id, column.spec);
69
+ promises.push(pFrame.setColumnData(column.id, column.data, { signal: this.disposeSignal }));
70
+ }
71
+ this.pFramePromise = Promise.all(promises).then(() => pFrame).catch((err) => {
72
+ this.dispose();
73
+ pFrame.dispose();
74
+ const error = new PFrameDriverError("PFrame creation failed asynchronously");
75
+ error.cause = new Error(`PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`, { cause: ensureError(err) });
76
+ throw error;
77
+ });
78
+ } catch (err) {
79
+ const error = new PFrameDriverError("PFrame creation failed synchronously");
80
+ error.cause = new Error(`PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`, { cause: ensureError(err) });
81
+ throw error;
82
+ }
83
+ }
84
+ get disposeSignal() {
85
+ return this.abortController.signal;
86
+ }
87
+ dispose() {
88
+ this.abortController.abort();
89
+ this.localBlobs.forEach((entry) => entry.unref());
90
+ this.remoteBlobs.forEach((entry) => entry.unref());
91
+ }
92
+ [Symbol.dispose]() {
93
+ this.dispose();
94
+ this.pFramePromise.then((pFrame) => pFrame.dispose()).catch(() => {});
95
+ }
96
+ };
97
+ var PFramePool = class extends RefCountPoolBase {
98
+ constructor(localBlobProvider, remoteBlobProvider, logger, spillPath) {
99
+ super();
100
+ this.localBlobProvider = localBlobProvider;
101
+ this.remoteBlobProvider = remoteBlobProvider;
102
+ this.logger = logger;
103
+ this.spillPath = spillPath;
104
+ }
105
+ calculateParamsKey(params) {
106
+ return stableKeyFromPFrameData(params);
107
+ }
108
+ createNewResource(params, key) {
109
+ if (logPFrames()) this.logger("info", `PFrame creation (pFrameHandle = ${key}): ${JSON.stringify(params, bigintReplacer)}`);
110
+ return new PFrameHolder(key, this.localBlobProvider, this.remoteBlobProvider, this.logger, this.spillPath, params);
111
+ }
112
+ getByKey(key) {
113
+ const resource = super.tryGetByKey(key);
114
+ if (!resource) {
115
+ const error = new PFrameDriverError(`Invalid PFrame handle`);
116
+ error.cause = /* @__PURE__ */ new Error(`PFrame with handle ${key} not found`);
117
+ throw error;
118
+ }
119
+ return resource;
120
+ }
121
+ };
138
122
  function stableKeyFromPFrameData(data) {
139
- const orderedData = [...data].map((column) => mapPObjectData(column, (r) => {
140
- let result;
141
- const type = r.type;
142
- switch (type) {
143
- case "Json":
144
- result = {
145
- type: r.type,
146
- keyLength: r.keyLength,
147
- payload: Object.entries(r.data).map(([part, value]) => ({
148
- key: part,
149
- value,
150
- })),
151
- };
152
- break;
153
- case "JsonPartitioned":
154
- result = {
155
- type: r.type,
156
- keyLength: r.partitionKeyLength,
157
- payload: Object.entries(r.parts).map(([part, info]) => ({
158
- key: part,
159
- value: canonicalizeJson(info),
160
- })),
161
- };
162
- break;
163
- case "BinaryPartitioned":
164
- result = {
165
- type: r.type,
166
- keyLength: r.partitionKeyLength,
167
- payload: Object.entries(r.parts).map(([part, info]) => ({
168
- key: part,
169
- value: [canonicalizeJson(info.index), canonicalizeJson(info.values)],
170
- })),
171
- };
172
- break;
173
- case "ParquetPartitioned":
174
- result = {
175
- type: r.type,
176
- keyLength: r.partitionKeyLength,
177
- payload: Object.entries(r.parts).map(([part, info]) => ({
178
- key: part,
179
- value: info.dataDigest ||
180
- [
181
- canonicalizeJson(info.data),
182
- JSON.stringify({ axes: info.axes, column: info.column }),
183
- ],
184
- })),
185
- };
186
- break;
187
- default:
188
- throw new PFrameDriverError(`unsupported resource type: ${JSON.stringify(type)}`);
189
- }
190
- result.payload.sort((lhs, rhs) => (lhs.key < rhs.key ? -1 : 1));
191
- return result;
192
- }));
193
- orderedData.sort((lhs, rhs) => (lhs.id < rhs.id ? -1 : 1));
194
- return hashJson(orderedData);
123
+ const orderedData = [...data].map((column) => mapPObjectData(column, (r) => {
124
+ let result;
125
+ const type = r.type;
126
+ switch (type) {
127
+ case "Json":
128
+ result = {
129
+ type: r.type,
130
+ keyLength: r.keyLength,
131
+ payload: Object.entries(r.data).map(([part, value]) => ({
132
+ key: part,
133
+ value
134
+ }))
135
+ };
136
+ break;
137
+ case "JsonPartitioned":
138
+ result = {
139
+ type: r.type,
140
+ keyLength: r.partitionKeyLength,
141
+ payload: Object.entries(r.parts).map(([part, info]) => ({
142
+ key: part,
143
+ value: canonicalizeJson(info)
144
+ }))
145
+ };
146
+ break;
147
+ case "BinaryPartitioned":
148
+ result = {
149
+ type: r.type,
150
+ keyLength: r.partitionKeyLength,
151
+ payload: Object.entries(r.parts).map(([part, info]) => ({
152
+ key: part,
153
+ value: [canonicalizeJson(info.index), canonicalizeJson(info.values)]
154
+ }))
155
+ };
156
+ break;
157
+ case "ParquetPartitioned":
158
+ result = {
159
+ type: r.type,
160
+ keyLength: r.partitionKeyLength,
161
+ payload: Object.entries(r.parts).map(([part, info]) => ({
162
+ key: part,
163
+ value: info.dataDigest || [canonicalizeJson(info.data), JSON.stringify({
164
+ axes: info.axes,
165
+ column: info.column
166
+ })]
167
+ }))
168
+ };
169
+ break;
170
+ default: throw new PFrameDriverError(`unsupported resource type: ${JSON.stringify(type)}`);
171
+ }
172
+ result.payload.sort((lhs, rhs) => lhs.key < rhs.key ? -1 : 1);
173
+ return result;
174
+ }));
175
+ orderedData.sort((lhs, rhs) => lhs.id < rhs.id ? -1 : 1);
176
+ return hashJson(orderedData);
195
177
  }
196
178
 
197
- export { PFrameHolder, PFramePool };
198
- //# sourceMappingURL=pframe_pool.js.map
179
+ //#endregion
180
+ export { PFramePool };
181
+ //# sourceMappingURL=pframe_pool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pframe_pool.js","sources":["../src/pframe_pool.ts"],"sourcesContent":["import {\n assertNever,\n bigintReplacer,\n canonicalizeJson,\n ensureError,\n mapPObjectData,\n PFrameDriverError,\n type JsonSerializable,\n type PColumn,\n type PFrameHandle,\n} from \"@platforma-sdk/model\";\nimport { hashJson, PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { PFrameFactory } from \"@milaboratories/pframes-rs-node\";\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 pFramePromise: Promise<PFrameInternal.PFrameV13>;\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 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 try {\n const pFrame = PFrameFactory.createPFrame({ frameId, spillPath: this.spillPath, logger });\n pFrame.setDataSource({\n ...this.localBlobProvider.makeDataSource(this.disposeSignal),\n parquetServer: this.remoteBlobProvider.httpServerInfo(),\n });\n\n const promises: Promise<void>[] = [];\n for (const column of jsonifiedColumns) {\n pFrame.addColumnSpec(column.id, column.spec);\n promises.push(pFrame.setColumnData(column.id, column.data, { signal: this.disposeSignal }));\n }\n\n this.pFramePromise = Promise.all(promises)\n .then(() => pFrame)\n .catch((err) => {\n this.dispose();\n pFrame.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 const error = new PFrameDriverError(\"PFrame creation failed synchronously\");\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 }\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 }\n\n [Symbol.dispose](): void {\n this.dispose();\n void this.pFramePromise\n .then((pFrame) => pFrame.dispose())\n .catch(() => {\n /* mute error */\n });\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"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pframe_pool.js","names":[],"sources":["../src/pframe_pool.ts"],"sourcesContent":["import {\n assertNever,\n bigintReplacer,\n canonicalizeJson,\n ensureError,\n mapPObjectData,\n PFrameDriverError,\n type JsonSerializable,\n type PColumn,\n type PFrameHandle,\n} from \"@platforma-sdk/model\";\nimport { hashJson, PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { PFrameFactory } from \"@milaboratories/pframes-rs-node\";\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 pFramePromise: Promise<PFrameInternal.PFrameV13>;\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 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 try {\n const pFrame = PFrameFactory.createPFrame({ frameId, spillPath: this.spillPath, logger });\n pFrame.setDataSource({\n ...this.localBlobProvider.makeDataSource(this.disposeSignal),\n parquetServer: this.remoteBlobProvider.httpServerInfo(),\n });\n\n const promises: Promise<void>[] = [];\n for (const column of jsonifiedColumns) {\n pFrame.addColumnSpec(column.id, column.spec);\n promises.push(pFrame.setColumnData(column.id, column.data, { signal: this.disposeSignal }));\n }\n\n this.pFramePromise = Promise.all(promises)\n .then(() => pFrame)\n .catch((err) => {\n this.dispose();\n pFrame.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 const error = new PFrameDriverError(\"PFrame creation failed synchronously\");\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 }\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 }\n\n [Symbol.dispose](): void {\n this.dispose();\n void this.pFramePromise\n .then((pFrame) => pFrame.dispose())\n .catch(() => {\n /* mute error */\n });\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":";;;;;;;;AA2BA,IAAa,eAAb,MAAoF;CAClF,AAAgB;CAChB,AAAiB,kBAAkB,IAAI,iBAAiB;CAExD,AAAiB,aAAuD,EAAE;CAC1E,AAAiB,cAAwD,EAAE;CAE3E,YACE,SACA,AAAiB,mBACjB,AAAiB,oBACjB,QACA,AAAiB,WACjB,SACA;EALiB;EACA;EAEA;EAGjB,MAAM,mBAAmB,SAAiD;GACxE,MAAM,YAAY,KAAK,kBAAkB,QAAQ,KAAK;AACtD,QAAK,WAAW,KAAK,UAAU;AAC/B,UAAO,UAAU;;EAGnB,MAAM,oBAAoB,SAAiD;GACzE,MAAM,aAAa,KAAK,mBAAmB,QAAQ,KAAK;AACxD,QAAK,YAAY,KAAK,WAAW;AACjC,UAAO,GAAG,WAAW,MAAM,eAAe;;EAG5C,MAAM,iBACJ,SACyD;AACzD,WAAQ,KAAK,MAAb;IACE,KAAK,OACH,QAAO,EAAE,GAAG,MAAM;IACpB,KAAK,kBACH,QAAO;KACL,GAAG;KACH,OAAO,UAAU,KAAK,OAAO,gBAAgB;KAC9C;IACH,KAAK,oBACH,QAAO;KACL,GAAG;KACH,OAAO,UAAU,KAAK,QAAQ,OAAO;MACnC,OAAO,gBAAgB,EAAE,MAAM;MAC/B,QAAQ,gBAAgB,EAAE,OAAO;MAClC,EAAE;KACJ;IACH,KAAK,qBACH,QAAO;KACL,GAAG;KACH,OAAO,UAAU,KAAK,QAAQ,OAAO;MACnC,GAAG;MACH,MAAM,iBAAiB,EAAE,KAAK;MAC/B,EAAE;KACJ;IACH,QACE,aAAY,KAAK;;;EAIvB,MAAM,mBAAmB,QAAQ,KAAK,YAAY;GAChD,GAAG;GACH,MAAM,cAAc,OAAO,KAAK;GACjC,EAAE;AAEH,MAAI;GACF,MAAM,SAAS,cAAc,aAAa;IAAE;IAAS,WAAW,KAAK;IAAW;IAAQ,CAAC;AACzF,UAAO,cAAc;IACnB,GAAG,KAAK,kBAAkB,eAAe,KAAK,cAAc;IAC5D,eAAe,KAAK,mBAAmB,gBAAgB;IACxD,CAAC;GAEF,MAAM,WAA4B,EAAE;AACpC,QAAK,MAAM,UAAU,kBAAkB;AACrC,WAAO,cAAc,OAAO,IAAI,OAAO,KAAK;AAC5C,aAAS,KAAK,OAAO,cAAc,OAAO,IAAI,OAAO,MAAM,EAAE,QAAQ,KAAK,eAAe,CAAC,CAAC;;AAG7F,QAAK,gBAAgB,QAAQ,IAAI,SAAS,CACvC,WAAW,OAAO,CAClB,OAAO,QAAQ;AACd,SAAK,SAAS;AACd,WAAO,SAAS;IAChB,MAAM,QAAQ,IAAI,kBAAkB,wCAAwC;AAC5E,UAAM,QAAQ,IAAI,MAChB,0CAA0C,KAAK,UAAU,iBAAiB,IAC1E,EAAE,OAAO,YAAY,IAAI,EAAE,CAC5B;AACD,UAAM;KACN;WACG,KAAc;GACrB,MAAM,QAAQ,IAAI,kBAAkB,uCAAuC;AAC3E,SAAM,QAAQ,IAAI,MAChB,0CAA0C,KAAK,UAAU,iBAAiB,IAC1E,EAAE,OAAO,YAAY,IAAI,EAAE,CAC5B;AACD,SAAM;;;CAIV,IAAW,gBAA6B;AACtC,SAAO,KAAK,gBAAgB;;CAG9B,AAAQ,UAAgB;AACtB,OAAK,gBAAgB,OAAO;AAC5B,OAAK,WAAW,SAAS,UAAU,MAAM,OAAO,CAAC;AACjD,OAAK,YAAY,SAAS,UAAU,MAAM,OAAO,CAAC;;CAGpD,CAAC,OAAO,WAAiB;AACvB,OAAK,SAAS;AACd,EAAK,KAAK,cACP,MAAM,WAAW,OAAO,SAAS,CAAC,CAClC,YAAY,GAEX;;;AAIR,IAAa,aAAb,cAAoE,iBAIlE;CACA,YACE,AAAiB,mBACjB,AAAiB,oBACjB,AAAiB,QACjB,AAAiB,WACjB;AACA,SAAO;EALU;EACA;EACA;EACA;;CAKnB,AAAU,mBACR,QACc;AACd,SAAO,wBAAwB,OAAO;;CAGxC,AAAU,kBACR,QACA,KACyB;AACzB,MAAI,YAAY,CACd,MAAK,OACH,QACA,mCAAmC,IAAI,KAAU,KAAK,UAAU,QAAQ,eAAe,GACxF;AAEH,SAAO,IAAI,aACT,KACA,KAAK,mBACL,KAAK,oBACL,KAAK,QACL,KAAK,WACL,OACD;;CAGH,AAAO,SAAS,KAA4C;EAC1D,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;;;AAIX,SAAS,wBACP,MACc;CACd,MAAM,cAAc,CAAC,GAAG,KAAK,CAAC,KAAK,WACjC,eAAe,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,OAAO,iBAAiB,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,CAAC,iBAAiB,KAAK,MAAM,EAAE,iBAAiB,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,CACC,iBAAiB,KAAK,KAAK,EAC3B,KAAK,UAAU;OAAE,MAAM,KAAK;OAAM,QAAQ,KAAK;OAAQ,CAAC,CACzD;MACJ,EAAE;KACJ;AACD;GACF,QACE,OAAM,IAAI,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,QAAO,SAAS,YAAY"}