@milaboratories/pf-driver 1.7.13 → 1.7.15

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 (49) hide show
  1. package/dist/_virtual/{_@oxc-project_runtime@0.123.0/helpers → _@oxc-project_runtime@0.137.0/helpers/esm}/usingCtx.cjs +2 -2
  2. package/dist/_virtual/{_@oxc-project_runtime@0.123.0/helpers → _@oxc-project_runtime@0.137.0/helpers/esm}/usingCtx.js +2 -2
  3. package/dist/csv_writer.cjs +2 -1
  4. package/dist/csv_writer.cjs.map +1 -1
  5. package/dist/csv_writer.js +1 -1
  6. package/dist/csv_writer.js.map +1 -1
  7. package/dist/data_info_helpers.cjs +0 -1
  8. package/dist/data_info_helpers.cjs.map +1 -1
  9. package/dist/data_info_helpers.js.map +1 -1
  10. package/dist/driver_double.cjs +5 -2
  11. package/dist/driver_double.cjs.map +1 -1
  12. package/dist/driver_double.d.ts.map +1 -1
  13. package/dist/driver_double.js +3 -0
  14. package/dist/driver_double.js.map +1 -1
  15. package/dist/driver_impl.cjs +10 -10
  16. package/dist/driver_impl.cjs.map +1 -1
  17. package/dist/driver_impl.d.ts.map +1 -1
  18. package/dist/driver_impl.js +1 -1
  19. package/dist/driver_impl.js.map +1 -1
  20. package/dist/index.d.ts +1 -1
  21. package/dist/logging.cjs.map +1 -1
  22. package/dist/logging.js.map +1 -1
  23. package/dist/pframe_pool.cjs +8 -1
  24. package/dist/pframe_pool.cjs.map +1 -1
  25. package/dist/pframe_pool.js +8 -1
  26. package/dist/pframe_pool.js.map +1 -1
  27. package/dist/ptable_cache_per_frame.cjs +2 -1
  28. package/dist/ptable_cache_per_frame.cjs.map +1 -1
  29. package/dist/ptable_cache_per_frame.d.ts.map +1 -1
  30. package/dist/ptable_cache_per_frame.js +2 -0
  31. package/dist/ptable_cache_per_frame.js.map +1 -1
  32. package/dist/ptable_cache_plain.cjs +1 -1
  33. package/dist/ptable_cache_plain.cjs.map +1 -1
  34. package/dist/ptable_cache_plain.d.ts.map +1 -1
  35. package/dist/ptable_cache_plain.js +1 -0
  36. package/dist/ptable_cache_plain.js.map +1 -1
  37. package/dist/ptable_def_pool.cjs +5 -1
  38. package/dist/ptable_def_pool.cjs.map +1 -1
  39. package/dist/ptable_def_pool.js +5 -1
  40. package/dist/ptable_def_pool.js.map +1 -1
  41. package/dist/ptable_pool.cjs +7 -1
  42. package/dist/ptable_pool.cjs.map +1 -1
  43. package/dist/ptable_pool.js +7 -1
  44. package/dist/ptable_pool.js.map +1 -1
  45. package/dist/ptable_shared.cjs +1 -1
  46. package/dist/ptable_shared.cjs.map +1 -1
  47. package/dist/ptable_shared.js +1 -1
  48. package/dist/ptable_shared.js.map +1 -1
  49. package/package.json +5 -5
@@ -1,4 +1,4 @@
1
- //#region \0@oxc-project+runtime@0.123.0/helpers/usingCtx.js
1
+ //#region \0@oxc-project+runtime@0.137.0/helpers/esm/usingCtx.js
2
2
  function _usingCtx() {
3
3
  var r = "function" == typeof SuppressedError ? SuppressedError : function(r, e) {
4
4
  var n = Error();
@@ -54,4 +54,4 @@ function _usingCtx() {
54
54
  };
55
55
  }
56
56
  //#endregion
57
- exports._usingCtx = _usingCtx;
57
+ exports.default = _usingCtx;
@@ -1,4 +1,4 @@
1
- //#region \0@oxc-project+runtime@0.123.0/helpers/usingCtx.js
1
+ //#region \0@oxc-project+runtime@0.137.0/helpers/esm/usingCtx.js
2
2
  function _usingCtx() {
3
3
  var r = "function" == typeof SuppressedError ? SuppressedError : function(r, e) {
4
4
  var n = Error();
@@ -54,4 +54,4 @@ function _usingCtx() {
54
54
  };
55
55
  }
56
56
  //#endregion
57
- export { _usingCtx };
57
+ export { _usingCtx as default };
@@ -1,4 +1,3 @@
1
- require("./_virtual/_rolldown/runtime.cjs");
2
1
  let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
3
2
  let _milaboratories_helpers = require("@milaboratories/helpers");
4
3
  //#region src/csv_writer.ts
@@ -75,6 +74,8 @@ function serializeValue(vector, rowIndex) {
75
74
  }
76
75
  //#endregion
77
76
  exports.columnLabel = columnLabel;
77
+ exports.formatHeader = formatHeader;
78
+ exports.formatRow = formatRow;
78
79
  exports.streamPTableRows = streamPTableRows;
79
80
 
80
81
  //# sourceMappingURL=csv_writer.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"csv_writer.cjs","names":["Annotation","ValueType"],"sources":["../src/csv_writer.ts"],"sourcesContent":["import {\n Annotation,\n isValueNA,\n readAnnotation,\n ValueType,\n type PTableColumnSpec,\n type PTableVector,\n type TableRange,\n} from \"@milaboratories/pl-model-common\";\nimport { isNil } from \"@milaboratories/helpers\";\n\n/** Minimal subset of PTable required by streamPTableRows. */\nexport interface PTableDataSource {\n getData(\n columnIndices: number[],\n options?: { range?: TableRange; signal?: AbortSignal },\n ): Promise<PTableVector[]>;\n}\n\n// ── Public API (high-level → low-level) ──────────────────────────────\n\n/** Format a CSV/TSV header row from column specs. Line ending is CRLF. */\nexport function formatHeader(specs: PTableColumnSpec[], separator: string): string {\n return specs.map((spec) => escapeField(columnLabel(spec), separator)).join(separator) + \"\\r\\n\";\n}\n\n/** Format a single data row from parallel vectors. Line ending is CRLF. */\nexport function formatRow(vectors: PTableVector[], rowIndex: number, separator: string): string {\n return (\n vectors\n .map((vector) => escapeField(serializeValue(vector, rowIndex), separator))\n .join(separator) + \"\\r\\n\"\n );\n}\n\n/**\n * Async generator that streams CSV/TSV content chunk by chunk.\n *\n * The caller is responsible for providing a concrete `range` (already clipped\n * to the table shape). When `range` is undefined the generator does nothing\n * beyond emitting an optional BOM and header.\n */\nexport interface StreamPTableRowsOptions {\n pTable: PTableDataSource;\n specs: PTableColumnSpec[];\n columnIndices: number[];\n range?: TableRange;\n chunkSize: number;\n separator: string;\n includeHeader: boolean;\n bom: boolean;\n signal?: AbortSignal;\n}\nexport async function* streamPTableRows(options: StreamPTableRowsOptions): AsyncIterable<string> {\n const { pTable, columnIndices, range, chunkSize, separator, signal, specs, includeHeader, bom } =\n options;\n\n if (bom) {\n yield \"\\uFEFF\";\n }\n\n if (includeHeader) {\n const selectedSpecs = columnIndices.map((index) => specs[index]);\n yield formatHeader(selectedSpecs, separator);\n }\n\n if (isNil(range)) {\n return;\n }\n\n const end = range.offset + range.length;\n\n for (let from = range.offset; from < end; from += chunkSize) {\n signal?.throwIfAborted();\n\n const length = Math.min(chunkSize, end - from);\n const subRange: TableRange = { offset: from, length };\n\n const vectors = await pTable.getData(columnIndices, { range: subRange, signal });\n\n const rows: string[] = [];\n for (let rowIndex = 0; rowIndex < length; rowIndex++) {\n rows.push(formatRow(vectors, rowIndex, separator));\n }\n yield rows.join(\"\");\n }\n}\n\n// ── Helpers (low-level) ──────────────────────────────────────────────\n\n/** Extract a human-readable label from a PTableColumnSpec. */\nexport function columnLabel(spec: PTableColumnSpec): string {\n const annotation = readAnnotation(spec.spec, Annotation.Label);\n return isNil(annotation) ? spec.spec.name : annotation.trim();\n}\n\n/**\n * RFC 4180 field escaping.\n * Quote if the field contains the separator, a double-quote, CR, or LF.\n * Embedded `\"` are doubled.\n */\nfunction escapeField(value: string, separator: string): string {\n return needsQuoting(value, separator) ? '\"' + value.replace(/\"/g, '\"\"') + '\"' : value;\n}\n\n/** Returns true when the value must be wrapped in double-quotes. */\nfunction needsQuoting(value: string, separator: string): boolean {\n return (\n value.includes(separator) || value.includes('\"') || value.includes(\"\\r\") || value.includes(\"\\n\")\n );\n}\n\n/**\n * Serialize one cell value from a typed vector to its string representation.\n *\n * - `null` / `undefined` -> `\"\"`\n * - `bigint` -> `String(x)`\n * - `NaN` / `+Inf` / `-Inf` -> `\"\"`\n */\nfunction serializeValue(vector: PTableVector, rowIndex: number): string {\n const rawValue = vector.data[rowIndex];\n\n if (isNil(rawValue)) {\n return \"\";\n }\n\n if (isValueNA(vector, rowIndex)) {\n return \"\";\n }\n\n switch (vector.type) {\n case ValueType.Long: {\n // BigInt64Array element — may be stored as bigint\n return String(rawValue);\n }\n case ValueType.Float:\n case ValueType.Double: {\n const numeric = rawValue as number;\n return Number.isNaN(numeric) || !Number.isFinite(numeric) ? \"\" : String(numeric);\n }\n case ValueType.Int: {\n return String(rawValue);\n }\n case ValueType.String: {\n return rawValue as string;\n }\n case ValueType.Bytes: {\n return \"\";\n }\n default: {\n return String(rawValue);\n }\n }\n}\n"],"mappings":";;;;;AAsBA,SAAgB,aAAa,OAA2B,WAA2B;AACjF,QAAO,MAAM,KAAK,SAAS,YAAY,YAAY,KAAK,EAAE,UAAU,CAAC,CAAC,KAAK,UAAU,GAAG;;;AAI1F,SAAgB,UAAU,SAAyB,UAAkB,WAA2B;AAC9F,QACE,QACG,KAAK,WAAW,YAAY,eAAe,QAAQ,SAAS,EAAE,UAAU,CAAC,CACzE,KAAK,UAAU,GAAG;;AAsBzB,gBAAuB,iBAAiB,SAAyD;CAC/F,MAAM,EAAE,QAAQ,eAAe,OAAO,WAAW,WAAW,QAAQ,OAAO,eAAe,QACxF;AAEF,KAAI,IACF,OAAM;AAGR,KAAI,cAEF,OAAM,aADgB,cAAc,KAAK,UAAU,MAAM,OAAO,EAC9B,UAAU;AAG9C,MAAA,GAAA,wBAAA,OAAU,MAAM,CACd;CAGF,MAAM,MAAM,MAAM,SAAS,MAAM;AAEjC,MAAK,IAAI,OAAO,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW;AAC3D,UAAQ,gBAAgB;EAExB,MAAM,SAAS,KAAK,IAAI,WAAW,MAAM,KAAK;EAC9C,MAAM,WAAuB;GAAE,QAAQ;GAAM;GAAQ;EAErD,MAAM,UAAU,MAAM,OAAO,QAAQ,eAAe;GAAE,OAAO;GAAU;GAAQ,CAAC;EAEhF,MAAM,OAAiB,EAAE;AACzB,OAAK,IAAI,WAAW,GAAG,WAAW,QAAQ,WACxC,MAAK,KAAK,UAAU,SAAS,UAAU,UAAU,CAAC;AAEpD,QAAM,KAAK,KAAK,GAAG;;;;AAOvB,SAAgB,YAAY,MAAgC;CAC1D,MAAM,cAAA,GAAA,gCAAA,gBAA4B,KAAK,MAAMA,gCAAAA,WAAW,MAAM;AAC9D,SAAA,GAAA,wBAAA,OAAa,WAAW,GAAG,KAAK,KAAK,OAAO,WAAW,MAAM;;;;;;;AAQ/D,SAAS,YAAY,OAAe,WAA2B;AAC7D,QAAO,aAAa,OAAO,UAAU,GAAG,OAAM,MAAM,QAAQ,MAAM,OAAK,GAAG,OAAM;;;AAIlF,SAAS,aAAa,OAAe,WAA4B;AAC/D,QACE,MAAM,SAAS,UAAU,IAAI,MAAM,SAAS,KAAI,IAAI,MAAM,SAAS,KAAK,IAAI,MAAM,SAAS,KAAK;;;;;;;;;AAWpG,SAAS,eAAe,QAAsB,UAA0B;CACtE,MAAM,WAAW,OAAO,KAAK;AAE7B,MAAA,GAAA,wBAAA,OAAU,SAAS,CACjB,QAAO;AAGT,MAAA,GAAA,gCAAA,WAAc,QAAQ,SAAS,CAC7B,QAAO;AAGT,SAAQ,OAAO,MAAf;EACE,KAAKC,gCAAAA,UAAU,KAEb,QAAO,OAAO,SAAS;EAEzB,KAAKA,gCAAAA,UAAU;EACf,KAAKA,gCAAAA,UAAU,QAAQ;GACrB,MAAM,UAAU;AAChB,UAAO,OAAO,MAAM,QAAQ,IAAI,CAAC,OAAO,SAAS,QAAQ,GAAG,KAAK,OAAO,QAAQ;;EAElF,KAAKA,gCAAAA,UAAU,IACb,QAAO,OAAO,SAAS;EAEzB,KAAKA,gCAAAA,UAAU,OACb,QAAO;EAET,KAAKA,gCAAAA,UAAU,MACb,QAAO;EAET,QACE,QAAO,OAAO,SAAS"}
1
+ {"version":3,"file":"csv_writer.cjs","names":["Annotation","ValueType"],"sources":["../src/csv_writer.ts"],"sourcesContent":["import {\n Annotation,\n isValueNA,\n readAnnotation,\n ValueType,\n type PTableColumnSpec,\n type PTableVector,\n type TableRange,\n} from \"@milaboratories/pl-model-common\";\nimport { isNil } from \"@milaboratories/helpers\";\n\n/** Minimal subset of PTable required by streamPTableRows. */\nexport interface PTableDataSource {\n getData(\n columnIndices: number[],\n options?: { range?: TableRange; signal?: AbortSignal },\n ): Promise<PTableVector[]>;\n}\n\n// ── Public API (high-level → low-level) ──────────────────────────────\n\n/** Format a CSV/TSV header row from column specs. Line ending is CRLF. */\nexport function formatHeader(specs: PTableColumnSpec[], separator: string): string {\n return specs.map((spec) => escapeField(columnLabel(spec), separator)).join(separator) + \"\\r\\n\";\n}\n\n/** Format a single data row from parallel vectors. Line ending is CRLF. */\nexport function formatRow(vectors: PTableVector[], rowIndex: number, separator: string): string {\n return (\n vectors\n .map((vector) => escapeField(serializeValue(vector, rowIndex), separator))\n .join(separator) + \"\\r\\n\"\n );\n}\n\n/**\n * Async generator that streams CSV/TSV content chunk by chunk.\n *\n * The caller is responsible for providing a concrete `range` (already clipped\n * to the table shape). When `range` is undefined the generator does nothing\n * beyond emitting an optional BOM and header.\n */\nexport interface StreamPTableRowsOptions {\n pTable: PTableDataSource;\n specs: PTableColumnSpec[];\n columnIndices: number[];\n range?: TableRange;\n chunkSize: number;\n separator: string;\n includeHeader: boolean;\n bom: boolean;\n signal?: AbortSignal;\n}\nexport async function* streamPTableRows(options: StreamPTableRowsOptions): AsyncIterable<string> {\n const { pTable, columnIndices, range, chunkSize, separator, signal, specs, includeHeader, bom } =\n options;\n\n if (bom) {\n yield \"\\uFEFF\";\n }\n\n if (includeHeader) {\n const selectedSpecs = columnIndices.map((index) => specs[index]);\n yield formatHeader(selectedSpecs, separator);\n }\n\n if (isNil(range)) {\n return;\n }\n\n const end = range.offset + range.length;\n\n for (let from = range.offset; from < end; from += chunkSize) {\n signal?.throwIfAborted();\n\n const length = Math.min(chunkSize, end - from);\n const subRange: TableRange = { offset: from, length };\n\n const vectors = await pTable.getData(columnIndices, { range: subRange, signal });\n\n const rows: string[] = [];\n for (let rowIndex = 0; rowIndex < length; rowIndex++) {\n rows.push(formatRow(vectors, rowIndex, separator));\n }\n yield rows.join(\"\");\n }\n}\n\n// ── Helpers (low-level) ──────────────────────────────────────────────\n\n/** Extract a human-readable label from a PTableColumnSpec. */\nexport function columnLabel(spec: PTableColumnSpec): string {\n const annotation = readAnnotation(spec.spec, Annotation.Label);\n return isNil(annotation) ? spec.spec.name : annotation.trim();\n}\n\n/**\n * RFC 4180 field escaping.\n * Quote if the field contains the separator, a double-quote, CR, or LF.\n * Embedded `\"` are doubled.\n */\nfunction escapeField(value: string, separator: string): string {\n return needsQuoting(value, separator) ? '\"' + value.replace(/\"/g, '\"\"') + '\"' : value;\n}\n\n/** Returns true when the value must be wrapped in double-quotes. */\nfunction needsQuoting(value: string, separator: string): boolean {\n return (\n value.includes(separator) || value.includes('\"') || value.includes(\"\\r\") || value.includes(\"\\n\")\n );\n}\n\n/**\n * Serialize one cell value from a typed vector to its string representation.\n *\n * - `null` / `undefined` -> `\"\"`\n * - `bigint` -> `String(x)`\n * - `NaN` / `+Inf` / `-Inf` -> `\"\"`\n */\nfunction serializeValue(vector: PTableVector, rowIndex: number): string {\n const rawValue = vector.data[rowIndex];\n\n if (isNil(rawValue)) {\n return \"\";\n }\n\n if (isValueNA(vector, rowIndex)) {\n return \"\";\n }\n\n switch (vector.type) {\n case ValueType.Long: {\n // BigInt64Array element — may be stored as bigint\n return String(rawValue);\n }\n case ValueType.Float:\n case ValueType.Double: {\n const numeric = rawValue as number;\n return Number.isNaN(numeric) || !Number.isFinite(numeric) ? \"\" : String(numeric);\n }\n case ValueType.Int: {\n return String(rawValue);\n }\n case ValueType.String: {\n return rawValue as string;\n }\n case ValueType.Bytes: {\n return \"\";\n }\n default: {\n return String(rawValue);\n }\n }\n}\n"],"mappings":";;;;AAsBA,SAAgB,aAAa,OAA2B,WAA2B;CACjF,OAAO,MAAM,KAAK,SAAS,YAAY,YAAY,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI;AAC1F;;AAGA,SAAgB,UAAU,SAAyB,UAAkB,WAA2B;CAC9F,OACE,QACG,KAAK,WAAW,YAAY,eAAe,QAAQ,QAAQ,GAAG,SAAS,CAAC,CAAC,CACzE,KAAK,SAAS,IAAI;AAEzB;AAoBA,gBAAuB,iBAAiB,SAAyD;CAC/F,MAAM,EAAE,QAAQ,eAAe,OAAO,WAAW,WAAW,QAAQ,OAAO,eAAe,QACxF;CAEF,IAAI,KACF,MAAM;CAGR,IAAI,eAEF,MAAM,aADgB,cAAc,KAAK,UAAU,MAAM,MAC1B,GAAG,SAAS;CAG7C,KAAA,GAAA,wBAAA,MAAA,CAAU,KAAK,GACb;CAGF,MAAM,MAAM,MAAM,SAAS,MAAM;CAEjC,KAAK,IAAI,OAAO,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW;EAC3D,QAAQ,eAAe;EAEvB,MAAM,SAAS,KAAK,IAAI,WAAW,MAAM,IAAI;EAC7C,MAAM,WAAuB;GAAE,QAAQ;GAAM;EAAO;EAEpD,MAAM,UAAU,MAAM,OAAO,QAAQ,eAAe;GAAE,OAAO;GAAU;EAAO,CAAC;EAE/E,MAAM,OAAiB,CAAC;EACxB,KAAK,IAAI,WAAW,GAAG,WAAW,QAAQ,YACxC,KAAK,KAAK,UAAU,SAAS,UAAU,SAAS,CAAC;EAEnD,MAAM,KAAK,KAAK,EAAE;CACpB;AACF;;AAKA,SAAgB,YAAY,MAAgC;CAC1D,MAAM,cAAA,GAAA,gCAAA,eAAA,CAA4B,KAAK,MAAMA,gCAAAA,WAAW,KAAK;CAC7D,QAAA,GAAA,wBAAA,MAAA,CAAa,UAAU,IAAI,KAAK,KAAK,OAAO,WAAW,KAAK;AAC9D;;;;;;AAOA,SAAS,YAAY,OAAe,WAA2B;CAC7D,OAAO,aAAa,OAAO,SAAS,IAAI,OAAM,MAAM,QAAQ,MAAM,MAAI,IAAI,OAAM;AAClF;;AAGA,SAAS,aAAa,OAAe,WAA4B;CAC/D,OACE,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,IAAG,KAAK,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,IAAI;AAEnG;;;;;;;;AASA,SAAS,eAAe,QAAsB,UAA0B;CACtE,MAAM,WAAW,OAAO,KAAK;CAE7B,KAAA,GAAA,wBAAA,MAAA,CAAU,QAAQ,GAChB,OAAO;CAGT,KAAA,GAAA,gCAAA,UAAA,CAAc,QAAQ,QAAQ,GAC5B,OAAO;CAGT,QAAQ,OAAO,MAAf;EACE,KAAKC,gCAAAA,UAAU,MAEb,OAAO,OAAO,QAAQ;EAExB,KAAKA,gCAAAA,UAAU;EACf,KAAKA,gCAAAA,UAAU,QAAQ;GACrB,MAAM,UAAU;GAChB,OAAO,OAAO,MAAM,OAAO,KAAK,CAAC,OAAO,SAAS,OAAO,IAAI,KAAK,OAAO,OAAO;EACjF;EACA,KAAKA,gCAAAA,UAAU,KACb,OAAO,OAAO,QAAQ;EAExB,KAAKA,gCAAAA,UAAU,QACb,OAAO;EAET,KAAKA,gCAAAA,UAAU,OACb,OAAO;EAET,SACE,OAAO,OAAO,QAAQ;CAE1B;AACF"}
@@ -73,6 +73,6 @@ function serializeValue(vector, rowIndex) {
73
73
  }
74
74
  }
75
75
  //#endregion
76
- export { columnLabel, streamPTableRows };
76
+ export { columnLabel, formatHeader, formatRow, streamPTableRows };
77
77
 
78
78
  //# sourceMappingURL=csv_writer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"csv_writer.js","names":[],"sources":["../src/csv_writer.ts"],"sourcesContent":["import {\n Annotation,\n isValueNA,\n readAnnotation,\n ValueType,\n type PTableColumnSpec,\n type PTableVector,\n type TableRange,\n} from \"@milaboratories/pl-model-common\";\nimport { isNil } from \"@milaboratories/helpers\";\n\n/** Minimal subset of PTable required by streamPTableRows. */\nexport interface PTableDataSource {\n getData(\n columnIndices: number[],\n options?: { range?: TableRange; signal?: AbortSignal },\n ): Promise<PTableVector[]>;\n}\n\n// ── Public API (high-level → low-level) ──────────────────────────────\n\n/** Format a CSV/TSV header row from column specs. Line ending is CRLF. */\nexport function formatHeader(specs: PTableColumnSpec[], separator: string): string {\n return specs.map((spec) => escapeField(columnLabel(spec), separator)).join(separator) + \"\\r\\n\";\n}\n\n/** Format a single data row from parallel vectors. Line ending is CRLF. */\nexport function formatRow(vectors: PTableVector[], rowIndex: number, separator: string): string {\n return (\n vectors\n .map((vector) => escapeField(serializeValue(vector, rowIndex), separator))\n .join(separator) + \"\\r\\n\"\n );\n}\n\n/**\n * Async generator that streams CSV/TSV content chunk by chunk.\n *\n * The caller is responsible for providing a concrete `range` (already clipped\n * to the table shape). When `range` is undefined the generator does nothing\n * beyond emitting an optional BOM and header.\n */\nexport interface StreamPTableRowsOptions {\n pTable: PTableDataSource;\n specs: PTableColumnSpec[];\n columnIndices: number[];\n range?: TableRange;\n chunkSize: number;\n separator: string;\n includeHeader: boolean;\n bom: boolean;\n signal?: AbortSignal;\n}\nexport async function* streamPTableRows(options: StreamPTableRowsOptions): AsyncIterable<string> {\n const { pTable, columnIndices, range, chunkSize, separator, signal, specs, includeHeader, bom } =\n options;\n\n if (bom) {\n yield \"\\uFEFF\";\n }\n\n if (includeHeader) {\n const selectedSpecs = columnIndices.map((index) => specs[index]);\n yield formatHeader(selectedSpecs, separator);\n }\n\n if (isNil(range)) {\n return;\n }\n\n const end = range.offset + range.length;\n\n for (let from = range.offset; from < end; from += chunkSize) {\n signal?.throwIfAborted();\n\n const length = Math.min(chunkSize, end - from);\n const subRange: TableRange = { offset: from, length };\n\n const vectors = await pTable.getData(columnIndices, { range: subRange, signal });\n\n const rows: string[] = [];\n for (let rowIndex = 0; rowIndex < length; rowIndex++) {\n rows.push(formatRow(vectors, rowIndex, separator));\n }\n yield rows.join(\"\");\n }\n}\n\n// ── Helpers (low-level) ──────────────────────────────────────────────\n\n/** Extract a human-readable label from a PTableColumnSpec. */\nexport function columnLabel(spec: PTableColumnSpec): string {\n const annotation = readAnnotation(spec.spec, Annotation.Label);\n return isNil(annotation) ? spec.spec.name : annotation.trim();\n}\n\n/**\n * RFC 4180 field escaping.\n * Quote if the field contains the separator, a double-quote, CR, or LF.\n * Embedded `\"` are doubled.\n */\nfunction escapeField(value: string, separator: string): string {\n return needsQuoting(value, separator) ? '\"' + value.replace(/\"/g, '\"\"') + '\"' : value;\n}\n\n/** Returns true when the value must be wrapped in double-quotes. */\nfunction needsQuoting(value: string, separator: string): boolean {\n return (\n value.includes(separator) || value.includes('\"') || value.includes(\"\\r\") || value.includes(\"\\n\")\n );\n}\n\n/**\n * Serialize one cell value from a typed vector to its string representation.\n *\n * - `null` / `undefined` -> `\"\"`\n * - `bigint` -> `String(x)`\n * - `NaN` / `+Inf` / `-Inf` -> `\"\"`\n */\nfunction serializeValue(vector: PTableVector, rowIndex: number): string {\n const rawValue = vector.data[rowIndex];\n\n if (isNil(rawValue)) {\n return \"\";\n }\n\n if (isValueNA(vector, rowIndex)) {\n return \"\";\n }\n\n switch (vector.type) {\n case ValueType.Long: {\n // BigInt64Array element — may be stored as bigint\n return String(rawValue);\n }\n case ValueType.Float:\n case ValueType.Double: {\n const numeric = rawValue as number;\n return Number.isNaN(numeric) || !Number.isFinite(numeric) ? \"\" : String(numeric);\n }\n case ValueType.Int: {\n return String(rawValue);\n }\n case ValueType.String: {\n return rawValue as string;\n }\n case ValueType.Bytes: {\n return \"\";\n }\n default: {\n return String(rawValue);\n }\n }\n}\n"],"mappings":";;;;AAsBA,SAAgB,aAAa,OAA2B,WAA2B;AACjF,QAAO,MAAM,KAAK,SAAS,YAAY,YAAY,KAAK,EAAE,UAAU,CAAC,CAAC,KAAK,UAAU,GAAG;;;AAI1F,SAAgB,UAAU,SAAyB,UAAkB,WAA2B;AAC9F,QACE,QACG,KAAK,WAAW,YAAY,eAAe,QAAQ,SAAS,EAAE,UAAU,CAAC,CACzE,KAAK,UAAU,GAAG;;AAsBzB,gBAAuB,iBAAiB,SAAyD;CAC/F,MAAM,EAAE,QAAQ,eAAe,OAAO,WAAW,WAAW,QAAQ,OAAO,eAAe,QACxF;AAEF,KAAI,IACF,OAAM;AAGR,KAAI,cAEF,OAAM,aADgB,cAAc,KAAK,UAAU,MAAM,OAAO,EAC9B,UAAU;AAG9C,KAAI,MAAM,MAAM,CACd;CAGF,MAAM,MAAM,MAAM,SAAS,MAAM;AAEjC,MAAK,IAAI,OAAO,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW;AAC3D,UAAQ,gBAAgB;EAExB,MAAM,SAAS,KAAK,IAAI,WAAW,MAAM,KAAK;EAC9C,MAAM,WAAuB;GAAE,QAAQ;GAAM;GAAQ;EAErD,MAAM,UAAU,MAAM,OAAO,QAAQ,eAAe;GAAE,OAAO;GAAU;GAAQ,CAAC;EAEhF,MAAM,OAAiB,EAAE;AACzB,OAAK,IAAI,WAAW,GAAG,WAAW,QAAQ,WACxC,MAAK,KAAK,UAAU,SAAS,UAAU,UAAU,CAAC;AAEpD,QAAM,KAAK,KAAK,GAAG;;;;AAOvB,SAAgB,YAAY,MAAgC;CAC1D,MAAM,aAAa,eAAe,KAAK,MAAM,WAAW,MAAM;AAC9D,QAAO,MAAM,WAAW,GAAG,KAAK,KAAK,OAAO,WAAW,MAAM;;;;;;;AAQ/D,SAAS,YAAY,OAAe,WAA2B;AAC7D,QAAO,aAAa,OAAO,UAAU,GAAG,OAAM,MAAM,QAAQ,MAAM,OAAK,GAAG,OAAM;;;AAIlF,SAAS,aAAa,OAAe,WAA4B;AAC/D,QACE,MAAM,SAAS,UAAU,IAAI,MAAM,SAAS,KAAI,IAAI,MAAM,SAAS,KAAK,IAAI,MAAM,SAAS,KAAK;;;;;;;;;AAWpG,SAAS,eAAe,QAAsB,UAA0B;CACtE,MAAM,WAAW,OAAO,KAAK;AAE7B,KAAI,MAAM,SAAS,CACjB,QAAO;AAGT,KAAI,UAAU,QAAQ,SAAS,CAC7B,QAAO;AAGT,SAAQ,OAAO,MAAf;EACE,KAAK,UAAU,KAEb,QAAO,OAAO,SAAS;EAEzB,KAAK,UAAU;EACf,KAAK,UAAU,QAAQ;GACrB,MAAM,UAAU;AAChB,UAAO,OAAO,MAAM,QAAQ,IAAI,CAAC,OAAO,SAAS,QAAQ,GAAG,KAAK,OAAO,QAAQ;;EAElF,KAAK,UAAU,IACb,QAAO,OAAO,SAAS;EAEzB,KAAK,UAAU,OACb,QAAO;EAET,KAAK,UAAU,MACb,QAAO;EAET,QACE,QAAO,OAAO,SAAS"}
1
+ {"version":3,"file":"csv_writer.js","names":[],"sources":["../src/csv_writer.ts"],"sourcesContent":["import {\n Annotation,\n isValueNA,\n readAnnotation,\n ValueType,\n type PTableColumnSpec,\n type PTableVector,\n type TableRange,\n} from \"@milaboratories/pl-model-common\";\nimport { isNil } from \"@milaboratories/helpers\";\n\n/** Minimal subset of PTable required by streamPTableRows. */\nexport interface PTableDataSource {\n getData(\n columnIndices: number[],\n options?: { range?: TableRange; signal?: AbortSignal },\n ): Promise<PTableVector[]>;\n}\n\n// ── Public API (high-level → low-level) ──────────────────────────────\n\n/** Format a CSV/TSV header row from column specs. Line ending is CRLF. */\nexport function formatHeader(specs: PTableColumnSpec[], separator: string): string {\n return specs.map((spec) => escapeField(columnLabel(spec), separator)).join(separator) + \"\\r\\n\";\n}\n\n/** Format a single data row from parallel vectors. Line ending is CRLF. */\nexport function formatRow(vectors: PTableVector[], rowIndex: number, separator: string): string {\n return (\n vectors\n .map((vector) => escapeField(serializeValue(vector, rowIndex), separator))\n .join(separator) + \"\\r\\n\"\n );\n}\n\n/**\n * Async generator that streams CSV/TSV content chunk by chunk.\n *\n * The caller is responsible for providing a concrete `range` (already clipped\n * to the table shape). When `range` is undefined the generator does nothing\n * beyond emitting an optional BOM and header.\n */\nexport interface StreamPTableRowsOptions {\n pTable: PTableDataSource;\n specs: PTableColumnSpec[];\n columnIndices: number[];\n range?: TableRange;\n chunkSize: number;\n separator: string;\n includeHeader: boolean;\n bom: boolean;\n signal?: AbortSignal;\n}\nexport async function* streamPTableRows(options: StreamPTableRowsOptions): AsyncIterable<string> {\n const { pTable, columnIndices, range, chunkSize, separator, signal, specs, includeHeader, bom } =\n options;\n\n if (bom) {\n yield \"\\uFEFF\";\n }\n\n if (includeHeader) {\n const selectedSpecs = columnIndices.map((index) => specs[index]);\n yield formatHeader(selectedSpecs, separator);\n }\n\n if (isNil(range)) {\n return;\n }\n\n const end = range.offset + range.length;\n\n for (let from = range.offset; from < end; from += chunkSize) {\n signal?.throwIfAborted();\n\n const length = Math.min(chunkSize, end - from);\n const subRange: TableRange = { offset: from, length };\n\n const vectors = await pTable.getData(columnIndices, { range: subRange, signal });\n\n const rows: string[] = [];\n for (let rowIndex = 0; rowIndex < length; rowIndex++) {\n rows.push(formatRow(vectors, rowIndex, separator));\n }\n yield rows.join(\"\");\n }\n}\n\n// ── Helpers (low-level) ──────────────────────────────────────────────\n\n/** Extract a human-readable label from a PTableColumnSpec. */\nexport function columnLabel(spec: PTableColumnSpec): string {\n const annotation = readAnnotation(spec.spec, Annotation.Label);\n return isNil(annotation) ? spec.spec.name : annotation.trim();\n}\n\n/**\n * RFC 4180 field escaping.\n * Quote if the field contains the separator, a double-quote, CR, or LF.\n * Embedded `\"` are doubled.\n */\nfunction escapeField(value: string, separator: string): string {\n return needsQuoting(value, separator) ? '\"' + value.replace(/\"/g, '\"\"') + '\"' : value;\n}\n\n/** Returns true when the value must be wrapped in double-quotes. */\nfunction needsQuoting(value: string, separator: string): boolean {\n return (\n value.includes(separator) || value.includes('\"') || value.includes(\"\\r\") || value.includes(\"\\n\")\n );\n}\n\n/**\n * Serialize one cell value from a typed vector to its string representation.\n *\n * - `null` / `undefined` -> `\"\"`\n * - `bigint` -> `String(x)`\n * - `NaN` / `+Inf` / `-Inf` -> `\"\"`\n */\nfunction serializeValue(vector: PTableVector, rowIndex: number): string {\n const rawValue = vector.data[rowIndex];\n\n if (isNil(rawValue)) {\n return \"\";\n }\n\n if (isValueNA(vector, rowIndex)) {\n return \"\";\n }\n\n switch (vector.type) {\n case ValueType.Long: {\n // BigInt64Array element — may be stored as bigint\n return String(rawValue);\n }\n case ValueType.Float:\n case ValueType.Double: {\n const numeric = rawValue as number;\n return Number.isNaN(numeric) || !Number.isFinite(numeric) ? \"\" : String(numeric);\n }\n case ValueType.Int: {\n return String(rawValue);\n }\n case ValueType.String: {\n return rawValue as string;\n }\n case ValueType.Bytes: {\n return \"\";\n }\n default: {\n return String(rawValue);\n }\n }\n}\n"],"mappings":";;;;AAsBA,SAAgB,aAAa,OAA2B,WAA2B;CACjF,OAAO,MAAM,KAAK,SAAS,YAAY,YAAY,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI;AAC1F;;AAGA,SAAgB,UAAU,SAAyB,UAAkB,WAA2B;CAC9F,OACE,QACG,KAAK,WAAW,YAAY,eAAe,QAAQ,QAAQ,GAAG,SAAS,CAAC,CAAC,CACzE,KAAK,SAAS,IAAI;AAEzB;AAoBA,gBAAuB,iBAAiB,SAAyD;CAC/F,MAAM,EAAE,QAAQ,eAAe,OAAO,WAAW,WAAW,QAAQ,OAAO,eAAe,QACxF;CAEF,IAAI,KACF,MAAM;CAGR,IAAI,eAEF,MAAM,aADgB,cAAc,KAAK,UAAU,MAAM,MAC1B,GAAG,SAAS;CAG7C,IAAI,MAAM,KAAK,GACb;CAGF,MAAM,MAAM,MAAM,SAAS,MAAM;CAEjC,KAAK,IAAI,OAAO,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW;EAC3D,QAAQ,eAAe;EAEvB,MAAM,SAAS,KAAK,IAAI,WAAW,MAAM,IAAI;EAC7C,MAAM,WAAuB;GAAE,QAAQ;GAAM;EAAO;EAEpD,MAAM,UAAU,MAAM,OAAO,QAAQ,eAAe;GAAE,OAAO;GAAU;EAAO,CAAC;EAE/E,MAAM,OAAiB,CAAC;EACxB,KAAK,IAAI,WAAW,GAAG,WAAW,QAAQ,YACxC,KAAK,KAAK,UAAU,SAAS,UAAU,SAAS,CAAC;EAEnD,MAAM,KAAK,KAAK,EAAE;CACpB;AACF;;AAKA,SAAgB,YAAY,MAAgC;CAC1D,MAAM,aAAa,eAAe,KAAK,MAAM,WAAW,KAAK;CAC7D,OAAO,MAAM,UAAU,IAAI,KAAK,KAAK,OAAO,WAAW,KAAK;AAC9D;;;;;;AAOA,SAAS,YAAY,OAAe,WAA2B;CAC7D,OAAO,aAAa,OAAO,SAAS,IAAI,OAAM,MAAM,QAAQ,MAAM,MAAI,IAAI,OAAM;AAClF;;AAGA,SAAS,aAAa,OAAe,WAA4B;CAC/D,OACE,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,IAAG,KAAK,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,IAAI;AAEnG;;;;;;;;AASA,SAAS,eAAe,QAAsB,UAA0B;CACtE,MAAM,WAAW,OAAO,KAAK;CAE7B,IAAI,MAAM,QAAQ,GAChB,OAAO;CAGT,IAAI,UAAU,QAAQ,QAAQ,GAC5B,OAAO;CAGT,QAAQ,OAAO,MAAf;EACE,KAAK,UAAU,MAEb,OAAO,OAAO,QAAQ;EAExB,KAAK,UAAU;EACf,KAAK,UAAU,QAAQ;GACrB,MAAM,UAAU;GAChB,OAAO,OAAO,MAAM,OAAO,KAAK,CAAC,OAAO,SAAS,OAAO,IAAI,KAAK,OAAO,OAAO;EACjF;EACA,KAAK,UAAU,KACb,OAAO,OAAO,QAAQ;EAExB,KAAK,UAAU,QACb,OAAO;EAET,KAAK,UAAU,OACb,OAAO;EAET,SACE,OAAO,OAAO,QAAQ;CAE1B;AACF"}
@@ -1,4 +1,3 @@
1
- require("./_virtual/_rolldown/runtime.cjs");
2
1
  let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
3
2
  //#region src/data_info_helpers.ts
4
3
  function makeJsonDataInfo(spec, data) {
@@ -1 +1 @@
1
- {"version":3,"file":"data_info_helpers.cjs","names":["PFrameDriverError"],"sources":["../src/data_info_helpers.ts"],"sourcesContent":["import {\n PFrameDriverError,\n type PColumnSpec,\n type PColumnValues,\n type JsonDataInfo,\n type PColumnValue,\n} from \"@milaboratories/pl-model-common\";\n\nexport function makeJsonDataInfo(spec: PColumnSpec, data: PColumnValues): JsonDataInfo {\n const keyLength = spec.axesSpec.length;\n const jsonData: Record<string, PColumnValue> = {};\n for (const { key, val } of data) {\n if (key.length !== keyLength) {\n const error = new PFrameDriverError(`Inconsistent inline column key length`);\n error.cause = new Error(\n `Inline column key length ${key.length} differs from axes count ${keyLength}`,\n );\n throw error;\n }\n jsonData[JSON.stringify(key)] = val;\n }\n\n return {\n type: \"Json\",\n keyLength,\n data: jsonData,\n };\n}\n"],"mappings":";;;AAQA,SAAgB,iBAAiB,MAAmB,MAAmC;CACrF,MAAM,YAAY,KAAK,SAAS;CAChC,MAAM,WAAyC,EAAE;AACjD,MAAK,MAAM,EAAE,KAAK,SAAS,MAAM;AAC/B,MAAI,IAAI,WAAW,WAAW;GAC5B,MAAM,QAAQ,IAAIA,gCAAAA,kBAAkB,wCAAwC;AAC5E,SAAM,wBAAQ,IAAI,MAChB,4BAA4B,IAAI,OAAO,2BAA2B,YACnE;AACD,SAAM;;AAER,WAAS,KAAK,UAAU,IAAI,IAAI;;AAGlC,QAAO;EACL,MAAM;EACN;EACA,MAAM;EACP"}
1
+ {"version":3,"file":"data_info_helpers.cjs","names":["PFrameDriverError"],"sources":["../src/data_info_helpers.ts"],"sourcesContent":["import {\n PFrameDriverError,\n type PColumnSpec,\n type PColumnValues,\n type JsonDataInfo,\n type PColumnValue,\n} from \"@milaboratories/pl-model-common\";\n\nexport function makeJsonDataInfo(spec: PColumnSpec, data: PColumnValues): JsonDataInfo {\n const keyLength = spec.axesSpec.length;\n const jsonData: Record<string, PColumnValue> = {};\n for (const { key, val } of data) {\n if (key.length !== keyLength) {\n const error = new PFrameDriverError(`Inconsistent inline column key length`);\n error.cause = new Error(\n `Inline column key length ${key.length} differs from axes count ${keyLength}`,\n );\n throw error;\n }\n jsonData[JSON.stringify(key)] = val;\n }\n\n return {\n type: \"Json\",\n keyLength,\n data: jsonData,\n };\n}\n"],"mappings":";;AAQA,SAAgB,iBAAiB,MAAmB,MAAmC;CACrF,MAAM,YAAY,KAAK,SAAS;CAChC,MAAM,WAAyC,CAAC;CAChD,KAAK,MAAM,EAAE,KAAK,SAAS,MAAM;EAC/B,IAAI,IAAI,WAAW,WAAW;GAC5B,MAAM,QAAQ,IAAIA,gCAAAA,kBAAkB,uCAAuC;GAC3E,MAAM,wBAAQ,IAAI,MAChB,4BAA4B,IAAI,OAAO,2BAA2B,WACpE;GACA,MAAM;EACR;EACA,SAAS,KAAK,UAAU,GAAG,KAAK;CAClC;CAEA,OAAO;EACL,MAAM;EACN;EACA,MAAM;CACR;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"data_info_helpers.js","names":[],"sources":["../src/data_info_helpers.ts"],"sourcesContent":["import {\n PFrameDriverError,\n type PColumnSpec,\n type PColumnValues,\n type JsonDataInfo,\n type PColumnValue,\n} from \"@milaboratories/pl-model-common\";\n\nexport function makeJsonDataInfo(spec: PColumnSpec, data: PColumnValues): JsonDataInfo {\n const keyLength = spec.axesSpec.length;\n const jsonData: Record<string, PColumnValue> = {};\n for (const { key, val } of data) {\n if (key.length !== keyLength) {\n const error = new PFrameDriverError(`Inconsistent inline column key length`);\n error.cause = new Error(\n `Inline column key length ${key.length} differs from axes count ${keyLength}`,\n );\n throw error;\n }\n jsonData[JSON.stringify(key)] = val;\n }\n\n return {\n type: \"Json\",\n keyLength,\n data: jsonData,\n };\n}\n"],"mappings":";;AAQA,SAAgB,iBAAiB,MAAmB,MAAmC;CACrF,MAAM,YAAY,KAAK,SAAS;CAChC,MAAM,WAAyC,EAAE;AACjD,MAAK,MAAM,EAAE,KAAK,SAAS,MAAM;AAC/B,MAAI,IAAI,WAAW,WAAW;GAC5B,MAAM,QAAQ,IAAI,kBAAkB,wCAAwC;AAC5E,SAAM,wBAAQ,IAAI,MAChB,4BAA4B,IAAI,OAAO,2BAA2B,YACnE;AACD,SAAM;;AAER,WAAS,KAAK,UAAU,IAAI,IAAI;;AAGlC,QAAO;EACL,MAAM;EACN;EACA,MAAM;EACP"}
1
+ {"version":3,"file":"data_info_helpers.js","names":[],"sources":["../src/data_info_helpers.ts"],"sourcesContent":["import {\n PFrameDriverError,\n type PColumnSpec,\n type PColumnValues,\n type JsonDataInfo,\n type PColumnValue,\n} from \"@milaboratories/pl-model-common\";\n\nexport function makeJsonDataInfo(spec: PColumnSpec, data: PColumnValues): JsonDataInfo {\n const keyLength = spec.axesSpec.length;\n const jsonData: Record<string, PColumnValue> = {};\n for (const { key, val } of data) {\n if (key.length !== keyLength) {\n const error = new PFrameDriverError(`Inconsistent inline column key length`);\n error.cause = new Error(\n `Inline column key length ${key.length} differs from axes count ${keyLength}`,\n );\n throw error;\n }\n jsonData[JSON.stringify(key)] = val;\n }\n\n return {\n type: \"Json\",\n keyLength,\n data: jsonData,\n };\n}\n"],"mappings":";;AAQA,SAAgB,iBAAiB,MAAmB,MAAmC;CACrF,MAAM,YAAY,KAAK,SAAS;CAChC,MAAM,WAAyC,CAAC;CAChD,KAAK,MAAM,EAAE,KAAK,SAAS,MAAM;EAC/B,IAAI,IAAI,WAAW,WAAW;GAC5B,MAAM,QAAQ,IAAI,kBAAkB,uCAAuC;GAC3E,MAAM,wBAAQ,IAAI,MAChB,4BAA4B,IAAI,OAAO,2BAA2B,WACpE;GACA,MAAM;EACR;EACA,SAAS,KAAK,UAAU,GAAG,KAAK;CAClC;CAEA,OAAO;EACL,MAAM;EACN;EACA,MAAM;CACR;AACF"}
@@ -6,10 +6,10 @@ let _milaboratories_helpers = require("@milaboratories/helpers");
6
6
  let _milaboratories_pframes_rs_node = require("@milaboratories/pframes-rs-node");
7
7
  let node_os = require("node:os");
8
8
  let node_fs = require("node:fs");
9
- node_fs = require_runtime.__toESM(node_fs);
9
+ node_fs = require_runtime.__toESM(node_fs, 1);
10
10
  let _milaboratories_pl_model_middle_layer = require("@milaboratories/pl-model-middle-layer");
11
11
  let node_path = require("node:path");
12
- node_path = require_runtime.__toESM(node_path);
12
+ node_path = require_runtime.__toESM(node_path, 1);
13
13
  //#region src/driver_double.ts
14
14
  function makeFolderPath(dataFolder) {
15
15
  if (!node_fs.default.statSync(dataFolder, { throwIfNoEntry: false })?.isDirectory()) {
@@ -23,6 +23,7 @@ function makeBlobId(res) {
23
23
  return res;
24
24
  }
25
25
  var LocalBlobProviderImpl = class extends _milaboratories_helpers.RefCountPoolBase {
26
+ dataFolder;
26
27
  constructor(dataFolder) {
27
28
  super();
28
29
  this.dataFolder = dataFolder;
@@ -59,6 +60,8 @@ var LocalBlobProviderImpl = class extends _milaboratories_helpers.RefCountPoolBa
59
60
  }
60
61
  };
61
62
  var RemoteBlobProviderImpl = class RemoteBlobProviderImpl {
63
+ pool;
64
+ server;
62
65
  constructor(pool, server) {
63
66
  this.pool = pool;
64
67
  this.server = server;
@@ -1 +1 @@
1
- {"version":3,"file":"driver_double.cjs","names":["fs","PFrameDriverError","RefCountPoolBase","path","HttpHelpers","PFrameInternal","makeJsonDataInfo","AbstractPFrameDriver"],"sources":["../src/driver_double.ts"],"sourcesContent":["import {\n isDataInfo,\n PFrameDriverError,\n type Branded,\n type PColumnSpec,\n type PColumnValues,\n} from \"@milaboratories/pl-model-common\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/helpers\";\nimport { HttpHelpers } from \"@milaboratories/pframes-rs-node\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { AbstractInternalPFrameDriver } from \"./driver_decl\";\nimport {\n AbstractPFrameDriver,\n type LocalBlobProvider,\n type RemoteBlobProvider,\n} from \"./driver_impl\";\nimport { makeJsonDataInfo } from \"./data_info_helpers\";\n\nexport type FileName = Branded<string, \"FileName\">;\nexport type FilePath = Branded<string, \"FilePath\">;\nexport type FolderPath = Branded<string, \"FolderPath\">;\n\nexport function makeFolderPath(dataFolder: string): FolderPath {\n if (!fs.statSync(dataFolder, { throwIfNoEntry: false })?.isDirectory()) {\n const error = new PFrameDriverError(`Invalid data folder`);\n error.cause = new Error(`Folder ${dataFolder} does not exist`);\n throw error;\n }\n return dataFolder as FolderPath;\n}\n\nfunction makeBlobId(res: FileName): PFrameInternal.PFrameBlobId {\n return res as string as PFrameInternal.PFrameBlobId;\n}\n\nclass LocalBlobProviderImpl\n extends RefCountPoolBase<FileName, PFrameInternal.PFrameBlobId, FilePath>\n implements LocalBlobProvider<FileName>\n{\n constructor(private readonly dataFolder: FolderPath) {\n super();\n }\n\n protected calculateParamsKey(params: FileName): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(params: FileName, _key: PFrameInternal.PFrameBlobId): FilePath {\n const filePath = path.join(this.dataFolder, params);\n if (!fs.statSync(filePath, { throwIfNoEntry: false })?.isFile()) {\n const error = new PFrameDriverError(`Invalid file name`);\n error.cause = new Error(`File ${filePath} does not exist`);\n throw error;\n }\n return filePath as FilePath;\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): FilePath {\n const resource = super.tryGetByKey(blobId);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid blob id`);\n error.cause = new Error(`Blob with id ${blobId} not found.`);\n throw error;\n }\n return resource;\n }\n\n public makeDataSource(\n signal: AbortSignal,\n ): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\"> {\n return {\n preloadBlob: async (_blobIds: PFrameInternal.PFrameBlobId[]) => {},\n resolveBlobContent: async (blobId: PFrameInternal.PFrameBlobId) => {\n const filePath = this.getByKey(blobId);\n return await fs.promises.readFile(filePath, { signal });\n },\n };\n }\n}\n\nclass RemoteBlobProviderImpl implements RemoteBlobProvider<FileName> {\n constructor(\n private readonly pool: LocalBlobProviderImpl,\n private readonly server: PFrameInternal.HttpServer,\n ) {}\n\n public static async init(\n dataFolder: FolderPath,\n logger: PFrameInternal.Logger,\n serverOptions: Omit<PFrameInternal.HttpServerOptions, \"handler\">,\n ): Promise<RemoteBlobProviderImpl> {\n const pool = new LocalBlobProviderImpl(dataFolder);\n\n const underlyingStore = await HttpHelpers.createFsStore({ rootDir: dataFolder, logger });\n const store: PFrameInternal.ObjectStore = {\n request: (filename, params) => {\n const blobId = filename.slice(0, -PFrameInternal.ParquetExtension.length);\n return underlyingStore.request(blobId as PFrameInternal.ParquetFileName, params);\n },\n };\n\n const handler = HttpHelpers.createRequestHandler({ store });\n const server = await HttpHelpers.createHttpServer({ ...serverOptions, handler });\n\n return new RemoteBlobProviderImpl(pool, server);\n }\n\n public acquire(params: FileName): PoolEntry<PFrameInternal.PFrameBlobId> {\n return this.pool.acquire(params);\n }\n\n public httpServerInfo(): PFrameInternal.HttpServerInfo {\n return this.server.info;\n }\n\n public async getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null> {\n return null;\n }\n\n public async resetCache(): Promise<void> {}\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.server.stop();\n await this.pool[Symbol.asyncDispose]();\n }\n}\n\nexport type InternalPFrameDriverDouble = AbstractInternalPFrameDriver<\n PFrameInternal.DataInfo<FileName> | PColumnValues\n>;\n\n// It's mock for testing purposes, not a real test!\nexport async function createPFrameDriverDouble({\n dataFolder = tmpdir() as FolderPath,\n logger = console.log,\n}: {\n dataFolder?: FolderPath;\n logger?: PFrameInternal.Logger;\n}): Promise<InternalPFrameDriverDouble> {\n const localBlobProvider = new LocalBlobProviderImpl(dataFolder);\n const remoteBlobProvider = await RemoteBlobProviderImpl.init(dataFolder, logger, {});\n\n const resolveDataInfo = (\n spec: PColumnSpec,\n data: PFrameInternal.DataInfo<FileName> | PColumnValues,\n ) => (isDataInfo(data) ? data : makeJsonDataInfo(spec, data));\n\n return new AbstractPFrameDriver({\n logger,\n localBlobProvider,\n remoteBlobProvider,\n resolveDataInfo,\n });\n}\n"],"mappings":";;;;;;;;;;;;;AAyBA,SAAgB,eAAe,YAAgC;AAC7D,KAAI,CAACA,QAAAA,QAAG,SAAS,YAAY,EAAE,gBAAgB,OAAO,CAAC,EAAE,aAAa,EAAE;EACtE,MAAM,QAAQ,IAAIC,gCAAAA,kBAAkB,sBAAsB;AAC1D,QAAM,wBAAQ,IAAI,MAAM,UAAU,WAAW,iBAAiB;AAC9D,QAAM;;AAER,QAAO;;AAGT,SAAS,WAAW,KAA4C;AAC9D,QAAO;;AAGT,IAAM,wBAAN,cACUC,wBAAAA,iBAEV;CACE,YAAY,YAAyC;AACnD,SAAO;AADoB,OAAA,aAAA;;CAI7B,mBAA6B,QAA+C;AAC1E,SAAO,WAAW,OAAO;;CAG3B,kBAA4B,QAAkB,MAA6C;EACzF,MAAM,WAAWC,UAAAA,QAAK,KAAK,KAAK,YAAY,OAAO;AACnD,MAAI,CAACH,QAAAA,QAAG,SAAS,UAAU,EAAE,gBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE;GAC/D,MAAM,QAAQ,IAAIC,gCAAAA,kBAAkB,oBAAoB;AACxD,SAAM,wBAAQ,IAAI,MAAM,QAAQ,SAAS,iBAAiB;AAC1D,SAAM;;AAER,SAAO;;CAGT,SAAgB,QAA+C;EAC7D,MAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,MAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAIA,gCAAAA,kBAAkB,kBAAkB;AACtD,SAAM,wBAAQ,IAAI,MAAM,gBAAgB,OAAO,aAAa;AAC5D,SAAM;;AAER,SAAO;;CAGT,eACE,QAC0D;AAC1D,SAAO;GACL,aAAa,OAAO,aAA4C;GAChE,oBAAoB,OAAO,WAAwC;IACjE,MAAM,WAAW,KAAK,SAAS,OAAO;AACtC,WAAO,MAAMD,QAAAA,QAAG,SAAS,SAAS,UAAU,EAAE,QAAQ,CAAC;;GAE1D;;;AAIL,IAAM,yBAAN,MAAM,uBAA+D;CACnE,YACE,MACA,QACA;AAFiB,OAAA,OAAA;AACA,OAAA,SAAA;;CAGnB,aAAoB,KAClB,YACA,QACA,eACiC;EACjC,MAAM,OAAO,IAAI,sBAAsB,WAAW;EAElD,MAAM,kBAAkB,MAAMI,gCAAAA,YAAY,cAAc;GAAE,SAAS;GAAY;GAAQ,CAAC;EAQxF,MAAM,UAAUA,gCAAAA,YAAY,qBAAqB,EAAE,OAPT,EACxC,UAAU,UAAU,WAAW;GAC7B,MAAM,SAAS,SAAS,MAAM,GAAG,CAACC,sCAAAA,eAAe,iBAAiB,OAAO;AACzE,UAAO,gBAAgB,QAAQ,QAA0C,OAAO;KAEnF,EAEyD,CAAC;AAG3D,SAAO,IAAI,uBAAuB,MAFnB,MAAMD,gCAAAA,YAAY,iBAAiB;GAAE,GAAG;GAAe;GAAS,CAAC,CAEjC;;CAGjD,QAAe,QAA0D;AACvE,SAAO,KAAK,KAAK,QAAQ,OAAO;;CAGlC,iBAAuD;AACrD,SAAO,KAAK,OAAO;;CAGrB,MAAa,kBAA+D;AAC1E,SAAO;;CAGT,MAAa,aAA4B;CAEzC,OAAO,OAAO,gBAA+B;AAC3C,QAAM,KAAK,OAAO,MAAM;AACxB,QAAM,KAAK,KAAK,OAAO,eAAe;;;AAS1C,eAAsB,yBAAyB,EAC7C,cAAA,GAAA,QAAA,SAAqB,EACrB,SAAS,QAAQ,OAIqB;CACtC,MAAM,oBAAoB,IAAI,sBAAsB,WAAW;CAC/D,MAAM,qBAAqB,MAAM,uBAAuB,KAAK,YAAY,QAAQ,EAAE,CAAC;CAEpF,MAAM,mBACJ,MACA,UAAA,GAAA,gCAAA,YACe,KAAK,GAAG,OAAOE,0BAAAA,iBAAiB,MAAM,KAAK;AAE5D,QAAO,IAAIC,oBAAAA,qBAAqB;EAC9B;EACA;EACA;EACA;EACD,CAAC"}
1
+ {"version":3,"file":"driver_double.cjs","names":["fs","PFrameDriverError","RefCountPoolBase","path","HttpHelpers","PFrameInternal","makeJsonDataInfo","AbstractPFrameDriver"],"sources":["../src/driver_double.ts"],"sourcesContent":["import {\n isDataInfo,\n PFrameDriverError,\n type Branded,\n type PColumnSpec,\n type PColumnValues,\n} from \"@milaboratories/pl-model-common\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/helpers\";\nimport { HttpHelpers } from \"@milaboratories/pframes-rs-node\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { AbstractInternalPFrameDriver } from \"./driver_decl\";\nimport {\n AbstractPFrameDriver,\n type LocalBlobProvider,\n type RemoteBlobProvider,\n} from \"./driver_impl\";\nimport { makeJsonDataInfo } from \"./data_info_helpers\";\n\nexport type FileName = Branded<string, \"FileName\">;\nexport type FilePath = Branded<string, \"FilePath\">;\nexport type FolderPath = Branded<string, \"FolderPath\">;\n\nexport function makeFolderPath(dataFolder: string): FolderPath {\n if (!fs.statSync(dataFolder, { throwIfNoEntry: false })?.isDirectory()) {\n const error = new PFrameDriverError(`Invalid data folder`);\n error.cause = new Error(`Folder ${dataFolder} does not exist`);\n throw error;\n }\n return dataFolder as FolderPath;\n}\n\nfunction makeBlobId(res: FileName): PFrameInternal.PFrameBlobId {\n return res as string as PFrameInternal.PFrameBlobId;\n}\n\nclass LocalBlobProviderImpl\n extends RefCountPoolBase<FileName, PFrameInternal.PFrameBlobId, FilePath>\n implements LocalBlobProvider<FileName>\n{\n constructor(private readonly dataFolder: FolderPath) {\n super();\n }\n\n protected calculateParamsKey(params: FileName): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(params: FileName, _key: PFrameInternal.PFrameBlobId): FilePath {\n const filePath = path.join(this.dataFolder, params);\n if (!fs.statSync(filePath, { throwIfNoEntry: false })?.isFile()) {\n const error = new PFrameDriverError(`Invalid file name`);\n error.cause = new Error(`File ${filePath} does not exist`);\n throw error;\n }\n return filePath as FilePath;\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): FilePath {\n const resource = super.tryGetByKey(blobId);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid blob id`);\n error.cause = new Error(`Blob with id ${blobId} not found.`);\n throw error;\n }\n return resource;\n }\n\n public makeDataSource(\n signal: AbortSignal,\n ): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\"> {\n return {\n preloadBlob: async (_blobIds: PFrameInternal.PFrameBlobId[]) => {},\n resolveBlobContent: async (blobId: PFrameInternal.PFrameBlobId) => {\n const filePath = this.getByKey(blobId);\n return await fs.promises.readFile(filePath, { signal });\n },\n };\n }\n}\n\nclass RemoteBlobProviderImpl implements RemoteBlobProvider<FileName> {\n constructor(\n private readonly pool: LocalBlobProviderImpl,\n private readonly server: PFrameInternal.HttpServer,\n ) {}\n\n public static async init(\n dataFolder: FolderPath,\n logger: PFrameInternal.Logger,\n serverOptions: Omit<PFrameInternal.HttpServerOptions, \"handler\">,\n ): Promise<RemoteBlobProviderImpl> {\n const pool = new LocalBlobProviderImpl(dataFolder);\n\n const underlyingStore = await HttpHelpers.createFsStore({ rootDir: dataFolder, logger });\n const store: PFrameInternal.ObjectStore = {\n request: (filename, params) => {\n const blobId = filename.slice(0, -PFrameInternal.ParquetExtension.length);\n return underlyingStore.request(blobId as PFrameInternal.ParquetFileName, params);\n },\n };\n\n const handler = HttpHelpers.createRequestHandler({ store });\n const server = await HttpHelpers.createHttpServer({ ...serverOptions, handler });\n\n return new RemoteBlobProviderImpl(pool, server);\n }\n\n public acquire(params: FileName): PoolEntry<PFrameInternal.PFrameBlobId> {\n return this.pool.acquire(params);\n }\n\n public httpServerInfo(): PFrameInternal.HttpServerInfo {\n return this.server.info;\n }\n\n public async getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null> {\n return null;\n }\n\n public async resetCache(): Promise<void> {}\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.server.stop();\n await this.pool[Symbol.asyncDispose]();\n }\n}\n\nexport type InternalPFrameDriverDouble = AbstractInternalPFrameDriver<\n PFrameInternal.DataInfo<FileName> | PColumnValues\n>;\n\n// It's mock for testing purposes, not a real test!\nexport async function createPFrameDriverDouble({\n dataFolder = tmpdir() as FolderPath,\n logger = console.log,\n}: {\n dataFolder?: FolderPath;\n logger?: PFrameInternal.Logger;\n}): Promise<InternalPFrameDriverDouble> {\n const localBlobProvider = new LocalBlobProviderImpl(dataFolder);\n const remoteBlobProvider = await RemoteBlobProviderImpl.init(dataFolder, logger, {});\n\n const resolveDataInfo = (\n spec: PColumnSpec,\n data: PFrameInternal.DataInfo<FileName> | PColumnValues,\n ) => (isDataInfo(data) ? data : makeJsonDataInfo(spec, data));\n\n return new AbstractPFrameDriver({\n logger,\n localBlobProvider,\n remoteBlobProvider,\n resolveDataInfo,\n });\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"driver_double.d.ts","names":[],"sources":["../src/driver_double.ts"],"mappings":";;;;;KAqBY,QAAA,GAAW,OAAA;AAAA,KACX,QAAA,GAAW,OAAA;AAAA,KACX,UAAA,GAAa,OAAA;AAAA,iBAET,cAAA,CAAe,UAAA,WAAqB,UAAA;AAAA,KAyGxC,0BAAA,GAA6B,4BAAA,CACvC,cAAA,CAAe,QAAA,CAAS,QAAA,IAAY,aAAA;AAAA,iBAIhB,wBAAA,CAAA;EACpB,UAAA;EACA;AAAA;EAEA,UAAA,GAAa,UAAA;EACb,MAAA,GAAS,cAAA,CAAe,MAAA;AAAA,IACtB,OAAA,CAAQ,0BAAA"}
1
+ {"version":3,"file":"driver_double.d.ts","names":[],"sources":["../src/driver_double.ts"],"mappings":";;;;;KAqBY,QAAA,GAAW,OAAO;AAAA,KAClB,QAAA,GAAW,OAAO;AAAA,KAClB,UAAA,GAAa,OAAO;AAAA,iBAEhB,cAAA,CAAe,UAAA,WAAqB,UAAU;AAAA,KAyGlD,0BAAA,GAA6B,4BAAA,CACvC,cAAA,CAAe,QAAA,CAAS,QAAA,IAAY,aAAA;AAAA,iBAIhB,wBAAA;EACpB,UAAA;EACA;AAAA;EAEA,UAAA,GAAa,UAAA;EACb,MAAA,GAAS,cAAA,CAAe,MAAA;AAAA,IACtB,OAAA,CAAQ,0BAAA"}
@@ -20,6 +20,7 @@ function makeBlobId(res) {
20
20
  return res;
21
21
  }
22
22
  var LocalBlobProviderImpl = class extends RefCountPoolBase {
23
+ dataFolder;
23
24
  constructor(dataFolder) {
24
25
  super();
25
26
  this.dataFolder = dataFolder;
@@ -56,6 +57,8 @@ var LocalBlobProviderImpl = class extends RefCountPoolBase {
56
57
  }
57
58
  };
58
59
  var RemoteBlobProviderImpl = class RemoteBlobProviderImpl {
60
+ pool;
61
+ server;
59
62
  constructor(pool, server) {
60
63
  this.pool = pool;
61
64
  this.server = server;
@@ -1 +1 @@
1
- {"version":3,"file":"driver_double.js","names":[],"sources":["../src/driver_double.ts"],"sourcesContent":["import {\n isDataInfo,\n PFrameDriverError,\n type Branded,\n type PColumnSpec,\n type PColumnValues,\n} from \"@milaboratories/pl-model-common\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/helpers\";\nimport { HttpHelpers } from \"@milaboratories/pframes-rs-node\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { AbstractInternalPFrameDriver } from \"./driver_decl\";\nimport {\n AbstractPFrameDriver,\n type LocalBlobProvider,\n type RemoteBlobProvider,\n} from \"./driver_impl\";\nimport { makeJsonDataInfo } from \"./data_info_helpers\";\n\nexport type FileName = Branded<string, \"FileName\">;\nexport type FilePath = Branded<string, \"FilePath\">;\nexport type FolderPath = Branded<string, \"FolderPath\">;\n\nexport function makeFolderPath(dataFolder: string): FolderPath {\n if (!fs.statSync(dataFolder, { throwIfNoEntry: false })?.isDirectory()) {\n const error = new PFrameDriverError(`Invalid data folder`);\n error.cause = new Error(`Folder ${dataFolder} does not exist`);\n throw error;\n }\n return dataFolder as FolderPath;\n}\n\nfunction makeBlobId(res: FileName): PFrameInternal.PFrameBlobId {\n return res as string as PFrameInternal.PFrameBlobId;\n}\n\nclass LocalBlobProviderImpl\n extends RefCountPoolBase<FileName, PFrameInternal.PFrameBlobId, FilePath>\n implements LocalBlobProvider<FileName>\n{\n constructor(private readonly dataFolder: FolderPath) {\n super();\n }\n\n protected calculateParamsKey(params: FileName): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(params: FileName, _key: PFrameInternal.PFrameBlobId): FilePath {\n const filePath = path.join(this.dataFolder, params);\n if (!fs.statSync(filePath, { throwIfNoEntry: false })?.isFile()) {\n const error = new PFrameDriverError(`Invalid file name`);\n error.cause = new Error(`File ${filePath} does not exist`);\n throw error;\n }\n return filePath as FilePath;\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): FilePath {\n const resource = super.tryGetByKey(blobId);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid blob id`);\n error.cause = new Error(`Blob with id ${blobId} not found.`);\n throw error;\n }\n return resource;\n }\n\n public makeDataSource(\n signal: AbortSignal,\n ): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\"> {\n return {\n preloadBlob: async (_blobIds: PFrameInternal.PFrameBlobId[]) => {},\n resolveBlobContent: async (blobId: PFrameInternal.PFrameBlobId) => {\n const filePath = this.getByKey(blobId);\n return await fs.promises.readFile(filePath, { signal });\n },\n };\n }\n}\n\nclass RemoteBlobProviderImpl implements RemoteBlobProvider<FileName> {\n constructor(\n private readonly pool: LocalBlobProviderImpl,\n private readonly server: PFrameInternal.HttpServer,\n ) {}\n\n public static async init(\n dataFolder: FolderPath,\n logger: PFrameInternal.Logger,\n serverOptions: Omit<PFrameInternal.HttpServerOptions, \"handler\">,\n ): Promise<RemoteBlobProviderImpl> {\n const pool = new LocalBlobProviderImpl(dataFolder);\n\n const underlyingStore = await HttpHelpers.createFsStore({ rootDir: dataFolder, logger });\n const store: PFrameInternal.ObjectStore = {\n request: (filename, params) => {\n const blobId = filename.slice(0, -PFrameInternal.ParquetExtension.length);\n return underlyingStore.request(blobId as PFrameInternal.ParquetFileName, params);\n },\n };\n\n const handler = HttpHelpers.createRequestHandler({ store });\n const server = await HttpHelpers.createHttpServer({ ...serverOptions, handler });\n\n return new RemoteBlobProviderImpl(pool, server);\n }\n\n public acquire(params: FileName): PoolEntry<PFrameInternal.PFrameBlobId> {\n return this.pool.acquire(params);\n }\n\n public httpServerInfo(): PFrameInternal.HttpServerInfo {\n return this.server.info;\n }\n\n public async getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null> {\n return null;\n }\n\n public async resetCache(): Promise<void> {}\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.server.stop();\n await this.pool[Symbol.asyncDispose]();\n }\n}\n\nexport type InternalPFrameDriverDouble = AbstractInternalPFrameDriver<\n PFrameInternal.DataInfo<FileName> | PColumnValues\n>;\n\n// It's mock for testing purposes, not a real test!\nexport async function createPFrameDriverDouble({\n dataFolder = tmpdir() as FolderPath,\n logger = console.log,\n}: {\n dataFolder?: FolderPath;\n logger?: PFrameInternal.Logger;\n}): Promise<InternalPFrameDriverDouble> {\n const localBlobProvider = new LocalBlobProviderImpl(dataFolder);\n const remoteBlobProvider = await RemoteBlobProviderImpl.init(dataFolder, logger, {});\n\n const resolveDataInfo = (\n spec: PColumnSpec,\n data: PFrameInternal.DataInfo<FileName> | PColumnValues,\n ) => (isDataInfo(data) ? data : makeJsonDataInfo(spec, data));\n\n return new AbstractPFrameDriver({\n logger,\n localBlobProvider,\n remoteBlobProvider,\n resolveDataInfo,\n });\n}\n"],"mappings":";;;;;;;;;;AAyBA,SAAgB,eAAe,YAAgC;AAC7D,KAAI,CAAC,GAAG,SAAS,YAAY,EAAE,gBAAgB,OAAO,CAAC,EAAE,aAAa,EAAE;EACtE,MAAM,QAAQ,IAAI,kBAAkB,sBAAsB;AAC1D,QAAM,wBAAQ,IAAI,MAAM,UAAU,WAAW,iBAAiB;AAC9D,QAAM;;AAER,QAAO;;AAGT,SAAS,WAAW,KAA4C;AAC9D,QAAO;;AAGT,IAAM,wBAAN,cACU,iBAEV;CACE,YAAY,YAAyC;AACnD,SAAO;AADoB,OAAA,aAAA;;CAI7B,mBAA6B,QAA+C;AAC1E,SAAO,WAAW,OAAO;;CAG3B,kBAA4B,QAAkB,MAA6C;EACzF,MAAM,WAAW,KAAK,KAAK,KAAK,YAAY,OAAO;AACnD,MAAI,CAAC,GAAG,SAAS,UAAU,EAAE,gBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE;GAC/D,MAAM,QAAQ,IAAI,kBAAkB,oBAAoB;AACxD,SAAM,wBAAQ,IAAI,MAAM,QAAQ,SAAS,iBAAiB;AAC1D,SAAM;;AAER,SAAO;;CAGT,SAAgB,QAA+C;EAC7D,MAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,MAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAI,kBAAkB,kBAAkB;AACtD,SAAM,wBAAQ,IAAI,MAAM,gBAAgB,OAAO,aAAa;AAC5D,SAAM;;AAER,SAAO;;CAGT,eACE,QAC0D;AAC1D,SAAO;GACL,aAAa,OAAO,aAA4C;GAChE,oBAAoB,OAAO,WAAwC;IACjE,MAAM,WAAW,KAAK,SAAS,OAAO;AACtC,WAAO,MAAM,GAAG,SAAS,SAAS,UAAU,EAAE,QAAQ,CAAC;;GAE1D;;;AAIL,IAAM,yBAAN,MAAM,uBAA+D;CACnE,YACE,MACA,QACA;AAFiB,OAAA,OAAA;AACA,OAAA,SAAA;;CAGnB,aAAoB,KAClB,YACA,QACA,eACiC;EACjC,MAAM,OAAO,IAAI,sBAAsB,WAAW;EAElD,MAAM,kBAAkB,MAAM,YAAY,cAAc;GAAE,SAAS;GAAY;GAAQ,CAAC;EAQxF,MAAM,UAAU,YAAY,qBAAqB,EAAE,OAPT,EACxC,UAAU,UAAU,WAAW;GAC7B,MAAM,SAAS,SAAS,MAAM,GAAG,CAAC,eAAe,iBAAiB,OAAO;AACzE,UAAO,gBAAgB,QAAQ,QAA0C,OAAO;KAEnF,EAEyD,CAAC;AAG3D,SAAO,IAAI,uBAAuB,MAFnB,MAAM,YAAY,iBAAiB;GAAE,GAAG;GAAe;GAAS,CAAC,CAEjC;;CAGjD,QAAe,QAA0D;AACvE,SAAO,KAAK,KAAK,QAAQ,OAAO;;CAGlC,iBAAuD;AACrD,SAAO,KAAK,OAAO;;CAGrB,MAAa,kBAA+D;AAC1E,SAAO;;CAGT,MAAa,aAA4B;CAEzC,OAAO,OAAO,gBAA+B;AAC3C,QAAM,KAAK,OAAO,MAAM;AACxB,QAAM,KAAK,KAAK,OAAO,eAAe;;;AAS1C,eAAsB,yBAAyB,EAC7C,aAAa,QAAQ,EACrB,SAAS,QAAQ,OAIqB;CACtC,MAAM,oBAAoB,IAAI,sBAAsB,WAAW;CAC/D,MAAM,qBAAqB,MAAM,uBAAuB,KAAK,YAAY,QAAQ,EAAE,CAAC;CAEpF,MAAM,mBACJ,MACA,SACI,WAAW,KAAK,GAAG,OAAO,iBAAiB,MAAM,KAAK;AAE5D,QAAO,IAAI,qBAAqB;EAC9B;EACA;EACA;EACA;EACD,CAAC"}
1
+ {"version":3,"file":"driver_double.js","names":[],"sources":["../src/driver_double.ts"],"sourcesContent":["import {\n isDataInfo,\n PFrameDriverError,\n type Branded,\n type PColumnSpec,\n type PColumnValues,\n} from \"@milaboratories/pl-model-common\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/helpers\";\nimport { HttpHelpers } from \"@milaboratories/pframes-rs-node\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { AbstractInternalPFrameDriver } from \"./driver_decl\";\nimport {\n AbstractPFrameDriver,\n type LocalBlobProvider,\n type RemoteBlobProvider,\n} from \"./driver_impl\";\nimport { makeJsonDataInfo } from \"./data_info_helpers\";\n\nexport type FileName = Branded<string, \"FileName\">;\nexport type FilePath = Branded<string, \"FilePath\">;\nexport type FolderPath = Branded<string, \"FolderPath\">;\n\nexport function makeFolderPath(dataFolder: string): FolderPath {\n if (!fs.statSync(dataFolder, { throwIfNoEntry: false })?.isDirectory()) {\n const error = new PFrameDriverError(`Invalid data folder`);\n error.cause = new Error(`Folder ${dataFolder} does not exist`);\n throw error;\n }\n return dataFolder as FolderPath;\n}\n\nfunction makeBlobId(res: FileName): PFrameInternal.PFrameBlobId {\n return res as string as PFrameInternal.PFrameBlobId;\n}\n\nclass LocalBlobProviderImpl\n extends RefCountPoolBase<FileName, PFrameInternal.PFrameBlobId, FilePath>\n implements LocalBlobProvider<FileName>\n{\n constructor(private readonly dataFolder: FolderPath) {\n super();\n }\n\n protected calculateParamsKey(params: FileName): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(params: FileName, _key: PFrameInternal.PFrameBlobId): FilePath {\n const filePath = path.join(this.dataFolder, params);\n if (!fs.statSync(filePath, { throwIfNoEntry: false })?.isFile()) {\n const error = new PFrameDriverError(`Invalid file name`);\n error.cause = new Error(`File ${filePath} does not exist`);\n throw error;\n }\n return filePath as FilePath;\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): FilePath {\n const resource = super.tryGetByKey(blobId);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid blob id`);\n error.cause = new Error(`Blob with id ${blobId} not found.`);\n throw error;\n }\n return resource;\n }\n\n public makeDataSource(\n signal: AbortSignal,\n ): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\"> {\n return {\n preloadBlob: async (_blobIds: PFrameInternal.PFrameBlobId[]) => {},\n resolveBlobContent: async (blobId: PFrameInternal.PFrameBlobId) => {\n const filePath = this.getByKey(blobId);\n return await fs.promises.readFile(filePath, { signal });\n },\n };\n }\n}\n\nclass RemoteBlobProviderImpl implements RemoteBlobProvider<FileName> {\n constructor(\n private readonly pool: LocalBlobProviderImpl,\n private readonly server: PFrameInternal.HttpServer,\n ) {}\n\n public static async init(\n dataFolder: FolderPath,\n logger: PFrameInternal.Logger,\n serverOptions: Omit<PFrameInternal.HttpServerOptions, \"handler\">,\n ): Promise<RemoteBlobProviderImpl> {\n const pool = new LocalBlobProviderImpl(dataFolder);\n\n const underlyingStore = await HttpHelpers.createFsStore({ rootDir: dataFolder, logger });\n const store: PFrameInternal.ObjectStore = {\n request: (filename, params) => {\n const blobId = filename.slice(0, -PFrameInternal.ParquetExtension.length);\n return underlyingStore.request(blobId as PFrameInternal.ParquetFileName, params);\n },\n };\n\n const handler = HttpHelpers.createRequestHandler({ store });\n const server = await HttpHelpers.createHttpServer({ ...serverOptions, handler });\n\n return new RemoteBlobProviderImpl(pool, server);\n }\n\n public acquire(params: FileName): PoolEntry<PFrameInternal.PFrameBlobId> {\n return this.pool.acquire(params);\n }\n\n public httpServerInfo(): PFrameInternal.HttpServerInfo {\n return this.server.info;\n }\n\n public async getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null> {\n return null;\n }\n\n public async resetCache(): Promise<void> {}\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.server.stop();\n await this.pool[Symbol.asyncDispose]();\n }\n}\n\nexport type InternalPFrameDriverDouble = AbstractInternalPFrameDriver<\n PFrameInternal.DataInfo<FileName> | PColumnValues\n>;\n\n// It's mock for testing purposes, not a real test!\nexport async function createPFrameDriverDouble({\n dataFolder = tmpdir() as FolderPath,\n logger = console.log,\n}: {\n dataFolder?: FolderPath;\n logger?: PFrameInternal.Logger;\n}): Promise<InternalPFrameDriverDouble> {\n const localBlobProvider = new LocalBlobProviderImpl(dataFolder);\n const remoteBlobProvider = await RemoteBlobProviderImpl.init(dataFolder, logger, {});\n\n const resolveDataInfo = (\n spec: PColumnSpec,\n data: PFrameInternal.DataInfo<FileName> | PColumnValues,\n ) => (isDataInfo(data) ? data : makeJsonDataInfo(spec, data));\n\n return new AbstractPFrameDriver({\n logger,\n localBlobProvider,\n remoteBlobProvider,\n resolveDataInfo,\n });\n}\n"],"mappings":";;;;;;;;;;AAyBA,SAAgB,eAAe,YAAgC;CAC7D,IAAI,CAAC,GAAG,SAAS,YAAY,EAAE,gBAAgB,MAAM,CAAC,CAAC,EAAE,YAAY,GAAG;EACtE,MAAM,QAAQ,IAAI,kBAAkB,qBAAqB;EACzD,MAAM,wBAAQ,IAAI,MAAM,UAAU,WAAW,gBAAgB;EAC7D,MAAM;CACR;CACA,OAAO;AACT;AAEA,SAAS,WAAW,KAA4C;CAC9D,OAAO;AACT;AAEA,IAAM,wBAAN,cACU,iBAEV;CAC+B;CAA7B,YAAY,YAAyC;EACnD,MAAM;EADqB,KAAA,aAAA;CAE7B;CAEA,mBAA6B,QAA+C;EAC1E,OAAO,WAAW,MAAM;CAC1B;CAEA,kBAA4B,QAAkB,MAA6C;EACzF,MAAM,WAAW,KAAK,KAAK,KAAK,YAAY,MAAM;EAClD,IAAI,CAAC,GAAG,SAAS,UAAU,EAAE,gBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG;GAC/D,MAAM,QAAQ,IAAI,kBAAkB,mBAAmB;GACvD,MAAM,wBAAQ,IAAI,MAAM,QAAQ,SAAS,gBAAgB;GACzD,MAAM;EACR;EACA,OAAO;CACT;CAEA,SAAgB,QAA+C;EAC7D,MAAM,WAAW,MAAM,YAAY,MAAM;EACzC,IAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAI,kBAAkB,iBAAiB;GACrD,MAAM,wBAAQ,IAAI,MAAM,gBAAgB,OAAO,YAAY;GAC3D,MAAM;EACR;EACA,OAAO;CACT;CAEA,eACE,QAC0D;EAC1D,OAAO;GACL,aAAa,OAAO,aAA4C,CAAC;GACjE,oBAAoB,OAAO,WAAwC;IACjE,MAAM,WAAW,KAAK,SAAS,MAAM;IACrC,OAAO,MAAM,GAAG,SAAS,SAAS,UAAU,EAAE,OAAO,CAAC;GACxD;EACF;CACF;AACF;AAEA,IAAM,yBAAN,MAAM,uBAA+D;CAEhD;CACA;CAFnB,YACE,MACA,QACA;EAFiB,KAAA,OAAA;EACA,KAAA,SAAA;CAChB;CAEH,aAAoB,KAClB,YACA,QACA,eACiC;EACjC,MAAM,OAAO,IAAI,sBAAsB,UAAU;EAEjD,MAAM,kBAAkB,MAAM,YAAY,cAAc;GAAE,SAAS;GAAY;EAAO,CAAC;EAQvF,MAAM,UAAU,YAAY,qBAAqB,EAAE,OAAA,EANjD,UAAU,UAAU,WAAW;GAC7B,MAAM,SAAS,SAAS,MAAM,GAAG,CAAC,eAAe,iBAAiB,MAAM;GACxE,OAAO,gBAAgB,QAAQ,QAA0C,MAAM;EACjF,EAGqD,EAAE,CAAC;EAG1D,OAAO,IAAI,uBAAuB,MAAM,MAFnB,YAAY,iBAAiB;GAAE,GAAG;GAAe;EAAQ,CAAC,CAEjC;CAChD;CAEA,QAAe,QAA0D;EACvE,OAAO,KAAK,KAAK,QAAQ,MAAM;CACjC;CAEA,iBAAuD;EACrD,OAAO,KAAK,OAAO;CACrB;CAEA,MAAa,kBAA+D;EAC1E,OAAO;CACT;CAEA,MAAa,aAA4B,CAAC;CAE1C,OAAO,OAAO,gBAA+B;EAC3C,MAAM,KAAK,OAAO,KAAK;EACvB,MAAM,KAAK,KAAK,OAAO,aAAa,CAAC;CACvC;AACF;AAOA,eAAsB,yBAAyB,EAC7C,aAAa,OAAO,GACpB,SAAS,QAAQ,OAIqB;CACtC,MAAM,oBAAoB,IAAI,sBAAsB,UAAU;CAC9D,MAAM,qBAAqB,MAAM,uBAAuB,KAAK,YAAY,QAAQ,CAAC,CAAC;CAEnF,MAAM,mBACJ,MACA,SACI,WAAW,IAAI,IAAI,OAAO,iBAAiB,MAAM,IAAI;CAE3D,OAAO,IAAI,qBAAqB;EAC9B;EACA;EACA;EACA;CACF,CAAC;AACH"}
@@ -7,7 +7,7 @@ const require_ptable_def_pool = require("./ptable_def_pool.cjs");
7
7
  const require_ptable_pool = require("./ptable_pool.cjs");
8
8
  const require_ptable_cache_per_frame = require("./ptable_cache_per_frame.cjs");
9
9
  const require_ptable_cache_plain = require("./ptable_cache_plain.cjs");
10
- const require_usingCtx = require("./_virtual/_@oxc-project_runtime@0.123.0/helpers/usingCtx.cjs");
10
+ const require_usingCtx = require("./_virtual/_@oxc-project_runtime@0.137.0/helpers/esm/usingCtx.cjs");
11
11
  let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
12
12
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
13
13
  let _milaboratories_helpers = require("@milaboratories/helpers");
@@ -15,11 +15,11 @@ let _milaboratories_pframes_rs_node = require("@milaboratories/pframes-rs-node")
15
15
  let _milaboratories_pframes_rs_wasm = require("@milaboratories/pframes-rs-wasm");
16
16
  let node_os = require("node:os");
17
17
  let node_fs = require("node:fs");
18
- node_fs = require_runtime.__toESM(node_fs);
18
+ node_fs = require_runtime.__toESM(node_fs, 1);
19
19
  let node_stream = require("node:stream");
20
20
  let node_stream_promises = require("node:stream/promises");
21
21
  let node_zlib = require("node:zlib");
22
- node_zlib = require_runtime.__toESM(node_zlib);
22
+ node_zlib = require_runtime.__toESM(node_zlib, 1);
23
23
  //#region src/driver_impl.ts
24
24
  const AbstractPFrameDriverOpsDefaults = {
25
25
  ...require_ptable_cache_per_frame.PTableCachePerFrameOpsDefaults,
@@ -83,7 +83,7 @@ var AbstractPFrameDriver = class {
83
83
  }
84
84
  createPTable(rawDef) {
85
85
  try {
86
- var _usingCtx$1 = require_usingCtx._usingCtx();
86
+ var _usingCtx$1 = require_usingCtx.default();
87
87
  const columns = (0, _milaboratories_pl_model_common.uniqueBy)((0, _milaboratories_pl_model_common.extractAllColumns)(rawDef.src), (c) => c.id);
88
88
  const pFrameGuard = _usingCtx$1.u(new _milaboratories_helpers.PoolEntryGuard(this.createPFrame(columns)));
89
89
  const sortedDef = (0, _milaboratories_pl_model_common.sortPTableDef)(migrateTableFilter((0, _milaboratories_pl_model_common.mapPTableDef)(rawDef, (c) => c.id), this.logger));
@@ -114,7 +114,7 @@ var AbstractPFrameDriver = class {
114
114
  }
115
115
  createPTableV2(def) {
116
116
  try {
117
- var _usingCtx3 = require_usingCtx._usingCtx();
117
+ var _usingCtx3 = require_usingCtx.default();
118
118
  const columns = (0, _milaboratories_pl_model_common.uniqueBy)((0, _milaboratories_pl_model_common.collectSpecQueryColumns)(def.query), (c) => c.id);
119
119
  const pFrameGuard = _usingCtx3.u(new _milaboratories_helpers.PoolEntryGuard(this.createPFrame(columns)));
120
120
  const pFrameSpec = this.pFrames.getByKey(pFrameGuard.key).pFrameSpec;
@@ -146,7 +146,7 @@ var AbstractPFrameDriver = class {
146
146
  }
147
147
  async writePTableToFs(handle, options) {
148
148
  try {
149
- var _usingCtx4 = require_usingCtx._usingCtx();
149
+ var _usingCtx4 = require_usingCtx.default();
150
150
  this.logger("info", `[WritePTableToFs] ENTER (handle = ${handle}, path = ${options.path}, format = ${options.format}, compression = ${options.compression ?? "auto"}, columns = ${options.columnIndices.length})`);
151
151
  const startTime = performance.now();
152
152
  const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);
@@ -208,7 +208,7 @@ var AbstractPFrameDriver = class {
208
208
  }
209
209
  async exportPTable(handle, options, signal) {
210
210
  try {
211
- var _usingCtx5 = require_usingCtx._usingCtx();
211
+ var _usingCtx5 = require_usingCtx.default();
212
212
  const { path, columnIndices } = options;
213
213
  this.logger("info", `[ExportPTable] ENTER (handle = ${handle}, path = ${path})`);
214
214
  const startTime = performance.now();
@@ -269,7 +269,7 @@ var AbstractPFrameDriver = class {
269
269
  }
270
270
  async calculateTableData(handle, request, range, signal) {
271
271
  try {
272
- var _usingCtx6 = require_usingCtx._usingCtx();
272
+ var _usingCtx6 = require_usingCtx.default();
273
273
  if (require_logging.logPFrames()) this.logger("info", `Call calculateTableData, handle = ${handle}, request = ${JSON.stringify(request, _milaboratories_pl_model_common.bigintReplacer)}`);
274
274
  const { pFrameSpec } = this.pFrames.getByKey(handle);
275
275
  const sortedDef = (0, _milaboratories_pl_model_common.sortPTableDef)(migrateTableFilter(request, this.logger));
@@ -356,7 +356,7 @@ var AbstractPFrameDriver = class {
356
356
  }
357
357
  async getShape(handle, signal) {
358
358
  try {
359
- var _usingCtx7 = require_usingCtx._usingCtx();
359
+ var _usingCtx7 = require_usingCtx.default();
360
360
  const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);
361
361
  const tableGuard = _usingCtx7.u(new _milaboratories_helpers.PoolEntryGuard(this.pTables.acquire(def)));
362
362
  const { pTablePromise, disposeSignal } = tableGuard.resource;
@@ -378,7 +378,7 @@ var AbstractPFrameDriver = class {
378
378
  }
379
379
  async getData(handle, columnIndices, range, signal) {
380
380
  try {
381
- var _usingCtx8 = require_usingCtx._usingCtx();
381
+ var _usingCtx8 = require_usingCtx.default();
382
382
  const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);
383
383
  const tableGuard = _usingCtx8.u(new _milaboratories_helpers.PoolEntryGuard(this.pTables.acquire(def)));
384
384
  const { pTablePromise, disposeSignal } = tableGuard.resource;
@@ -1 +1 @@
1
- {"version":3,"file":"driver_impl.cjs","names":["PTableCachePerFrameOpsDefaults","PTableCachePlainOpsDefaults","PFrameFactory","ConcurrencyLimitingExecutor","PFramePool","PTableDefPool","PTablePool","PTableCachePerFrame","PTableCachePlain","ValueType","PoolEntryGuard","logPFrames","embedInlineColumnTypeSpecs","streamPTableRows","fs","Readable","zlib","columnLabel","XLSX_MAX_ROWS_PER_SHEET","PFrameDriverError","bigintReplacer"],"sources":["../src/driver_impl.ts"],"sourcesContent":["import {\n mapPObjectData,\n mapPTableDef,\n extractAllColumns,\n uniqueBy,\n canonicalizeJson,\n bigintReplacer,\n ValueType,\n type CalculateTableDataRequest,\n type CalculateTableDataResponse,\n type FindColumnsRequest,\n type FindColumnsResponse,\n type PColumnIdAndSpec,\n type PColumnSpec,\n type PFrameHandle,\n type PObjectId,\n type PTableColumnSpec,\n type PTableHandle,\n type PTableShape,\n type PTableVector,\n type TableRange,\n type UniqueValuesRequest,\n type UniqueValuesResponse,\n type PColumn,\n type PFrameDef,\n type PTableDef,\n type PTableRecordSingleValueFilterV2,\n type PTableRecordFilter,\n type JsonSerializable,\n type PTableDefV2,\n mapSpecQueryColumns,\n collectSpecQueryColumns,\n sortSpecQuery,\n sortPTableDef,\n resolveAnnotationParents,\n PFrameDriverError,\n XLSX_MAX_ROWS_PER_SHEET,\n} from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport {\n ConcurrencyLimitingExecutor,\n createPathAtomically,\n type MiLogger,\n} from \"@milaboratories/ts-helpers\";\nimport { isNil, PoolEntryGuard, type PoolEntry } from \"@milaboratories/helpers\";\nimport { PFrameFactory } from \"@milaboratories/pframes-rs-node\";\nimport { expandAxes, findTableColumn, rewriteLegacyFilters } from \"@milaboratories/pframes-rs-wasm\";\nimport { tmpdir } from \"node:os\";\nimport * as fs from \"node:fs\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport * as zlib from \"node:zlib\";\nimport { columnLabel, streamPTableRows } from \"./csv_writer\";\nimport type {\n AbstractInternalPFrameDriver,\n WritePTableToFsOptions,\n WritePTableToFsResult,\n ExportPTableOptions,\n} from \"./driver_decl\";\nimport { logPFrames } from \"./logging\";\nimport {\n PFramePool,\n type LocalBlobProvider as PoolLocalBlobProvider,\n type RemoteBlobProvider as PoolRemoteBlobProvider,\n} from \"./pframe_pool\";\nimport { PTableDefPool } from \"./ptable_def_pool\";\nimport { PTablePool } from \"./ptable_pool\";\nimport { embedInlineColumnTypeSpecs } from \"./ptable_shared\";\nimport {\n PTableCachePerFrame,\n PTableCachePerFrameOpsDefaults,\n type PTableCachePerFrameOps,\n} from \"./ptable_cache_per_frame\";\nimport {\n PTableCachePlain,\n PTableCachePlainOpsDefaults,\n type PTableCachePlainOps,\n} from \"./ptable_cache_plain\";\n\nexport interface LocalBlobProvider<TreeEntry extends JsonSerializable>\n extends PoolLocalBlobProvider<TreeEntry>, AsyncDisposable {}\n\nexport interface RemoteBlobProvider<TreeEntry extends JsonSerializable>\n extends PoolRemoteBlobProvider<TreeEntry>, AsyncDisposable {\n getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null>;\n resetCache(): Promise<void>;\n}\n\nexport type AbstractPFrameDriverOps = PTableCachePerFrameOps &\n PTableCachePlainOps & {\n /** Concurrency limits for `getUniqueValues` and `calculateTableData` requests */\n pFrameConcurrency: number;\n /** Concurrency limits for `getShape` and `getData` requests */\n pTableConcurrency: number;\n };\n\nexport const AbstractPFrameDriverOpsDefaults: AbstractPFrameDriverOps = {\n ...PTableCachePerFrameOpsDefaults,\n ...PTableCachePlainOpsDefaults,\n pFrameConcurrency: 1, // 1 join is executed in parallel and utilize all RAM and CPU cores\n pTableConcurrency: 1, // 1 joined table is read from disk at a time, which matches 1 table the user can view in the UI\n};\n\nexport type DataInfoResolver<PColumnData, TreeEntry extends JsonSerializable> = (\n spec: PColumnSpec,\n data: PColumnData,\n) => PFrameInternal.DataInfo<TreeEntry>;\n\nexport class AbstractPFrameDriver<\n PColumnData,\n TreeEntry extends JsonSerializable,\n> implements AbstractInternalPFrameDriver<PColumnData> {\n private readonly logger: PFrameInternal.Logger;\n\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>;\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>;\n\n private readonly resolveDataInfo: DataInfoResolver<PColumnData, TreeEntry>;\n\n private readonly pFrames: PFramePool<TreeEntry>;\n private readonly pTableDefs: PTableDefPool;\n private readonly pTables: PTablePool<TreeEntry>;\n\n private readonly pTableCachePerFrame: PTableCachePerFrame;\n private readonly pTableCachePlain: PTableCachePlain;\n\n private readonly frameConcurrencyLimiter: ConcurrencyLimitingExecutor;\n private readonly tableConcurrencyLimiter: ConcurrencyLimitingExecutor;\n\n public async pprofDump(): Promise<Uint8Array> {\n return await PFrameFactory.pprofDump();\n }\n\n public async getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null> {\n return await this.remoteBlobProvider.getCacheMetrics();\n }\n\n public async resetCache(): Promise<void> {\n await this.remoteBlobProvider.resetCache();\n }\n\n public constructor({\n logger = () => {},\n localBlobProvider,\n remoteBlobProvider,\n spillPath = tmpdir(),\n options = AbstractPFrameDriverOpsDefaults,\n resolveDataInfo,\n }: {\n logger?: PFrameInternal.Logger;\n localBlobProvider: LocalBlobProvider<TreeEntry>;\n remoteBlobProvider: RemoteBlobProvider<TreeEntry>;\n spillPath?: string;\n options?: AbstractPFrameDriverOps;\n resolveDataInfo: DataInfoResolver<PColumnData, TreeEntry>;\n }) {\n this.logger = logger;\n\n this.localBlobProvider = localBlobProvider;\n this.remoteBlobProvider = remoteBlobProvider;\n\n this.resolveDataInfo = resolveDataInfo;\n\n this.frameConcurrencyLimiter = new ConcurrencyLimitingExecutor(options.pFrameConcurrency);\n this.tableConcurrencyLimiter = new ConcurrencyLimitingExecutor(options.pTableConcurrency);\n\n this.pFrames = new PFramePool(\n this.localBlobProvider,\n this.remoteBlobProvider,\n this.logger,\n spillPath,\n );\n this.pTableDefs = new PTableDefPool(this.logger);\n this.pTables = new PTablePool(this.pFrames, this.pTableDefs, this.logger);\n\n this.pTableCachePerFrame = new PTableCachePerFrame(this.logger, options);\n this.pTableCachePlain = new PTableCachePlain(this.logger, options);\n }\n\n async dispose(): Promise<void> {\n void (await Promise.allSettled([\n this.pTables[Symbol.asyncDispose](),\n this.pTableDefs[Symbol.asyncDispose](),\n this.pFrames[Symbol.asyncDispose](),\n this.localBlobProvider[Symbol.asyncDispose](),\n this.remoteBlobProvider[Symbol.asyncDispose](),\n ]));\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n return await this.dispose();\n }\n\n //\n // Internal / Config API Methods\n //\n\n public createPFrame(def: PFrameDef<PColumn<PColumnData>>): PoolEntry<PFrameHandle> {\n const ValueTypes = new Set(Object.values(ValueType));\n const supportedColumns = def\n .filter((column) => ValueTypes.has(column.spec.valueType))\n .map((c) => ({ ...c, spec: resolveAnnotationParents(c.spec) }));\n const uniqueColumns = uniqueBy(supportedColumns, (column) => column.id);\n const columns = uniqueColumns.map((c) =>\n mapPObjectData(c, (d) => this.resolveDataInfo(c.spec, d)),\n );\n\n return this.pFrames.acquire(columns);\n }\n\n public createPTable(rawDef: PTableDef<PColumn<PColumnData>>): PoolEntry<PTableHandle> {\n const columns = uniqueBy(extractAllColumns(rawDef.src), (c) => c.id);\n using pFrameGuard = new PoolEntryGuard(this.createPFrame(columns));\n const sortedDef = sortPTableDef(\n migrateTableFilter(\n mapPTableDef(rawDef, (c) => c.id),\n this.logger,\n ),\n );\n const pFrameSpec = this.pFrames.getByKey(pFrameGuard.key).pFrameSpec;\n using pTableGuard = new PoolEntryGuard(\n this.pTableDefs.acquireFromLegacy({\n pFrameHandle: pFrameGuard.key,\n def: sortedDef,\n pFrameSpec,\n }).entry,\n );\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Create PTable call (pFrameHandle = ${pFrameGuard.key}; pTableHandle = ${pTableGuard.key})`,\n );\n }\n\n const pFrameEntry = pFrameGuard.keep();\n const pTableEntry = pTableGuard.keep();\n const unref = () => {\n pTableEntry.unref();\n pFrameEntry.unref();\n };\n return {\n key: pTableEntry.key,\n resource: pTableEntry.resource,\n unref,\n [Symbol.dispose]: unref,\n };\n }\n\n public createPTableV2(def: PTableDefV2<PColumn<PColumnData>>): PoolEntry<PTableHandle> {\n const columns = uniqueBy(collectSpecQueryColumns(def.query), (c) => c.id);\n using pFrameGuard = new PoolEntryGuard(this.createPFrame(columns));\n const pFrameSpec = this.pFrames.getByKey(pFrameGuard.key).pFrameSpec;\n const sortedQuery = sortSpecQuery(mapSpecQueryColumns(def.query, (c) => c.id));\n const { tableSpec, dataQuery } = pFrameSpec.evaluateQuery(\n embedInlineColumnTypeSpecs(sortedQuery),\n );\n\n using pTableGuard = new PoolEntryGuard(\n this.pTableDefs.acquire({\n pFrameHandle: pFrameGuard.key,\n tableSpec,\n dataQuery,\n }),\n );\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Create PTable call (pFrameHandle = ${pFrameGuard.key}; pTableHandle = ${pTableGuard.key})`,\n );\n }\n\n const pFrameEntry = pFrameGuard.keep();\n const pTableEntry = pTableGuard.keep();\n const unref = () => {\n pTableEntry.unref();\n pFrameEntry.unref();\n };\n return {\n key: pTableEntry.key,\n resource: pTableEntry.resource,\n unref,\n [Symbol.dispose]: unref,\n };\n }\n\n public async writePTableToFs(\n handle: PTableHandle,\n options: WritePTableToFsOptions,\n ): Promise<WritePTableToFsResult> {\n this.logger(\n \"info\",\n `[WritePTableToFs] ENTER (handle = ${handle}, path = ${options.path}, format = ${options.format}, compression = ${options.compression ?? \"auto\"}, columns = ${options.columnIndices.length})`,\n );\n const startTime = performance.now();\n const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);\n using tableGuard = new PoolEntryGuard(this.pTables.acquire(def));\n const { pTablePromise, disposeSignal } = tableGuard.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any(\n [options.signal, disposeSignal].filter((s): s is AbortSignal => !isNil(s)),\n );\n\n // `combinedSignal` is passed twice on purpose: into the native calls for cooperative\n // cancellation, and into `run` so the concurrency slot is released on abort even if a\n // native call fails to unwind. Dropping the `run` signal reintroduces the queue wedge.\n // keep()/cache live outside the limiter task: on abort `run` rejects and they are\n // skipped, so an abandoned (detached) operation never caches its result nor touches\n // `tableGuard` after the `using` block has already unref'd it.\n const { result, overallSize } = await this.tableConcurrencyLimiter.run(async () => {\n const shape = await pTable.getShape({ signal: combinedSignal });\n const clippedRange = clipRange(options.range, shape);\n const specs = def.tableSpec;\n const separator = options.format === \"tsv\" ? \"\\t\" : \",\";\n\n const iterable = streamPTableRows({\n pTable,\n specs,\n columnIndices: options.columnIndices,\n range: clippedRange,\n chunkSize: options.chunkSize ?? 50_000,\n separator,\n includeHeader: options.includeHeader ?? true,\n bom: options.bom ?? true,\n signal: combinedSignal,\n });\n\n const miLogger: MiLogger = {\n info: (msg) => this.logger(\"info\", String(msg)),\n warn: (msg) => this.logger(\"warn\", String(msg)),\n error: (msg) => this.logger(\"error\", String(msg)),\n };\n\n let bytesWritten = 0;\n await createPathAtomically(miLogger, options.path, async (tempPath) => {\n const writeStream = fs.createWriteStream(tempPath, { flags: \"wx\" });\n const source = Readable.from(iterable, { objectMode: false });\n if (options.compression?.type === \"gzip\") {\n const gzip = zlib.createGzip({ level: options.compression.level ?? 6 });\n await pipeline(source, gzip, writeStream, { signal: combinedSignal });\n } else {\n await pipeline(source, writeStream, { signal: combinedSignal });\n }\n bytesWritten = writeStream.bytesWritten;\n });\n\n const overallSize = await tableGuard.resource.cacheSize;\n\n // rowsWritten equals the clipped range length — the generator streams the\n // entire effective range without early termination, so this is accurate.\n const rowsWritten = clippedRange.length;\n\n if (logPFrames()) {\n const durationMs = Math.round(performance.now() - startTime);\n this.logger(\n \"info\",\n `[WritePTableToFs] complete (handle = ${handle}, columns = ${options.columnIndices.length}, rows = ${rowsWritten}, bytes = ${bytesWritten}, duration = ${durationMs}ms)`,\n );\n }\n\n return { result: { path: options.path, rowsWritten, bytesWritten }, overallSize };\n }, combinedSignal);\n\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\n return result;\n }\n\n public async exportPTable(\n handle: PTableHandle,\n options: ExportPTableOptions,\n signal?: AbortSignal,\n ): Promise<void> {\n const { path, columnIndices } = options;\n\n this.logger(\"info\", `[ExportPTable] ENTER (handle = ${handle}, path = ${path})`);\n const startTime = performance.now();\n\n const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);\n using tableGuard = new PoolEntryGuard(this.pTables.acquire(def));\n const { pTablePromise, disposeSignal } = tableGuard.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any(\n [signal, disposeSignal].filter((s): s is AbortSignal => !isNil(s)),\n );\n\n const headers: [number, string][] = columnIndices.map((index): [number, string] => [\n index,\n columnLabel(def.tableSpec[index]),\n ]);\n\n // keep()/cache live outside the limiter task: on abort `run` rejects and they are\n // skipped, so an abandoned (detached) operation never caches its result nor touches\n // `tableGuard` after the `using` block has already unref'd it.\n const overallSize = await this.tableConcurrencyLimiter.run(async () => {\n // Cap data rows per xlsx sheet below Excel's hard limit of 1,048,576.\n if (path.toLowerCase().endsWith(\".xlsx\")) {\n const shape = await pTable.getShape({ signal: combinedSignal });\n if (shape.rows > XLSX_MAX_ROWS_PER_SHEET) {\n const error = new PFrameDriverError(`exportPTable failed`);\n error.cause = new Error(\n `xlsx export rejected: ${shape.rows} rows exceed the per-sheet ` +\n `limit of ${XLSX_MAX_ROWS_PER_SHEET} rows`,\n );\n throw error;\n }\n }\n\n await pTable.export(path, { headers, signal: combinedSignal });\n\n const overallSize = await tableGuard.resource.cacheSize;\n\n if (logPFrames()) {\n const durationMs = Math.round(performance.now() - startTime);\n this.logger(\n \"info\",\n `[ExportPTable] complete (handle = ${handle}, path = ${path}), ` +\n `duration = ${durationMs}ms`,\n );\n }\n\n return overallSize;\n }, combinedSignal);\n\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\n }\n\n //\n // PFrame instance methods\n //\n\n public async findColumns(\n handle: PFrameHandle,\n request: FindColumnsRequest,\n ): Promise<FindColumnsResponse> {\n const iRequest: PFrameInternal.FindColumnsRequest = {\n ...request,\n compatibleWith:\n request.compatibleWith.length !== 0\n ? [\n {\n axesSpec: [\n ...new Map(\n request.compatibleWith.map((item) => [canonicalizeJson(item), item] as const),\n ).values(),\n ],\n qualifications: [],\n },\n ]\n : [],\n };\n\n const { pFrameSpec } = this.pFrames.getByKey(handle);\n const response = pFrameSpec.findColumns(iRequest);\n return {\n hits: response.hits\n .filter(\n (h) =>\n // only exactly matching columns\n h.mappingVariants.length === 0 ||\n h.mappingVariants.some(\n (v) =>\n v.qualifications.forHit.length === 0 &&\n v.qualifications.forQueries.every((q) => q.length === 0),\n ),\n )\n .map((h) => h.hit),\n };\n }\n\n public async getColumnSpec(\n handle: PFrameHandle,\n columnId: PObjectId,\n ): Promise<PColumnSpec | null> {\n const { columnSpecs } = this.pFrames.getByKey(handle);\n return columnSpecs[columnId] ?? null;\n }\n\n public async listColumns(handle: PFrameHandle): Promise<PColumnIdAndSpec[]> {\n const { pFrameSpec } = this.pFrames.getByKey(handle);\n return pFrameSpec.listColumns().map(({ columnId, spec }) => ({ columnId, spec }));\n }\n\n public async calculateTableData(\n handle: PFrameHandle,\n request: CalculateTableDataRequest<PObjectId>,\n range: TableRange | undefined,\n signal?: AbortSignal,\n ): Promise<CalculateTableDataResponse> {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Call calculateTableData, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,\n );\n }\n\n const { pFrameSpec } = this.pFrames.getByKey(handle);\n const sortedDef = sortPTableDef(migrateTableFilter(request, this.logger));\n const { def, entry } = this.pTables.acquireFromLegacy({\n pFrameHandle: handle,\n def: sortedDef,\n pFrameSpec,\n });\n using tableGuard = new PoolEntryGuard(entry);\n const tableSpec = def.tableSpec;\n const { pTablePromise, disposeSignal } = tableGuard.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n // keep()/cache live outside the limiter task: on abort `run` rejects and they are\n // skipped, so an abandoned (detached) operation never caches its result nor touches\n // `tableGuard` after the `using` block has already unref'd it.\n const { data, overallSize } = await this.frameConcurrencyLimiter.run(async () => {\n // TODO: throw error when more then 200k rows is requested\n // after pf-plots migration to stream API\n\n const data = await pTable.getData([...tableSpec.keys()], {\n range,\n signal: combinedSignal,\n });\n\n const overallSize = await tableGuard.resource.cacheSize;\n return { data, overallSize };\n }, combinedSignal);\n\n this.pTableCachePerFrame.cache(tableGuard.keep(), overallSize);\n return tableSpec.map((spec, i) => ({\n spec: spec,\n data: data[i],\n }));\n }\n\n public async getUniqueValues(\n handle: PFrameHandle,\n request: UniqueValuesRequest,\n signal?: AbortSignal,\n ): Promise<UniqueValuesResponse> {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Call getUniqueValues, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,\n );\n }\n\n const { pFrameDataPromise, columnSpecs, disposeSignal } = this.pFrames.getByKey(handle);\n const pFrameData = await pFrameDataPromise;\n\n const columnSpec = columnSpecs[request.columnId];\n if (!columnSpec) {\n const error = new PFrameDriverError(`getUniqueValues failed`);\n error.cause = new Error(`column ${request.columnId} is not registered in the PFrame`);\n throw error;\n }\n\n const axisIds = expandAxes(columnSpec.axesSpec);\n const tableSpec: PTableColumnSpec[] = [\n ...columnSpec.axesSpec.map(\n (axisSpec, i): PTableColumnSpec => ({\n type: \"axis\",\n id: axisIds[i],\n spec: axisSpec,\n }),\n ),\n { type: \"column\", id: request.columnId, spec: columnSpec },\n ];\n\n let axisIndex: number | undefined;\n if (request.axis !== undefined) {\n const index = findTableColumn(tableSpec, { type: \"axis\", id: request.axis });\n if (index < 0) {\n const error = new PFrameDriverError(`getUniqueValues failed`);\n error.cause = new Error(\n `axis ${JSON.stringify(request.axis)} not found among axes of column ${request.columnId}`,\n );\n throw error;\n }\n axisIndex = index;\n }\n\n const resolvedRequest: PFrameInternal.UniqueValuesRequestV2 = {\n columnId: request.columnId,\n axisIndex,\n filters: rewriteLegacyFilters({\n tableSpec,\n filters: migrateFilters(request.filters, this.logger),\n }),\n limit: request.limit,\n };\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n return await this.frameConcurrencyLimiter.run(async () => {\n return await pFrameData.getUniqueValues(resolvedRequest, { signal: combinedSignal });\n }, combinedSignal);\n }\n\n //\n // PTable instance methods\n //\n\n public async getSpec(handle: PTableHandle): Promise<PTableColumnSpec[]> {\n const { def } = this.pTableDefs.getByKey(handle);\n return def.tableSpec;\n }\n\n public async getShape(handle: PTableHandle, signal?: AbortSignal): Promise<PTableShape> {\n const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);\n using tableGuard = new PoolEntryGuard(this.pTables.acquire(def));\n\n const { pTablePromise, disposeSignal } = tableGuard.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n const { shape, overallSize } = await this.tableConcurrencyLimiter.run(async () => {\n const shape = await pTable.getShape({\n signal: combinedSignal,\n });\n\n const overallSize = await tableGuard.resource.cacheSize;\n\n return { shape, overallSize };\n }, combinedSignal);\n\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\n return shape;\n }\n\n public async getData(\n handle: PTableHandle,\n columnIndices: number[],\n range: TableRange | undefined,\n signal?: AbortSignal,\n ): Promise<PTableVector[]> {\n const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);\n using tableGuard = new PoolEntryGuard(this.pTables.acquire(def));\n\n const { pTablePromise, disposeSignal } = tableGuard.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n const { data, overallSize } = await this.tableConcurrencyLimiter.run(async () => {\n const data = await pTable.getData(columnIndices, {\n range,\n signal: combinedSignal,\n });\n\n const overallSize = await tableGuard.resource.cacheSize;\n\n return { data, overallSize };\n }, combinedSignal);\n\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\n return data;\n }\n}\n\n/** Clamp range to table shape. When range is undefined, returns full table range. */\nfunction clipRange(range: undefined | TableRange, shape: PTableShape): TableRange {\n if (isNil(range)) {\n return { offset: 0, length: shape.rows };\n }\n const clampedOffset = Math.min(range.offset, shape.rows);\n const clampedLength = Math.min(range.length, shape.rows - clampedOffset);\n return { offset: clampedOffset, length: clampedLength };\n}\n\nfunction migrateFilters(\n filters: PTableRecordFilter[],\n logger: PFrameInternal.Logger,\n): PTableRecordFilter[] {\n const filtersV1 = [];\n const filtersV2: PTableRecordSingleValueFilterV2[] = [];\n for (const filter of filters) {\n if ((filter.type as unknown) === \"bySingleColumn\") {\n filtersV1.push(filter);\n filtersV2.push({\n ...filter,\n type: \"bySingleColumnV2\",\n });\n } else {\n filtersV2.push(filter);\n }\n }\n if (filtersV1.length > 0) {\n const filtersV1Json = JSON.stringify(filtersV1);\n logger(\n \"warn\",\n `type overwritten from 'bySingleColumn' to 'bySingleColumnV2' for filters: ${filtersV1Json}`,\n );\n }\n return filtersV2;\n}\n\nfunction migrateTableFilter<T>(\n def: Omit<PTableDef<T>, \"partitionFilters\"> | PTableDef<T>,\n logger: PFrameInternal.Logger,\n): PTableDef<T> {\n if (!(\"partitionFilters\" in def)) {\n // For old blocks assume all axes filters to be partition filters\n return {\n ...def,\n partitionFilters: migrateFilters(\n def.filters.filter((f) => f.column.type === \"axis\"),\n logger,\n ),\n filters: migrateFilters(\n def.filters.filter((f) => f.column.type === \"column\"),\n logger,\n ),\n };\n }\n return {\n ...def,\n partitionFilters: migrateFilters(def.partitionFilters, logger),\n filters: migrateFilters(def.filters, logger),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAgGA,MAAa,kCAA2D;CACtE,GAAGA,+BAAAA;CACH,GAAGC,2BAAAA;CACH,mBAAmB;CACnB,mBAAmB;CACpB;AAOD,IAAa,uBAAb,MAGuD;CACrD;CAEA;CACA;CAEA;CAEA;CACA;CACA;CAEA;CACA;CAEA;CACA;CAEA,MAAa,YAAiC;AAC5C,SAAO,MAAMC,gCAAAA,cAAc,WAAW;;CAGxC,MAAa,kBAA+D;AAC1E,SAAO,MAAM,KAAK,mBAAmB,iBAAiB;;CAGxD,MAAa,aAA4B;AACvC,QAAM,KAAK,mBAAmB,YAAY;;CAG5C,YAAmB,EACjB,eAAe,IACf,mBACA,oBACA,aAAA,GAAA,QAAA,SAAoB,EACpB,UAAU,iCACV,mBAQC;AACD,OAAK,SAAS;AAEd,OAAK,oBAAoB;AACzB,OAAK,qBAAqB;AAE1B,OAAK,kBAAkB;AAEvB,OAAK,0BAA0B,IAAIC,2BAAAA,4BAA4B,QAAQ,kBAAkB;AACzF,OAAK,0BAA0B,IAAIA,2BAAAA,4BAA4B,QAAQ,kBAAkB;AAEzF,OAAK,UAAU,IAAIC,oBAAAA,WACjB,KAAK,mBACL,KAAK,oBACL,KAAK,QACL,UACD;AACD,OAAK,aAAa,IAAIC,wBAAAA,cAAc,KAAK,OAAO;AAChD,OAAK,UAAU,IAAIC,oBAAAA,WAAW,KAAK,SAAS,KAAK,YAAY,KAAK,OAAO;AAEzE,OAAK,sBAAsB,IAAIC,+BAAAA,oBAAoB,KAAK,QAAQ,QAAQ;AACxE,OAAK,mBAAmB,IAAIC,2BAAAA,iBAAiB,KAAK,QAAQ,QAAQ;;CAGpE,MAAM,UAAyB;AACvB,QAAM,QAAQ,WAAW;GAC7B,KAAK,QAAQ,OAAO,eAAe;GACnC,KAAK,WAAW,OAAO,eAAe;GACtC,KAAK,QAAQ,OAAO,eAAe;GACnC,KAAK,kBAAkB,OAAO,eAAe;GAC7C,KAAK,mBAAmB,OAAO,eAAe;GAC/C,CAAC;;CAGJ,OAAO,OAAO,gBAA+B;AAC3C,SAAO,MAAM,KAAK,SAAS;;CAO7B,aAAoB,KAA+D;EACjF,MAAM,aAAa,IAAI,IAAI,OAAO,OAAOC,gCAAAA,UAAU,CAAC;EAKpD,MAAM,WAAA,GAAA,gCAAA,UAJmB,IACtB,QAAQ,WAAW,WAAW,IAAI,OAAO,KAAK,UAAU,CAAC,CACzD,KAAK,OAAO;GAAE,GAAG;GAAG,OAAA,GAAA,gCAAA,0BAA+B,EAAE,KAAK;GAAE,EAAE,GACf,WAAW,OAAO,GAAG,CACzC,KAAK,OAAA,GAAA,gCAAA,gBAClB,IAAI,MAAM,KAAK,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAC1D;AAED,SAAO,KAAK,QAAQ,QAAQ,QAAQ;;CAGtC,aAAoB,QAAkE;;;GACpF,MAAM,WAAA,GAAA,gCAAA,WAAA,GAAA,gCAAA,mBAAqC,OAAO,IAAI,GAAG,MAAM,EAAE,GAAG;GACpE,MAAM,cAAA,YAAA,EAAc,IAAIC,wBAAAA,eAAe,KAAK,aAAa,QAAQ,CAAC,CAAA;GAClE,MAAM,aAAA,GAAA,gCAAA,eACJ,oBAAA,GAAA,gCAAA,cACe,SAAS,MAAM,EAAE,GAAG,EACjC,KAAK,OACN,CACF;GACD,MAAM,aAAa,KAAK,QAAQ,SAAS,YAAY,IAAI,CAAC;GAC1D,MAAM,cAAA,YAAA,EAAc,IAAIA,wBAAAA,eACtB,KAAK,WAAW,kBAAkB;IAChC,cAAc,YAAY;IAC1B,KAAK;IACL;IACD,CAAC,CAAC,MACJ,CAAA;AACD,OAAIC,gBAAAA,YAAY,CACd,MAAK,OACH,QACA,sCAAsC,YAAY,IAAI,mBAAmB,YAAY,IAAI,GAC1F;GAGH,MAAM,cAAc,YAAY,MAAM;GACtC,MAAM,cAAc,YAAY,MAAM;GACtC,MAAM,cAAc;AAClB,gBAAY,OAAO;AACnB,gBAAY,OAAO;;AAErB,UAAO;IACL,KAAK,YAAY;IACjB,UAAU,YAAY;IACtB;KACC,OAAO,UAAU;IACnB;;;;;;;CAGH,eAAsB,KAAiE;;;GACrF,MAAM,WAAA,GAAA,gCAAA,WAAA,GAAA,gCAAA,yBAA2C,IAAI,MAAM,GAAG,MAAM,EAAE,GAAG;GACzE,MAAM,cAAA,WAAA,EAAc,IAAID,wBAAAA,eAAe,KAAK,aAAa,QAAQ,CAAC,CAAA;GAClE,MAAM,aAAa,KAAK,QAAQ,SAAS,YAAY,IAAI,CAAC;GAC1D,MAAM,eAAA,GAAA,gCAAA,gBAAA,GAAA,gCAAA,qBAAgD,IAAI,QAAQ,MAAM,EAAE,GAAG,CAAC;GAC9E,MAAM,EAAE,WAAW,cAAc,WAAW,cAC1CE,sBAAAA,2BAA2B,YAAY,CACxC;GAED,MAAM,cAAA,WAAA,EAAc,IAAIF,wBAAAA,eACtB,KAAK,WAAW,QAAQ;IACtB,cAAc,YAAY;IAC1B;IACA;IACD,CAAC,CACH,CAAA;AACD,OAAIC,gBAAAA,YAAY,CACd,MAAK,OACH,QACA,sCAAsC,YAAY,IAAI,mBAAmB,YAAY,IAAI,GAC1F;GAGH,MAAM,cAAc,YAAY,MAAM;GACtC,MAAM,cAAc,YAAY,MAAM;GACtC,MAAM,cAAc;AAClB,gBAAY,OAAO;AACnB,gBAAY,OAAO;;AAErB,UAAO;IACL,KAAK,YAAY;IACjB,UAAU,YAAY;IACtB;KACC,OAAO,UAAU;IACnB;;;;;;;CAGH,MAAa,gBACX,QACA,SACgC;;;AAChC,QAAK,OACH,QACA,qCAAqC,OAAO,WAAW,QAAQ,KAAK,aAAa,QAAQ,OAAO,kBAAkB,QAAQ,eAAe,OAAO,cAAc,QAAQ,cAAc,OAAO,GAC5L;GACD,MAAM,YAAY,YAAY,KAAK;GACnC,MAAM,EAAE,KAAK,eAAe,qBAAqB,KAAK,WAAW,SAAS,OAAO;GACjF,MAAM,aAAA,WAAA,EAAa,IAAID,wBAAAA,eAAe,KAAK,QAAQ,QAAQ,IAAI,CAAC,CAAA;GAChE,MAAM,EAAE,eAAe,kBAAkB,WAAW;GACpD,MAAM,SAAS,MAAM;GAErB,MAAM,iBAAiB,YAAY,IACjC,CAAC,QAAQ,QAAQ,cAAc,CAAC,QAAQ,MAAwB,EAAA,GAAA,wBAAA,OAAO,EAAE,CAAC,CAC3E;GAQD,MAAM,EAAE,QAAQ,gBAAgB,MAAM,KAAK,wBAAwB,IAAI,YAAY;IACjF,MAAM,QAAQ,MAAM,OAAO,SAAS,EAAE,QAAQ,gBAAgB,CAAC;IAC/D,MAAM,eAAe,UAAU,QAAQ,OAAO,MAAM;IACpD,MAAM,QAAQ,IAAI;IAClB,MAAM,YAAY,QAAQ,WAAW,QAAQ,MAAO;IAEpD,MAAM,WAAWG,mBAAAA,iBAAiB;KAChC;KACA;KACA,eAAe,QAAQ;KACvB,OAAO;KACP,WAAW,QAAQ,aAAa;KAChC;KACA,eAAe,QAAQ,iBAAiB;KACxC,KAAK,QAAQ,OAAO;KACpB,QAAQ;KACT,CAAC;IAEF,MAAM,WAAqB;KACzB,OAAO,QAAQ,KAAK,OAAO,QAAQ,OAAO,IAAI,CAAC;KAC/C,OAAO,QAAQ,KAAK,OAAO,QAAQ,OAAO,IAAI,CAAC;KAC/C,QAAQ,QAAQ,KAAK,OAAO,SAAS,OAAO,IAAI,CAAC;KAClD;IAED,IAAI,eAAe;AACnB,WAAA,GAAA,2BAAA,sBAA2B,UAAU,QAAQ,MAAM,OAAO,aAAa;KACrE,MAAM,cAAcC,QAAG,kBAAkB,UAAU,EAAE,OAAO,MAAM,CAAC;KACnE,MAAM,SAASC,YAAAA,SAAS,KAAK,UAAU,EAAE,YAAY,OAAO,CAAC;AAC7D,SAAI,QAAQ,aAAa,SAAS,OAEhC,QAAA,GAAA,qBAAA,UAAe,QADFC,UAAK,WAAW,EAAE,OAAO,QAAQ,YAAY,SAAS,GAAG,CAAC,EAC1C,aAAa,EAAE,QAAQ,gBAAgB,CAAC;SAErE,QAAA,GAAA,qBAAA,UAAe,QAAQ,aAAa,EAAE,QAAQ,gBAAgB,CAAC;AAEjE,oBAAe,YAAY;MAC3B;IAEF,MAAM,cAAc,MAAM,WAAW,SAAS;IAI9C,MAAM,cAAc,aAAa;AAEjC,QAAIL,gBAAAA,YAAY,EAAE;KAChB,MAAM,aAAa,KAAK,MAAM,YAAY,KAAK,GAAG,UAAU;AAC5D,UAAK,OACH,QACA,wCAAwC,OAAO,cAAc,QAAQ,cAAc,OAAO,WAAW,YAAY,YAAY,aAAa,eAAe,WAAW,KACrK;;AAGH,WAAO;KAAE,QAAQ;MAAE,MAAM,QAAQ;MAAM;MAAa;MAAc;KAAE;KAAa;MAChF,eAAe;AAElB,QAAK,iBAAiB,MAAM,WAAW,MAAM,EAAE,aAAa,iBAAiB;AAC7E,UAAO;;;;;;;CAGT,MAAa,aACX,QACA,SACA,QACe;;;GACf,MAAM,EAAE,MAAM,kBAAkB;AAEhC,QAAK,OAAO,QAAQ,kCAAkC,OAAO,WAAW,KAAK,GAAG;GAChF,MAAM,YAAY,YAAY,KAAK;GAEnC,MAAM,EAAE,KAAK,eAAe,qBAAqB,KAAK,WAAW,SAAS,OAAO;GACjF,MAAM,aAAA,WAAA,EAAa,IAAID,wBAAAA,eAAe,KAAK,QAAQ,QAAQ,IAAI,CAAC,CAAA;GAChE,MAAM,EAAE,eAAe,kBAAkB,WAAW;GACpD,MAAM,SAAS,MAAM;GAErB,MAAM,iBAAiB,YAAY,IACjC,CAAC,QAAQ,cAAc,CAAC,QAAQ,MAAwB,EAAA,GAAA,wBAAA,OAAO,EAAE,CAAC,CACnE;GAED,MAAM,UAA8B,cAAc,KAAK,UAA4B,CACjF,OACAO,mBAAAA,YAAY,IAAI,UAAU,OAAO,CAClC,CAAC;GAKF,MAAM,cAAc,MAAM,KAAK,wBAAwB,IAAI,YAAY;AAErE,QAAI,KAAK,aAAa,CAAC,SAAS,QAAQ,EAAE;KACxC,MAAM,QAAQ,MAAM,OAAO,SAAS,EAAE,QAAQ,gBAAgB,CAAC;AAC/D,SAAI,MAAM,OAAOC,gCAAAA,yBAAyB;MACxC,MAAM,QAAQ,IAAIC,gCAAAA,kBAAkB,sBAAsB;AAC1D,YAAM,wBAAQ,IAAI,MAChB,yBAAyB,MAAM,KAAK,sCACtBD,gCAAAA,wBAAwB,OACvC;AACD,YAAM;;;AAIV,UAAM,OAAO,OAAO,MAAM;KAAE;KAAS,QAAQ;KAAgB,CAAC;IAE9D,MAAM,cAAc,MAAM,WAAW,SAAS;AAE9C,QAAIP,gBAAAA,YAAY,EAAE;KAChB,MAAM,aAAa,KAAK,MAAM,YAAY,KAAK,GAAG,UAAU;AAC5D,UAAK,OACH,QACA,qCAAqC,OAAO,WAAW,KAAK,gBAC5C,WAAW,IAC5B;;AAGH,WAAO;MACN,eAAe;AAElB,QAAK,iBAAiB,MAAM,WAAW,MAAM,EAAE,aAAa,iBAAiB;;;;;;;CAO/E,MAAa,YACX,QACA,SAC8B;EAC9B,MAAM,WAA8C;GAClD,GAAG;GACH,gBACE,QAAQ,eAAe,WAAW,IAC9B,CACE;IACE,UAAU,CACR,GAAG,IAAI,IACL,QAAQ,eAAe,KAAK,SAAS,EAAA,GAAA,gCAAA,kBAAkB,KAAK,EAAE,KAAK,CAAU,CAC9E,CAAC,QAAQ,CACX;IACD,gBAAgB,EAAE;IACnB,CACF,GACD,EAAE;GACT;EAED,MAAM,EAAE,eAAe,KAAK,QAAQ,SAAS,OAAO;AAEpD,SAAO,EACL,MAFe,WAAW,YAAY,SAAS,CAEhC,KACZ,QACE,MAEC,EAAE,gBAAgB,WAAW,KAC7B,EAAE,gBAAgB,MACf,MACC,EAAE,eAAe,OAAO,WAAW,KACnC,EAAE,eAAe,WAAW,OAAO,MAAM,EAAE,WAAW,EAAE,CAC3D,CACJ,CACA,KAAK,MAAM,EAAE,IAAI,EACrB;;CAGH,MAAa,cACX,QACA,UAC6B;EAC7B,MAAM,EAAE,gBAAgB,KAAK,QAAQ,SAAS,OAAO;AACrD,SAAO,YAAY,aAAa;;CAGlC,MAAa,YAAY,QAAmD;EAC1E,MAAM,EAAE,eAAe,KAAK,QAAQ,SAAS,OAAO;AACpD,SAAO,WAAW,aAAa,CAAC,KAAK,EAAE,UAAU,YAAY;GAAE;GAAU;GAAM,EAAE;;CAGnF,MAAa,mBACX,QACA,SACA,OACA,QACqC;;;AACrC,OAAIA,gBAAAA,YAAY,CACd,MAAK,OACH,QACA,qCAAqC,OAAO,cAAc,KAAK,UAAU,SAASS,gCAAAA,eAAe,GAClG;GAGH,MAAM,EAAE,eAAe,KAAK,QAAQ,SAAS,OAAO;GACpD,MAAM,aAAA,GAAA,gCAAA,eAA0B,mBAAmB,SAAS,KAAK,OAAO,CAAC;GACzE,MAAM,EAAE,KAAK,UAAU,KAAK,QAAQ,kBAAkB;IACpD,cAAc;IACd,KAAK;IACL;IACD,CAAC;GACF,MAAM,aAAA,WAAA,EAAa,IAAIV,wBAAAA,eAAe,MAAM,CAAA;GAC5C,MAAM,YAAY,IAAI;GACtB,MAAM,EAAE,eAAe,kBAAkB,WAAW;GACpD,MAAM,SAAS,MAAM;GAErB,MAAM,iBAAiB,YAAY,IAAI,CAAC,QAAQ,cAAc,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC;GAIlF,MAAM,EAAE,MAAM,gBAAgB,MAAM,KAAK,wBAAwB,IAAI,YAAY;AAU/E,WAAO;KAAE,MANI,MAAM,OAAO,QAAQ,CAAC,GAAG,UAAU,MAAM,CAAC,EAAE;MACvD;MACA,QAAQ;MACT,CAAC;KAGa,aADK,MAAM,WAAW,SAAS;KAClB;MAC3B,eAAe;AAElB,QAAK,oBAAoB,MAAM,WAAW,MAAM,EAAE,YAAY;AAC9D,UAAO,UAAU,KAAK,MAAM,OAAO;IAC3B;IACN,MAAM,KAAK;IACZ,EAAE;;;;;;;CAGL,MAAa,gBACX,QACA,SACA,QAC+B;AAC/B,MAAIC,gBAAAA,YAAY,CACd,MAAK,OACH,QACA,kCAAkC,OAAO,cAAc,KAAK,UAAU,SAASS,gCAAAA,eAAe,GAC/F;EAGH,MAAM,EAAE,mBAAmB,aAAa,kBAAkB,KAAK,QAAQ,SAAS,OAAO;EACvF,MAAM,aAAa,MAAM;EAEzB,MAAM,aAAa,YAAY,QAAQ;AACvC,MAAI,CAAC,YAAY;GACf,MAAM,QAAQ,IAAID,gCAAAA,kBAAkB,yBAAyB;AAC7D,SAAM,wBAAQ,IAAI,MAAM,UAAU,QAAQ,SAAS,kCAAkC;AACrF,SAAM;;EAGR,MAAM,WAAA,GAAA,gCAAA,YAAqB,WAAW,SAAS;EAC/C,MAAM,YAAgC,CACpC,GAAG,WAAW,SAAS,KACpB,UAAU,OAAyB;GAClC,MAAM;GACN,IAAI,QAAQ;GACZ,MAAM;GACP,EACF,EACD;GAAE,MAAM;GAAU,IAAI,QAAQ;GAAU,MAAM;GAAY,CAC3D;EAED,IAAI;AACJ,MAAI,QAAQ,SAAS,KAAA,GAAW;GAC9B,MAAM,SAAA,GAAA,gCAAA,iBAAwB,WAAW;IAAE,MAAM;IAAQ,IAAI,QAAQ;IAAM,CAAC;AAC5E,OAAI,QAAQ,GAAG;IACb,MAAM,QAAQ,IAAIA,gCAAAA,kBAAkB,yBAAyB;AAC7D,UAAM,wBAAQ,IAAI,MAChB,QAAQ,KAAK,UAAU,QAAQ,KAAK,CAAC,kCAAkC,QAAQ,WAChF;AACD,UAAM;;AAER,eAAY;;EAGd,MAAM,kBAAwD;GAC5D,UAAU,QAAQ;GAClB;GACA,UAAA,GAAA,gCAAA,sBAA8B;IAC5B;IACA,SAAS,eAAe,QAAQ,SAAS,KAAK,OAAO;IACtD,CAAC;GACF,OAAO,QAAQ;GAChB;EAED,MAAM,iBAAiB,YAAY,IAAI,CAAC,QAAQ,cAAc,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC;AAClF,SAAO,MAAM,KAAK,wBAAwB,IAAI,YAAY;AACxD,UAAO,MAAM,WAAW,gBAAgB,iBAAiB,EAAE,QAAQ,gBAAgB,CAAC;KACnF,eAAe;;CAOpB,MAAa,QAAQ,QAAmD;EACtE,MAAM,EAAE,QAAQ,KAAK,WAAW,SAAS,OAAO;AAChD,SAAO,IAAI;;CAGb,MAAa,SAAS,QAAsB,QAA4C;;;GACtF,MAAM,EAAE,KAAK,eAAe,qBAAqB,KAAK,WAAW,SAAS,OAAO;GACjF,MAAM,aAAA,WAAA,EAAa,IAAIT,wBAAAA,eAAe,KAAK,QAAQ,QAAQ,IAAI,CAAC,CAAA;GAEhE,MAAM,EAAE,eAAe,kBAAkB,WAAW;GACpD,MAAM,SAAS,MAAM;GAErB,MAAM,iBAAiB,YAAY,IAAI,CAAC,QAAQ,cAAc,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC;GAClF,MAAM,EAAE,OAAO,gBAAgB,MAAM,KAAK,wBAAwB,IAAI,YAAY;AAOhF,WAAO;KAAE,OANK,MAAM,OAAO,SAAS,EAClC,QAAQ,gBACT,CAAC;KAIc,aAFI,MAAM,WAAW,SAAS;KAEjB;MAC5B,eAAe;AAElB,QAAK,iBAAiB,MAAM,WAAW,MAAM,EAAE,aAAa,iBAAiB;AAC7E,UAAO;;;;;;;CAGT,MAAa,QACX,QACA,eACA,OACA,QACyB;;;GACzB,MAAM,EAAE,KAAK,eAAe,qBAAqB,KAAK,WAAW,SAAS,OAAO;GACjF,MAAM,aAAA,WAAA,EAAa,IAAIA,wBAAAA,eAAe,KAAK,QAAQ,QAAQ,IAAI,CAAC,CAAA;GAEhE,MAAM,EAAE,eAAe,kBAAkB,WAAW;GACpD,MAAM,SAAS,MAAM;GAErB,MAAM,iBAAiB,YAAY,IAAI,CAAC,QAAQ,cAAc,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC;GAClF,MAAM,EAAE,MAAM,gBAAgB,MAAM,KAAK,wBAAwB,IAAI,YAAY;AAQ/E,WAAO;KAAE,MAPI,MAAM,OAAO,QAAQ,eAAe;MAC/C;MACA,QAAQ;MACT,CAAC;KAIa,aAFK,MAAM,WAAW,SAAS;KAElB;MAC3B,eAAe;AAElB,QAAK,iBAAiB,MAAM,WAAW,MAAM,EAAE,aAAa,iBAAiB;AAC7E,UAAO;;;;;;;;;AAKX,SAAS,UAAU,OAA+B,OAAgC;AAChF,MAAA,GAAA,wBAAA,OAAU,MAAM,CACd,QAAO;EAAE,QAAQ;EAAG,QAAQ,MAAM;EAAM;CAE1C,MAAM,gBAAgB,KAAK,IAAI,MAAM,QAAQ,MAAM,KAAK;AAExD,QAAO;EAAE,QAAQ;EAAe,QADV,KAAK,IAAI,MAAM,QAAQ,MAAM,OAAO,cAAc;EACjB;;AAGzD,SAAS,eACP,SACA,QACsB;CACtB,MAAM,YAAY,EAAE;CACpB,MAAM,YAA+C,EAAE;AACvD,MAAK,MAAM,UAAU,QACnB,KAAK,OAAO,SAAqB,kBAAkB;AACjD,YAAU,KAAK,OAAO;AACtB,YAAU,KAAK;GACb,GAAG;GACH,MAAM;GACP,CAAC;OAEF,WAAU,KAAK,OAAO;AAG1B,KAAI,UAAU,SAAS,EAErB,QACE,QACA,6EAHoB,KAAK,UAAU,UAAU,GAI9C;AAEH,QAAO;;AAGT,SAAS,mBACP,KACA,QACc;AACd,KAAI,EAAE,sBAAsB,KAE1B,QAAO;EACL,GAAG;EACH,kBAAkB,eAChB,IAAI,QAAQ,QAAQ,MAAM,EAAE,OAAO,SAAS,OAAO,EACnD,OACD;EACD,SAAS,eACP,IAAI,QAAQ,QAAQ,MAAM,EAAE,OAAO,SAAS,SAAS,EACrD,OACD;EACF;AAEH,QAAO;EACL,GAAG;EACH,kBAAkB,eAAe,IAAI,kBAAkB,OAAO;EAC9D,SAAS,eAAe,IAAI,SAAS,OAAO;EAC7C"}
1
+ {"version":3,"file":"driver_impl.cjs","names":["PTableCachePerFrameOpsDefaults","PTableCachePlainOpsDefaults","PFrameFactory","ConcurrencyLimitingExecutor","PFramePool","PTableDefPool","PTablePool","PTableCachePerFrame","PTableCachePlain","ValueType","PoolEntryGuard","logPFrames","embedInlineColumnTypeSpecs","streamPTableRows","fs","Readable","zlib","columnLabel","XLSX_MAX_ROWS_PER_SHEET","PFrameDriverError","bigintReplacer"],"sources":["../src/driver_impl.ts"],"sourcesContent":["import {\n mapPObjectData,\n mapPTableDef,\n extractAllColumns,\n uniqueBy,\n canonicalizeJson,\n bigintReplacer,\n ValueType,\n type CalculateTableDataRequest,\n type CalculateTableDataResponse,\n type FindColumnsRequest,\n type FindColumnsResponse,\n type PColumnIdAndSpec,\n type PColumnSpec,\n type PFrameHandle,\n type PObjectId,\n type PTableColumnSpec,\n type PTableHandle,\n type PTableShape,\n type PTableVector,\n type TableRange,\n type UniqueValuesRequest,\n type UniqueValuesResponse,\n type PColumn,\n type PFrameDef,\n type PTableDef,\n type PTableRecordSingleValueFilterV2,\n type PTableRecordFilter,\n type JsonSerializable,\n type PTableDefV2,\n mapSpecQueryColumns,\n collectSpecQueryColumns,\n sortSpecQuery,\n sortPTableDef,\n resolveAnnotationParents,\n PFrameDriverError,\n XLSX_MAX_ROWS_PER_SHEET,\n} from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport {\n ConcurrencyLimitingExecutor,\n createPathAtomically,\n type MiLogger,\n} from \"@milaboratories/ts-helpers\";\nimport { isNil, PoolEntryGuard, type PoolEntry } from \"@milaboratories/helpers\";\nimport { PFrameFactory } from \"@milaboratories/pframes-rs-node\";\nimport { expandAxes, findTableColumn, rewriteLegacyFilters } from \"@milaboratories/pframes-rs-wasm\";\nimport { tmpdir } from \"node:os\";\nimport * as fs from \"node:fs\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport * as zlib from \"node:zlib\";\nimport { columnLabel, streamPTableRows } from \"./csv_writer\";\nimport type {\n AbstractInternalPFrameDriver,\n WritePTableToFsOptions,\n WritePTableToFsResult,\n ExportPTableOptions,\n} from \"./driver_decl\";\nimport { logPFrames } from \"./logging\";\nimport {\n PFramePool,\n type LocalBlobProvider as PoolLocalBlobProvider,\n type RemoteBlobProvider as PoolRemoteBlobProvider,\n} from \"./pframe_pool\";\nimport { PTableDefPool } from \"./ptable_def_pool\";\nimport { PTablePool } from \"./ptable_pool\";\nimport { embedInlineColumnTypeSpecs } from \"./ptable_shared\";\nimport {\n PTableCachePerFrame,\n PTableCachePerFrameOpsDefaults,\n type PTableCachePerFrameOps,\n} from \"./ptable_cache_per_frame\";\nimport {\n PTableCachePlain,\n PTableCachePlainOpsDefaults,\n type PTableCachePlainOps,\n} from \"./ptable_cache_plain\";\n\nexport interface LocalBlobProvider<TreeEntry extends JsonSerializable>\n extends PoolLocalBlobProvider<TreeEntry>, AsyncDisposable {}\n\nexport interface RemoteBlobProvider<TreeEntry extends JsonSerializable>\n extends PoolRemoteBlobProvider<TreeEntry>, AsyncDisposable {\n getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null>;\n resetCache(): Promise<void>;\n}\n\nexport type AbstractPFrameDriverOps = PTableCachePerFrameOps &\n PTableCachePlainOps & {\n /** Concurrency limits for `getUniqueValues` and `calculateTableData` requests */\n pFrameConcurrency: number;\n /** Concurrency limits for `getShape` and `getData` requests */\n pTableConcurrency: number;\n };\n\nexport const AbstractPFrameDriverOpsDefaults: AbstractPFrameDriverOps = {\n ...PTableCachePerFrameOpsDefaults,\n ...PTableCachePlainOpsDefaults,\n pFrameConcurrency: 1, // 1 join is executed in parallel and utilize all RAM and CPU cores\n pTableConcurrency: 1, // 1 joined table is read from disk at a time, which matches 1 table the user can view in the UI\n};\n\nexport type DataInfoResolver<PColumnData, TreeEntry extends JsonSerializable> = (\n spec: PColumnSpec,\n data: PColumnData,\n) => PFrameInternal.DataInfo<TreeEntry>;\n\nexport class AbstractPFrameDriver<\n PColumnData,\n TreeEntry extends JsonSerializable,\n> implements AbstractInternalPFrameDriver<PColumnData> {\n private readonly logger: PFrameInternal.Logger;\n\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>;\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>;\n\n private readonly resolveDataInfo: DataInfoResolver<PColumnData, TreeEntry>;\n\n private readonly pFrames: PFramePool<TreeEntry>;\n private readonly pTableDefs: PTableDefPool;\n private readonly pTables: PTablePool<TreeEntry>;\n\n private readonly pTableCachePerFrame: PTableCachePerFrame;\n private readonly pTableCachePlain: PTableCachePlain;\n\n private readonly frameConcurrencyLimiter: ConcurrencyLimitingExecutor;\n private readonly tableConcurrencyLimiter: ConcurrencyLimitingExecutor;\n\n public async pprofDump(): Promise<Uint8Array> {\n return await PFrameFactory.pprofDump();\n }\n\n public async getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null> {\n return await this.remoteBlobProvider.getCacheMetrics();\n }\n\n public async resetCache(): Promise<void> {\n await this.remoteBlobProvider.resetCache();\n }\n\n public constructor({\n logger = () => {},\n localBlobProvider,\n remoteBlobProvider,\n spillPath = tmpdir(),\n options = AbstractPFrameDriverOpsDefaults,\n resolveDataInfo,\n }: {\n logger?: PFrameInternal.Logger;\n localBlobProvider: LocalBlobProvider<TreeEntry>;\n remoteBlobProvider: RemoteBlobProvider<TreeEntry>;\n spillPath?: string;\n options?: AbstractPFrameDriverOps;\n resolveDataInfo: DataInfoResolver<PColumnData, TreeEntry>;\n }) {\n this.logger = logger;\n\n this.localBlobProvider = localBlobProvider;\n this.remoteBlobProvider = remoteBlobProvider;\n\n this.resolveDataInfo = resolveDataInfo;\n\n this.frameConcurrencyLimiter = new ConcurrencyLimitingExecutor(options.pFrameConcurrency);\n this.tableConcurrencyLimiter = new ConcurrencyLimitingExecutor(options.pTableConcurrency);\n\n this.pFrames = new PFramePool(\n this.localBlobProvider,\n this.remoteBlobProvider,\n this.logger,\n spillPath,\n );\n this.pTableDefs = new PTableDefPool(this.logger);\n this.pTables = new PTablePool(this.pFrames, this.pTableDefs, this.logger);\n\n this.pTableCachePerFrame = new PTableCachePerFrame(this.logger, options);\n this.pTableCachePlain = new PTableCachePlain(this.logger, options);\n }\n\n async dispose(): Promise<void> {\n void (await Promise.allSettled([\n this.pTables[Symbol.asyncDispose](),\n this.pTableDefs[Symbol.asyncDispose](),\n this.pFrames[Symbol.asyncDispose](),\n this.localBlobProvider[Symbol.asyncDispose](),\n this.remoteBlobProvider[Symbol.asyncDispose](),\n ]));\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n return await this.dispose();\n }\n\n //\n // Internal / Config API Methods\n //\n\n public createPFrame(def: PFrameDef<PColumn<PColumnData>>): PoolEntry<PFrameHandle> {\n const ValueTypes = new Set(Object.values(ValueType));\n const supportedColumns = def\n .filter((column) => ValueTypes.has(column.spec.valueType))\n .map((c) => ({ ...c, spec: resolveAnnotationParents(c.spec) }));\n const uniqueColumns = uniqueBy(supportedColumns, (column) => column.id);\n const columns = uniqueColumns.map((c) =>\n mapPObjectData(c, (d) => this.resolveDataInfo(c.spec, d)),\n );\n\n return this.pFrames.acquire(columns);\n }\n\n public createPTable(rawDef: PTableDef<PColumn<PColumnData>>): PoolEntry<PTableHandle> {\n const columns = uniqueBy(extractAllColumns(rawDef.src), (c) => c.id);\n using pFrameGuard = new PoolEntryGuard(this.createPFrame(columns));\n const sortedDef = sortPTableDef(\n migrateTableFilter(\n mapPTableDef(rawDef, (c) => c.id),\n this.logger,\n ),\n );\n const pFrameSpec = this.pFrames.getByKey(pFrameGuard.key).pFrameSpec;\n using pTableGuard = new PoolEntryGuard(\n this.pTableDefs.acquireFromLegacy({\n pFrameHandle: pFrameGuard.key,\n def: sortedDef,\n pFrameSpec,\n }).entry,\n );\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Create PTable call (pFrameHandle = ${pFrameGuard.key}; pTableHandle = ${pTableGuard.key})`,\n );\n }\n\n const pFrameEntry = pFrameGuard.keep();\n const pTableEntry = pTableGuard.keep();\n const unref = () => {\n pTableEntry.unref();\n pFrameEntry.unref();\n };\n return {\n key: pTableEntry.key,\n resource: pTableEntry.resource,\n unref,\n [Symbol.dispose]: unref,\n };\n }\n\n public createPTableV2(def: PTableDefV2<PColumn<PColumnData>>): PoolEntry<PTableHandle> {\n const columns = uniqueBy(collectSpecQueryColumns(def.query), (c) => c.id);\n using pFrameGuard = new PoolEntryGuard(this.createPFrame(columns));\n const pFrameSpec = this.pFrames.getByKey(pFrameGuard.key).pFrameSpec;\n const sortedQuery = sortSpecQuery(mapSpecQueryColumns(def.query, (c) => c.id));\n const { tableSpec, dataQuery } = pFrameSpec.evaluateQuery(\n embedInlineColumnTypeSpecs(sortedQuery),\n );\n\n using pTableGuard = new PoolEntryGuard(\n this.pTableDefs.acquire({\n pFrameHandle: pFrameGuard.key,\n tableSpec,\n dataQuery,\n }),\n );\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Create PTable call (pFrameHandle = ${pFrameGuard.key}; pTableHandle = ${pTableGuard.key})`,\n );\n }\n\n const pFrameEntry = pFrameGuard.keep();\n const pTableEntry = pTableGuard.keep();\n const unref = () => {\n pTableEntry.unref();\n pFrameEntry.unref();\n };\n return {\n key: pTableEntry.key,\n resource: pTableEntry.resource,\n unref,\n [Symbol.dispose]: unref,\n };\n }\n\n public async writePTableToFs(\n handle: PTableHandle,\n options: WritePTableToFsOptions,\n ): Promise<WritePTableToFsResult> {\n this.logger(\n \"info\",\n `[WritePTableToFs] ENTER (handle = ${handle}, path = ${options.path}, format = ${options.format}, compression = ${options.compression ?? \"auto\"}, columns = ${options.columnIndices.length})`,\n );\n const startTime = performance.now();\n const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);\n using tableGuard = new PoolEntryGuard(this.pTables.acquire(def));\n const { pTablePromise, disposeSignal } = tableGuard.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any(\n [options.signal, disposeSignal].filter((s): s is AbortSignal => !isNil(s)),\n );\n\n // `combinedSignal` is passed twice on purpose: into the native calls for cooperative\n // cancellation, and into `run` so the concurrency slot is released on abort even if a\n // native call fails to unwind. Dropping the `run` signal reintroduces the queue wedge.\n // keep()/cache live outside the limiter task: on abort `run` rejects and they are\n // skipped, so an abandoned (detached) operation never caches its result nor touches\n // `tableGuard` after the `using` block has already unref'd it.\n const { result, overallSize } = await this.tableConcurrencyLimiter.run(async () => {\n const shape = await pTable.getShape({ signal: combinedSignal });\n const clippedRange = clipRange(options.range, shape);\n const specs = def.tableSpec;\n const separator = options.format === \"tsv\" ? \"\\t\" : \",\";\n\n const iterable = streamPTableRows({\n pTable,\n specs,\n columnIndices: options.columnIndices,\n range: clippedRange,\n chunkSize: options.chunkSize ?? 50_000,\n separator,\n includeHeader: options.includeHeader ?? true,\n bom: options.bom ?? true,\n signal: combinedSignal,\n });\n\n const miLogger: MiLogger = {\n info: (msg) => this.logger(\"info\", String(msg)),\n warn: (msg) => this.logger(\"warn\", String(msg)),\n error: (msg) => this.logger(\"error\", String(msg)),\n };\n\n let bytesWritten = 0;\n await createPathAtomically(miLogger, options.path, async (tempPath) => {\n const writeStream = fs.createWriteStream(tempPath, { flags: \"wx\" });\n const source = Readable.from(iterable, { objectMode: false });\n if (options.compression?.type === \"gzip\") {\n const gzip = zlib.createGzip({ level: options.compression.level ?? 6 });\n await pipeline(source, gzip, writeStream, { signal: combinedSignal });\n } else {\n await pipeline(source, writeStream, { signal: combinedSignal });\n }\n bytesWritten = writeStream.bytesWritten;\n });\n\n const overallSize = await tableGuard.resource.cacheSize;\n\n // rowsWritten equals the clipped range length — the generator streams the\n // entire effective range without early termination, so this is accurate.\n const rowsWritten = clippedRange.length;\n\n if (logPFrames()) {\n const durationMs = Math.round(performance.now() - startTime);\n this.logger(\n \"info\",\n `[WritePTableToFs] complete (handle = ${handle}, columns = ${options.columnIndices.length}, rows = ${rowsWritten}, bytes = ${bytesWritten}, duration = ${durationMs}ms)`,\n );\n }\n\n return { result: { path: options.path, rowsWritten, bytesWritten }, overallSize };\n }, combinedSignal);\n\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\n return result;\n }\n\n public async exportPTable(\n handle: PTableHandle,\n options: ExportPTableOptions,\n signal?: AbortSignal,\n ): Promise<void> {\n const { path, columnIndices } = options;\n\n this.logger(\"info\", `[ExportPTable] ENTER (handle = ${handle}, path = ${path})`);\n const startTime = performance.now();\n\n const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);\n using tableGuard = new PoolEntryGuard(this.pTables.acquire(def));\n const { pTablePromise, disposeSignal } = tableGuard.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any(\n [signal, disposeSignal].filter((s): s is AbortSignal => !isNil(s)),\n );\n\n const headers: [number, string][] = columnIndices.map((index): [number, string] => [\n index,\n columnLabel(def.tableSpec[index]),\n ]);\n\n // keep()/cache live outside the limiter task: on abort `run` rejects and they are\n // skipped, so an abandoned (detached) operation never caches its result nor touches\n // `tableGuard` after the `using` block has already unref'd it.\n const overallSize = await this.tableConcurrencyLimiter.run(async () => {\n // Cap data rows per xlsx sheet below Excel's hard limit of 1,048,576.\n if (path.toLowerCase().endsWith(\".xlsx\")) {\n const shape = await pTable.getShape({ signal: combinedSignal });\n if (shape.rows > XLSX_MAX_ROWS_PER_SHEET) {\n const error = new PFrameDriverError(`exportPTable failed`);\n error.cause = new Error(\n `xlsx export rejected: ${shape.rows} rows exceed the per-sheet ` +\n `limit of ${XLSX_MAX_ROWS_PER_SHEET} rows`,\n );\n throw error;\n }\n }\n\n await pTable.export(path, { headers, signal: combinedSignal });\n\n const overallSize = await tableGuard.resource.cacheSize;\n\n if (logPFrames()) {\n const durationMs = Math.round(performance.now() - startTime);\n this.logger(\n \"info\",\n `[ExportPTable] complete (handle = ${handle}, path = ${path}), ` +\n `duration = ${durationMs}ms`,\n );\n }\n\n return overallSize;\n }, combinedSignal);\n\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\n }\n\n //\n // PFrame instance methods\n //\n\n public async findColumns(\n handle: PFrameHandle,\n request: FindColumnsRequest,\n ): Promise<FindColumnsResponse> {\n const iRequest: PFrameInternal.FindColumnsRequest = {\n ...request,\n compatibleWith:\n request.compatibleWith.length !== 0\n ? [\n {\n axesSpec: [\n ...new Map(\n request.compatibleWith.map((item) => [canonicalizeJson(item), item] as const),\n ).values(),\n ],\n qualifications: [],\n },\n ]\n : [],\n };\n\n const { pFrameSpec } = this.pFrames.getByKey(handle);\n const response = pFrameSpec.findColumns(iRequest);\n return {\n hits: response.hits\n .filter(\n (h) =>\n // only exactly matching columns\n h.mappingVariants.length === 0 ||\n h.mappingVariants.some(\n (v) =>\n v.qualifications.forHit.length === 0 &&\n v.qualifications.forQueries.every((q) => q.length === 0),\n ),\n )\n .map((h) => h.hit),\n };\n }\n\n public async getColumnSpec(\n handle: PFrameHandle,\n columnId: PObjectId,\n ): Promise<PColumnSpec | null> {\n const { columnSpecs } = this.pFrames.getByKey(handle);\n return columnSpecs[columnId] ?? null;\n }\n\n public async listColumns(handle: PFrameHandle): Promise<PColumnIdAndSpec[]> {\n const { pFrameSpec } = this.pFrames.getByKey(handle);\n return pFrameSpec.listColumns().map(({ columnId, spec }) => ({ columnId, spec }));\n }\n\n public async calculateTableData(\n handle: PFrameHandle,\n request: CalculateTableDataRequest<PObjectId>,\n range: TableRange | undefined,\n signal?: AbortSignal,\n ): Promise<CalculateTableDataResponse> {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Call calculateTableData, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,\n );\n }\n\n const { pFrameSpec } = this.pFrames.getByKey(handle);\n const sortedDef = sortPTableDef(migrateTableFilter(request, this.logger));\n const { def, entry } = this.pTables.acquireFromLegacy({\n pFrameHandle: handle,\n def: sortedDef,\n pFrameSpec,\n });\n using tableGuard = new PoolEntryGuard(entry);\n const tableSpec = def.tableSpec;\n const { pTablePromise, disposeSignal } = tableGuard.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n // keep()/cache live outside the limiter task: on abort `run` rejects and they are\n // skipped, so an abandoned (detached) operation never caches its result nor touches\n // `tableGuard` after the `using` block has already unref'd it.\n const { data, overallSize } = await this.frameConcurrencyLimiter.run(async () => {\n // TODO: throw error when more then 200k rows is requested\n // after pf-plots migration to stream API\n\n const data = await pTable.getData([...tableSpec.keys()], {\n range,\n signal: combinedSignal,\n });\n\n const overallSize = await tableGuard.resource.cacheSize;\n return { data, overallSize };\n }, combinedSignal);\n\n this.pTableCachePerFrame.cache(tableGuard.keep(), overallSize);\n return tableSpec.map((spec, i) => ({\n spec: spec,\n data: data[i],\n }));\n }\n\n public async getUniqueValues(\n handle: PFrameHandle,\n request: UniqueValuesRequest,\n signal?: AbortSignal,\n ): Promise<UniqueValuesResponse> {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `Call getUniqueValues, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,\n );\n }\n\n const { pFrameDataPromise, columnSpecs, disposeSignal } = this.pFrames.getByKey(handle);\n const pFrameData = await pFrameDataPromise;\n\n const columnSpec = columnSpecs[request.columnId];\n if (!columnSpec) {\n const error = new PFrameDriverError(`getUniqueValues failed`);\n error.cause = new Error(`column ${request.columnId} is not registered in the PFrame`);\n throw error;\n }\n\n const axisIds = expandAxes(columnSpec.axesSpec);\n const tableSpec: PTableColumnSpec[] = [\n ...columnSpec.axesSpec.map(\n (axisSpec, i): PTableColumnSpec => ({\n type: \"axis\",\n id: axisIds[i],\n spec: axisSpec,\n }),\n ),\n { type: \"column\", id: request.columnId, spec: columnSpec },\n ];\n\n let axisIndex: number | undefined;\n if (request.axis !== undefined) {\n const index = findTableColumn(tableSpec, { type: \"axis\", id: request.axis });\n if (index < 0) {\n const error = new PFrameDriverError(`getUniqueValues failed`);\n error.cause = new Error(\n `axis ${JSON.stringify(request.axis)} not found among axes of column ${request.columnId}`,\n );\n throw error;\n }\n axisIndex = index;\n }\n\n const resolvedRequest: PFrameInternal.UniqueValuesRequestV2 = {\n columnId: request.columnId,\n axisIndex,\n filters: rewriteLegacyFilters({\n tableSpec,\n filters: migrateFilters(request.filters, this.logger),\n }),\n limit: request.limit,\n };\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n return await this.frameConcurrencyLimiter.run(async () => {\n return await pFrameData.getUniqueValues(resolvedRequest, { signal: combinedSignal });\n }, combinedSignal);\n }\n\n //\n // PTable instance methods\n //\n\n public async getSpec(handle: PTableHandle): Promise<PTableColumnSpec[]> {\n const { def } = this.pTableDefs.getByKey(handle);\n return def.tableSpec;\n }\n\n public async getShape(handle: PTableHandle, signal?: AbortSignal): Promise<PTableShape> {\n const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);\n using tableGuard = new PoolEntryGuard(this.pTables.acquire(def));\n\n const { pTablePromise, disposeSignal } = tableGuard.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n const { shape, overallSize } = await this.tableConcurrencyLimiter.run(async () => {\n const shape = await pTable.getShape({\n signal: combinedSignal,\n });\n\n const overallSize = await tableGuard.resource.cacheSize;\n\n return { shape, overallSize };\n }, combinedSignal);\n\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\n return shape;\n }\n\n public async getData(\n handle: PTableHandle,\n columnIndices: number[],\n range: TableRange | undefined,\n signal?: AbortSignal,\n ): Promise<PTableVector[]> {\n const { def, disposeSignal: defDisposeSignal } = this.pTableDefs.getByKey(handle);\n using tableGuard = new PoolEntryGuard(this.pTables.acquire(def));\n\n const { pTablePromise, disposeSignal } = tableGuard.resource;\n const pTable = await pTablePromise;\n\n const combinedSignal = AbortSignal.any([signal, disposeSignal].filter((s) => !!s));\n const { data, overallSize } = await this.tableConcurrencyLimiter.run(async () => {\n const data = await pTable.getData(columnIndices, {\n range,\n signal: combinedSignal,\n });\n\n const overallSize = await tableGuard.resource.cacheSize;\n\n return { data, overallSize };\n }, combinedSignal);\n\n this.pTableCachePlain.cache(tableGuard.keep(), overallSize, defDisposeSignal);\n return data;\n }\n}\n\n/** Clamp range to table shape. When range is undefined, returns full table range. */\nfunction clipRange(range: undefined | TableRange, shape: PTableShape): TableRange {\n if (isNil(range)) {\n return { offset: 0, length: shape.rows };\n }\n const clampedOffset = Math.min(range.offset, shape.rows);\n const clampedLength = Math.min(range.length, shape.rows - clampedOffset);\n return { offset: clampedOffset, length: clampedLength };\n}\n\nfunction migrateFilters(\n filters: PTableRecordFilter[],\n logger: PFrameInternal.Logger,\n): PTableRecordFilter[] {\n const filtersV1 = [];\n const filtersV2: PTableRecordSingleValueFilterV2[] = [];\n for (const filter of filters) {\n if ((filter.type as unknown) === \"bySingleColumn\") {\n filtersV1.push(filter);\n filtersV2.push({\n ...filter,\n type: \"bySingleColumnV2\",\n });\n } else {\n filtersV2.push(filter);\n }\n }\n if (filtersV1.length > 0) {\n const filtersV1Json = JSON.stringify(filtersV1);\n logger(\n \"warn\",\n `type overwritten from 'bySingleColumn' to 'bySingleColumnV2' for filters: ${filtersV1Json}`,\n );\n }\n return filtersV2;\n}\n\nfunction migrateTableFilter<T>(\n def: Omit<PTableDef<T>, \"partitionFilters\"> | PTableDef<T>,\n logger: PFrameInternal.Logger,\n): PTableDef<T> {\n if (!(\"partitionFilters\" in def)) {\n // For old blocks assume all axes filters to be partition filters\n return {\n ...def,\n partitionFilters: migrateFilters(\n def.filters.filter((f) => f.column.type === \"axis\"),\n logger,\n ),\n filters: migrateFilters(\n def.filters.filter((f) => f.column.type === \"column\"),\n logger,\n ),\n };\n }\n return {\n ...def,\n partitionFilters: migrateFilters(def.partitionFilters, logger),\n filters: migrateFilters(def.filters, logger),\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"driver_impl.d.ts","names":[],"sources":["../src/driver_impl.ts"],"mappings":"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"}
1
+ {"version":3,"file":"driver_impl.d.ts","names":[],"sources":["../src/driver_impl.ts"],"mappings":"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"}
@@ -6,7 +6,7 @@ import { PTableDefPool } from "./ptable_def_pool.js";
6
6
  import { PTablePool } from "./ptable_pool.js";
7
7
  import { PTableCachePerFrame, PTableCachePerFrameOpsDefaults } from "./ptable_cache_per_frame.js";
8
8
  import { PTableCachePlain, PTableCachePlainOpsDefaults } from "./ptable_cache_plain.js";
9
- import { _usingCtx } from "./_virtual/_@oxc-project_runtime@0.123.0/helpers/usingCtx.js";
9
+ import _usingCtx from "./_virtual/_@oxc-project_runtime@0.137.0/helpers/esm/usingCtx.js";
10
10
  import { PFrameDriverError, ValueType, XLSX_MAX_ROWS_PER_SHEET, bigintReplacer, canonicalizeJson, collectSpecQueryColumns, extractAllColumns, mapPObjectData, mapPTableDef, mapSpecQueryColumns, resolveAnnotationParents, sortPTableDef, sortSpecQuery, uniqueBy } from "@milaboratories/pl-model-common";
11
11
  import { ConcurrencyLimitingExecutor, createPathAtomically } from "@milaboratories/ts-helpers";
12
12
  import { PoolEntryGuard, isNil } from "@milaboratories/helpers";