@milaboratories/pf-driver 1.0.39 → 1.0.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/data_info_helpers.cjs +1 -1
  2. package/dist/data_info_helpers.cjs.map +1 -1
  3. package/dist/data_info_helpers.d.ts +1 -1
  4. package/dist/data_info_helpers.d.ts.map +1 -1
  5. package/dist/data_info_helpers.js +1 -1
  6. package/dist/data_info_helpers.js.map +1 -1
  7. package/dist/driver_decl.d.ts +2 -2
  8. package/dist/driver_decl.d.ts.map +1 -1
  9. package/dist/driver_double.cjs +1 -1
  10. package/dist/driver_double.cjs.map +1 -1
  11. package/dist/driver_double.d.ts +6 -6
  12. package/dist/driver_double.d.ts.map +1 -1
  13. package/dist/driver_double.js +1 -1
  14. package/dist/driver_double.js.map +1 -1
  15. package/dist/driver_impl.cjs +35 -32
  16. package/dist/driver_impl.cjs.map +1 -1
  17. package/dist/driver_impl.d.ts +7 -7
  18. package/dist/driver_impl.d.ts.map +1 -1
  19. package/dist/driver_impl.js +35 -32
  20. package/dist/driver_impl.js.map +1 -1
  21. package/dist/index.d.ts +4 -4
  22. package/dist/pframe_pool.cjs +21 -19
  23. package/dist/pframe_pool.cjs.map +1 -1
  24. package/dist/pframe_pool.d.ts +4 -4
  25. package/dist/pframe_pool.d.ts.map +1 -1
  26. package/dist/pframe_pool.js +21 -19
  27. package/dist/pframe_pool.js.map +1 -1
  28. package/dist/ptable_cache_per_frame.cjs +6 -6
  29. package/dist/ptable_cache_per_frame.cjs.map +1 -1
  30. package/dist/ptable_cache_per_frame.d.ts +4 -4
  31. package/dist/ptable_cache_per_frame.d.ts.map +1 -1
  32. package/dist/ptable_cache_per_frame.js +6 -6
  33. package/dist/ptable_cache_per_frame.js.map +1 -1
  34. package/dist/ptable_cache_plain.cjs +5 -5
  35. package/dist/ptable_cache_plain.cjs.map +1 -1
  36. package/dist/ptable_cache_plain.d.ts +4 -4
  37. package/dist/ptable_cache_plain.d.ts.map +1 -1
  38. package/dist/ptable_cache_plain.js +5 -5
  39. package/dist/ptable_cache_plain.js.map +1 -1
  40. package/dist/ptable_def_pool.cjs +2 -2
  41. package/dist/ptable_def_pool.cjs.map +1 -1
  42. package/dist/ptable_def_pool.d.ts +4 -4
  43. package/dist/ptable_def_pool.js +2 -2
  44. package/dist/ptable_def_pool.js.map +1 -1
  45. package/dist/ptable_pool.cjs +30 -26
  46. package/dist/ptable_pool.cjs.map +1 -1
  47. package/dist/ptable_pool.d.ts +6 -6
  48. package/dist/ptable_pool.d.ts.map +1 -1
  49. package/dist/ptable_pool.js +30 -26
  50. package/dist/ptable_pool.js.map +1 -1
  51. package/dist/ptable_shared.cjs.map +1 -1
  52. package/dist/ptable_shared.d.ts +1 -1
  53. package/dist/ptable_shared.js.map +1 -1
  54. package/package.json +29 -29
  55. package/src/data_info_helpers.ts +6 -7
  56. package/src/driver_decl.ts +8 -16
  57. package/src/driver_double.test.ts +89 -83
  58. package/src/driver_double.ts +23 -19
  59. package/src/driver_impl.ts +115 -80
  60. package/src/index.ts +4 -4
  61. package/src/pframe_pool.ts +42 -37
  62. package/src/ptable_cache_per_frame.ts +16 -13
  63. package/src/ptable_cache_plain.ts +16 -12
  64. package/src/ptable_def_pool.ts +7 -7
  65. package/src/ptable_pool.ts +62 -45
  66. package/src/ptable_shared.ts +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"ptable_def_pool.js","sources":["../src/ptable_def_pool.ts"],"sourcesContent":["import { PFrameDriverError, type PTableHandle } from '@platforma-sdk/model';\nimport type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport { RefCountPoolBase } from '@milaboratories/ts-helpers';\nimport { logPFrames } from './logging';\nimport { stableKeyFromFullPTableDef, type FullPTableDef } 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"],"names":[],"mappings":";;;;;MAMa,eAAe,CAAA;AAIR,IAAA,GAAA;AACC,IAAA,YAAA;AACA,IAAA,MAAA;AALF,IAAA,eAAe,GAAG,IAAI,eAAe,EAAE;AAExD,IAAA,WAAA,CACkB,GAAkB,EACjB,YAA0B,EAC1B,MAA6B,EAAA;QAF9B,IAAA,CAAA,GAAG,GAAH,GAAG;QACF,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,MAAM,GAAN,MAAM;QAEvB,IAAI,UAAU,EAAE,EAAE;YAChB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA,wCAAA,EAA2C,IAAI,CAAC,YAAY,CAAA,CAAA,CAAG,CAAC;QACtF;IACF;AAEA,IAAA,IAAW,aAAa,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM;IACpC;IAEA,CAAC,MAAM,CAAC,OAAO,CAAC,GAAA;AACd,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;QAC5B,IAAI,UAAU,EAAE,EAAE;YAChB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA,2CAAA,EAA8C,IAAI,CAAC,YAAY,CAAA,CAAA,CAAG,CAAC;QACzF;IACF;AACD;AAEK,MAAO,aAAc,SAAQ,gBAA8D,CAAA;AAClE,IAAA,MAAA;AAA7B,IAAA,WAAA,CAA6B,MAA6B,EAAA;AACxD,QAAA,KAAK,EAAE;QADoB,IAAA,CAAA,MAAM,GAAN,MAAM;IAEnC;AAEU,IAAA,kBAAkB,CAAC,MAAqB,EAAA;AAChD,QAAA,OAAO,0BAA0B,CAAC,MAAM,CAAC;IAC3C;IAEU,iBAAiB,CAAC,MAAqB,EAAE,GAAiB,EAAA;QAClE,OAAO,IAAI,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;IACtD;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,6BAAA,EAAgC,GAAG,CAAA,UAAA,CAAY,CAAC;AACxE,YAAA,MAAM,KAAK;QACb;AACA,QAAA,OAAO,QAAQ;IACjB;AACD;;;;"}
1
+ {"version":3,"file":"ptable_def_pool.js","sources":["../src/ptable_def_pool.ts"],"sourcesContent":["import { PFrameDriverError, type PTableHandle } from \"@platforma-sdk/model\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase } from \"@milaboratories/ts-helpers\";\nimport { logPFrames } from \"./logging\";\nimport { stableKeyFromFullPTableDef, type FullPTableDef } 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"],"names":[],"mappings":";;;;;MAMa,eAAe,CAAA;AAIR,IAAA,GAAA;AACC,IAAA,YAAA;AACA,IAAA,MAAA;AALF,IAAA,eAAe,GAAG,IAAI,eAAe,EAAE;AAExD,IAAA,WAAA,CACkB,GAAkB,EACjB,YAA0B,EAC1B,MAA6B,EAAA;QAF9B,IAAA,CAAA,GAAG,GAAH,GAAG;QACF,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,MAAM,GAAN,MAAM;QAEvB,IAAI,UAAU,EAAE,EAAE;YAChB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA,wCAAA,EAA2C,IAAI,CAAC,YAAY,CAAA,CAAA,CAAG,CAAC;QACtF;IACF;AAEA,IAAA,IAAW,aAAa,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM;IACpC;IAEA,CAAC,MAAM,CAAC,OAAO,CAAC,GAAA;AACd,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;QAC5B,IAAI,UAAU,EAAE,EAAE;YAChB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA,2CAAA,EAA8C,IAAI,CAAC,YAAY,CAAA,CAAA,CAAG,CAAC;QACzF;IACF;AACD;AAEK,MAAO,aAAc,SAAQ,gBAA8D,CAAA;AAClE,IAAA,MAAA;AAA7B,IAAA,WAAA,CAA6B,MAA6B,EAAA;AACxD,QAAA,KAAK,EAAE;QADoB,IAAA,CAAA,MAAM,GAAN,MAAM;IAEnC;AAEU,IAAA,kBAAkB,CAAC,MAAqB,EAAA;AAChD,QAAA,OAAO,0BAA0B,CAAC,MAAM,CAAC;IAC3C;IAEU,iBAAiB,CAAC,MAAqB,EAAE,GAAiB,EAAA;QAClE,OAAO,IAAI,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;IACtD;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,6BAAA,EAAgC,GAAG,CAAA,UAAA,CAAY,CAAC;AACxE,YAAA,MAAM,KAAK;QACb;AACA,QAAA,OAAO,QAAQ;IACjB;AACD;;;;"}
@@ -15,7 +15,10 @@ class PTableHolder {
15
15
  this.pFrame = pFrame;
16
16
  this.pTablePromise = pTablePromise;
17
17
  this.predecessor = predecessor;
18
- this.combinedDisposeSignal = AbortSignal.any([pFrameDisposeSignal, this.abortController.signal]);
18
+ this.combinedDisposeSignal = AbortSignal.any([
19
+ pFrameDisposeSignal,
20
+ this.abortController.signal,
21
+ ]);
19
22
  }
20
23
  get disposeSignal() {
21
24
  return this.combinedDisposeSignal;
@@ -25,7 +28,9 @@ class PTableHolder {
25
28
  this.predecessor?.unref();
26
29
  void this.pTablePromise
27
30
  .then((pTable) => pTable.dispose())
28
- .catch(() => { });
31
+ .catch(() => {
32
+ /* mute error */
33
+ });
29
34
  }
30
35
  }
31
36
  class PTablePool extends tsHelpers.RefCountPoolBase {
@@ -43,8 +48,7 @@ class PTablePool extends tsHelpers.RefCountPoolBase {
43
48
  }
44
49
  createNewResource(params, key) {
45
50
  if (logging.logPFrames()) {
46
- this.logger('info', `PTable creation (pTableHandle = ${key}): `
47
- + `${JSON.stringify(params, model.bigintReplacer)}`);
51
+ this.logger("info", `PTable creation (pTableHandle = ${key}): ` + `${JSON.stringify(params, model.bigintReplacer)}`);
48
52
  }
49
53
  const handle = params.pFrameHandle;
50
54
  const { pFramePromise, disposeSignal } = this.pFrames.getByKey(handle);
@@ -59,7 +63,7 @@ class PTablePool extends tsHelpers.RefCountPoolBase {
59
63
  sorting: [],
60
64
  },
61
65
  });
62
- const { resource: { pTablePromise } } = predecessor;
66
+ const { resource: { pTablePromise }, } = predecessor;
63
67
  const sortedTable = pTablePromise.then((pTable) => pTable.sort(key, params.def.sorting));
64
68
  return new PTableHolder(handle, combinedSignal, sortedTable, predecessor);
65
69
  }
@@ -72,7 +76,7 @@ class PTablePool extends tsHelpers.RefCountPoolBase {
72
76
  filters: [],
73
77
  },
74
78
  });
75
- const { resource: { pTablePromise } } = predecessor;
79
+ const { resource: { pTablePromise }, } = predecessor;
76
80
  const filteredTable = pTablePromise.then((pTable) => pTable.filter(key, params.def.filters));
77
81
  return new PTableHolder(handle, combinedSignal, filteredTable, predecessor);
78
82
  }
@@ -96,16 +100,16 @@ class PTablePool extends tsHelpers.RefCountPoolBase {
96
100
  }
97
101
  function hasArtificialColumns(entry) {
98
102
  switch (entry.type) {
99
- case 'column':
100
- case 'slicedColumn':
101
- case 'inlineColumn':
103
+ case "column":
104
+ case "slicedColumn":
105
+ case "inlineColumn":
102
106
  return false;
103
- case 'artificialColumn':
107
+ case "artificialColumn":
104
108
  return true;
105
- case 'full':
106
- case 'inner':
109
+ case "full":
110
+ case "inner":
107
111
  return entry.entries.some(hasArtificialColumns);
108
- case 'outer':
112
+ case "outer":
109
113
  return hasArtificialColumns(entry.primary) || entry.secondary.some(hasArtificialColumns);
110
114
  default:
111
115
  model.assertNever(entry);
@@ -114,32 +118,32 @@ function hasArtificialColumns(entry) {
114
118
  function joinEntryToInternal(entry) {
115
119
  const type = entry.type;
116
120
  switch (type) {
117
- case 'column':
121
+ case "column":
118
122
  return {
119
- type: 'column',
123
+ type: "column",
120
124
  columnId: entry.column,
121
125
  };
122
- case 'slicedColumn':
126
+ case "slicedColumn":
123
127
  return {
124
- type: 'slicedColumn',
128
+ type: "slicedColumn",
125
129
  columnId: entry.column,
126
130
  newId: entry.newId,
127
131
  axisFilters: entry.axisFilters,
128
132
  };
129
- case 'artificialColumn':
133
+ case "artificialColumn":
130
134
  return {
131
- type: 'artificialColumn',
135
+ type: "artificialColumn",
132
136
  columnId: entry.column,
133
137
  newId: entry.newId,
134
138
  axesIndices: entry.axesIndices,
135
139
  };
136
- case 'inlineColumn':
140
+ case "inlineColumn":
137
141
  return {
138
- type: 'inlineColumn',
142
+ type: "inlineColumn",
139
143
  newId: entry.column.id,
140
144
  spec: entry.column.spec,
141
145
  dataInfo: {
142
- type: 'Json',
146
+ type: "Json",
143
147
  keyLength: entry.column.spec.axesSpec.length,
144
148
  data: entry.column.data.reduce((acc, row) => {
145
149
  acc[JSON.stringify(row.key)] = row.val;
@@ -147,15 +151,15 @@ function joinEntryToInternal(entry) {
147
151
  }, {}),
148
152
  },
149
153
  };
150
- case 'inner':
151
- case 'full':
154
+ case "inner":
155
+ case "full":
152
156
  return {
153
157
  type: entry.type,
154
158
  entries: entry.entries.map((col) => joinEntryToInternal(col)),
155
159
  };
156
- case 'outer':
160
+ case "outer":
157
161
  return {
158
- type: 'outer',
162
+ type: "outer",
159
163
  primary: joinEntryToInternal(entry.primary),
160
164
  secondary: entry.secondary.map((col) => joinEntryToInternal(col)),
161
165
  };
@@ -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 { stableKeyFromFullPTableDef, type FullPTableDef } 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([pFrameDisposeSignal, this.abortController.signal]);\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(() => { /* mute error */ });\n }\n}\n\nexport class PTablePool<TreeEntry extends JsonSerializable>\n extends RefCountPoolBase<FullPTableDef, PTableHandle, PTableHolder> {\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('info',\n `PTable creation (pTableHandle = ${key}): `\n + `${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n\n const handle = params.pFrameHandle;\n const { pFramePromise, disposeSignal } = this.pFrames.getByKey(handle);\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 (params.def.sorting.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...params.def,\n sorting: [],\n },\n });\n const { resource: { pTablePromise } } = predecessor;\n const sortedTable = pTablePromise.then((pTable) => pTable.sort(key, params.def.sorting));\n return new PTableHolder(handle, combinedSignal, sortedTable, predecessor);\n }\n\n // 2. Filter (except the case with artificial columns where cartesian creates too many rows)\n if (!hasArtificialColumns(params.def.src) && params.def.filters.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...params.def,\n filters: [],\n },\n });\n const { resource: { pTablePromise } } = predecessor;\n const filteredTable = pTablePromise.then((pTable) => pTable.filter(key, params.def.filters));\n return new PTableHolder(handle, combinedSignal, filteredTable, predecessor);\n }\n\n // 1. Join\n const table = pFramePromise.then((pFrame) => pFrame.createTable(key, {\n src: joinEntryToInternal(params.def.src),\n // `params.def.filters` would be non-empty only when join has artificial columns\n filters: [...params.def.partitionFilters, ...params.def.filters],\n }));\n return new PTableHolder(handle, 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((acc, row) => {\n acc[JSON.stringify(row.key)] = row.val;\n return acc;\n }, {} as Record<string, PColumnValue>),\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 // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\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 { stableKeyFromFullPTableDef, type FullPTableDef } 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 const handle = params.pFrameHandle;\n const { pFramePromise, disposeSignal } = this.pFrames.getByKey(handle);\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 (params.def.sorting.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...params.def,\n sorting: [],\n },\n });\n const {\n resource: { pTablePromise },\n } = predecessor;\n const sortedTable = pTablePromise.then((pTable) => pTable.sort(key, params.def.sorting));\n return new PTableHolder(handle, combinedSignal, sortedTable, predecessor);\n }\n\n // 2. Filter (except the case with artificial columns where cartesian creates too many rows)\n if (!hasArtificialColumns(params.def.src) && params.def.filters.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...params.def,\n filters: [],\n },\n });\n const {\n resource: { pTablePromise },\n } = predecessor;\n const filteredTable = pTablePromise.then((pTable) => pTable.filter(key, params.def.filters));\n return new PTableHolder(handle, combinedSignal, filteredTable, predecessor);\n }\n\n // 1. Join\n const table = pFramePromise.then((pFrame) =>\n pFrame.createTable(key, {\n src: joinEntryToInternal(params.def.src),\n // `params.def.filters` would be non-empty only when join has artificial columns\n filters: [...params.def.partitionFilters, ...params.def.filters],\n }),\n );\n return new PTableHolder(handle, 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 // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\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,9 +1,9 @@
1
- import { type PFrameHandle, type PTableHandle, type JsonSerializable } from '@platforma-sdk/model';
2
- import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
3
- import { RefCountPoolBase, type PoolEntry } from '@milaboratories/ts-helpers';
4
- import type { PFramePool } from './pframe_pool';
5
- import { type FullPTableDef } from './ptable_shared';
6
- import type { PTableDefPool } from './ptable_def_pool';
1
+ import { type PFrameHandle, type PTableHandle, type JsonSerializable } from "@platforma-sdk/model";
2
+ import type { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
3
+ import { RefCountPoolBase, type PoolEntry } from "@milaboratories/ts-helpers";
4
+ import type { PFramePool } from "./pframe_pool";
5
+ import { type FullPTableDef } from "./ptable_shared";
6
+ import type { PTableDefPool } from "./ptable_def_pool";
7
7
  export declare class PTableHolder implements Disposable {
8
8
  readonly pFrame: PFrameHandle;
9
9
  readonly pTablePromise: Promise<PFrameInternal.PTableV8>;
@@ -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,EAA8B,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACjF,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;IAKtE,IAAW,aAAa,IAAI,WAAW,CAEtC;IAED,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAOzB;AAED,qBAAa,UAAU,CAAC,SAAS,SAAS,gBAAgB,CACxD,SAAQ,gBAAgB,CAAC,aAAa,EAAE,YAAY,EAAE,YAAY,CAAC;IAEjE,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;IAmD5E,QAAQ,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;CASjD"}
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,EAA8B,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACjF,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;IAyD5E,QAAQ,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;CASjD"}
@@ -13,7 +13,10 @@ class PTableHolder {
13
13
  this.pFrame = pFrame;
14
14
  this.pTablePromise = pTablePromise;
15
15
  this.predecessor = predecessor;
16
- this.combinedDisposeSignal = AbortSignal.any([pFrameDisposeSignal, this.abortController.signal]);
16
+ this.combinedDisposeSignal = AbortSignal.any([
17
+ pFrameDisposeSignal,
18
+ this.abortController.signal,
19
+ ]);
17
20
  }
18
21
  get disposeSignal() {
19
22
  return this.combinedDisposeSignal;
@@ -23,7 +26,9 @@ class PTableHolder {
23
26
  this.predecessor?.unref();
24
27
  void this.pTablePromise
25
28
  .then((pTable) => pTable.dispose())
26
- .catch(() => { });
29
+ .catch(() => {
30
+ /* mute error */
31
+ });
27
32
  }
28
33
  }
29
34
  class PTablePool extends RefCountPoolBase {
@@ -41,8 +46,7 @@ class PTablePool extends RefCountPoolBase {
41
46
  }
42
47
  createNewResource(params, key) {
43
48
  if (logPFrames()) {
44
- this.logger('info', `PTable creation (pTableHandle = ${key}): `
45
- + `${JSON.stringify(params, bigintReplacer)}`);
49
+ this.logger("info", `PTable creation (pTableHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`);
46
50
  }
47
51
  const handle = params.pFrameHandle;
48
52
  const { pFramePromise, disposeSignal } = this.pFrames.getByKey(handle);
@@ -57,7 +61,7 @@ class PTablePool extends RefCountPoolBase {
57
61
  sorting: [],
58
62
  },
59
63
  });
60
- const { resource: { pTablePromise } } = predecessor;
64
+ const { resource: { pTablePromise }, } = predecessor;
61
65
  const sortedTable = pTablePromise.then((pTable) => pTable.sort(key, params.def.sorting));
62
66
  return new PTableHolder(handle, combinedSignal, sortedTable, predecessor);
63
67
  }
@@ -70,7 +74,7 @@ class PTablePool extends RefCountPoolBase {
70
74
  filters: [],
71
75
  },
72
76
  });
73
- const { resource: { pTablePromise } } = predecessor;
77
+ const { resource: { pTablePromise }, } = predecessor;
74
78
  const filteredTable = pTablePromise.then((pTable) => pTable.filter(key, params.def.filters));
75
79
  return new PTableHolder(handle, combinedSignal, filteredTable, predecessor);
76
80
  }
@@ -94,16 +98,16 @@ class PTablePool extends RefCountPoolBase {
94
98
  }
95
99
  function hasArtificialColumns(entry) {
96
100
  switch (entry.type) {
97
- case 'column':
98
- case 'slicedColumn':
99
- case 'inlineColumn':
101
+ case "column":
102
+ case "slicedColumn":
103
+ case "inlineColumn":
100
104
  return false;
101
- case 'artificialColumn':
105
+ case "artificialColumn":
102
106
  return true;
103
- case 'full':
104
- case 'inner':
107
+ case "full":
108
+ case "inner":
105
109
  return entry.entries.some(hasArtificialColumns);
106
- case 'outer':
110
+ case "outer":
107
111
  return hasArtificialColumns(entry.primary) || entry.secondary.some(hasArtificialColumns);
108
112
  default:
109
113
  assertNever(entry);
@@ -112,32 +116,32 @@ function hasArtificialColumns(entry) {
112
116
  function joinEntryToInternal(entry) {
113
117
  const type = entry.type;
114
118
  switch (type) {
115
- case 'column':
119
+ case "column":
116
120
  return {
117
- type: 'column',
121
+ type: "column",
118
122
  columnId: entry.column,
119
123
  };
120
- case 'slicedColumn':
124
+ case "slicedColumn":
121
125
  return {
122
- type: 'slicedColumn',
126
+ type: "slicedColumn",
123
127
  columnId: entry.column,
124
128
  newId: entry.newId,
125
129
  axisFilters: entry.axisFilters,
126
130
  };
127
- case 'artificialColumn':
131
+ case "artificialColumn":
128
132
  return {
129
- type: 'artificialColumn',
133
+ type: "artificialColumn",
130
134
  columnId: entry.column,
131
135
  newId: entry.newId,
132
136
  axesIndices: entry.axesIndices,
133
137
  };
134
- case 'inlineColumn':
138
+ case "inlineColumn":
135
139
  return {
136
- type: 'inlineColumn',
140
+ type: "inlineColumn",
137
141
  newId: entry.column.id,
138
142
  spec: entry.column.spec,
139
143
  dataInfo: {
140
- type: 'Json',
144
+ type: "Json",
141
145
  keyLength: entry.column.spec.axesSpec.length,
142
146
  data: entry.column.data.reduce((acc, row) => {
143
147
  acc[JSON.stringify(row.key)] = row.val;
@@ -145,15 +149,15 @@ function joinEntryToInternal(entry) {
145
149
  }, {}),
146
150
  },
147
151
  };
148
- case 'inner':
149
- case 'full':
152
+ case "inner":
153
+ case "full":
150
154
  return {
151
155
  type: entry.type,
152
156
  entries: entry.entries.map((col) => joinEntryToInternal(col)),
153
157
  };
154
- case 'outer':
158
+ case "outer":
155
159
  return {
156
- type: 'outer',
160
+ type: "outer",
157
161
  primary: joinEntryToInternal(entry.primary),
158
162
  secondary: entry.secondary.map((col) => joinEntryToInternal(col)),
159
163
  };
@@ -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 { stableKeyFromFullPTableDef, type FullPTableDef } 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([pFrameDisposeSignal, this.abortController.signal]);\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(() => { /* mute error */ });\n }\n}\n\nexport class PTablePool<TreeEntry extends JsonSerializable>\n extends RefCountPoolBase<FullPTableDef, PTableHandle, PTableHolder> {\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('info',\n `PTable creation (pTableHandle = ${key}): `\n + `${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n\n const handle = params.pFrameHandle;\n const { pFramePromise, disposeSignal } = this.pFrames.getByKey(handle);\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 (params.def.sorting.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...params.def,\n sorting: [],\n },\n });\n const { resource: { pTablePromise } } = predecessor;\n const sortedTable = pTablePromise.then((pTable) => pTable.sort(key, params.def.sorting));\n return new PTableHolder(handle, combinedSignal, sortedTable, predecessor);\n }\n\n // 2. Filter (except the case with artificial columns where cartesian creates too many rows)\n if (!hasArtificialColumns(params.def.src) && params.def.filters.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...params.def,\n filters: [],\n },\n });\n const { resource: { pTablePromise } } = predecessor;\n const filteredTable = pTablePromise.then((pTable) => pTable.filter(key, params.def.filters));\n return new PTableHolder(handle, combinedSignal, filteredTable, predecessor);\n }\n\n // 1. Join\n const table = pFramePromise.then((pFrame) => pFrame.createTable(key, {\n src: joinEntryToInternal(params.def.src),\n // `params.def.filters` would be non-empty only when join has artificial columns\n filters: [...params.def.partitionFilters, ...params.def.filters],\n }));\n return new PTableHolder(handle, 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((acc, row) => {\n acc[JSON.stringify(row.key)] = row.val;\n return acc;\n }, {} as Record<string, PColumnValue>),\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 // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n throw new PFrameDriverError(`unsupported PFrame join entry type: ${type satisfies never}`);\n }\n}\n"],"names":[],"mappings":"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"}
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 { stableKeyFromFullPTableDef, type FullPTableDef } 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 const handle = params.pFrameHandle;\n const { pFramePromise, disposeSignal } = this.pFrames.getByKey(handle);\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 (params.def.sorting.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...params.def,\n sorting: [],\n },\n });\n const {\n resource: { pTablePromise },\n } = predecessor;\n const sortedTable = pTablePromise.then((pTable) => pTable.sort(key, params.def.sorting));\n return new PTableHolder(handle, combinedSignal, sortedTable, predecessor);\n }\n\n // 2. Filter (except the case with artificial columns where cartesian creates too many rows)\n if (!hasArtificialColumns(params.def.src) && params.def.filters.length > 0) {\n const predecessor = this.acquire({\n ...params,\n def: {\n ...params.def,\n filters: [],\n },\n });\n const {\n resource: { pTablePromise },\n } = predecessor;\n const filteredTable = pTablePromise.then((pTable) => pTable.filter(key, params.def.filters));\n return new PTableHolder(handle, combinedSignal, filteredTable, predecessor);\n }\n\n // 1. Join\n const table = pFramePromise.then((pFrame) =>\n pFrame.createTable(key, {\n src: joinEntryToInternal(params.def.src),\n // `params.def.filters` would be non-empty only when join has artificial columns\n filters: [...params.def.partitionFilters, ...params.def.filters],\n }),\n );\n return new PTableHolder(handle, 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 // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n throw new PFrameDriverError(`unsupported PFrame join entry type: ${type satisfies never}`);\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ptable_shared.cjs","sources":["../src/ptable_shared.ts"],"sourcesContent":["import type { PObjectId, PFrameHandle, PTableDef, PTableHandle } from '@platforma-sdk/model';\nimport { hashJson } from '@milaboratories/pl-model-middle-layer';\n\nexport type FullPTableDef = {\n pFrameHandle: PFrameHandle;\n def: PTableDef<PObjectId>;\n};\n\nexport function stableKeyFromFullPTableDef(data: FullPTableDef): PTableHandle {\n return hashJson(data) as string as PTableHandle;\n}\n"],"names":["hashJson"],"mappings":";;;;AAQM,SAAU,0BAA0B,CAAC,IAAmB,EAAA;AAC5D,IAAA,OAAOA,2BAAQ,CAAC,IAAI,CAA2B;AACjD;;;;"}
1
+ {"version":3,"file":"ptable_shared.cjs","sources":["../src/ptable_shared.ts"],"sourcesContent":["import type { PObjectId, PFrameHandle, PTableDef, PTableHandle } from \"@platforma-sdk/model\";\nimport { hashJson } from \"@milaboratories/pl-model-middle-layer\";\n\nexport type FullPTableDef = {\n pFrameHandle: PFrameHandle;\n def: PTableDef<PObjectId>;\n};\n\nexport function stableKeyFromFullPTableDef(data: FullPTableDef): PTableHandle {\n return hashJson(data) as string as PTableHandle;\n}\n"],"names":["hashJson"],"mappings":";;;;AAQM,SAAU,0BAA0B,CAAC,IAAmB,EAAA;AAC5D,IAAA,OAAOA,2BAAQ,CAAC,IAAI,CAA2B;AACjD;;;;"}
@@ -1,4 +1,4 @@
1
- import type { PObjectId, PFrameHandle, PTableDef, PTableHandle } from '@platforma-sdk/model';
1
+ import type { PObjectId, PFrameHandle, PTableDef, PTableHandle } from "@platforma-sdk/model";
2
2
  export type FullPTableDef = {
3
3
  pFrameHandle: PFrameHandle;
4
4
  def: PTableDef<PObjectId>;
@@ -1 +1 @@
1
- {"version":3,"file":"ptable_shared.js","sources":["../src/ptable_shared.ts"],"sourcesContent":["import type { PObjectId, PFrameHandle, PTableDef, PTableHandle } from '@platforma-sdk/model';\nimport { hashJson } from '@milaboratories/pl-model-middle-layer';\n\nexport type FullPTableDef = {\n pFrameHandle: PFrameHandle;\n def: PTableDef<PObjectId>;\n};\n\nexport function stableKeyFromFullPTableDef(data: FullPTableDef): PTableHandle {\n return hashJson(data) as string as PTableHandle;\n}\n"],"names":[],"mappings":";;AAQM,SAAU,0BAA0B,CAAC,IAAmB,EAAA;AAC5D,IAAA,OAAO,QAAQ,CAAC,IAAI,CAA2B;AACjD;;;;"}
1
+ {"version":3,"file":"ptable_shared.js","sources":["../src/ptable_shared.ts"],"sourcesContent":["import type { PObjectId, PFrameHandle, PTableDef, PTableHandle } from \"@platforma-sdk/model\";\nimport { hashJson } from \"@milaboratories/pl-model-middle-layer\";\n\nexport type FullPTableDef = {\n pFrameHandle: PFrameHandle;\n def: PTableDef<PObjectId>;\n};\n\nexport function stableKeyFromFullPTableDef(data: FullPTableDef): PTableHandle {\n return hashJson(data) as string as PTableHandle;\n}\n"],"names":[],"mappings":";;AAQM,SAAU,0BAA0B,CAAC,IAAmB,EAAA;AAC5D,IAAA,OAAO,QAAQ,CAAC,IAAI,CAA2B;AACjD;;;;"}
package/package.json CHANGED
@@ -1,14 +1,17 @@
1
1
  {
2
2
  "name": "@milaboratories/pf-driver",
3
- "version": "1.0.39",
3
+ "version": "1.0.41",
4
4
  "description": "PFrameDriver implementation abstracted from Middle Layer",
5
- "engines": {
6
- "node": ">=22.19.0"
7
- },
5
+ "keywords": [],
6
+ "license": "UNLICENSED",
7
+ "files": [
8
+ "./dist/**/*",
9
+ "./src/**/*"
10
+ ],
8
11
  "type": "module",
9
- "types": "./dist/index.d.ts",
10
12
  "main": "./dist/index.js",
11
13
  "module": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
12
15
  "exports": {
13
16
  ".": {
14
17
  "types": "./dist/index.d.ts",
@@ -16,39 +19,36 @@
16
19
  "require": "./dist/index.cjs"
17
20
  }
18
21
  },
19
- "files": [
20
- "./dist/**/*",
21
- "./src/**/*"
22
- ],
23
- "keywords": [],
24
- "license": "UNLICENSED",
22
+ "dependencies": {
23
+ "@milaboratories/pframes-rs-node": "1.0.109",
24
+ "es-toolkit": "^1.39.10",
25
+ "lru-cache": "^11.2.2",
26
+ "@milaboratories/pl-model-middle-layer": "1.11.6",
27
+ "@milaboratories/ts-helpers": "1.7.2",
28
+ "@platforma-sdk/model": "1.53.14"
29
+ },
25
30
  "devDependencies": {
26
- "eslint": "^9.25.1",
31
+ "@types/node": "~24.5.2",
32
+ "@vitest/coverage-istanbul": "^4.0.16",
27
33
  "tsconfig-paths": "^4.2.0",
28
34
  "typescript": "~5.6.3",
29
- "tslib": "~2.7.0",
30
35
  "vitest": "^4.0.16",
31
- "@vitest/coverage-istanbul": "^4.0.16",
32
- "@types/node": "~24.5.2",
33
- "@milaboratories/eslint-config": "1.0.5",
34
- "@milaboratories/build-configs": "1.4.0",
35
- "@milaboratories/ts-configs": "1.2.0",
36
- "@milaboratories/ts-builder": "1.2.4"
36
+ "@milaboratories/build-configs": "1.4.2",
37
+ "@milaboratories/ts-builder": "1.2.6",
38
+ "@milaboratories/ts-configs": "1.2.1"
37
39
  },
38
- "dependencies": {
39
- "@milaboratories/pframes-rs-node": "1.0.109",
40
- "lru-cache": "^11.2.2",
41
- "es-toolkit": "^1.39.10",
42
- "@milaboratories/pl-model-middle-layer": "1.11.4",
43
- "@milaboratories/ts-helpers": "1.7.0",
44
- "@platforma-sdk/model": "1.53.11"
40
+ "engines": {
41
+ "node": ">=22.19.0"
45
42
  },
46
43
  "scripts": {
47
- "type-check": "ts-builder types --target node",
48
44
  "build": "ts-builder build --target node",
49
45
  "watch": "ts-builder build --target node --watch",
50
- "lint": "eslint .",
46
+ "check": "ts-builder check --target node",
47
+ "formatter:check": "ts-builder formatter --check",
48
+ "linter:check": "ts-builder linter --check",
49
+ "types:check": "ts-builder type-check --target node",
51
50
  "test": "vitest run --coverage",
52
- "do-pack": "rm -f *.tgz && pnpm pack && mv *.tgz package.tgz"
51
+ "do-pack": "rm -f *.tgz && pnpm pack && mv *.tgz package.tgz",
52
+ "fmt": "ts-builder format"
53
53
  }
54
54
  }
@@ -4,25 +4,24 @@ import {
4
4
  type PColumnValues,
5
5
  type JsonDataInfo,
6
6
  type PColumnValue,
7
- } from '@platforma-sdk/model';
7
+ } from "@platforma-sdk/model";
8
8
 
9
- export function makeJsonDataInfo(
10
- spec: PColumnSpec,
11
- data: PColumnValues,
12
- ): JsonDataInfo {
9
+ export function makeJsonDataInfo(spec: PColumnSpec, data: PColumnValues): JsonDataInfo {
13
10
  const keyLength = spec.axesSpec.length;
14
11
  const jsonData: Record<string, PColumnValue> = {};
15
12
  for (const { key, val } of data) {
16
13
  if (key.length !== keyLength) {
17
14
  const error = new PFrameDriverError(`Inconsistent inline column key length`);
18
- error.cause = new Error(`Inline column key length ${key.length} differs from axes count ${keyLength}`);
15
+ error.cause = new Error(
16
+ `Inline column key length ${key.length} differs from axes count ${keyLength}`,
17
+ );
19
18
  throw error;
20
19
  }
21
20
  jsonData[JSON.stringify(key)] = val;
22
21
  }
23
22
 
24
23
  return {
25
- type: 'Json',
24
+ type: "Json",
26
25
  keyLength,
27
26
  data: jsonData,
28
27
  };
@@ -13,15 +13,14 @@ import type {
13
13
  TableRange,
14
14
  UniqueValuesRequest,
15
15
  UniqueValuesResponse,
16
- } from '@platforma-sdk/model';
17
- import type { PoolEntry } from '@milaboratories/ts-helpers';
16
+ } from "@platforma-sdk/model";
17
+ import type { PoolEntry } from "@milaboratories/ts-helpers";
18
18
 
19
19
  /**
20
20
  * Extends public and safe SDK's driver API with methods used internally in the middle
21
21
  * layer and in tests.
22
22
  */
23
- export interface AbstractInternalPFrameDriver<PColumnData>
24
- extends PFrameDriver, AsyncDisposable {
23
+ export interface AbstractInternalPFrameDriver<PColumnData> extends PFrameDriver, AsyncDisposable {
25
24
  /** Dispose the driver and all its resources. */
26
25
  dispose(): Promise<void>;
27
26
 
@@ -35,35 +34,28 @@ export interface AbstractInternalPFrameDriver<PColumnData>
35
34
  pprofDump(): Promise<Uint8Array>;
36
35
 
37
36
  /** Create a new PFrame */
38
- createPFrame(
39
- def: PFrameDef<PColumn<PColumnData>>,
40
- ): PoolEntry<PFrameHandle>;
37
+ createPFrame(def: PFrameDef<PColumn<PColumnData>>): PoolEntry<PFrameHandle>;
41
38
 
42
39
  /** Create a new PTable */
43
- createPTable(
44
- def: PTableDef<PColumn<PColumnData>>,
45
- ): PoolEntry<PTableHandle>;
40
+ createPTable(def: PTableDef<PColumn<PColumnData>>): PoolEntry<PTableHandle>;
46
41
 
47
42
  /** Calculates data for the table and returns complete data representation of it */
48
43
  calculateTableData(
49
44
  handle: PFrameHandle,
50
45
  request: CalculateTableDataRequest<PObjectId>,
51
46
  range: TableRange | undefined,
52
- signal?: AbortSignal
47
+ signal?: AbortSignal,
53
48
  ): Promise<CalculateTableDataResponse>;
54
49
 
55
50
  /** Calculate set of unique values for a specific axis for the filtered set of records */
56
51
  getUniqueValues(
57
52
  handle: PFrameHandle,
58
53
  request: UniqueValuesRequest,
59
- signal?: AbortSignal
54
+ signal?: AbortSignal,
60
55
  ): Promise<UniqueValuesResponse>;
61
56
 
62
57
  /** Unified table shape */
63
- getShape(
64
- handle: PTableHandle,
65
- signal?: AbortSignal,
66
- ): Promise<PTableShape>;
58
+ getShape(handle: PTableHandle, signal?: AbortSignal): Promise<PTableShape>;
67
59
 
68
60
  /**
69
61
  * Retrieve the data from the table. To retrieve only data required, it can be