@milaboratories/pf-driver 1.0.54 → 1.0.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/driver_double.cjs +1 -1
- package/dist/driver_double.cjs.map +1 -1
- package/dist/driver_double.d.ts.map +1 -1
- package/dist/driver_double.js +1 -1
- package/dist/driver_double.js.map +1 -1
- package/dist/ptable_pool.cjs +0 -3
- package/dist/ptable_pool.cjs.map +1 -1
- package/dist/ptable_pool.d.ts.map +1 -1
- package/dist/ptable_pool.js +0 -3
- package/dist/ptable_pool.js.map +1 -1
- package/package.json +6 -6
- package/src/driver_double.test.ts +175 -0
- package/src/driver_double.ts +1 -1
- package/src/ptable_pool.ts +0 -7
package/dist/driver_double.cjs
CHANGED
|
@@ -89,7 +89,7 @@ class RemoteBlobProviderImpl {
|
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
// It's mock for testing purposes, not a real test!
|
|
92
|
-
async function createPFrameDriverDouble({ dataFolder = node_os.tmpdir(), logger =
|
|
92
|
+
async function createPFrameDriverDouble({ dataFolder = node_os.tmpdir(), logger = console.log, }) {
|
|
93
93
|
const localBlobProvider = new LocalBlobProviderImpl(dataFolder);
|
|
94
94
|
const remoteBlobProvider = await RemoteBlobProviderImpl.init(dataFolder, logger, {});
|
|
95
95
|
const resolveDataInfo = (spec, data) => (model.isDataInfo(data) ? data : data_info_helpers.makeJsonDataInfo(spec, data));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver_double.cjs","sources":["../src/driver_double.ts"],"sourcesContent":["import {\n isDataInfo,\n PFrameDriverError,\n type Branded,\n type PColumnSpec,\n type PColumnValues,\n} from \"@platforma-sdk/model\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { HttpHelpers } from \"@milaboratories/pframes-rs-node\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { AbstractInternalPFrameDriver } from \"./driver_decl\";\nimport {\n AbstractPFrameDriver,\n type LocalBlobProvider,\n type RemoteBlobProvider,\n} from \"./driver_impl\";\nimport { makeJsonDataInfo } from \"./data_info_helpers\";\n\nexport type FileName = Branded<string, \"FileName\">;\nexport type FilePath = Branded<string, \"FilePath\">;\nexport type FolderPath = Branded<string, \"FolderPath\">;\n\nexport function makeFolderPath(dataFolder: string): FolderPath {\n if (!fs.statSync(dataFolder, { throwIfNoEntry: false })?.isDirectory()) {\n const error = new PFrameDriverError(`Invalid data folder`);\n error.cause = new Error(`Folder ${dataFolder} does not exist`);\n throw error;\n }\n return dataFolder as FolderPath;\n}\n\nfunction makeBlobId(res: FileName): PFrameInternal.PFrameBlobId {\n return res as string as PFrameInternal.PFrameBlobId;\n}\n\nclass LocalBlobProviderImpl\n extends RefCountPoolBase<FileName, PFrameInternal.PFrameBlobId, FilePath>\n implements LocalBlobProvider<FileName>\n{\n constructor(private readonly dataFolder: FolderPath) {\n super();\n }\n\n protected calculateParamsKey(params: FileName): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(params: FileName, _key: PFrameInternal.PFrameBlobId): FilePath {\n const filePath = path.join(this.dataFolder, params);\n if (!fs.statSync(filePath, { throwIfNoEntry: false })?.isFile()) {\n const error = new PFrameDriverError(`Invalid file name`);\n error.cause = new Error(`File ${filePath} does not exist`);\n throw error;\n }\n return filePath as FilePath;\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): FilePath {\n const resource = super.tryGetByKey(blobId);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid blob id`);\n error.cause = new Error(`Blob with id ${blobId} not found.`);\n throw error;\n }\n return resource;\n }\n\n public makeDataSource(\n signal: AbortSignal,\n ): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\"> {\n return {\n preloadBlob: async (_blobIds: PFrameInternal.PFrameBlobId[]) => {},\n resolveBlobContent: async (blobId: PFrameInternal.PFrameBlobId) => {\n const filePath = this.getByKey(blobId);\n return await fs.promises.readFile(filePath, { signal });\n },\n };\n }\n}\n\nclass RemoteBlobProviderImpl implements RemoteBlobProvider<FileName> {\n constructor(\n private readonly pool: LocalBlobProviderImpl,\n private readonly server: PFrameInternal.HttpServer,\n ) {}\n\n public static async init(\n dataFolder: FolderPath,\n logger: PFrameInternal.Logger,\n serverOptions: Omit<PFrameInternal.HttpServerOptions, \"handler\">,\n ): Promise<RemoteBlobProviderImpl> {\n const pool = new LocalBlobProviderImpl(dataFolder);\n\n const underlyingStore = await HttpHelpers.createFsStore({ rootDir: dataFolder, logger });\n const store: PFrameInternal.ObjectStore = {\n request: (filename, params) => {\n const blobId = filename.slice(0, -PFrameInternal.ParquetExtension.length);\n return underlyingStore.request(blobId as PFrameInternal.ParquetFileName, params);\n },\n };\n\n const handler = HttpHelpers.createRequestHandler({ store });\n const server = await HttpHelpers.createHttpServer({ ...serverOptions, handler });\n\n return new RemoteBlobProviderImpl(pool, server);\n }\n\n public acquire(params: FileName): PoolEntry<PFrameInternal.PFrameBlobId> {\n return this.pool.acquire(params);\n }\n\n public httpServerInfo(): PFrameInternal.HttpServerInfo {\n return this.server.info;\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.server.stop();\n }\n}\n\nexport type InternalPFrameDriverDouble = AbstractInternalPFrameDriver<\n PFrameInternal.DataInfo<FileName> | PColumnValues\n>;\n\n// It's mock for testing purposes, not a real test!\nexport async function createPFrameDriverDouble({\n dataFolder = tmpdir() as FolderPath,\n logger =
|
|
1
|
+
{"version":3,"file":"driver_double.cjs","sources":["../src/driver_double.ts"],"sourcesContent":["import {\n isDataInfo,\n PFrameDriverError,\n type Branded,\n type PColumnSpec,\n type PColumnValues,\n} from \"@platforma-sdk/model\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { HttpHelpers } from \"@milaboratories/pframes-rs-node\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { AbstractInternalPFrameDriver } from \"./driver_decl\";\nimport {\n AbstractPFrameDriver,\n type LocalBlobProvider,\n type RemoteBlobProvider,\n} from \"./driver_impl\";\nimport { makeJsonDataInfo } from \"./data_info_helpers\";\n\nexport type FileName = Branded<string, \"FileName\">;\nexport type FilePath = Branded<string, \"FilePath\">;\nexport type FolderPath = Branded<string, \"FolderPath\">;\n\nexport function makeFolderPath(dataFolder: string): FolderPath {\n if (!fs.statSync(dataFolder, { throwIfNoEntry: false })?.isDirectory()) {\n const error = new PFrameDriverError(`Invalid data folder`);\n error.cause = new Error(`Folder ${dataFolder} does not exist`);\n throw error;\n }\n return dataFolder as FolderPath;\n}\n\nfunction makeBlobId(res: FileName): PFrameInternal.PFrameBlobId {\n return res as string as PFrameInternal.PFrameBlobId;\n}\n\nclass LocalBlobProviderImpl\n extends RefCountPoolBase<FileName, PFrameInternal.PFrameBlobId, FilePath>\n implements LocalBlobProvider<FileName>\n{\n constructor(private readonly dataFolder: FolderPath) {\n super();\n }\n\n protected calculateParamsKey(params: FileName): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(params: FileName, _key: PFrameInternal.PFrameBlobId): FilePath {\n const filePath = path.join(this.dataFolder, params);\n if (!fs.statSync(filePath, { throwIfNoEntry: false })?.isFile()) {\n const error = new PFrameDriverError(`Invalid file name`);\n error.cause = new Error(`File ${filePath} does not exist`);\n throw error;\n }\n return filePath as FilePath;\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): FilePath {\n const resource = super.tryGetByKey(blobId);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid blob id`);\n error.cause = new Error(`Blob with id ${blobId} not found.`);\n throw error;\n }\n return resource;\n }\n\n public makeDataSource(\n signal: AbortSignal,\n ): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\"> {\n return {\n preloadBlob: async (_blobIds: PFrameInternal.PFrameBlobId[]) => {},\n resolveBlobContent: async (blobId: PFrameInternal.PFrameBlobId) => {\n const filePath = this.getByKey(blobId);\n return await fs.promises.readFile(filePath, { signal });\n },\n };\n }\n}\n\nclass RemoteBlobProviderImpl implements RemoteBlobProvider<FileName> {\n constructor(\n private readonly pool: LocalBlobProviderImpl,\n private readonly server: PFrameInternal.HttpServer,\n ) {}\n\n public static async init(\n dataFolder: FolderPath,\n logger: PFrameInternal.Logger,\n serverOptions: Omit<PFrameInternal.HttpServerOptions, \"handler\">,\n ): Promise<RemoteBlobProviderImpl> {\n const pool = new LocalBlobProviderImpl(dataFolder);\n\n const underlyingStore = await HttpHelpers.createFsStore({ rootDir: dataFolder, logger });\n const store: PFrameInternal.ObjectStore = {\n request: (filename, params) => {\n const blobId = filename.slice(0, -PFrameInternal.ParquetExtension.length);\n return underlyingStore.request(blobId as PFrameInternal.ParquetFileName, params);\n },\n };\n\n const handler = HttpHelpers.createRequestHandler({ store });\n const server = await HttpHelpers.createHttpServer({ ...serverOptions, handler });\n\n return new RemoteBlobProviderImpl(pool, server);\n }\n\n public acquire(params: FileName): PoolEntry<PFrameInternal.PFrameBlobId> {\n return this.pool.acquire(params);\n }\n\n public httpServerInfo(): PFrameInternal.HttpServerInfo {\n return this.server.info;\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.server.stop();\n }\n}\n\nexport type InternalPFrameDriverDouble = AbstractInternalPFrameDriver<\n PFrameInternal.DataInfo<FileName> | PColumnValues\n>;\n\n// It's mock for testing purposes, not a real test!\nexport async function createPFrameDriverDouble({\n dataFolder = tmpdir() as FolderPath,\n logger = console.log,\n}: {\n dataFolder?: FolderPath;\n logger?: PFrameInternal.Logger;\n}): Promise<InternalPFrameDriverDouble> {\n const localBlobProvider = new LocalBlobProviderImpl(dataFolder);\n const remoteBlobProvider = await RemoteBlobProviderImpl.init(dataFolder, logger, {});\n\n const resolveDataInfo = (\n spec: PColumnSpec,\n data: PFrameInternal.DataInfo<FileName> | PColumnValues,\n ) => (isDataInfo(data) ? data : makeJsonDataInfo(spec, data));\n\n return new AbstractPFrameDriver({\n logger,\n localBlobProvider,\n remoteBlobProvider,\n resolveDataInfo,\n });\n}\n"],"names":["PFrameDriverError","RefCountPoolBase","HttpHelpers","PFrameInternal","tmpdir","isDataInfo","makeJsonDataInfo","AbstractPFrameDriver"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver_double.d.ts","sourceRoot":"","sources":["../src/driver_double.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,OAAO,EAEZ,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAMvE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAQlE,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AACnD,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AACnD,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAEvD,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAO7D;AA2FD,MAAM,MAAM,0BAA0B,GAAG,4BAA4B,CACnE,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,aAAa,CAClD,CAAC;AAGF,wBAAsB,wBAAwB,CAAC,EAC7C,UAAmC,EACnC,
|
|
1
|
+
{"version":3,"file":"driver_double.d.ts","sourceRoot":"","sources":["../src/driver_double.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,OAAO,EAEZ,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAMvE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAQlE,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AACnD,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AACnD,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAEvD,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAO7D;AA2FD,MAAM,MAAM,0BAA0B,GAAG,4BAA4B,CACnE,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,aAAa,CAClD,CAAC;AAGF,wBAAsB,wBAAwB,CAAC,EAC7C,UAAmC,EACnC,MAAoB,GACrB,EAAE;IACD,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC;CAChC,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAetC"}
|
package/dist/driver_double.js
CHANGED
|
@@ -87,7 +87,7 @@ class RemoteBlobProviderImpl {
|
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
// It's mock for testing purposes, not a real test!
|
|
90
|
-
async function createPFrameDriverDouble({ dataFolder = tmpdir(), logger =
|
|
90
|
+
async function createPFrameDriverDouble({ dataFolder = tmpdir(), logger = console.log, }) {
|
|
91
91
|
const localBlobProvider = new LocalBlobProviderImpl(dataFolder);
|
|
92
92
|
const remoteBlobProvider = await RemoteBlobProviderImpl.init(dataFolder, logger, {});
|
|
93
93
|
const resolveDataInfo = (spec, data) => (isDataInfo(data) ? data : makeJsonDataInfo(spec, data));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver_double.js","sources":["../src/driver_double.ts"],"sourcesContent":["import {\n isDataInfo,\n PFrameDriverError,\n type Branded,\n type PColumnSpec,\n type PColumnValues,\n} from \"@platforma-sdk/model\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { HttpHelpers } from \"@milaboratories/pframes-rs-node\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { AbstractInternalPFrameDriver } from \"./driver_decl\";\nimport {\n AbstractPFrameDriver,\n type LocalBlobProvider,\n type RemoteBlobProvider,\n} from \"./driver_impl\";\nimport { makeJsonDataInfo } from \"./data_info_helpers\";\n\nexport type FileName = Branded<string, \"FileName\">;\nexport type FilePath = Branded<string, \"FilePath\">;\nexport type FolderPath = Branded<string, \"FolderPath\">;\n\nexport function makeFolderPath(dataFolder: string): FolderPath {\n if (!fs.statSync(dataFolder, { throwIfNoEntry: false })?.isDirectory()) {\n const error = new PFrameDriverError(`Invalid data folder`);\n error.cause = new Error(`Folder ${dataFolder} does not exist`);\n throw error;\n }\n return dataFolder as FolderPath;\n}\n\nfunction makeBlobId(res: FileName): PFrameInternal.PFrameBlobId {\n return res as string as PFrameInternal.PFrameBlobId;\n}\n\nclass LocalBlobProviderImpl\n extends RefCountPoolBase<FileName, PFrameInternal.PFrameBlobId, FilePath>\n implements LocalBlobProvider<FileName>\n{\n constructor(private readonly dataFolder: FolderPath) {\n super();\n }\n\n protected calculateParamsKey(params: FileName): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(params: FileName, _key: PFrameInternal.PFrameBlobId): FilePath {\n const filePath = path.join(this.dataFolder, params);\n if (!fs.statSync(filePath, { throwIfNoEntry: false })?.isFile()) {\n const error = new PFrameDriverError(`Invalid file name`);\n error.cause = new Error(`File ${filePath} does not exist`);\n throw error;\n }\n return filePath as FilePath;\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): FilePath {\n const resource = super.tryGetByKey(blobId);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid blob id`);\n error.cause = new Error(`Blob with id ${blobId} not found.`);\n throw error;\n }\n return resource;\n }\n\n public makeDataSource(\n signal: AbortSignal,\n ): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\"> {\n return {\n preloadBlob: async (_blobIds: PFrameInternal.PFrameBlobId[]) => {},\n resolveBlobContent: async (blobId: PFrameInternal.PFrameBlobId) => {\n const filePath = this.getByKey(blobId);\n return await fs.promises.readFile(filePath, { signal });\n },\n };\n }\n}\n\nclass RemoteBlobProviderImpl implements RemoteBlobProvider<FileName> {\n constructor(\n private readonly pool: LocalBlobProviderImpl,\n private readonly server: PFrameInternal.HttpServer,\n ) {}\n\n public static async init(\n dataFolder: FolderPath,\n logger: PFrameInternal.Logger,\n serverOptions: Omit<PFrameInternal.HttpServerOptions, \"handler\">,\n ): Promise<RemoteBlobProviderImpl> {\n const pool = new LocalBlobProviderImpl(dataFolder);\n\n const underlyingStore = await HttpHelpers.createFsStore({ rootDir: dataFolder, logger });\n const store: PFrameInternal.ObjectStore = {\n request: (filename, params) => {\n const blobId = filename.slice(0, -PFrameInternal.ParquetExtension.length);\n return underlyingStore.request(blobId as PFrameInternal.ParquetFileName, params);\n },\n };\n\n const handler = HttpHelpers.createRequestHandler({ store });\n const server = await HttpHelpers.createHttpServer({ ...serverOptions, handler });\n\n return new RemoteBlobProviderImpl(pool, server);\n }\n\n public acquire(params: FileName): PoolEntry<PFrameInternal.PFrameBlobId> {\n return this.pool.acquire(params);\n }\n\n public httpServerInfo(): PFrameInternal.HttpServerInfo {\n return this.server.info;\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.server.stop();\n }\n}\n\nexport type InternalPFrameDriverDouble = AbstractInternalPFrameDriver<\n PFrameInternal.DataInfo<FileName> | PColumnValues\n>;\n\n// It's mock for testing purposes, not a real test!\nexport async function createPFrameDriverDouble({\n dataFolder = tmpdir() as FolderPath,\n logger =
|
|
1
|
+
{"version":3,"file":"driver_double.js","sources":["../src/driver_double.ts"],"sourcesContent":["import {\n isDataInfo,\n PFrameDriverError,\n type Branded,\n type PColumnSpec,\n type PColumnValues,\n} from \"@platforma-sdk/model\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { HttpHelpers } from \"@milaboratories/pframes-rs-node\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { AbstractInternalPFrameDriver } from \"./driver_decl\";\nimport {\n AbstractPFrameDriver,\n type LocalBlobProvider,\n type RemoteBlobProvider,\n} from \"./driver_impl\";\nimport { makeJsonDataInfo } from \"./data_info_helpers\";\n\nexport type FileName = Branded<string, \"FileName\">;\nexport type FilePath = Branded<string, \"FilePath\">;\nexport type FolderPath = Branded<string, \"FolderPath\">;\n\nexport function makeFolderPath(dataFolder: string): FolderPath {\n if (!fs.statSync(dataFolder, { throwIfNoEntry: false })?.isDirectory()) {\n const error = new PFrameDriverError(`Invalid data folder`);\n error.cause = new Error(`Folder ${dataFolder} does not exist`);\n throw error;\n }\n return dataFolder as FolderPath;\n}\n\nfunction makeBlobId(res: FileName): PFrameInternal.PFrameBlobId {\n return res as string as PFrameInternal.PFrameBlobId;\n}\n\nclass LocalBlobProviderImpl\n extends RefCountPoolBase<FileName, PFrameInternal.PFrameBlobId, FilePath>\n implements LocalBlobProvider<FileName>\n{\n constructor(private readonly dataFolder: FolderPath) {\n super();\n }\n\n protected calculateParamsKey(params: FileName): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(params: FileName, _key: PFrameInternal.PFrameBlobId): FilePath {\n const filePath = path.join(this.dataFolder, params);\n if (!fs.statSync(filePath, { throwIfNoEntry: false })?.isFile()) {\n const error = new PFrameDriverError(`Invalid file name`);\n error.cause = new Error(`File ${filePath} does not exist`);\n throw error;\n }\n return filePath as FilePath;\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): FilePath {\n const resource = super.tryGetByKey(blobId);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid blob id`);\n error.cause = new Error(`Blob with id ${blobId} not found.`);\n throw error;\n }\n return resource;\n }\n\n public makeDataSource(\n signal: AbortSignal,\n ): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\"> {\n return {\n preloadBlob: async (_blobIds: PFrameInternal.PFrameBlobId[]) => {},\n resolveBlobContent: async (blobId: PFrameInternal.PFrameBlobId) => {\n const filePath = this.getByKey(blobId);\n return await fs.promises.readFile(filePath, { signal });\n },\n };\n }\n}\n\nclass RemoteBlobProviderImpl implements RemoteBlobProvider<FileName> {\n constructor(\n private readonly pool: LocalBlobProviderImpl,\n private readonly server: PFrameInternal.HttpServer,\n ) {}\n\n public static async init(\n dataFolder: FolderPath,\n logger: PFrameInternal.Logger,\n serverOptions: Omit<PFrameInternal.HttpServerOptions, \"handler\">,\n ): Promise<RemoteBlobProviderImpl> {\n const pool = new LocalBlobProviderImpl(dataFolder);\n\n const underlyingStore = await HttpHelpers.createFsStore({ rootDir: dataFolder, logger });\n const store: PFrameInternal.ObjectStore = {\n request: (filename, params) => {\n const blobId = filename.slice(0, -PFrameInternal.ParquetExtension.length);\n return underlyingStore.request(blobId as PFrameInternal.ParquetFileName, params);\n },\n };\n\n const handler = HttpHelpers.createRequestHandler({ store });\n const server = await HttpHelpers.createHttpServer({ ...serverOptions, handler });\n\n return new RemoteBlobProviderImpl(pool, server);\n }\n\n public acquire(params: FileName): PoolEntry<PFrameInternal.PFrameBlobId> {\n return this.pool.acquire(params);\n }\n\n public httpServerInfo(): PFrameInternal.HttpServerInfo {\n return this.server.info;\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.server.stop();\n }\n}\n\nexport type InternalPFrameDriverDouble = AbstractInternalPFrameDriver<\n PFrameInternal.DataInfo<FileName> | PColumnValues\n>;\n\n// It's mock for testing purposes, not a real test!\nexport async function createPFrameDriverDouble({\n dataFolder = tmpdir() as FolderPath,\n logger = console.log,\n}: {\n dataFolder?: FolderPath;\n logger?: PFrameInternal.Logger;\n}): Promise<InternalPFrameDriverDouble> {\n const localBlobProvider = new LocalBlobProviderImpl(dataFolder);\n const remoteBlobProvider = await RemoteBlobProviderImpl.init(dataFolder, logger, {});\n\n const resolveDataInfo = (\n spec: PColumnSpec,\n data: PFrameInternal.DataInfo<FileName> | PColumnValues,\n ) => (isDataInfo(data) ? data : makeJsonDataInfo(spec, data));\n\n return new AbstractPFrameDriver({\n logger,\n localBlobProvider,\n remoteBlobProvider,\n resolveDataInfo,\n });\n}\n"],"names":[],"mappings":"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"}
|
package/dist/ptable_pool.cjs
CHANGED
|
@@ -100,9 +100,6 @@ class PTablePool extends tsHelpers.RefCountPoolBase {
|
|
|
100
100
|
return new PTableHolder(pFrameHandle, combinedSignal, table);
|
|
101
101
|
}
|
|
102
102
|
createNewResourceV2(params, key) {
|
|
103
|
-
if (logging.logPFrames()) {
|
|
104
|
-
this.logger("info", `PTable creation (pTableHandle = ${key}): ` + `${JSON.stringify(params, model.bigintReplacer)}`);
|
|
105
|
-
}
|
|
106
103
|
const { pFrameHandle } = params;
|
|
107
104
|
const { pFramePromise, disposeSignal } = this.pFrames.getByKey(pFrameHandle);
|
|
108
105
|
const defDisposeSignal = this.pTableDefs.tryGetByKey(key)?.disposeSignal;
|
package/dist/ptable_pool.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ptable_pool.cjs","sources":["../src/ptable_pool.ts"],"sourcesContent":["import {\n assertNever,\n bigintReplacer,\n PFrameDriverError,\n type PFrameHandle,\n type PTableHandle,\n type JoinEntry,\n type JsonSerializable,\n type PColumnValue,\n type PObjectId,\n} from \"@platforma-sdk/model\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { logPFrames } from \"./logging\";\nimport type { PFramePool } from \"./pframe_pool\";\nimport {\n FullPTableDefV1,\n FullPTableDefV2,\n stableKeyFromFullPTableDef,\n type FullPTableDef,\n} from \"./ptable_shared\";\nimport type { PTableDefPool } from \"./ptable_def_pool\";\n\nexport class PTableHolder implements Disposable {\n private readonly abortController = new AbortController();\n private readonly combinedDisposeSignal: AbortSignal;\n\n constructor(\n public readonly pFrame: PFrameHandle,\n pFrameDisposeSignal: AbortSignal,\n public readonly pTablePromise: Promise<PFrameInternal.PTableV8>,\n private readonly predecessor?: PoolEntry<PTableHandle, PTableHolder>,\n ) {\n this.combinedDisposeSignal = AbortSignal.any([\n pFrameDisposeSignal,\n this.abortController.signal,\n ]);\n }\n\n public get disposeSignal(): AbortSignal {\n return this.combinedDisposeSignal;\n }\n\n [Symbol.dispose](): void {\n this.abortController.abort();\n this.predecessor?.unref();\n void this.pTablePromise\n .then((pTable) => pTable.dispose())\n .catch(() => {\n /* mute error */\n });\n }\n}\n\nexport class PTablePool<TreeEntry extends JsonSerializable> extends RefCountPoolBase<\n FullPTableDef,\n PTableHandle,\n PTableHolder\n> {\n constructor(\n private readonly pFrames: PFramePool<TreeEntry>,\n private readonly pTableDefs: PTableDefPool,\n private readonly logger: PFrameInternal.Logger,\n ) {\n super();\n }\n\n protected calculateParamsKey(params: FullPTableDef): PTableHandle {\n return stableKeyFromFullPTableDef(params);\n }\n\n protected createNewResource(params: FullPTableDef, key: PTableHandle): PTableHolder {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `PTable creation (pTableHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n\n switch (params.type) {\n case \"v1\":\n return this.createNewResourceV1(params, key);\n case \"v2\":\n return this.createNewResourceV2(params, key);\n default:\n // @ts-expect-error `params.type` is a string, but we want to make sure all cases are handled\n throw new PFrameDriverError(`Unsupported FullPTableDef type: ${params.type}`);\n }\n }\n\n protected createNewResourceV1(params: FullPTableDefV1, key: PTableHandle): PTableHolder {\n const { def, pFrameHandle } = params;\n const { pFramePromise, disposeSignal } = this.pFrames.getByKey(pFrameHandle);\n\n const defDisposeSignal = this.pTableDefs.tryGetByKey(key)?.disposeSignal;\n const combinedSignal = AbortSignal.any([disposeSignal, defDisposeSignal].filter((s) => !!s));\n\n // 3. Sort\n if (def.sorting.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...def,\n sorting: [],\n },\n });\n const {\n resource: { pTablePromise },\n } = predecessor;\n const sortedTable = pTablePromise.then((pTable) => pTable.sort(key, def.sorting));\n return new PTableHolder(pFrameHandle, combinedSignal, sortedTable, predecessor);\n }\n\n // 2. Filter (except the case with artificial columns where cartesian creates too many rows)\n if (!hasArtificialColumns(def.src) && def.filters.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...def,\n filters: [],\n },\n });\n const {\n resource: { pTablePromise },\n } = predecessor;\n const filteredTable = pTablePromise.then((pTable) => pTable.filter(key, def.filters));\n return new PTableHolder(pFrameHandle, combinedSignal, filteredTable, predecessor);\n }\n\n // 1. Join\n const table = pFramePromise.then((pFrame) =>\n pFrame.createTable(key, {\n src: joinEntryToInternal(def.src),\n // `def.filters` would be non-empty only when join has artificial columns\n filters: [...def.partitionFilters, ...def.filters],\n }),\n );\n return new PTableHolder(pFrameHandle, combinedSignal, table);\n }\n\n protected createNewResourceV2(params: FullPTableDefV2, key: PTableHandle): PTableHolder {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `PTable creation (pTableHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n\n const { pFrameHandle } = params;\n const { pFramePromise, disposeSignal } = this.pFrames.getByKey(pFrameHandle);\n\n const defDisposeSignal = this.pTableDefs.tryGetByKey(key)?.disposeSignal;\n const combinedSignal = AbortSignal.any([disposeSignal, defDisposeSignal].filter((s) => !!s));\n\n const table = pFramePromise.then((pFrame) => pFrame.createTableV2(key, params.def));\n return new PTableHolder(pFrameHandle, combinedSignal, table);\n }\n\n public getByKey(key: PTableHandle): PTableHolder {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PTable handle`);\n error.cause = new Error(`PTable with handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n\nfunction hasArtificialColumns<T>(entry: JoinEntry<T>): boolean {\n switch (entry.type) {\n case \"column\":\n case \"slicedColumn\":\n case \"inlineColumn\":\n return false;\n case \"artificialColumn\":\n return true;\n case \"full\":\n case \"inner\":\n return entry.entries.some(hasArtificialColumns);\n case \"outer\":\n return hasArtificialColumns(entry.primary) || entry.secondary.some(hasArtificialColumns);\n default:\n assertNever(entry);\n }\n}\n\nfunction joinEntryToInternal(entry: JoinEntry<PObjectId>): PFrameInternal.JoinEntryV4 {\n const type = entry.type;\n switch (type) {\n case \"column\":\n return {\n type: \"column\",\n columnId: entry.column,\n };\n case \"slicedColumn\":\n return {\n type: \"slicedColumn\",\n columnId: entry.column,\n newId: entry.newId,\n axisFilters: entry.axisFilters,\n };\n case \"artificialColumn\":\n return {\n type: \"artificialColumn\",\n columnId: entry.column,\n newId: entry.newId,\n axesIndices: entry.axesIndices,\n };\n case \"inlineColumn\":\n return {\n type: \"inlineColumn\",\n newId: entry.column.id,\n spec: entry.column.spec,\n dataInfo: {\n type: \"Json\",\n keyLength: entry.column.spec.axesSpec.length,\n data: entry.column.data.reduce(\n (acc, row) => {\n acc[JSON.stringify(row.key)] = row.val;\n return acc;\n },\n {} as Record<string, PColumnValue>,\n ),\n },\n };\n case \"inner\":\n case \"full\":\n return {\n type: entry.type,\n entries: entry.entries.map((col) => joinEntryToInternal(col)),\n };\n case \"outer\":\n return {\n type: \"outer\",\n primary: joinEntryToInternal(entry.primary),\n secondary: entry.secondary.map((col) => joinEntryToInternal(col)),\n };\n default:\n throw new PFrameDriverError(`unsupported PFrame join entry type: ${type satisfies never}`);\n }\n}\n"],"names":["RefCountPoolBase","stableKeyFromFullPTableDef","logPFrames","bigintReplacer","PFrameDriverError","assertNever"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ptable_pool.cjs","sources":["../src/ptable_pool.ts"],"sourcesContent":["import {\n assertNever,\n bigintReplacer,\n PFrameDriverError,\n type PFrameHandle,\n type PTableHandle,\n type JoinEntry,\n type JsonSerializable,\n type PColumnValue,\n type PObjectId,\n} from \"@platforma-sdk/model\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { logPFrames } from \"./logging\";\nimport type { PFramePool } from \"./pframe_pool\";\nimport {\n FullPTableDefV1,\n FullPTableDefV2,\n stableKeyFromFullPTableDef,\n type FullPTableDef,\n} from \"./ptable_shared\";\nimport type { PTableDefPool } from \"./ptable_def_pool\";\n\nexport class PTableHolder implements Disposable {\n private readonly abortController = new AbortController();\n private readonly combinedDisposeSignal: AbortSignal;\n\n constructor(\n public readonly pFrame: PFrameHandle,\n pFrameDisposeSignal: AbortSignal,\n public readonly pTablePromise: Promise<PFrameInternal.PTableV8>,\n private readonly predecessor?: PoolEntry<PTableHandle, PTableHolder>,\n ) {\n this.combinedDisposeSignal = AbortSignal.any([\n pFrameDisposeSignal,\n this.abortController.signal,\n ]);\n }\n\n public get disposeSignal(): AbortSignal {\n return this.combinedDisposeSignal;\n }\n\n [Symbol.dispose](): void {\n this.abortController.abort();\n this.predecessor?.unref();\n void this.pTablePromise\n .then((pTable) => pTable.dispose())\n .catch(() => {\n /* mute error */\n });\n }\n}\n\nexport class PTablePool<TreeEntry extends JsonSerializable> extends RefCountPoolBase<\n FullPTableDef,\n PTableHandle,\n PTableHolder\n> {\n constructor(\n private readonly pFrames: PFramePool<TreeEntry>,\n private readonly pTableDefs: PTableDefPool,\n private readonly logger: PFrameInternal.Logger,\n ) {\n super();\n }\n\n protected calculateParamsKey(params: FullPTableDef): PTableHandle {\n return stableKeyFromFullPTableDef(params);\n }\n\n protected createNewResource(params: FullPTableDef, key: PTableHandle): PTableHolder {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `PTable creation (pTableHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n\n switch (params.type) {\n case \"v1\":\n return this.createNewResourceV1(params, key);\n case \"v2\":\n return this.createNewResourceV2(params, key);\n default:\n // @ts-expect-error `params.type` is a string, but we want to make sure all cases are handled\n throw new PFrameDriverError(`Unsupported FullPTableDef type: ${params.type}`);\n }\n }\n\n protected createNewResourceV1(params: FullPTableDefV1, key: PTableHandle): PTableHolder {\n const { def, pFrameHandle } = params;\n const { pFramePromise, disposeSignal } = this.pFrames.getByKey(pFrameHandle);\n\n const defDisposeSignal = this.pTableDefs.tryGetByKey(key)?.disposeSignal;\n const combinedSignal = AbortSignal.any([disposeSignal, defDisposeSignal].filter((s) => !!s));\n\n // 3. Sort\n if (def.sorting.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...def,\n sorting: [],\n },\n });\n const {\n resource: { pTablePromise },\n } = predecessor;\n const sortedTable = pTablePromise.then((pTable) => pTable.sort(key, def.sorting));\n return new PTableHolder(pFrameHandle, combinedSignal, sortedTable, predecessor);\n }\n\n // 2. Filter (except the case with artificial columns where cartesian creates too many rows)\n if (!hasArtificialColumns(def.src) && def.filters.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...def,\n filters: [],\n },\n });\n const {\n resource: { pTablePromise },\n } = predecessor;\n const filteredTable = pTablePromise.then((pTable) => pTable.filter(key, def.filters));\n return new PTableHolder(pFrameHandle, combinedSignal, filteredTable, predecessor);\n }\n\n // 1. Join\n const table = pFramePromise.then((pFrame) =>\n pFrame.createTable(key, {\n src: joinEntryToInternal(def.src),\n // `def.filters` would be non-empty only when join has artificial columns\n filters: [...def.partitionFilters, ...def.filters],\n }),\n );\n return new PTableHolder(pFrameHandle, combinedSignal, table);\n }\n\n protected createNewResourceV2(params: FullPTableDefV2, key: PTableHandle): PTableHolder {\n const { pFrameHandle } = params;\n const { pFramePromise, disposeSignal } = this.pFrames.getByKey(pFrameHandle);\n\n const defDisposeSignal = this.pTableDefs.tryGetByKey(key)?.disposeSignal;\n const combinedSignal = AbortSignal.any([disposeSignal, defDisposeSignal].filter((s) => !!s));\n\n const table = pFramePromise.then((pFrame) => pFrame.createTableV2(key, params.def));\n return new PTableHolder(pFrameHandle, combinedSignal, table);\n }\n\n public getByKey(key: PTableHandle): PTableHolder {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PTable handle`);\n error.cause = new Error(`PTable with handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n\nfunction hasArtificialColumns<T>(entry: JoinEntry<T>): boolean {\n switch (entry.type) {\n case \"column\":\n case \"slicedColumn\":\n case \"inlineColumn\":\n return false;\n case \"artificialColumn\":\n return true;\n case \"full\":\n case \"inner\":\n return entry.entries.some(hasArtificialColumns);\n case \"outer\":\n return hasArtificialColumns(entry.primary) || entry.secondary.some(hasArtificialColumns);\n default:\n assertNever(entry);\n }\n}\n\nfunction joinEntryToInternal(entry: JoinEntry<PObjectId>): PFrameInternal.JoinEntryV4 {\n const type = entry.type;\n switch (type) {\n case \"column\":\n return {\n type: \"column\",\n columnId: entry.column,\n };\n case \"slicedColumn\":\n return {\n type: \"slicedColumn\",\n columnId: entry.column,\n newId: entry.newId,\n axisFilters: entry.axisFilters,\n };\n case \"artificialColumn\":\n return {\n type: \"artificialColumn\",\n columnId: entry.column,\n newId: entry.newId,\n axesIndices: entry.axesIndices,\n };\n case \"inlineColumn\":\n return {\n type: \"inlineColumn\",\n newId: entry.column.id,\n spec: entry.column.spec,\n dataInfo: {\n type: \"Json\",\n keyLength: entry.column.spec.axesSpec.length,\n data: entry.column.data.reduce(\n (acc, row) => {\n acc[JSON.stringify(row.key)] = row.val;\n return acc;\n },\n {} as Record<string, PColumnValue>,\n ),\n },\n };\n case \"inner\":\n case \"full\":\n return {\n type: entry.type,\n entries: entry.entries.map((col) => joinEntryToInternal(col)),\n };\n case \"outer\":\n return {\n type: \"outer\",\n primary: joinEntryToInternal(entry.primary),\n secondary: entry.secondary.map((col) => joinEntryToInternal(col)),\n };\n default:\n throw new PFrameDriverError(`unsupported PFrame join entry type: ${type satisfies never}`);\n }\n}\n"],"names":["RefCountPoolBase","stableKeyFromFullPTableDef","logPFrames","bigintReplacer","PFrameDriverError","assertNever"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ptable_pool.d.ts","sourceRoot":"","sources":["../src/ptable_pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,YAAY,EAEjB,KAAK,gBAAgB,EAGtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,eAAe,EACf,eAAe,EAEf,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,qBAAa,YAAa,YAAW,UAAU;aAK3B,MAAM,EAAE,YAAY;aAEpB,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC;IAC/D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAP/B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IACzD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAc;gBAGlC,MAAM,EAAE,YAAY,EACpC,mBAAmB,EAAE,WAAW,EAChB,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,EAC9C,WAAW,CAAC,EAAE,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,YAAA;IAQtE,IAAW,aAAa,IAAI,WAAW,CAEtC;IAED,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CASzB;AAED,qBAAa,UAAU,CAAC,SAAS,SAAS,gBAAgB,CAAE,SAAQ,gBAAgB,CAClF,aAAa,EACb,YAAY,EACZ,YAAY,CACb;IAEG,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,EAC9B,UAAU,EAAE,aAAa,EACzB,MAAM,EAAE,cAAc,CAAC,MAAM;IAKhD,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,YAAY;IAIjE,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,GAAG,YAAY;IAmBnF,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,YAAY,GAAG,YAAY;IAkDvF,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,YAAY,GAAG,YAAY;
|
|
1
|
+
{"version":3,"file":"ptable_pool.d.ts","sourceRoot":"","sources":["../src/ptable_pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,YAAY,EAEjB,KAAK,gBAAgB,EAGtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,eAAe,EACf,eAAe,EAEf,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,qBAAa,YAAa,YAAW,UAAU;aAK3B,MAAM,EAAE,YAAY;aAEpB,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC;IAC/D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAP/B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IACzD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAc;gBAGlC,MAAM,EAAE,YAAY,EACpC,mBAAmB,EAAE,WAAW,EAChB,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,EAC9C,WAAW,CAAC,EAAE,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,YAAA;IAQtE,IAAW,aAAa,IAAI,WAAW,CAEtC;IAED,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CASzB;AAED,qBAAa,UAAU,CAAC,SAAS,SAAS,gBAAgB,CAAE,SAAQ,gBAAgB,CAClF,aAAa,EACb,YAAY,EACZ,YAAY,CACb;IAEG,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,EAC9B,UAAU,EAAE,aAAa,EACzB,MAAM,EAAE,cAAc,CAAC,MAAM;IAKhD,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,YAAY;IAIjE,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,GAAG,YAAY;IAmBnF,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,YAAY,GAAG,YAAY;IAkDvF,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,YAAY,GAAG,YAAY;IAWhF,QAAQ,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;CASjD"}
|
package/dist/ptable_pool.js
CHANGED
|
@@ -98,9 +98,6 @@ class PTablePool extends RefCountPoolBase {
|
|
|
98
98
|
return new PTableHolder(pFrameHandle, combinedSignal, table);
|
|
99
99
|
}
|
|
100
100
|
createNewResourceV2(params, key) {
|
|
101
|
-
if (logPFrames()) {
|
|
102
|
-
this.logger("info", `PTable creation (pTableHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`);
|
|
103
|
-
}
|
|
104
101
|
const { pFrameHandle } = params;
|
|
105
102
|
const { pFramePromise, disposeSignal } = this.pFrames.getByKey(pFrameHandle);
|
|
106
103
|
const defDisposeSignal = this.pTableDefs.tryGetByKey(key)?.disposeSignal;
|
package/dist/ptable_pool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ptable_pool.js","sources":["../src/ptable_pool.ts"],"sourcesContent":["import {\n assertNever,\n bigintReplacer,\n PFrameDriverError,\n type PFrameHandle,\n type PTableHandle,\n type JoinEntry,\n type JsonSerializable,\n type PColumnValue,\n type PObjectId,\n} from \"@platforma-sdk/model\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { logPFrames } from \"./logging\";\nimport type { PFramePool } from \"./pframe_pool\";\nimport {\n FullPTableDefV1,\n FullPTableDefV2,\n stableKeyFromFullPTableDef,\n type FullPTableDef,\n} from \"./ptable_shared\";\nimport type { PTableDefPool } from \"./ptable_def_pool\";\n\nexport class PTableHolder implements Disposable {\n private readonly abortController = new AbortController();\n private readonly combinedDisposeSignal: AbortSignal;\n\n constructor(\n public readonly pFrame: PFrameHandle,\n pFrameDisposeSignal: AbortSignal,\n public readonly pTablePromise: Promise<PFrameInternal.PTableV8>,\n private readonly predecessor?: PoolEntry<PTableHandle, PTableHolder>,\n ) {\n this.combinedDisposeSignal = AbortSignal.any([\n pFrameDisposeSignal,\n this.abortController.signal,\n ]);\n }\n\n public get disposeSignal(): AbortSignal {\n return this.combinedDisposeSignal;\n }\n\n [Symbol.dispose](): void {\n this.abortController.abort();\n this.predecessor?.unref();\n void this.pTablePromise\n .then((pTable) => pTable.dispose())\n .catch(() => {\n /* mute error */\n });\n }\n}\n\nexport class PTablePool<TreeEntry extends JsonSerializable> extends RefCountPoolBase<\n FullPTableDef,\n PTableHandle,\n PTableHolder\n> {\n constructor(\n private readonly pFrames: PFramePool<TreeEntry>,\n private readonly pTableDefs: PTableDefPool,\n private readonly logger: PFrameInternal.Logger,\n ) {\n super();\n }\n\n protected calculateParamsKey(params: FullPTableDef): PTableHandle {\n return stableKeyFromFullPTableDef(params);\n }\n\n protected createNewResource(params: FullPTableDef, key: PTableHandle): PTableHolder {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `PTable creation (pTableHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n\n switch (params.type) {\n case \"v1\":\n return this.createNewResourceV1(params, key);\n case \"v2\":\n return this.createNewResourceV2(params, key);\n default:\n // @ts-expect-error `params.type` is a string, but we want to make sure all cases are handled\n throw new PFrameDriverError(`Unsupported FullPTableDef type: ${params.type}`);\n }\n }\n\n protected createNewResourceV1(params: FullPTableDefV1, key: PTableHandle): PTableHolder {\n const { def, pFrameHandle } = params;\n const { pFramePromise, disposeSignal } = this.pFrames.getByKey(pFrameHandle);\n\n const defDisposeSignal = this.pTableDefs.tryGetByKey(key)?.disposeSignal;\n const combinedSignal = AbortSignal.any([disposeSignal, defDisposeSignal].filter((s) => !!s));\n\n // 3. Sort\n if (def.sorting.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...def,\n sorting: [],\n },\n });\n const {\n resource: { pTablePromise },\n } = predecessor;\n const sortedTable = pTablePromise.then((pTable) => pTable.sort(key, def.sorting));\n return new PTableHolder(pFrameHandle, combinedSignal, sortedTable, predecessor);\n }\n\n // 2. Filter (except the case with artificial columns where cartesian creates too many rows)\n if (!hasArtificialColumns(def.src) && def.filters.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...def,\n filters: [],\n },\n });\n const {\n resource: { pTablePromise },\n } = predecessor;\n const filteredTable = pTablePromise.then((pTable) => pTable.filter(key, def.filters));\n return new PTableHolder(pFrameHandle, combinedSignal, filteredTable, predecessor);\n }\n\n // 1. Join\n const table = pFramePromise.then((pFrame) =>\n pFrame.createTable(key, {\n src: joinEntryToInternal(def.src),\n // `def.filters` would be non-empty only when join has artificial columns\n filters: [...def.partitionFilters, ...def.filters],\n }),\n );\n return new PTableHolder(pFrameHandle, combinedSignal, table);\n }\n\n protected createNewResourceV2(params: FullPTableDefV2, key: PTableHandle): PTableHolder {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `PTable creation (pTableHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n\n const { pFrameHandle } = params;\n const { pFramePromise, disposeSignal } = this.pFrames.getByKey(pFrameHandle);\n\n const defDisposeSignal = this.pTableDefs.tryGetByKey(key)?.disposeSignal;\n const combinedSignal = AbortSignal.any([disposeSignal, defDisposeSignal].filter((s) => !!s));\n\n const table = pFramePromise.then((pFrame) => pFrame.createTableV2(key, params.def));\n return new PTableHolder(pFrameHandle, combinedSignal, table);\n }\n\n public getByKey(key: PTableHandle): PTableHolder {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PTable handle`);\n error.cause = new Error(`PTable with handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n\nfunction hasArtificialColumns<T>(entry: JoinEntry<T>): boolean {\n switch (entry.type) {\n case \"column\":\n case \"slicedColumn\":\n case \"inlineColumn\":\n return false;\n case \"artificialColumn\":\n return true;\n case \"full\":\n case \"inner\":\n return entry.entries.some(hasArtificialColumns);\n case \"outer\":\n return hasArtificialColumns(entry.primary) || entry.secondary.some(hasArtificialColumns);\n default:\n assertNever(entry);\n }\n}\n\nfunction joinEntryToInternal(entry: JoinEntry<PObjectId>): PFrameInternal.JoinEntryV4 {\n const type = entry.type;\n switch (type) {\n case \"column\":\n return {\n type: \"column\",\n columnId: entry.column,\n };\n case \"slicedColumn\":\n return {\n type: \"slicedColumn\",\n columnId: entry.column,\n newId: entry.newId,\n axisFilters: entry.axisFilters,\n };\n case \"artificialColumn\":\n return {\n type: \"artificialColumn\",\n columnId: entry.column,\n newId: entry.newId,\n axesIndices: entry.axesIndices,\n };\n case \"inlineColumn\":\n return {\n type: \"inlineColumn\",\n newId: entry.column.id,\n spec: entry.column.spec,\n dataInfo: {\n type: \"Json\",\n keyLength: entry.column.spec.axesSpec.length,\n data: entry.column.data.reduce(\n (acc, row) => {\n acc[JSON.stringify(row.key)] = row.val;\n return acc;\n },\n {} as Record<string, PColumnValue>,\n ),\n },\n };\n case \"inner\":\n case \"full\":\n return {\n type: entry.type,\n entries: entry.entries.map((col) => joinEntryToInternal(col)),\n };\n case \"outer\":\n return {\n type: \"outer\",\n primary: joinEntryToInternal(entry.primary),\n secondary: entry.secondary.map((col) => joinEntryToInternal(col)),\n };\n default:\n throw new PFrameDriverError(`unsupported PFrame join entry type: ${type satisfies never}`);\n }\n}\n"],"names":[],"mappings":";;;;;MAuBa,YAAY,CAAA;AAKL,IAAA,MAAA;AAEA,IAAA,aAAA;AACC,IAAA,WAAA;AAPF,IAAA,eAAe,GAAG,IAAI,eAAe,EAAE;AACvC,IAAA,qBAAqB;AAEtC,IAAA,WAAA,CACkB,MAAoB,EACpC,mBAAgC,EAChB,aAA+C,EAC9C,WAAmD,EAAA;QAHpD,IAAA,CAAA,MAAM,GAAN,MAAM;QAEN,IAAA,CAAA,aAAa,GAAb,aAAa;QACZ,IAAA,CAAA,WAAW,GAAX,WAAW;AAE5B,QAAA,IAAI,CAAC,qBAAqB,GAAG,WAAW,CAAC,GAAG,CAAC;YAC3C,mBAAmB;YACnB,IAAI,CAAC,eAAe,CAAC,MAAM;AAC5B,SAAA,CAAC;IACJ;AAEA,IAAA,IAAW,aAAa,GAAA;QACtB,OAAO,IAAI,CAAC,qBAAqB;IACnC;IAEA,CAAC,MAAM,CAAC,OAAO,CAAC,GAAA;AACd,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;AAC5B,QAAA,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE;QACzB,KAAK,IAAI,CAAC;aACP,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,EAAE;aACjC,KAAK,CAAC,MAAK;;AAEZ,QAAA,CAAC,CAAC;IACN;AACD;AAEK,MAAO,UAA+C,SAAQ,gBAInE,CAAA;AAEoB,IAAA,OAAA;AACA,IAAA,UAAA;AACA,IAAA,MAAA;AAHnB,IAAA,WAAA,CACmB,OAA8B,EAC9B,UAAyB,EACzB,MAA6B,EAAA;AAE9C,QAAA,KAAK,EAAE;QAJU,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,MAAM,GAAN,MAAM;IAGzB;AAEU,IAAA,kBAAkB,CAAC,MAAqB,EAAA;AAChD,QAAA,OAAO,0BAA0B,CAAC,MAAM,CAAC;IAC3C;IAEU,iBAAiB,CAAC,MAAqB,EAAE,GAAiB,EAAA;QAClE,IAAI,UAAU,EAAE,EAAE;YAChB,IAAI,CAAC,MAAM,CACT,MAAM,EACN,CAAA,gCAAA,EAAmC,GAAG,KAAK,GAAG,CAAA,EAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA,CAAE,CAC1F;QACH;AAEA,QAAA,QAAQ,MAAM,CAAC,IAAI;AACjB,YAAA,KAAK,IAAI;gBACP,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC;AAC9C,YAAA,KAAK,IAAI;gBACP,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC;AAC9C,YAAA;;gBAEE,MAAM,IAAI,iBAAiB,CAAC,CAAA,gCAAA,EAAmC,MAAM,CAAC,IAAI,CAAA,CAAE,CAAC;;IAEnF;IAEU,mBAAmB,CAAC,MAAuB,EAAE,GAAiB,EAAA;AACtE,QAAA,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,MAAM;AACpC,QAAA,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;AAE5E,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,aAAa;QACxE,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;;QAG5F,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1B,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC;AAC/B,gBAAA,GAAG,MAAM;AACT,gBAAA,GAAG,EAAE;AACH,oBAAA,GAAG,GAAG;AACN,oBAAA,OAAO,EAAE,EAAE;AACZ,iBAAA;AACF,aAAA,CAAC;YACF,MAAM,EACJ,QAAQ,EAAE,EAAE,aAAa,EAAE,GAC5B,GAAG,WAAW;YACf,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACjF,OAAO,IAAI,YAAY,CAAC,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,CAAC;QACjF;;AAGA,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5D,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC;AAC/B,gBAAA,GAAG,MAAM;AACT,gBAAA,GAAG,EAAE;AACH,oBAAA,GAAG,GAAG;AACN,oBAAA,OAAO,EAAE,EAAE;AACZ,iBAAA;AACF,aAAA,CAAC;YACF,MAAM,EACJ,QAAQ,EAAE,EAAE,aAAa,EAAE,GAC5B,GAAG,WAAW;YACf,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACrF,OAAO,IAAI,YAAY,CAAC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,CAAC;QACnF;;AAGA,QAAA,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,KACtC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE;AACtB,YAAA,GAAG,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC;;YAEjC,OAAO,EAAE,CAAC,GAAG,GAAG,CAAC,gBAAgB,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;AACnD,SAAA,CAAC,CACH;QACD,OAAO,IAAI,YAAY,CAAC,YAAY,EAAE,cAAc,EAAE,KAAK,CAAC;IAC9D;IAEU,mBAAmB,CAAC,MAAuB,EAAE,GAAiB,EAAA;QACtE,IAAI,UAAU,EAAE,EAAE;YAChB,IAAI,CAAC,MAAM,CACT,MAAM,EACN,CAAA,gCAAA,EAAmC,GAAG,KAAK,GAAG,CAAA,EAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA,CAAE,CAC1F;QACH;AAEA,QAAA,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM;AAC/B,QAAA,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;AAE5E,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,aAAa;QACxE,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5F,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACnF,OAAO,IAAI,YAAY,CAAC,YAAY,EAAE,cAAc,EAAE,KAAK,CAAC;IAC9D;AAEO,IAAA,QAAQ,CAAC,GAAiB,EAAA;QAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC;QACvC,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,MAAM,KAAK,GAAG,IAAI,iBAAiB,CAAC,CAAA,qBAAA,CAAuB,CAAC;YAC5D,KAAK,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAA,mBAAA,EAAsB,GAAG,CAAA,UAAA,CAAY,CAAC;AAC9D,YAAA,MAAM,KAAK;QACb;AACA,QAAA,OAAO,QAAQ;IACjB;AACD;AAED,SAAS,oBAAoB,CAAI,KAAmB,EAAA;AAClD,IAAA,QAAQ,KAAK,CAAC,IAAI;AAChB,QAAA,KAAK,QAAQ;AACb,QAAA,KAAK,cAAc;AACnB,QAAA,KAAK,cAAc;AACjB,YAAA,OAAO,KAAK;AACd,QAAA,KAAK,kBAAkB;AACrB,YAAA,OAAO,IAAI;AACb,QAAA,KAAK,MAAM;AACX,QAAA,KAAK,OAAO;YACV,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC;AACjD,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC;AAC1F,QAAA;YACE,WAAW,CAAC,KAAK,CAAC;;AAExB;AAEA,SAAS,mBAAmB,CAAC,KAA2B,EAAA;AACtD,IAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI;IACvB,QAAQ,IAAI;AACV,QAAA,KAAK,QAAQ;YACX,OAAO;AACL,gBAAA,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,KAAK,CAAC,MAAM;aACvB;AACH,QAAA,KAAK,cAAc;YACjB,OAAO;AACL,gBAAA,IAAI,EAAE,cAAc;gBACpB,QAAQ,EAAE,KAAK,CAAC,MAAM;gBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,WAAW,EAAE,KAAK,CAAC,WAAW;aAC/B;AACH,QAAA,KAAK,kBAAkB;YACrB,OAAO;AACL,gBAAA,IAAI,EAAE,kBAAkB;gBACxB,QAAQ,EAAE,KAAK,CAAC,MAAM;gBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,WAAW,EAAE,KAAK,CAAC,WAAW;aAC/B;AACH,QAAA,KAAK,cAAc;YACjB,OAAO;AACL,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;AACtB,gBAAA,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;AACvB,gBAAA,QAAQ,EAAE;AACR,oBAAA,IAAI,EAAE,MAAM;oBACZ,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM;AAC5C,oBAAA,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAC5B,CAAC,GAAG,EAAE,GAAG,KAAI;AACX,wBAAA,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG;AACtC,wBAAA,OAAO,GAAG;oBACZ,CAAC,EACD,EAAkC,CACnC;AACF,iBAAA;aACF;AACH,QAAA,KAAK,OAAO;AACZ,QAAA,KAAK,MAAM;YACT,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,gBAAA,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,mBAAmB,CAAC,GAAG,CAAC,CAAC;aAC9D;AACH,QAAA,KAAK,OAAO;YACV,OAAO;AACL,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC;AAC3C,gBAAA,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,mBAAmB,CAAC,GAAG,CAAC,CAAC;aAClE;AACH,QAAA;AACE,YAAA,MAAM,IAAI,iBAAiB,CAAC,uCAAuC,IAAoB,CAAA,CAAE,CAAC;;AAEhG;;;;"}
|
|
1
|
+
{"version":3,"file":"ptable_pool.js","sources":["../src/ptable_pool.ts"],"sourcesContent":["import {\n assertNever,\n bigintReplacer,\n PFrameDriverError,\n type PFrameHandle,\n type PTableHandle,\n type JoinEntry,\n type JsonSerializable,\n type PColumnValue,\n type PObjectId,\n} from \"@platforma-sdk/model\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { logPFrames } from \"./logging\";\nimport type { PFramePool } from \"./pframe_pool\";\nimport {\n FullPTableDefV1,\n FullPTableDefV2,\n stableKeyFromFullPTableDef,\n type FullPTableDef,\n} from \"./ptable_shared\";\nimport type { PTableDefPool } from \"./ptable_def_pool\";\n\nexport class PTableHolder implements Disposable {\n private readonly abortController = new AbortController();\n private readonly combinedDisposeSignal: AbortSignal;\n\n constructor(\n public readonly pFrame: PFrameHandle,\n pFrameDisposeSignal: AbortSignal,\n public readonly pTablePromise: Promise<PFrameInternal.PTableV8>,\n private readonly predecessor?: PoolEntry<PTableHandle, PTableHolder>,\n ) {\n this.combinedDisposeSignal = AbortSignal.any([\n pFrameDisposeSignal,\n this.abortController.signal,\n ]);\n }\n\n public get disposeSignal(): AbortSignal {\n return this.combinedDisposeSignal;\n }\n\n [Symbol.dispose](): void {\n this.abortController.abort();\n this.predecessor?.unref();\n void this.pTablePromise\n .then((pTable) => pTable.dispose())\n .catch(() => {\n /* mute error */\n });\n }\n}\n\nexport class PTablePool<TreeEntry extends JsonSerializable> extends RefCountPoolBase<\n FullPTableDef,\n PTableHandle,\n PTableHolder\n> {\n constructor(\n private readonly pFrames: PFramePool<TreeEntry>,\n private readonly pTableDefs: PTableDefPool,\n private readonly logger: PFrameInternal.Logger,\n ) {\n super();\n }\n\n protected calculateParamsKey(params: FullPTableDef): PTableHandle {\n return stableKeyFromFullPTableDef(params);\n }\n\n protected createNewResource(params: FullPTableDef, key: PTableHandle): PTableHolder {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `PTable creation (pTableHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n\n switch (params.type) {\n case \"v1\":\n return this.createNewResourceV1(params, key);\n case \"v2\":\n return this.createNewResourceV2(params, key);\n default:\n // @ts-expect-error `params.type` is a string, but we want to make sure all cases are handled\n throw new PFrameDriverError(`Unsupported FullPTableDef type: ${params.type}`);\n }\n }\n\n protected createNewResourceV1(params: FullPTableDefV1, key: PTableHandle): PTableHolder {\n const { def, pFrameHandle } = params;\n const { pFramePromise, disposeSignal } = this.pFrames.getByKey(pFrameHandle);\n\n const defDisposeSignal = this.pTableDefs.tryGetByKey(key)?.disposeSignal;\n const combinedSignal = AbortSignal.any([disposeSignal, defDisposeSignal].filter((s) => !!s));\n\n // 3. Sort\n if (def.sorting.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...def,\n sorting: [],\n },\n });\n const {\n resource: { pTablePromise },\n } = predecessor;\n const sortedTable = pTablePromise.then((pTable) => pTable.sort(key, def.sorting));\n return new PTableHolder(pFrameHandle, combinedSignal, sortedTable, predecessor);\n }\n\n // 2. Filter (except the case with artificial columns where cartesian creates too many rows)\n if (!hasArtificialColumns(def.src) && def.filters.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...def,\n filters: [],\n },\n });\n const {\n resource: { pTablePromise },\n } = predecessor;\n const filteredTable = pTablePromise.then((pTable) => pTable.filter(key, def.filters));\n return new PTableHolder(pFrameHandle, combinedSignal, filteredTable, predecessor);\n }\n\n // 1. Join\n const table = pFramePromise.then((pFrame) =>\n pFrame.createTable(key, {\n src: joinEntryToInternal(def.src),\n // `def.filters` would be non-empty only when join has artificial columns\n filters: [...def.partitionFilters, ...def.filters],\n }),\n );\n return new PTableHolder(pFrameHandle, combinedSignal, table);\n }\n\n protected createNewResourceV2(params: FullPTableDefV2, key: PTableHandle): PTableHolder {\n const { pFrameHandle } = params;\n const { pFramePromise, disposeSignal } = this.pFrames.getByKey(pFrameHandle);\n\n const defDisposeSignal = this.pTableDefs.tryGetByKey(key)?.disposeSignal;\n const combinedSignal = AbortSignal.any([disposeSignal, defDisposeSignal].filter((s) => !!s));\n\n const table = pFramePromise.then((pFrame) => pFrame.createTableV2(key, params.def));\n return new PTableHolder(pFrameHandle, combinedSignal, table);\n }\n\n public getByKey(key: PTableHandle): PTableHolder {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PTable handle`);\n error.cause = new Error(`PTable with handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n\nfunction hasArtificialColumns<T>(entry: JoinEntry<T>): boolean {\n switch (entry.type) {\n case \"column\":\n case \"slicedColumn\":\n case \"inlineColumn\":\n return false;\n case \"artificialColumn\":\n return true;\n case \"full\":\n case \"inner\":\n return entry.entries.some(hasArtificialColumns);\n case \"outer\":\n return hasArtificialColumns(entry.primary) || entry.secondary.some(hasArtificialColumns);\n default:\n assertNever(entry);\n }\n}\n\nfunction joinEntryToInternal(entry: JoinEntry<PObjectId>): PFrameInternal.JoinEntryV4 {\n const type = entry.type;\n switch (type) {\n case \"column\":\n return {\n type: \"column\",\n columnId: entry.column,\n };\n case \"slicedColumn\":\n return {\n type: \"slicedColumn\",\n columnId: entry.column,\n newId: entry.newId,\n axisFilters: entry.axisFilters,\n };\n case \"artificialColumn\":\n return {\n type: \"artificialColumn\",\n columnId: entry.column,\n newId: entry.newId,\n axesIndices: entry.axesIndices,\n };\n case \"inlineColumn\":\n return {\n type: \"inlineColumn\",\n newId: entry.column.id,\n spec: entry.column.spec,\n dataInfo: {\n type: \"Json\",\n keyLength: entry.column.spec.axesSpec.length,\n data: entry.column.data.reduce(\n (acc, row) => {\n acc[JSON.stringify(row.key)] = row.val;\n return acc;\n },\n {} as Record<string, PColumnValue>,\n ),\n },\n };\n case \"inner\":\n case \"full\":\n return {\n type: entry.type,\n entries: entry.entries.map((col) => joinEntryToInternal(col)),\n };\n case \"outer\":\n return {\n type: \"outer\",\n primary: joinEntryToInternal(entry.primary),\n secondary: entry.secondary.map((col) => joinEntryToInternal(col)),\n };\n default:\n throw new PFrameDriverError(`unsupported PFrame join entry type: ${type satisfies never}`);\n }\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@milaboratories/pf-driver",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.56",
|
|
4
4
|
"description": "PFrameDriver implementation abstracted from Middle Layer",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -20,13 +20,13 @@
|
|
|
20
20
|
}
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@milaboratories/pframes-rs-node": "1.1.
|
|
24
|
-
"@milaboratories/pframes-rs-wasm": "1.1.
|
|
23
|
+
"@milaboratories/pframes-rs-node": "1.1.10",
|
|
24
|
+
"@milaboratories/pframes-rs-wasm": "1.1.10",
|
|
25
25
|
"es-toolkit": "^1.39.10",
|
|
26
26
|
"lru-cache": "^11.2.2",
|
|
27
|
-
"@milaboratories/
|
|
28
|
-
"@platforma-sdk/model": "1.57.
|
|
29
|
-
"@milaboratories/
|
|
27
|
+
"@milaboratories/ts-helpers": "1.7.2",
|
|
28
|
+
"@platforma-sdk/model": "1.57.2",
|
|
29
|
+
"@milaboratories/pl-model-middle-layer": "1.12.3"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@types/node": "~24.5.2",
|
|
@@ -306,3 +306,178 @@ test("createTableV2 support", async ({ expect }) => {
|
|
|
306
306
|
expect([...data[1].data]).toEqual([20, 10]);
|
|
307
307
|
}
|
|
308
308
|
});
|
|
309
|
+
|
|
310
|
+
test("createTableV2 sorting by axis with 2 axes", async ({ expect }) => {
|
|
311
|
+
await using driver = await createPFrameDriverDouble({});
|
|
312
|
+
|
|
313
|
+
const columnId = "column1" as PObjectId;
|
|
314
|
+
const columnSpec = {
|
|
315
|
+
kind: "PColumn" as const,
|
|
316
|
+
axesSpec: [
|
|
317
|
+
{
|
|
318
|
+
name: "sample",
|
|
319
|
+
type: "String" as const,
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
name: "metric",
|
|
323
|
+
type: "String" as const,
|
|
324
|
+
},
|
|
325
|
+
],
|
|
326
|
+
name: "value",
|
|
327
|
+
valueType: "Int" as const,
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
// Data with 2 axes: sample x metric -> value
|
|
331
|
+
// Intentionally NOT sorted by "sample" to make sort effect visible
|
|
332
|
+
const inlineData = [
|
|
333
|
+
{ key: ["c", "x"], val: 1 },
|
|
334
|
+
{ key: ["c", "y"], val: 2 },
|
|
335
|
+
{ key: ["a", "x"], val: 3 },
|
|
336
|
+
{ key: ["a", "y"], val: 4 },
|
|
337
|
+
{ key: ["b", "x"], val: 5 },
|
|
338
|
+
{ key: ["b", "y"], val: 6 },
|
|
339
|
+
];
|
|
340
|
+
|
|
341
|
+
const column = { id: columnId, spec: columnSpec, data: inlineData };
|
|
342
|
+
|
|
343
|
+
const axis1Ref: SpecQueryExpression = {
|
|
344
|
+
type: "axisRef",
|
|
345
|
+
value: { name: "sample", type: "String" },
|
|
346
|
+
};
|
|
347
|
+
|
|
348
|
+
const axis2Ref: SpecQueryExpression = {
|
|
349
|
+
type: "axisRef",
|
|
350
|
+
value: { name: "metric", type: "String" },
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
const columnRef: SpecQueryExpression = { type: "columnRef", value: columnId };
|
|
354
|
+
|
|
355
|
+
const baseQuery: SpecQuery<typeof column> = { type: "column", column };
|
|
356
|
+
|
|
357
|
+
const uiDriver: PFrameDriver = driver;
|
|
358
|
+
|
|
359
|
+
// --- Baseline: no sorting ---
|
|
360
|
+
{
|
|
361
|
+
using pTable = driver.createPTableV2({ query: baseQuery });
|
|
362
|
+
const shape = await uiDriver.getShape(pTable.key);
|
|
363
|
+
expect(shape.rows).toBe(6);
|
|
364
|
+
expect(shape.columns).toBe(3); // 2 axes + 1 value column
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// --- Sort by axis 1 (sample) ascending ---
|
|
368
|
+
{
|
|
369
|
+
using pTable = driver.createPTableV2({
|
|
370
|
+
query: {
|
|
371
|
+
type: "sort",
|
|
372
|
+
input: baseQuery,
|
|
373
|
+
sortBy: [
|
|
374
|
+
{
|
|
375
|
+
expression: axis1Ref,
|
|
376
|
+
ascending: true,
|
|
377
|
+
nullsFirst: true,
|
|
378
|
+
},
|
|
379
|
+
],
|
|
380
|
+
},
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
const data = await uiDriver.getData(pTable.key, [0, 1, 2]);
|
|
384
|
+
// axis "sample" should be sorted: a, a, b, b, c, c
|
|
385
|
+
expect([...data[0].data]).toEqual(["a", "a", "b", "b", "c", "c"]);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// --- Sort by axis 1 (sample) descending ---
|
|
389
|
+
{
|
|
390
|
+
using pTable = driver.createPTableV2({
|
|
391
|
+
query: {
|
|
392
|
+
type: "sort",
|
|
393
|
+
input: baseQuery,
|
|
394
|
+
sortBy: [
|
|
395
|
+
{
|
|
396
|
+
expression: axis1Ref,
|
|
397
|
+
ascending: false,
|
|
398
|
+
nullsFirst: true,
|
|
399
|
+
},
|
|
400
|
+
],
|
|
401
|
+
},
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
const data = await uiDriver.getData(pTable.key, [0, 1, 2]);
|
|
405
|
+
// axis "sample" should be sorted descending: c, c, b, b, a, a
|
|
406
|
+
expect([...data[0].data]).toEqual(["c", "c", "b", "b", "a", "a"]);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// --- Sort by axis 2 (metric) descending ---
|
|
410
|
+
{
|
|
411
|
+
using pTable = driver.createPTableV2({
|
|
412
|
+
query: {
|
|
413
|
+
type: "sort",
|
|
414
|
+
input: baseQuery,
|
|
415
|
+
sortBy: [
|
|
416
|
+
{
|
|
417
|
+
expression: axis2Ref,
|
|
418
|
+
ascending: false,
|
|
419
|
+
nullsFirst: true,
|
|
420
|
+
},
|
|
421
|
+
],
|
|
422
|
+
},
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
const data = await uiDriver.getData(pTable.key, [0, 1, 2]);
|
|
426
|
+
// axis "metric" should be sorted descending: y, y, y, x, x, x
|
|
427
|
+
expect([...data[1].data]).toEqual(["y", "y", "y", "x", "x", "x"]);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// --- Sort by value column descending ---
|
|
431
|
+
{
|
|
432
|
+
using pTable = driver.createPTableV2({
|
|
433
|
+
query: {
|
|
434
|
+
type: "sort",
|
|
435
|
+
input: baseQuery,
|
|
436
|
+
sortBy: [
|
|
437
|
+
{
|
|
438
|
+
expression: columnRef,
|
|
439
|
+
ascending: false,
|
|
440
|
+
nullsFirst: true,
|
|
441
|
+
},
|
|
442
|
+
],
|
|
443
|
+
},
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
const data = await uiDriver.getData(pTable.key, [0, 1, 2]);
|
|
447
|
+
// values sorted descending: 6, 5, 4, 3, 2, 1
|
|
448
|
+
expect([...data[2].data]).toEqual([6, 5, 4, 3, 2, 1]);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// --- Sort by axis 1 (sample) DESC with outerJoin/fullJoin wrapper (like createPTableDef) ---
|
|
452
|
+
{
|
|
453
|
+
const wrappedQuery: SpecQuery<typeof column> = {
|
|
454
|
+
type: "outerJoin",
|
|
455
|
+
primary: {
|
|
456
|
+
entry: {
|
|
457
|
+
type: "fullJoin",
|
|
458
|
+
entries: [{ entry: baseQuery, qualifications: [] }],
|
|
459
|
+
},
|
|
460
|
+
qualifications: [],
|
|
461
|
+
},
|
|
462
|
+
secondary: [],
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
using pTable = driver.createPTableV2({
|
|
466
|
+
query: {
|
|
467
|
+
type: "sort",
|
|
468
|
+
input: wrappedQuery,
|
|
469
|
+
sortBy: [
|
|
470
|
+
{
|
|
471
|
+
expression: axis1Ref,
|
|
472
|
+
ascending: false,
|
|
473
|
+
nullsFirst: true,
|
|
474
|
+
},
|
|
475
|
+
],
|
|
476
|
+
},
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
const data = await uiDriver.getData(pTable.key, [0, 1, 2]);
|
|
480
|
+
// axis "sample" should be sorted descending: c, c, b, b, a, a
|
|
481
|
+
expect([...data[0].data]).toEqual(["c", "c", "b", "b", "a", "a"]);
|
|
482
|
+
}
|
|
483
|
+
});
|
package/src/driver_double.ts
CHANGED
|
@@ -128,7 +128,7 @@ export type InternalPFrameDriverDouble = AbstractInternalPFrameDriver<
|
|
|
128
128
|
// It's mock for testing purposes, not a real test!
|
|
129
129
|
export async function createPFrameDriverDouble({
|
|
130
130
|
dataFolder = tmpdir() as FolderPath,
|
|
131
|
-
logger =
|
|
131
|
+
logger = console.log,
|
|
132
132
|
}: {
|
|
133
133
|
dataFolder?: FolderPath;
|
|
134
134
|
logger?: PFrameInternal.Logger;
|
package/src/ptable_pool.ts
CHANGED
|
@@ -139,13 +139,6 @@ export class PTablePool<TreeEntry extends JsonSerializable> extends RefCountPool
|
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
protected createNewResourceV2(params: FullPTableDefV2, key: PTableHandle): PTableHolder {
|
|
142
|
-
if (logPFrames()) {
|
|
143
|
-
this.logger(
|
|
144
|
-
"info",
|
|
145
|
-
`PTable creation (pTableHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`,
|
|
146
|
-
);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
142
|
const { pFrameHandle } = params;
|
|
150
143
|
const { pFramePromise, disposeSignal } = this.pFrames.getByKey(pFrameHandle);
|
|
151
144
|
|