@milaboratories/pf-driver 1.0.68 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/data_info_helpers.cjs +2 -2
- package/dist/data_info_helpers.cjs.map +1 -1
- package/dist/data_info_helpers.d.ts +1 -1
- package/dist/data_info_helpers.js +1 -1
- package/dist/data_info_helpers.js.map +1 -1
- package/dist/driver_decl.d.ts +1 -1
- package/dist/driver_double.cjs +5 -5
- package/dist/driver_double.cjs.map +1 -1
- package/dist/driver_double.d.ts +1 -1
- package/dist/driver_double.js +1 -1
- package/dist/driver_double.js.map +1 -1
- package/dist/driver_impl.cjs +11 -11
- package/dist/driver_impl.cjs.map +1 -1
- package/dist/driver_impl.d.ts +1 -1
- package/dist/driver_impl.js +1 -1
- package/dist/driver_impl.js.map +1 -1
- package/dist/index.cjs +2 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/pframe_pool.cjs +13 -13
- package/dist/pframe_pool.cjs.map +1 -1
- package/dist/pframe_pool.d.ts +1 -1
- package/dist/pframe_pool.js +1 -1
- package/dist/pframe_pool.js.map +1 -1
- package/dist/pl-middle-layer/src/js_render/spec_driver.cjs +43 -0
- package/dist/pl-middle-layer/src/js_render/spec_driver.cjs.map +1 -0
- package/dist/pl-middle-layer/src/js_render/spec_driver.d.ts +20 -0
- package/dist/pl-middle-layer/src/js_render/spec_driver.js +42 -0
- package/dist/pl-middle-layer/src/js_render/spec_driver.js.map +1 -0
- package/dist/ptable_cache_per_frame.cjs.map +1 -1
- package/dist/ptable_cache_per_frame.d.ts +1 -1
- package/dist/ptable_cache_per_frame.js.map +1 -1
- package/dist/ptable_cache_plain.cjs.map +1 -1
- package/dist/ptable_cache_plain.d.ts +1 -1
- package/dist/ptable_cache_plain.js.map +1 -1
- package/dist/ptable_def_pool.cjs +2 -2
- package/dist/ptable_def_pool.cjs.map +1 -1
- package/dist/ptable_def_pool.d.ts +1 -1
- package/dist/ptable_def_pool.js +1 -1
- package/dist/ptable_def_pool.js.map +1 -1
- package/dist/ptable_pool.cjs +6 -6
- package/dist/ptable_pool.cjs.map +1 -1
- package/dist/ptable_pool.d.ts +1 -1
- package/dist/ptable_pool.js +1 -1
- package/dist/ptable_pool.js.map +1 -1
- package/dist/ptable_shared.cjs.map +1 -1
- package/dist/ptable_shared.d.ts +1 -1
- package/dist/ptable_shared.js.map +1 -1
- package/package.json +4 -4
- package/src/data_info_helpers.ts +1 -1
- package/src/driver_decl.ts +1 -1
- package/src/driver_double.test.ts +30 -28
- package/src/driver_double.ts +1 -1
- package/src/driver_impl.ts +1 -1
- package/src/index.ts +1 -0
- package/src/pframe_pool.ts +1 -1
- package/src/ptable_cache_per_frame.ts +1 -1
- package/src/ptable_cache_plain.ts +1 -1
- package/src/ptable_def_pool.ts +1 -1
- package/src/ptable_pool.ts +1 -1
- package/src/ptable_shared.ts +1 -1
package/dist/pframe_pool.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
|
|
2
2
|
const require_logging = require('./logging.cjs');
|
|
3
|
-
let
|
|
3
|
+
let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
|
|
4
4
|
let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
|
|
5
5
|
let _milaboratories_pframes_rs_node = require("@milaboratories/pframes-rs-node");
|
|
6
6
|
let _milaboratories_pl_model_middle_layer = require("@milaboratories/pl-model-middle-layer");
|
|
@@ -47,7 +47,7 @@ var PFrameHolder = class {
|
|
|
47
47
|
data: makeRemoteBlobId(v.data)
|
|
48
48
|
}))
|
|
49
49
|
};
|
|
50
|
-
default: (0,
|
|
50
|
+
default: (0, _milaboratories_pl_model_common.assertNever)(data);
|
|
51
51
|
}
|
|
52
52
|
};
|
|
53
53
|
const jsonifiedColumns = columns.map((column) => ({
|
|
@@ -72,13 +72,13 @@ var PFrameHolder = class {
|
|
|
72
72
|
this.pFramePromise = Promise.all(promises).then(() => pFrame).catch((err) => {
|
|
73
73
|
this.dispose();
|
|
74
74
|
pFrame.dispose();
|
|
75
|
-
const error = new
|
|
76
|
-
error.cause = new Error(`PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`, { cause: (0,
|
|
75
|
+
const error = new _milaboratories_pl_model_common.PFrameDriverError("PFrame creation failed asynchronously");
|
|
76
|
+
error.cause = new Error(`PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`, { cause: (0, _milaboratories_pl_model_common.ensureError)(err) });
|
|
77
77
|
throw error;
|
|
78
78
|
});
|
|
79
79
|
} catch (err) {
|
|
80
|
-
const error = new
|
|
81
|
-
error.cause = new Error(`PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`, { cause: (0,
|
|
80
|
+
const error = new _milaboratories_pl_model_common.PFrameDriverError("PFrame creation failed synchronously");
|
|
81
|
+
error.cause = new Error(`PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`, { cause: (0, _milaboratories_pl_model_common.ensureError)(err) });
|
|
82
82
|
throw error;
|
|
83
83
|
}
|
|
84
84
|
}
|
|
@@ -107,13 +107,13 @@ var PFramePool = class extends _milaboratories_ts_helpers.RefCountPoolBase {
|
|
|
107
107
|
return stableKeyFromPFrameData(params);
|
|
108
108
|
}
|
|
109
109
|
createNewResource(params, key) {
|
|
110
|
-
if (require_logging.logPFrames()) this.logger("info", `PFrame creation (pFrameHandle = ${key}): ${JSON.stringify(params,
|
|
110
|
+
if (require_logging.logPFrames()) this.logger("info", `PFrame creation (pFrameHandle = ${key}): ${JSON.stringify(params, _milaboratories_pl_model_common.bigintReplacer)}`);
|
|
111
111
|
return new PFrameHolder(key, this.localBlobProvider, this.remoteBlobProvider, this.logger, this.spillPath, params);
|
|
112
112
|
}
|
|
113
113
|
getByKey(key) {
|
|
114
114
|
const resource = super.tryGetByKey(key);
|
|
115
115
|
if (!resource) {
|
|
116
|
-
const error = new
|
|
116
|
+
const error = new _milaboratories_pl_model_common.PFrameDriverError(`Invalid PFrame handle`);
|
|
117
117
|
error.cause = /* @__PURE__ */ new Error(`PFrame with handle ${key} not found`);
|
|
118
118
|
throw error;
|
|
119
119
|
}
|
|
@@ -121,7 +121,7 @@ var PFramePool = class extends _milaboratories_ts_helpers.RefCountPoolBase {
|
|
|
121
121
|
}
|
|
122
122
|
};
|
|
123
123
|
function stableKeyFromPFrameData(data) {
|
|
124
|
-
const orderedData = [...data].map((column) => (0,
|
|
124
|
+
const orderedData = [...data].map((column) => (0, _milaboratories_pl_model_common.mapPObjectData)(column, (r) => {
|
|
125
125
|
let result;
|
|
126
126
|
const type = r.type;
|
|
127
127
|
switch (type) {
|
|
@@ -141,7 +141,7 @@ function stableKeyFromPFrameData(data) {
|
|
|
141
141
|
keyLength: r.partitionKeyLength,
|
|
142
142
|
payload: Object.entries(r.parts).map(([part, info]) => ({
|
|
143
143
|
key: part,
|
|
144
|
-
value: (0,
|
|
144
|
+
value: (0, _milaboratories_pl_model_common.canonicalizeJson)(info)
|
|
145
145
|
}))
|
|
146
146
|
};
|
|
147
147
|
break;
|
|
@@ -151,7 +151,7 @@ function stableKeyFromPFrameData(data) {
|
|
|
151
151
|
keyLength: r.partitionKeyLength,
|
|
152
152
|
payload: Object.entries(r.parts).map(([part, info]) => ({
|
|
153
153
|
key: part,
|
|
154
|
-
value: [(0,
|
|
154
|
+
value: [(0, _milaboratories_pl_model_common.canonicalizeJson)(info.index), (0, _milaboratories_pl_model_common.canonicalizeJson)(info.values)]
|
|
155
155
|
}))
|
|
156
156
|
};
|
|
157
157
|
break;
|
|
@@ -161,14 +161,14 @@ function stableKeyFromPFrameData(data) {
|
|
|
161
161
|
keyLength: r.partitionKeyLength,
|
|
162
162
|
payload: Object.entries(r.parts).map(([part, info]) => ({
|
|
163
163
|
key: part,
|
|
164
|
-
value: info.dataDigest || [(0,
|
|
164
|
+
value: info.dataDigest || [(0, _milaboratories_pl_model_common.canonicalizeJson)(info.data), JSON.stringify({
|
|
165
165
|
axes: info.axes,
|
|
166
166
|
column: info.column
|
|
167
167
|
})]
|
|
168
168
|
}))
|
|
169
169
|
};
|
|
170
170
|
break;
|
|
171
|
-
default: throw new
|
|
171
|
+
default: throw new _milaboratories_pl_model_common.PFrameDriverError(`unsupported resource type: ${JSON.stringify(type)}`);
|
|
172
172
|
}
|
|
173
173
|
result.payload.sort((lhs, rhs) => lhs.key < rhs.key ? -1 : 1);
|
|
174
174
|
return result;
|
package/dist/pframe_pool.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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
|
+
{"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 \"@milaboratories/pl-model-common\";\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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"}
|
package/dist/pframe_pool.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { JsonSerializable, PColumn, PFrameHandle } from "@
|
|
1
|
+
import { JsonSerializable, PColumn, PFrameHandle } from "@milaboratories/pl-model-common";
|
|
2
2
|
import { PoolEntry, RefCountPoolBase } from "@milaboratories/ts-helpers";
|
|
3
3
|
import { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
|
|
4
4
|
|
package/dist/pframe_pool.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { logPFrames } from "./logging.js";
|
|
2
|
-
import { PFrameDriverError, assertNever, bigintReplacer, canonicalizeJson, ensureError, mapPObjectData } from "@
|
|
2
|
+
import { PFrameDriverError, assertNever, bigintReplacer, canonicalizeJson, ensureError, mapPObjectData } from "@milaboratories/pl-model-common";
|
|
3
3
|
import { RefCountPoolBase } from "@milaboratories/ts-helpers";
|
|
4
4
|
import { PFrameFactory } from "@milaboratories/pframes-rs-node";
|
|
5
5
|
import { PFrameInternal, hashJson } from "@milaboratories/pl-model-middle-layer";
|
package/dist/pframe_pool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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":"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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 \"@milaboratories/pl-model-common\";\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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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
const require_runtime = require('../../../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
let _milaboratories_pframes_rs_wasm = require("@milaboratories/pframes-rs-wasm");
|
|
3
|
+
let node_crypto = require("node:crypto");
|
|
4
|
+
|
|
5
|
+
//#region ../pl-middle-layer/src/js_render/spec_driver.ts
|
|
6
|
+
/**
|
|
7
|
+
* Manages spec-only PFrame instances (WASM) with handle-based lifecycle.
|
|
8
|
+
*
|
|
9
|
+
* All operations are synchronous — WASM computes results immediately.
|
|
10
|
+
*/
|
|
11
|
+
var SpecDriver = class {
|
|
12
|
+
frames = /* @__PURE__ */ new Map();
|
|
13
|
+
createSpecFrame(specs) {
|
|
14
|
+
const frame = (0, _milaboratories_pframes_rs_wasm.createPFrame)(specs);
|
|
15
|
+
const handle = (0, node_crypto.randomUUID)();
|
|
16
|
+
this.frames.set(handle, frame);
|
|
17
|
+
return handle;
|
|
18
|
+
}
|
|
19
|
+
specFrameDiscoverColumns(handle, request) {
|
|
20
|
+
return this.getFrame(handle).discoverColumns(request);
|
|
21
|
+
}
|
|
22
|
+
disposeSpecFrame(handle) {
|
|
23
|
+
const frame = this.frames.get(handle);
|
|
24
|
+
if (frame) {
|
|
25
|
+
frame[Symbol.dispose]();
|
|
26
|
+
this.frames.delete(handle);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** Dispose all managed spec frames. */
|
|
30
|
+
disposeAll() {
|
|
31
|
+
for (const frame of this.frames.values()) frame[Symbol.dispose]();
|
|
32
|
+
this.frames.clear();
|
|
33
|
+
}
|
|
34
|
+
getFrame(handle) {
|
|
35
|
+
const frame = this.frames.get(handle);
|
|
36
|
+
if (frame === void 0) throw new Error(`No such spec frame: ${handle}`);
|
|
37
|
+
return frame;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
//#endregion
|
|
42
|
+
exports.SpecDriver = SpecDriver;
|
|
43
|
+
//# sourceMappingURL=spec_driver.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec_driver.cjs","names":[],"sources":["../../../../../pl-middle-layer/src/js_render/spec_driver.ts"],"sourcesContent":["import { createPFrame } from \"@milaboratories/pframes-rs-wasm\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport type {\n PColumnSpec,\n PSpecDriver,\n SpecFrameHandle,\n DiscoverColumnsRequest,\n DiscoverColumnsResponse,\n} from \"@milaboratories/pl-model-common\";\nimport { randomUUID } from \"node:crypto\";\n\n/**\n * Manages spec-only PFrame instances (WASM) with handle-based lifecycle.\n *\n * All operations are synchronous — WASM computes results immediately.\n */\nexport class SpecDriver implements PSpecDriver {\n private readonly frames = new Map<string, PFrameInternal.PFrameWasm>();\n\n createSpecFrame(specs: Record<string, PColumnSpec>): SpecFrameHandle {\n const frame = createPFrame(specs);\n const handle = randomUUID() as SpecFrameHandle;\n this.frames.set(handle, frame);\n return handle;\n }\n\n specFrameDiscoverColumns(\n handle: SpecFrameHandle,\n request: DiscoverColumnsRequest,\n ): DiscoverColumnsResponse {\n return this.getFrame(handle).discoverColumns(request);\n }\n\n disposeSpecFrame(handle: SpecFrameHandle): void {\n const frame = this.frames.get(handle);\n if (frame) {\n frame[Symbol.dispose]();\n this.frames.delete(handle);\n }\n }\n\n /** Dispose all managed spec frames. */\n disposeAll(): void {\n for (const frame of this.frames.values()) {\n frame[Symbol.dispose]();\n }\n this.frames.clear();\n }\n\n private getFrame(handle: string): PFrameInternal.PFrameWasm {\n const frame = this.frames.get(handle);\n if (frame === undefined) throw new Error(`No such spec frame: ${handle}`);\n return frame;\n }\n}\n"],"mappings":";;;;;;;;;;AAgBA,IAAa,aAAb,MAA+C;CAC7C,AAAiB,yBAAS,IAAI,KAAwC;CAEtE,gBAAgB,OAAqD;EACnE,MAAM,0DAAqB,MAAM;EACjC,MAAM,sCAAqB;AAC3B,OAAK,OAAO,IAAI,QAAQ,MAAM;AAC9B,SAAO;;CAGT,yBACE,QACA,SACyB;AACzB,SAAO,KAAK,SAAS,OAAO,CAAC,gBAAgB,QAAQ;;CAGvD,iBAAiB,QAA+B;EAC9C,MAAM,QAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,MAAI,OAAO;AACT,SAAM,OAAO,UAAU;AACvB,QAAK,OAAO,OAAO,OAAO;;;;CAK9B,aAAmB;AACjB,OAAK,MAAM,SAAS,KAAK,OAAO,QAAQ,CACtC,OAAM,OAAO,UAAU;AAEzB,OAAK,OAAO,OAAO;;CAGrB,AAAQ,SAAS,QAA2C;EAC1D,MAAM,QAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,MAAI,UAAU,OAAW,OAAM,IAAI,MAAM,uBAAuB,SAAS;AACzE,SAAO"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DiscoverColumnsRequest, DiscoverColumnsResponse, PColumnSpec, PSpecDriver, SpecFrameHandle } from "@milaboratories/pl-model-common";
|
|
2
|
+
|
|
3
|
+
//#region ../pl-middle-layer/src/js_render/spec_driver.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Manages spec-only PFrame instances (WASM) with handle-based lifecycle.
|
|
6
|
+
*
|
|
7
|
+
* All operations are synchronous — WASM computes results immediately.
|
|
8
|
+
*/
|
|
9
|
+
declare class SpecDriver implements PSpecDriver {
|
|
10
|
+
private readonly frames;
|
|
11
|
+
createSpecFrame(specs: Record<string, PColumnSpec>): SpecFrameHandle;
|
|
12
|
+
specFrameDiscoverColumns(handle: SpecFrameHandle, request: DiscoverColumnsRequest): DiscoverColumnsResponse;
|
|
13
|
+
disposeSpecFrame(handle: SpecFrameHandle): void;
|
|
14
|
+
/** Dispose all managed spec frames. */
|
|
15
|
+
disposeAll(): void;
|
|
16
|
+
private getFrame;
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { SpecDriver };
|
|
20
|
+
//# sourceMappingURL=spec_driver.d.ts.map
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createPFrame } from "@milaboratories/pframes-rs-wasm";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
|
|
4
|
+
//#region ../pl-middle-layer/src/js_render/spec_driver.ts
|
|
5
|
+
/**
|
|
6
|
+
* Manages spec-only PFrame instances (WASM) with handle-based lifecycle.
|
|
7
|
+
*
|
|
8
|
+
* All operations are synchronous — WASM computes results immediately.
|
|
9
|
+
*/
|
|
10
|
+
var SpecDriver = class {
|
|
11
|
+
frames = /* @__PURE__ */ new Map();
|
|
12
|
+
createSpecFrame(specs) {
|
|
13
|
+
const frame = createPFrame(specs);
|
|
14
|
+
const handle = randomUUID();
|
|
15
|
+
this.frames.set(handle, frame);
|
|
16
|
+
return handle;
|
|
17
|
+
}
|
|
18
|
+
specFrameDiscoverColumns(handle, request) {
|
|
19
|
+
return this.getFrame(handle).discoverColumns(request);
|
|
20
|
+
}
|
|
21
|
+
disposeSpecFrame(handle) {
|
|
22
|
+
const frame = this.frames.get(handle);
|
|
23
|
+
if (frame) {
|
|
24
|
+
frame[Symbol.dispose]();
|
|
25
|
+
this.frames.delete(handle);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** Dispose all managed spec frames. */
|
|
29
|
+
disposeAll() {
|
|
30
|
+
for (const frame of this.frames.values()) frame[Symbol.dispose]();
|
|
31
|
+
this.frames.clear();
|
|
32
|
+
}
|
|
33
|
+
getFrame(handle) {
|
|
34
|
+
const frame = this.frames.get(handle);
|
|
35
|
+
if (frame === void 0) throw new Error(`No such spec frame: ${handle}`);
|
|
36
|
+
return frame;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
//#endregion
|
|
41
|
+
export { SpecDriver };
|
|
42
|
+
//# sourceMappingURL=spec_driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec_driver.js","names":[],"sources":["../../../../../pl-middle-layer/src/js_render/spec_driver.ts"],"sourcesContent":["import { createPFrame } from \"@milaboratories/pframes-rs-wasm\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport type {\n PColumnSpec,\n PSpecDriver,\n SpecFrameHandle,\n DiscoverColumnsRequest,\n DiscoverColumnsResponse,\n} from \"@milaboratories/pl-model-common\";\nimport { randomUUID } from \"node:crypto\";\n\n/**\n * Manages spec-only PFrame instances (WASM) with handle-based lifecycle.\n *\n * All operations are synchronous — WASM computes results immediately.\n */\nexport class SpecDriver implements PSpecDriver {\n private readonly frames = new Map<string, PFrameInternal.PFrameWasm>();\n\n createSpecFrame(specs: Record<string, PColumnSpec>): SpecFrameHandle {\n const frame = createPFrame(specs);\n const handle = randomUUID() as SpecFrameHandle;\n this.frames.set(handle, frame);\n return handle;\n }\n\n specFrameDiscoverColumns(\n handle: SpecFrameHandle,\n request: DiscoverColumnsRequest,\n ): DiscoverColumnsResponse {\n return this.getFrame(handle).discoverColumns(request);\n }\n\n disposeSpecFrame(handle: SpecFrameHandle): void {\n const frame = this.frames.get(handle);\n if (frame) {\n frame[Symbol.dispose]();\n this.frames.delete(handle);\n }\n }\n\n /** Dispose all managed spec frames. */\n disposeAll(): void {\n for (const frame of this.frames.values()) {\n frame[Symbol.dispose]();\n }\n this.frames.clear();\n }\n\n private getFrame(handle: string): PFrameInternal.PFrameWasm {\n const frame = this.frames.get(handle);\n if (frame === undefined) throw new Error(`No such spec frame: ${handle}`);\n return frame;\n }\n}\n"],"mappings":";;;;;;;;;AAgBA,IAAa,aAAb,MAA+C;CAC7C,AAAiB,yBAAS,IAAI,KAAwC;CAEtE,gBAAgB,OAAqD;EACnE,MAAM,QAAQ,aAAa,MAAM;EACjC,MAAM,SAAS,YAAY;AAC3B,OAAK,OAAO,IAAI,QAAQ,MAAM;AAC9B,SAAO;;CAGT,yBACE,QACA,SACyB;AACzB,SAAO,KAAK,SAAS,OAAO,CAAC,gBAAgB,QAAQ;;CAGvD,iBAAiB,QAA+B;EAC9C,MAAM,QAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,MAAI,OAAO;AACT,SAAM,OAAO,UAAU;AACvB,QAAK,OAAO,OAAO,OAAO;;;;CAK9B,aAAmB;AACjB,OAAK,MAAM,SAAS,KAAK,OAAO,QAAQ,CACtC,OAAM,OAAO,UAAU;AAEzB,OAAK,OAAO,OAAO;;CAGrB,AAAQ,SAAS,QAA2C;EAC1D,MAAM,QAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,MAAI,UAAU,OAAW,OAAM,IAAI,MAAM,uBAAuB,SAAS;AACzE,SAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ptable_cache_per_frame.cjs","names":["LRUCache","logPFrames"],"sources":["../src/ptable_cache_per_frame.ts"],"sourcesContent":["import type { PFrameHandle, PTableHandle } from \"@
|
|
1
|
+
{"version":3,"file":"ptable_cache_per_frame.cjs","names":["LRUCache","logPFrames"],"sources":["../src/ptable_cache_per_frame.ts"],"sourcesContent":["import type { PFrameHandle, PTableHandle } from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport type { PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { LRUCache } from \"lru-cache\";\nimport { logPFrames } from \"./logging\";\nimport type { PTableHolder } from \"./ptable_pool\";\n\nexport type PTableCachePerFrameOps = {\n /** Maximum number of `calculateTableData` results cached for each PFrame */\n pFrameCacheMaxCount: number;\n /**\n * Maximum size of `calculateTableData` results cached for PFrames overall.\n * The limit is soft, as the same table could be materialized with other requests and will not be deleted in such case.\n * Also each table has predecessors, overlapping predecessors will be counted twice, so the effective limit is smaller.\n */\n pFramesCacheMaxSize: number;\n};\n\nexport const PTableCachePerFrameOpsDefaults: PTableCachePerFrameOps = {\n pFrameCacheMaxCount: 18, // SHM trees create 3 PTables per graphic, we want to cache 6 graphics per PFrame\n pFramesCacheMaxSize: 8 * 1024 * 1024 * 1024, // 8 GB, same as blob driver cache (must be at least 2GB)\n};\n\nexport class PTableCachePerFrame {\n private readonly perFrame = new Map<\n PFrameHandle,\n LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>\n >();\n private readonly global: LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>;\n private readonly disposeListeners = new Set<PTableHandle>();\n\n constructor(\n private readonly logger: PFrameInternal.Logger,\n private readonly ops: PTableCachePerFrameOps,\n ) {\n this.global = new LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>({\n maxSize: this.ops.pFramesCacheMaxSize,\n dispose: (resource, key, reason) => {\n if (reason === \"evict\") {\n this.perFrame.get(resource.resource.pFrame)?.delete(key);\n }\n\n if (this.perFrame.get(resource.resource.pFrame)?.size === 0) {\n this.perFrame.delete(resource.resource.pFrame);\n }\n\n resource.unref();\n if (logPFrames()) {\n logger(\"info\", `calculateTableData cache - removed PTable ${key} (reason: ${reason})`);\n }\n },\n });\n }\n\n public cache(resource: PoolEntry<PTableHandle, PTableHolder>, size: number): void {\n const key = resource.key;\n if (logPFrames()) {\n this.logger(\"info\", `calculateTableData cache - added PTable ${key} with size ${size}`);\n }\n\n this.global.set(key, resource, { size: Math.max(size, 1) }); // 1 is minimum size to avoid cache evictions\n\n let perFrame = this.perFrame.get(resource.resource.pFrame);\n if (!perFrame) {\n perFrame = new LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>({\n max: this.ops.pFrameCacheMaxCount,\n dispose: (_resource, key, reason) => {\n if (reason === \"evict\") {\n this.global.delete(key);\n }\n },\n });\n this.perFrame.set(resource.resource.pFrame, perFrame);\n }\n perFrame.set(key, resource);\n\n if (!this.disposeListeners.has(key)) {\n const disposeListener = () => {\n this.perFrame.get(resource.resource.pFrame)?.delete(key);\n this.global.delete(key);\n\n this.disposeListeners.delete(key);\n resource.resource.disposeSignal.removeEventListener(\"abort\", disposeListener);\n };\n this.disposeListeners.add(key);\n resource.resource.disposeSignal.addEventListener(\"abort\", disposeListener);\n }\n }\n}\n"],"mappings":";;;;;AAkBA,MAAa,iCAAyD;CACpE,qBAAqB;CACrB,qBAAqB,IAAI,OAAO,OAAO;CACxC;AAED,IAAa,sBAAb,MAAiC;CAC/B,AAAiB,2BAAW,IAAI,KAG7B;CACH,AAAiB;CACjB,AAAiB,mCAAmB,IAAI,KAAmB;CAE3D,YACE,AAAiB,QACjB,AAAiB,KACjB;EAFiB;EACA;AAEjB,OAAK,SAAS,IAAIA,mBAA8D;GAC9E,SAAS,KAAK,IAAI;GAClB,UAAU,UAAU,KAAK,WAAW;AAClC,QAAI,WAAW,QACb,MAAK,SAAS,IAAI,SAAS,SAAS,OAAO,EAAE,OAAO,IAAI;AAG1D,QAAI,KAAK,SAAS,IAAI,SAAS,SAAS,OAAO,EAAE,SAAS,EACxD,MAAK,SAAS,OAAO,SAAS,SAAS,OAAO;AAGhD,aAAS,OAAO;AAChB,QAAIC,4BAAY,CACd,QAAO,QAAQ,6CAA6C,IAAI,YAAY,OAAO,GAAG;;GAG3F,CAAC;;CAGJ,AAAO,MAAM,UAAiD,MAAoB;EAChF,MAAM,MAAM,SAAS;AACrB,MAAIA,4BAAY,CACd,MAAK,OAAO,QAAQ,2CAA2C,IAAI,aAAa,OAAO;AAGzF,OAAK,OAAO,IAAI,KAAK,UAAU,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,EAAE,CAAC;EAE3D,IAAI,WAAW,KAAK,SAAS,IAAI,SAAS,SAAS,OAAO;AAC1D,MAAI,CAAC,UAAU;AACb,cAAW,IAAID,mBAA8D;IAC3E,KAAK,KAAK,IAAI;IACd,UAAU,WAAW,KAAK,WAAW;AACnC,SAAI,WAAW,QACb,MAAK,OAAO,OAAO,IAAI;;IAG5B,CAAC;AACF,QAAK,SAAS,IAAI,SAAS,SAAS,QAAQ,SAAS;;AAEvD,WAAS,IAAI,KAAK,SAAS;AAE3B,MAAI,CAAC,KAAK,iBAAiB,IAAI,IAAI,EAAE;GACnC,MAAM,wBAAwB;AAC5B,SAAK,SAAS,IAAI,SAAS,SAAS,OAAO,EAAE,OAAO,IAAI;AACxD,SAAK,OAAO,OAAO,IAAI;AAEvB,SAAK,iBAAiB,OAAO,IAAI;AACjC,aAAS,SAAS,cAAc,oBAAoB,SAAS,gBAAgB;;AAE/E,QAAK,iBAAiB,IAAI,IAAI;AAC9B,YAAS,SAAS,cAAc,iBAAiB,SAAS,gBAAgB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "./ptable_pool.js";
|
|
2
|
-
import { PTableHandle } from "@
|
|
2
|
+
import { PTableHandle } from "@milaboratories/pl-model-common";
|
|
3
3
|
import { PoolEntry } from "@milaboratories/ts-helpers";
|
|
4
4
|
import { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ptable_cache_per_frame.js","names":[],"sources":["../src/ptable_cache_per_frame.ts"],"sourcesContent":["import type { PFrameHandle, PTableHandle } from \"@
|
|
1
|
+
{"version":3,"file":"ptable_cache_per_frame.js","names":[],"sources":["../src/ptable_cache_per_frame.ts"],"sourcesContent":["import type { PFrameHandle, PTableHandle } from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport type { PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { LRUCache } from \"lru-cache\";\nimport { logPFrames } from \"./logging\";\nimport type { PTableHolder } from \"./ptable_pool\";\n\nexport type PTableCachePerFrameOps = {\n /** Maximum number of `calculateTableData` results cached for each PFrame */\n pFrameCacheMaxCount: number;\n /**\n * Maximum size of `calculateTableData` results cached for PFrames overall.\n * The limit is soft, as the same table could be materialized with other requests and will not be deleted in such case.\n * Also each table has predecessors, overlapping predecessors will be counted twice, so the effective limit is smaller.\n */\n pFramesCacheMaxSize: number;\n};\n\nexport const PTableCachePerFrameOpsDefaults: PTableCachePerFrameOps = {\n pFrameCacheMaxCount: 18, // SHM trees create 3 PTables per graphic, we want to cache 6 graphics per PFrame\n pFramesCacheMaxSize: 8 * 1024 * 1024 * 1024, // 8 GB, same as blob driver cache (must be at least 2GB)\n};\n\nexport class PTableCachePerFrame {\n private readonly perFrame = new Map<\n PFrameHandle,\n LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>\n >();\n private readonly global: LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>;\n private readonly disposeListeners = new Set<PTableHandle>();\n\n constructor(\n private readonly logger: PFrameInternal.Logger,\n private readonly ops: PTableCachePerFrameOps,\n ) {\n this.global = new LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>({\n maxSize: this.ops.pFramesCacheMaxSize,\n dispose: (resource, key, reason) => {\n if (reason === \"evict\") {\n this.perFrame.get(resource.resource.pFrame)?.delete(key);\n }\n\n if (this.perFrame.get(resource.resource.pFrame)?.size === 0) {\n this.perFrame.delete(resource.resource.pFrame);\n }\n\n resource.unref();\n if (logPFrames()) {\n logger(\"info\", `calculateTableData cache - removed PTable ${key} (reason: ${reason})`);\n }\n },\n });\n }\n\n public cache(resource: PoolEntry<PTableHandle, PTableHolder>, size: number): void {\n const key = resource.key;\n if (logPFrames()) {\n this.logger(\"info\", `calculateTableData cache - added PTable ${key} with size ${size}`);\n }\n\n this.global.set(key, resource, { size: Math.max(size, 1) }); // 1 is minimum size to avoid cache evictions\n\n let perFrame = this.perFrame.get(resource.resource.pFrame);\n if (!perFrame) {\n perFrame = new LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>({\n max: this.ops.pFrameCacheMaxCount,\n dispose: (_resource, key, reason) => {\n if (reason === \"evict\") {\n this.global.delete(key);\n }\n },\n });\n this.perFrame.set(resource.resource.pFrame, perFrame);\n }\n perFrame.set(key, resource);\n\n if (!this.disposeListeners.has(key)) {\n const disposeListener = () => {\n this.perFrame.get(resource.resource.pFrame)?.delete(key);\n this.global.delete(key);\n\n this.disposeListeners.delete(key);\n resource.resource.disposeSignal.removeEventListener(\"abort\", disposeListener);\n };\n this.disposeListeners.add(key);\n resource.resource.disposeSignal.addEventListener(\"abort\", disposeListener);\n }\n }\n}\n"],"mappings":";;;;AAkBA,MAAa,iCAAyD;CACpE,qBAAqB;CACrB,qBAAqB,IAAI,OAAO,OAAO;CACxC;AAED,IAAa,sBAAb,MAAiC;CAC/B,AAAiB,2BAAW,IAAI,KAG7B;CACH,AAAiB;CACjB,AAAiB,mCAAmB,IAAI,KAAmB;CAE3D,YACE,AAAiB,QACjB,AAAiB,KACjB;EAFiB;EACA;AAEjB,OAAK,SAAS,IAAI,SAA8D;GAC9E,SAAS,KAAK,IAAI;GAClB,UAAU,UAAU,KAAK,WAAW;AAClC,QAAI,WAAW,QACb,MAAK,SAAS,IAAI,SAAS,SAAS,OAAO,EAAE,OAAO,IAAI;AAG1D,QAAI,KAAK,SAAS,IAAI,SAAS,SAAS,OAAO,EAAE,SAAS,EACxD,MAAK,SAAS,OAAO,SAAS,SAAS,OAAO;AAGhD,aAAS,OAAO;AAChB,QAAI,YAAY,CACd,QAAO,QAAQ,6CAA6C,IAAI,YAAY,OAAO,GAAG;;GAG3F,CAAC;;CAGJ,AAAO,MAAM,UAAiD,MAAoB;EAChF,MAAM,MAAM,SAAS;AACrB,MAAI,YAAY,CACd,MAAK,OAAO,QAAQ,2CAA2C,IAAI,aAAa,OAAO;AAGzF,OAAK,OAAO,IAAI,KAAK,UAAU,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,EAAE,CAAC;EAE3D,IAAI,WAAW,KAAK,SAAS,IAAI,SAAS,SAAS,OAAO;AAC1D,MAAI,CAAC,UAAU;AACb,cAAW,IAAI,SAA8D;IAC3E,KAAK,KAAK,IAAI;IACd,UAAU,WAAW,KAAK,WAAW;AACnC,SAAI,WAAW,QACb,MAAK,OAAO,OAAO,IAAI;;IAG5B,CAAC;AACF,QAAK,SAAS,IAAI,SAAS,SAAS,QAAQ,SAAS;;AAEvD,WAAS,IAAI,KAAK,SAAS;AAE3B,MAAI,CAAC,KAAK,iBAAiB,IAAI,IAAI,EAAE;GACnC,MAAM,wBAAwB;AAC5B,SAAK,SAAS,IAAI,SAAS,SAAS,OAAO,EAAE,OAAO,IAAI;AACxD,SAAK,OAAO,OAAO,IAAI;AAEvB,SAAK,iBAAiB,OAAO,IAAI;AACjC,aAAS,SAAS,cAAc,oBAAoB,SAAS,gBAAgB;;AAE/E,QAAK,iBAAiB,IAAI,IAAI;AAC9B,YAAS,SAAS,cAAc,iBAAiB,SAAS,gBAAgB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ptable_cache_plain.cjs","names":["LRUCache","logPFrames"],"sources":["../src/ptable_cache_plain.ts"],"sourcesContent":["import type { PTableHandle } from \"@
|
|
1
|
+
{"version":3,"file":"ptable_cache_plain.cjs","names":["LRUCache","logPFrames"],"sources":["../src/ptable_cache_plain.ts"],"sourcesContent":["import type { PTableHandle } from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport type { PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { LRUCache } from \"lru-cache\";\nimport { logPFrames } from \"./logging\";\nimport type { PTableHolder } from \"./ptable_pool\";\n\nexport type PTableCachePlainOps = {\n /**\n * Maximum size of `createPTable` results cached on disk.\n * The limit is soft, as the same table could be materialized with other requests and will not be deleted in such case.\n * Also each table has predecessors, overlapping predecessors will be counted twice, so the effective limit is smaller.\n */\n pTablesCacheMaxSize: number;\n};\n\nexport const PTableCachePlainOpsDefaults: PTableCachePlainOps = {\n pTablesCacheMaxSize: 32 * 1024 * 1024 * 1024, // 32 GB (must be at least 8GB)\n};\n\nexport class PTableCachePlain {\n private readonly global: LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>;\n private readonly disposeListeners = new Set<PTableHandle>();\n\n constructor(\n private readonly logger: PFrameInternal.Logger,\n ops: PTableCachePlainOps,\n ) {\n this.global = new LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>({\n maxSize: ops.pTablesCacheMaxSize,\n dispose: (resource, key, reason) => {\n resource.unref();\n if (logPFrames()) {\n logger(\"info\", `createPTable cache - removed PTable ${key} (reason: ${reason})`);\n }\n },\n });\n }\n\n public cache(\n resource: PoolEntry<PTableHandle, PTableHolder>,\n size: number,\n defDisposeSignal: AbortSignal,\n ): void {\n const key = resource.key;\n if (logPFrames()) {\n this.logger(\"info\", `createPTable cache - added PTable ${key} with size ${size}`);\n }\n\n const status: LRUCache.Status<PoolEntry<PTableHandle, PTableHolder>> = {};\n this.global.set(key, resource, { size: Math.max(size, 1), status }); // 1 is minimum size to avoid cache evictions\n\n if (status.maxEntrySizeExceeded) {\n resource.unref();\n if (logPFrames()) {\n this.logger(\"info\", `createPTable cache - removed PTable ${key} (maxEntrySizeExceeded)`);\n }\n } else {\n if (!this.disposeListeners.has(key)) {\n const disposeListener = () => {\n this.global.delete(key);\n\n this.disposeListeners.delete(key);\n defDisposeSignal.removeEventListener(\"abort\", disposeListener);\n };\n this.disposeListeners.add(key);\n defDisposeSignal.addEventListener(\"abort\", disposeListener);\n }\n }\n }\n}\n"],"mappings":";;;;;AAgBA,MAAa,8BAAmD,EAC9D,qBAAqB,KAAK,OAAO,OAAO,MACzC;AAED,IAAa,mBAAb,MAA8B;CAC5B,AAAiB;CACjB,AAAiB,mCAAmB,IAAI,KAAmB;CAE3D,YACE,AAAiB,QACjB,KACA;EAFiB;AAGjB,OAAK,SAAS,IAAIA,mBAA8D;GAC9E,SAAS,IAAI;GACb,UAAU,UAAU,KAAK,WAAW;AAClC,aAAS,OAAO;AAChB,QAAIC,4BAAY,CACd,QAAO,QAAQ,uCAAuC,IAAI,YAAY,OAAO,GAAG;;GAGrF,CAAC;;CAGJ,AAAO,MACL,UACA,MACA,kBACM;EACN,MAAM,MAAM,SAAS;AACrB,MAAIA,4BAAY,CACd,MAAK,OAAO,QAAQ,qCAAqC,IAAI,aAAa,OAAO;EAGnF,MAAM,SAAiE,EAAE;AACzE,OAAK,OAAO,IAAI,KAAK,UAAU;GAAE,MAAM,KAAK,IAAI,MAAM,EAAE;GAAE;GAAQ,CAAC;AAEnE,MAAI,OAAO,sBAAsB;AAC/B,YAAS,OAAO;AAChB,OAAIA,4BAAY,CACd,MAAK,OAAO,QAAQ,uCAAuC,IAAI,yBAAyB;aAGtF,CAAC,KAAK,iBAAiB,IAAI,IAAI,EAAE;GACnC,MAAM,wBAAwB;AAC5B,SAAK,OAAO,OAAO,IAAI;AAEvB,SAAK,iBAAiB,OAAO,IAAI;AACjC,qBAAiB,oBAAoB,SAAS,gBAAgB;;AAEhE,QAAK,iBAAiB,IAAI,IAAI;AAC9B,oBAAiB,iBAAiB,SAAS,gBAAgB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "./ptable_pool.js";
|
|
2
|
-
import { PTableHandle } from "@
|
|
2
|
+
import { PTableHandle } from "@milaboratories/pl-model-common";
|
|
3
3
|
import { PoolEntry } from "@milaboratories/ts-helpers";
|
|
4
4
|
import { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ptable_cache_plain.js","names":[],"sources":["../src/ptable_cache_plain.ts"],"sourcesContent":["import type { PTableHandle } from \"@
|
|
1
|
+
{"version":3,"file":"ptable_cache_plain.js","names":[],"sources":["../src/ptable_cache_plain.ts"],"sourcesContent":["import type { PTableHandle } from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport type { PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { LRUCache } from \"lru-cache\";\nimport { logPFrames } from \"./logging\";\nimport type { PTableHolder } from \"./ptable_pool\";\n\nexport type PTableCachePlainOps = {\n /**\n * Maximum size of `createPTable` results cached on disk.\n * The limit is soft, as the same table could be materialized with other requests and will not be deleted in such case.\n * Also each table has predecessors, overlapping predecessors will be counted twice, so the effective limit is smaller.\n */\n pTablesCacheMaxSize: number;\n};\n\nexport const PTableCachePlainOpsDefaults: PTableCachePlainOps = {\n pTablesCacheMaxSize: 32 * 1024 * 1024 * 1024, // 32 GB (must be at least 8GB)\n};\n\nexport class PTableCachePlain {\n private readonly global: LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>;\n private readonly disposeListeners = new Set<PTableHandle>();\n\n constructor(\n private readonly logger: PFrameInternal.Logger,\n ops: PTableCachePlainOps,\n ) {\n this.global = new LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>({\n maxSize: ops.pTablesCacheMaxSize,\n dispose: (resource, key, reason) => {\n resource.unref();\n if (logPFrames()) {\n logger(\"info\", `createPTable cache - removed PTable ${key} (reason: ${reason})`);\n }\n },\n });\n }\n\n public cache(\n resource: PoolEntry<PTableHandle, PTableHolder>,\n size: number,\n defDisposeSignal: AbortSignal,\n ): void {\n const key = resource.key;\n if (logPFrames()) {\n this.logger(\"info\", `createPTable cache - added PTable ${key} with size ${size}`);\n }\n\n const status: LRUCache.Status<PoolEntry<PTableHandle, PTableHolder>> = {};\n this.global.set(key, resource, { size: Math.max(size, 1), status }); // 1 is minimum size to avoid cache evictions\n\n if (status.maxEntrySizeExceeded) {\n resource.unref();\n if (logPFrames()) {\n this.logger(\"info\", `createPTable cache - removed PTable ${key} (maxEntrySizeExceeded)`);\n }\n } else {\n if (!this.disposeListeners.has(key)) {\n const disposeListener = () => {\n this.global.delete(key);\n\n this.disposeListeners.delete(key);\n defDisposeSignal.removeEventListener(\"abort\", disposeListener);\n };\n this.disposeListeners.add(key);\n defDisposeSignal.addEventListener(\"abort\", disposeListener);\n }\n }\n }\n}\n"],"mappings":";;;;AAgBA,MAAa,8BAAmD,EAC9D,qBAAqB,KAAK,OAAO,OAAO,MACzC;AAED,IAAa,mBAAb,MAA8B;CAC5B,AAAiB;CACjB,AAAiB,mCAAmB,IAAI,KAAmB;CAE3D,YACE,AAAiB,QACjB,KACA;EAFiB;AAGjB,OAAK,SAAS,IAAI,SAA8D;GAC9E,SAAS,IAAI;GACb,UAAU,UAAU,KAAK,WAAW;AAClC,aAAS,OAAO;AAChB,QAAI,YAAY,CACd,QAAO,QAAQ,uCAAuC,IAAI,YAAY,OAAO,GAAG;;GAGrF,CAAC;;CAGJ,AAAO,MACL,UACA,MACA,kBACM;EACN,MAAM,MAAM,SAAS;AACrB,MAAI,YAAY,CACd,MAAK,OAAO,QAAQ,qCAAqC,IAAI,aAAa,OAAO;EAGnF,MAAM,SAAiE,EAAE;AACzE,OAAK,OAAO,IAAI,KAAK,UAAU;GAAE,MAAM,KAAK,IAAI,MAAM,EAAE;GAAE;GAAQ,CAAC;AAEnE,MAAI,OAAO,sBAAsB;AAC/B,YAAS,OAAO;AAChB,OAAI,YAAY,CACd,MAAK,OAAO,QAAQ,uCAAuC,IAAI,yBAAyB;aAGtF,CAAC,KAAK,iBAAiB,IAAI,IAAI,EAAE;GACnC,MAAM,wBAAwB;AAC5B,SAAK,OAAO,OAAO,IAAI;AAEvB,SAAK,iBAAiB,OAAO,IAAI;AACjC,qBAAiB,oBAAoB,SAAS,gBAAgB;;AAEhE,QAAK,iBAAiB,IAAI,IAAI;AAC9B,oBAAiB,iBAAiB,SAAS,gBAAgB"}
|
package/dist/ptable_def_pool.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
|
|
2
2
|
const require_logging = require('./logging.cjs');
|
|
3
3
|
const require_ptable_shared = require('./ptable_shared.cjs');
|
|
4
|
-
let
|
|
4
|
+
let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
|
|
5
5
|
let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
|
|
6
6
|
|
|
7
7
|
//#region src/ptable_def_pool.ts
|
|
@@ -35,7 +35,7 @@ var PTableDefPool = class extends _milaboratories_ts_helpers.RefCountPoolBase {
|
|
|
35
35
|
getByKey(key) {
|
|
36
36
|
const resource = super.tryGetByKey(key);
|
|
37
37
|
if (!resource) {
|
|
38
|
-
const error = new
|
|
38
|
+
const error = new _milaboratories_pl_model_common.PFrameDriverError(`Invalid PTable handle`);
|
|
39
39
|
error.cause = /* @__PURE__ */ new Error(`PTable definition for handle ${key} not found`);
|
|
40
40
|
throw error;
|
|
41
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ptable_def_pool.cjs","names":["logPFrames","RefCountPoolBase","stableKeyFromFullPTableDef","PFrameDriverError"],"sources":["../src/ptable_def_pool.ts"],"sourcesContent":["import { PFrameDriverError, type PTableHandle } from \"@
|
|
1
|
+
{"version":3,"file":"ptable_def_pool.cjs","names":["logPFrames","RefCountPoolBase","stableKeyFromFullPTableDef","PFrameDriverError"],"sources":["../src/ptable_def_pool.ts"],"sourcesContent":["import { PFrameDriverError, type PTableHandle } from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase } from \"@milaboratories/ts-helpers\";\nimport { logPFrames } from \"./logging\";\nimport type { FullPTableDef } from \"./ptable_shared\";\nimport { stableKeyFromFullPTableDef } from \"./ptable_shared\";\n\nexport class PTableDefHolder implements Disposable {\n private readonly abortController = new AbortController();\n\n constructor(\n public readonly def: FullPTableDef,\n private readonly pTableHandle: PTableHandle,\n private readonly logger: PFrameInternal.Logger,\n ) {\n if (logPFrames()) {\n this.logger(\"info\", `PTable definition saved (pTableHandle = ${this.pTableHandle})`);\n }\n }\n\n public get disposeSignal(): AbortSignal {\n return this.abortController.signal;\n }\n\n [Symbol.dispose](): void {\n this.abortController.abort();\n if (logPFrames()) {\n this.logger(\"info\", `PTable definition disposed (pTableHandle = ${this.pTableHandle})`);\n }\n }\n}\n\nexport class PTableDefPool extends RefCountPoolBase<FullPTableDef, PTableHandle, PTableDefHolder> {\n constructor(private readonly logger: PFrameInternal.Logger) {\n super();\n }\n\n protected calculateParamsKey(params: FullPTableDef): PTableHandle {\n return stableKeyFromFullPTableDef(params);\n }\n\n protected createNewResource(params: FullPTableDef, key: PTableHandle): PTableDefHolder {\n return new PTableDefHolder(params, key, this.logger);\n }\n\n public getByKey(key: PTableHandle): PTableDefHolder {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PTable handle`);\n error.cause = new Error(`PTable definition for handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n"],"mappings":";;;;;;;AAOA,IAAa,kBAAb,MAAmD;CACjD,AAAiB,kBAAkB,IAAI,iBAAiB;CAExD,YACE,AAAgB,KAChB,AAAiB,cACjB,AAAiB,QACjB;EAHgB;EACC;EACA;AAEjB,MAAIA,4BAAY,CACd,MAAK,OAAO,QAAQ,2CAA2C,KAAK,aAAa,GAAG;;CAIxF,IAAW,gBAA6B;AACtC,SAAO,KAAK,gBAAgB;;CAG9B,CAAC,OAAO,WAAiB;AACvB,OAAK,gBAAgB,OAAO;AAC5B,MAAIA,4BAAY,CACd,MAAK,OAAO,QAAQ,8CAA8C,KAAK,aAAa,GAAG;;;AAK7F,IAAa,gBAAb,cAAmCC,4CAA+D;CAChG,YAAY,AAAiB,QAA+B;AAC1D,SAAO;EADoB;;CAI7B,AAAU,mBAAmB,QAAqC;AAChE,SAAOC,iDAA2B,OAAO;;CAG3C,AAAU,kBAAkB,QAAuB,KAAoC;AACrF,SAAO,IAAI,gBAAgB,QAAQ,KAAK,KAAK,OAAO;;CAGtD,AAAO,SAAS,KAAoC;EAClD,MAAM,WAAW,MAAM,YAAY,IAAI;AACvC,MAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAIC,kDAAkB,wBAAwB;AAC5D,SAAM,wBAAQ,IAAI,MAAM,gCAAgC,IAAI,YAAY;AACxE,SAAM;;AAER,SAAO"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import "./ptable_shared.js";
|
|
2
|
-
import { PTableHandle } from "@
|
|
2
|
+
import { PTableHandle } from "@milaboratories/pl-model-common";
|
|
3
3
|
import { RefCountPoolBase } from "@milaboratories/ts-helpers";
|
|
4
4
|
import { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
|
package/dist/ptable_def_pool.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { logPFrames } from "./logging.js";
|
|
2
2
|
import { stableKeyFromFullPTableDef } from "./ptable_shared.js";
|
|
3
|
-
import { PFrameDriverError } from "@
|
|
3
|
+
import { PFrameDriverError } from "@milaboratories/pl-model-common";
|
|
4
4
|
import { RefCountPoolBase } from "@milaboratories/ts-helpers";
|
|
5
5
|
|
|
6
6
|
//#region src/ptable_def_pool.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ptable_def_pool.js","names":[],"sources":["../src/ptable_def_pool.ts"],"sourcesContent":["import { PFrameDriverError, type PTableHandle } from \"@
|
|
1
|
+
{"version":3,"file":"ptable_def_pool.js","names":[],"sources":["../src/ptable_def_pool.ts"],"sourcesContent":["import { PFrameDriverError, type PTableHandle } from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase } from \"@milaboratories/ts-helpers\";\nimport { logPFrames } from \"./logging\";\nimport type { FullPTableDef } from \"./ptable_shared\";\nimport { stableKeyFromFullPTableDef } from \"./ptable_shared\";\n\nexport class PTableDefHolder implements Disposable {\n private readonly abortController = new AbortController();\n\n constructor(\n public readonly def: FullPTableDef,\n private readonly pTableHandle: PTableHandle,\n private readonly logger: PFrameInternal.Logger,\n ) {\n if (logPFrames()) {\n this.logger(\"info\", `PTable definition saved (pTableHandle = ${this.pTableHandle})`);\n }\n }\n\n public get disposeSignal(): AbortSignal {\n return this.abortController.signal;\n }\n\n [Symbol.dispose](): void {\n this.abortController.abort();\n if (logPFrames()) {\n this.logger(\"info\", `PTable definition disposed (pTableHandle = ${this.pTableHandle})`);\n }\n }\n}\n\nexport class PTableDefPool extends RefCountPoolBase<FullPTableDef, PTableHandle, PTableDefHolder> {\n constructor(private readonly logger: PFrameInternal.Logger) {\n super();\n }\n\n protected calculateParamsKey(params: FullPTableDef): PTableHandle {\n return stableKeyFromFullPTableDef(params);\n }\n\n protected createNewResource(params: FullPTableDef, key: PTableHandle): PTableDefHolder {\n return new PTableDefHolder(params, key, this.logger);\n }\n\n public getByKey(key: PTableHandle): PTableDefHolder {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PTable handle`);\n error.cause = new Error(`PTable definition for handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,kBAAb,MAAmD;CACjD,AAAiB,kBAAkB,IAAI,iBAAiB;CAExD,YACE,AAAgB,KAChB,AAAiB,cACjB,AAAiB,QACjB;EAHgB;EACC;EACA;AAEjB,MAAI,YAAY,CACd,MAAK,OAAO,QAAQ,2CAA2C,KAAK,aAAa,GAAG;;CAIxF,IAAW,gBAA6B;AACtC,SAAO,KAAK,gBAAgB;;CAG9B,CAAC,OAAO,WAAiB;AACvB,OAAK,gBAAgB,OAAO;AAC5B,MAAI,YAAY,CACd,MAAK,OAAO,QAAQ,8CAA8C,KAAK,aAAa,GAAG;;;AAK7F,IAAa,gBAAb,cAAmC,iBAA+D;CAChG,YAAY,AAAiB,QAA+B;AAC1D,SAAO;EADoB;;CAI7B,AAAU,mBAAmB,QAAqC;AAChE,SAAO,2BAA2B,OAAO;;CAG3C,AAAU,kBAAkB,QAAuB,KAAoC;AACrF,SAAO,IAAI,gBAAgB,QAAQ,KAAK,KAAK,OAAO;;CAGtD,AAAO,SAAS,KAAoC;EAClD,MAAM,WAAW,MAAM,YAAY,IAAI;AACvC,MAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAI,kBAAkB,wBAAwB;AAC5D,SAAM,wBAAQ,IAAI,MAAM,gCAAgC,IAAI,YAAY;AACxE,SAAM;;AAER,SAAO"}
|
package/dist/ptable_pool.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
|
|
2
2
|
const require_logging = require('./logging.cjs');
|
|
3
3
|
const require_ptable_shared = require('./ptable_shared.cjs');
|
|
4
|
-
let
|
|
4
|
+
let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
|
|
5
5
|
let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
|
|
6
6
|
|
|
7
7
|
//#region src/ptable_pool.ts
|
|
@@ -34,11 +34,11 @@ var PTablePool = class extends _milaboratories_ts_helpers.RefCountPoolBase {
|
|
|
34
34
|
return require_ptable_shared.stableKeyFromFullPTableDef(params);
|
|
35
35
|
}
|
|
36
36
|
createNewResource(params, key) {
|
|
37
|
-
if (require_logging.logPFrames()) this.logger("info", `PTable creation (pTableHandle = ${key}): ${JSON.stringify(params,
|
|
37
|
+
if (require_logging.logPFrames()) this.logger("info", `PTable creation (pTableHandle = ${key}): ${JSON.stringify(params, _milaboratories_pl_model_common.bigintReplacer)}`);
|
|
38
38
|
switch (params.type) {
|
|
39
39
|
case "v1": return this.createNewResourceV1(params, key);
|
|
40
40
|
case "v2": return this.createNewResourceV2(params, key);
|
|
41
|
-
default: throw new
|
|
41
|
+
default: throw new _milaboratories_pl_model_common.PFrameDriverError(`Unsupported FullPTableDef type: ${params.type}`);
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
createNewResourceV1(params, key) {
|
|
@@ -82,7 +82,7 @@ var PTablePool = class extends _milaboratories_ts_helpers.RefCountPoolBase {
|
|
|
82
82
|
getByKey(key) {
|
|
83
83
|
const resource = super.tryGetByKey(key);
|
|
84
84
|
if (!resource) {
|
|
85
|
-
const error = new
|
|
85
|
+
const error = new _milaboratories_pl_model_common.PFrameDriverError(`Invalid PTable handle`);
|
|
86
86
|
error.cause = /* @__PURE__ */ new Error(`PTable with handle ${key} not found`);
|
|
87
87
|
throw error;
|
|
88
88
|
}
|
|
@@ -98,7 +98,7 @@ function hasArtificialColumns(entry) {
|
|
|
98
98
|
case "full":
|
|
99
99
|
case "inner": return entry.entries.some(hasArtificialColumns);
|
|
100
100
|
case "outer": return hasArtificialColumns(entry.primary) || entry.secondary.some(hasArtificialColumns);
|
|
101
|
-
default: (0,
|
|
101
|
+
default: (0, _milaboratories_pl_model_common.assertNever)(entry);
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
function joinEntryToInternal(entry) {
|
|
@@ -143,7 +143,7 @@ function joinEntryToInternal(entry) {
|
|
|
143
143
|
primary: joinEntryToInternal(entry.primary),
|
|
144
144
|
secondary: entry.secondary.map((col) => joinEntryToInternal(col))
|
|
145
145
|
};
|
|
146
|
-
default: throw new
|
|
146
|
+
default: throw new _milaboratories_pl_model_common.PFrameDriverError(`unsupported PFrame join entry type: ${type}`);
|
|
147
147
|
}
|
|
148
148
|
}
|
|
149
149
|
|