@platforma-sdk/ui-vue 1.42.3 → 1.42.5

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 (45) hide show
  1. package/.turbo/turbo-build.log +16 -16
  2. package/.turbo/turbo-type-check.log +1 -1
  3. package/CHANGELOG.md +15 -0
  4. package/dist/aggrid.js +4 -4
  5. package/dist/components/PlAgDataTable/PlAgDataTableSheets.vue2.js +7 -7
  6. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js +13 -13
  7. package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts.map +1 -1
  8. package/dist/components/PlAgDataTable/sources/table-source-v2.js +88 -85
  9. package/dist/components/PlAgDataTable/sources/table-source-v2.js.map +1 -1
  10. package/dist/components/PlAgDataTable/sources/table-state-v2.js +6 -6
  11. package/dist/components/PlAnnotations/components/DynamicForm.vue2.js +10 -10
  12. package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js +2 -2
  13. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.d.ts.map +1 -1
  14. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue2.js +37 -29
  15. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue2.js.map +1 -1
  16. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue3.js +18 -14
  17. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue3.js.map +1 -1
  18. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.d.ts.map +1 -1
  19. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js +100 -98
  20. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js.map +1 -1
  21. package/dist/components/PlMultiSequenceAlignment/data.d.ts +1 -1
  22. package/dist/components/PlMultiSequenceAlignment/data.js +41 -41
  23. package/dist/components/PlMultiSequenceAlignment/data.js.map +1 -1
  24. package/dist/components/PlTableFilters/filters-state.js +2 -2
  25. package/dist/defineApp.js +16 -16
  26. package/dist/internal/createAppV2.js +9 -9
  27. package/dist/lib/model/common/dist/index.js +329 -317
  28. package/dist/lib/model/common/dist/index.js.map +1 -1
  29. package/dist/lib/ui/uikit/dist/components/PlAccordion/{ExpandTransition.vue2.js → ExpandTransition.vue.js} +1 -1
  30. package/dist/lib/ui/uikit/dist/components/PlAccordion/ExpandTransition.vue.js.map +1 -0
  31. package/dist/lib/ui/uikit/dist/components/PlAccordion/PlAccordionSection.vue2.js +1 -1
  32. package/dist/lib/ui/uikit/dist/components/PlFileInput/PlFileInput.vue.js +16 -16
  33. package/dist/lib/ui/uikit/dist/components/PlFileInput/PlFileInput.vue.js.map +1 -1
  34. package/dist/lib/ui/uikit/dist/lib/model/common/dist/index.js +8 -8
  35. package/dist/lib/ui/uikit/dist/lib/model/common/dist/index.js.map +1 -1
  36. package/dist/lib/ui/uikit/dist/sdk/model/dist/index.js +18 -18
  37. package/dist/lib/ui/uikit/dist/sdk/model/dist/index.js.map +1 -1
  38. package/dist/sdk/model/dist/index.js +198 -206
  39. package/dist/sdk/model/dist/index.js.map +1 -1
  40. package/package.json +5 -5
  41. package/src/components/PlAgDataTable/sources/table-source-v2.ts +9 -6
  42. package/src/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue +65 -18
  43. package/src/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue +16 -11
  44. package/src/components/PlMultiSequenceAlignment/data.ts +10 -10
  45. package/dist/lib/ui/uikit/dist/components/PlAccordion/ExpandTransition.vue2.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../model/src/config/actions.ts","../../../../../model/src/internal.ts","../../../../../model/src/render/future.ts","../../../../../model/src/render/accessor.ts","../../../../../model/src/render/internal.ts","../../../../../model/src/render/util/label.ts","../../../../../model/src/render/util/pcolumn_data.ts","../../../../../model/src/render/util/axis_filtering.ts","../../../../../model/src/render/util/column_collection.ts","../../../../../model/src/render/util/pframe_upgraders.ts","../../../../../model/src/render/api.ts","../../../../../model/src/version.ts","../../../../../model/src/bconfig/types.ts","../../../../../model/src/bconfig/normalization.ts","../../../../../model/src/builder.ts","../../../../../model/src/components/PlDataTable.ts","../../../../../model/src/components/PFrameForGraphs.ts","../../../../../model/src/components/PlMultiSequenceAlignment.ts","../../../../../model/src/components/PlSelectionModel.ts","../../../../../model/src/components/PlAnnotations/filters_ui.ts","../../../../../model/src/raw_globals.ts","../../../../../model/src/env_value.ts"],"sourcesContent":["import type {\n ActGetField,\n ActGetFromCtx,\n ActGetImmediate,\n ActGetResourceField,\n ActGetResourceValueAsJson,\n ActMakeObject,\n ActMapRecordValues,\n ActMapResourceFields,\n ActMapArrayValues,\n ActIsEmpty,\n ActNot,\n ActIsolate,\n ActGetBlobContentAsJson,\n ActGetBlobContentAsString,\n ActGetBlobContent,\n ActAnd,\n ActOr,\n ActMakeArray,\n ActFlatten,\n ActGetDownloadedBlobContent,\n ActGetOnDemandBlobContent,\n ActImportProgress,\n ActGetLastLogs,\n ActGetProgressLog,\n ActGetProgressLogWithInfo,\n ActGetLogHandle,\n ActExtractArchiveAndGetURL,\n} from './actions_kinds';\nimport type { ExtractAction, POCExtractAction, PrimitiveOrConfig, TypedConfig } from './type_engine';\nimport type { Cfg } from './model';\nimport type { CheckedSyncConf } from './type_util';\nimport type { ArchiveFormat, RangeBytes } from '@milaboratories/pl-model-common';\n\n//\n// Helpers\n//\n\nfunction primitiveToConfig(value: PrimitiveOrConfig): TypedConfig {\n if (\n typeof value === 'string'\n || typeof value === 'number'\n || typeof value === 'boolean'\n || value === null\n )\n return getImmediate(value);\n else return value as TypedConfig;\n}\n\n//\n// Context\n//\n\nexport function getFromCfg<const V extends string>(variable: V): TypedConfig<ActGetFromCtx<V>> {\n return { type: 'GetFromCtx', variable } as Cfg as any;\n}\n\n//\n// Isolate\n//\n\nexport function isolate<const Config extends TypedConfig>(\n cfg: Config,\n): TypedConfig<ActIsolate<ExtractAction<Config>>> {\n return {\n type: 'Isolate',\n cfg,\n } as Cfg as any;\n}\n\n//\n// Well-known Context Vars\n//\n\nexport const Args = getFromCfg('$args');\nexport const It = getFromCfg('$it');\nexport const MainOutputs = getFromCfg('$prod');\nexport const StagingOutputs = getFromCfg('$staging');\nexport const UiState = getFromCfg('$ui');\n\n//\n// Json\n//\n\nexport function getImmediate<const T>(value: T): TypedConfig<ActGetImmediate<T>> {\n return { type: 'Immediate', value } as Cfg as any;\n}\n\nexport function makeObject<const T extends Record<string, PrimitiveOrConfig>>(\n template: T,\n): TypedConfig<ActMakeObject<{ [Key in keyof T]: POCExtractAction<T[Key]> }>> {\n const normalizedTemplate: Record<string, TypedConfig> = {};\n for (const [k, cfg] of Object.entries(template)) normalizedTemplate[k] = primitiveToConfig(cfg);\n return {\n type: 'MakeObject',\n template: normalizedTemplate,\n } as Cfg as any;\n}\n\nexport function makeArray<const T extends PrimitiveOrConfig[]>(\n ...template: T\n): TypedConfig<ActMakeArray<{ [Key in keyof T]: POCExtractAction<T[Key]> }>> {\n const normalizedTemplate: TypedConfig[] = [];\n for (const cfg of template) normalizedTemplate.push(primitiveToConfig(cfg));\n return {\n type: 'MakeArray',\n template: normalizedTemplate,\n } as Cfg as any;\n}\n\nexport function getJsonField<\n const Source extends PrimitiveOrConfig,\n const Field extends PrimitiveOrConfig,\n>(\n source: Source,\n field: Field,\n): TypedConfig<ActGetField<POCExtractAction<Source>, POCExtractAction<Field>>> {\n return {\n type: 'GetJsonField',\n source: primitiveToConfig(source),\n field: primitiveToConfig(field),\n } as Cfg as any;\n}\n\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n>(\n source: Source & CheckedSyncConf<Source>,\n mapping: Mapping\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n>(\n source: Source,\n mapping: Mapping & CheckedSyncConf<Mapping>\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string,\n>(\n source: Source & CheckedSyncConf<Source>,\n mapping: Mapping,\n itVar: ItVar\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string,\n>(\n source: Source,\n mapping: Mapping & CheckedSyncConf<Mapping>,\n itVar: ItVar\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string,\n>(\n source: Source,\n mapping: Mapping,\n itVar: ItVar = '$it' as ItVar,\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>> {\n return {\n type: 'MapRecordValues',\n source,\n mapping,\n itVar,\n } as Cfg as any;\n}\n\nexport function mapArrayValues<const Source extends TypedConfig, const Mapping extends TypedConfig>(\n source: Source & CheckedSyncConf<Source>,\n mapping: Mapping\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapArrayValues<const Source extends TypedConfig, const Mapping extends TypedConfig>(\n source: Source,\n mapping: Mapping & CheckedSyncConf<Mapping>\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapArrayValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string,\n>(\n source: Source & CheckedSyncConf<Source>,\n mapping: Mapping,\n itVar: ItVar\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapArrayValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string,\n>(\n source: Source,\n mapping: Mapping & CheckedSyncConf<Mapping>,\n itVar: ItVar\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapArrayValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string,\n>(\n source: Source,\n mapping: Mapping,\n itVar: ItVar = '$it' as ItVar,\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>> {\n return {\n type: 'MapArrayValues',\n source,\n mapping,\n itVar,\n } as Cfg as any;\n}\n\nexport function flatten<const Source extends TypedConfig>(\n source: Source,\n): TypedConfig<ActFlatten<ExtractAction<Source>>> {\n return {\n type: 'Flatten',\n source,\n } as Cfg as any;\n}\n\n//\n// Boolean\n//\n\nexport function isEmpty<const Arg extends TypedConfig>(\n arg: Arg,\n): TypedConfig<ActIsEmpty<ExtractAction<Arg>>> {\n return {\n type: 'IsEmpty',\n arg,\n } as Cfg as any;\n}\n\nexport function not<const Operand extends TypedConfig>(\n operand: Operand,\n): TypedConfig<ActNot<ExtractAction<Operand>>> {\n return {\n type: 'Not',\n operand,\n } as Cfg as any;\n}\n\nexport function and<const Operand1 extends TypedConfig, const Operand2 extends TypedConfig>(\n operand1: Operand1,\n operand2: Operand2,\n): TypedConfig<ActAnd<ExtractAction<Operand1>, ExtractAction<Operand2>>> {\n return {\n type: 'And',\n operand1,\n operand2,\n } as Cfg as any;\n}\n\nexport function or<const Operand1 extends TypedConfig, const Operand2 extends TypedConfig>(\n operand1: Operand1,\n operand2: Operand2,\n): TypedConfig<ActOr<ExtractAction<Operand1>, ExtractAction<Operand2>>> {\n return {\n type: 'Or',\n operand1,\n operand2,\n } as Cfg as any;\n}\n\n//\n// Resources\n//\n\nexport function getResourceField<\n const Source extends PrimitiveOrConfig,\n const Field extends PrimitiveOrConfig,\n>(\n source: Source,\n field: Field,\n): TypedConfig<ActGetResourceField<POCExtractAction<Source>, POCExtractAction<Field>>> {\n return {\n type: 'GetResourceField',\n source: primitiveToConfig(source),\n field: primitiveToConfig(field),\n } as Cfg as any;\n}\n\nexport function getResourceValueAsJson<T>() {\n return function <const Source extends PrimitiveOrConfig>(\n source: Source,\n ): TypedConfig<ActGetResourceValueAsJson<POCExtractAction<Source>, T>> {\n return {\n type: 'GetResourceValueAsJson',\n source: primitiveToConfig(source),\n } as Cfg as any;\n };\n}\n\nexport function mapResourceFields<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n>(\n source: Source,\n mapping: Mapping\n): TypedConfig<ActMapResourceFields<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapResourceFields<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string,\n>(\n source: Source,\n mapping: Mapping,\n itVar: ItVar\n): TypedConfig<ActMapResourceFields<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapResourceFields<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string,\n>(\n source: Source,\n mapping: Mapping,\n itVar: ItVar = '$it' as ItVar,\n): TypedConfig<ActMapResourceFields<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>> {\n return {\n type: 'MapResourceFields',\n source,\n mapping,\n itVar,\n } as Cfg as TypedConfig<\n ActMapResourceFields<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>\n >;\n}\n\n//\n// Download Blobs\n//\n\nexport function getBlobContent<const Source extends TypedConfig>(\n source: Source,\n range?: RangeBytes,\n): TypedConfig<ActGetBlobContent<ExtractAction<Source>>> {\n return {\n type: 'GetBlobContent',\n range,\n source: primitiveToConfig(source),\n } as Cfg as any;\n}\n\nexport function getBlobContentAsString<const Source extends TypedConfig>(\n source: Source,\n range?: RangeBytes,\n): TypedConfig<ActGetBlobContentAsString<ExtractAction<Source>>> {\n return {\n type: 'GetBlobContentAsString',\n range,\n source: primitiveToConfig(source),\n } as Cfg as any;\n}\n\nexport function getBlobContentAsJson<T>() {\n return function <const Source extends TypedConfig>(\n source: Source,\n range?: RangeBytes,\n ): TypedConfig<ActGetBlobContentAsJson<ExtractAction<Source>, T>> {\n return {\n type: 'GetBlobContentAsJson',\n range,\n source: primitiveToConfig(source),\n } as Cfg as any;\n };\n}\n\nexport function getDownloadedBlobContent<const Source extends TypedConfig>(\n source: Source,\n): TypedConfig<ActGetDownloadedBlobContent<ExtractAction<Source>>> {\n return {\n type: 'GetDownloadedBlobContent',\n source: primitiveToConfig(source),\n } as Cfg as any;\n}\n\nexport function getOnDemandBlobContent<const Source extends TypedConfig>(\n source: Source,\n): TypedConfig<ActGetOnDemandBlobContent<ExtractAction<Source>>> {\n return {\n type: 'GetOnDemandBlobContent',\n source: primitiveToConfig(source),\n } as Cfg as any;\n}\n\n//\n// Download Blobs to URLs\n//\n\nexport function extractArchiveAndGetURL<const Source extends TypedConfig>(\n source: Source,\n format: ArchiveFormat,\n): TypedConfig<ActExtractArchiveAndGetURL<ExtractAction<Source>>> {\n return {\n type: 'ExtractArchiveAndGetURL',\n format,\n source: primitiveToConfig(source),\n } as Cfg as any;\n}\n\n//\n// Upload Blobs\n//\n\nexport function getImportProgress<const Source extends TypedConfig>(\n source: Source,\n): TypedConfig<ActImportProgress<ExtractAction<Source>>> {\n return {\n type: 'GetImportProgress',\n source: primitiveToConfig(source),\n } as Cfg as any;\n}\n\n//\n// Logs\n//\n\nexport function getLastLogs<const Source extends TypedConfig>(\n source: Source,\n lines: number,\n): TypedConfig<ActGetLastLogs<ExtractAction<Source>>> {\n return {\n type: 'GetLastLogs',\n source: primitiveToConfig(source),\n lines,\n } as Cfg as any;\n}\n\nexport function getProgressLog<const Source extends TypedConfig>(\n source: Source,\n patternToSearch: string,\n): TypedConfig<ActGetProgressLog<ExtractAction<Source>>> {\n return {\n type: 'GetProgressLog',\n source: primitiveToConfig(source),\n patternToSearch,\n } as Cfg as any;\n}\n\nexport function getProgressLogWithInfo<const Source extends TypedConfig>(\n source: Source,\n patternToSearch: string,\n): TypedConfig<ActGetProgressLogWithInfo<ExtractAction<Source>>> {\n return {\n type: 'GetProgressLogWithInfo',\n source: primitiveToConfig(source),\n patternToSearch,\n } as Cfg as any;\n}\n\nexport function getLogHandle<const Source extends TypedConfig>(\n source: Source,\n): TypedConfig<ActGetLogHandle<ExtractAction<Source>>> {\n return {\n type: 'GetLogHandle',\n source: primitiveToConfig(source),\n } as Cfg as any;\n}\n","import type { ValueOrErrors } from '@milaboratories/pl-model-common';\nimport {} from './global';\nimport type { Platforma, PlatformaApiVersion } from './platforma';\nimport type { FutureHandle, GlobalCfgRenderCtx } from './render/internal';\n\n/** Utility code helping to identify whether the code is running in actual UI environment */\nexport function isInUI() {\n return (\n typeof globalThis.getPlatforma !== 'undefined' || typeof globalThis.platforma !== 'undefined'\n );\n}\n\n/** Utility code helping to retrieve a platforma instance form the environment */\nexport function getPlatformaInstance<\n Args = unknown,\n Outputs extends Record<string, ValueOrErrors<unknown>> = Record<string, ValueOrErrors<unknown>>,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n>(config?: { sdkVersion: string; apiVersion: PlatformaApiVersion }): Platforma<Args, Outputs, UiState, Href> {\n if (config && typeof globalThis.getPlatforma === 'function')\n return globalThis.getPlatforma(config);\n else if (typeof globalThis.platforma !== 'undefined') return globalThis.platforma;\n else throw new Error('Can\\'t get platforma instance.');\n}\n\nexport function tryGetCfgRenderCtx(): GlobalCfgRenderCtx | undefined {\n if (typeof globalThis.cfgRenderCtx !== 'undefined') return globalThis.cfgRenderCtx;\n else return undefined;\n}\n\nexport function getCfgRenderCtx(): GlobalCfgRenderCtx {\n if (typeof globalThis.cfgRenderCtx !== 'undefined') return globalThis.cfgRenderCtx;\n else throw new Error('Not in config rendering context');\n}\n\nexport function tryRegisterCallback(key: string, callback: (...args: any[]) => any): boolean {\n const ctx = tryGetCfgRenderCtx();\n if (ctx === undefined) return false;\n if (key in ctx.callbackRegistry) throw new Error(`Callback with key ${key} already registered.`);\n ctx.callbackRegistry[key] = callback;\n return true;\n}\n\nconst futureResolves = new Map<string, ((value: unknown) => void)[]>();\n\nexport function registerFutureAwait(handle: FutureHandle, onResolve: (value: unknown) => void) {\n if (!(handle in getCfgRenderCtx().callbackRegistry)) {\n getCfgRenderCtx().callbackRegistry[handle] = (value: unknown) => {\n for (const res of futureResolves.get(handle)!) {\n res(value);\n }\n };\n futureResolves.set(handle, []);\n }\n futureResolves.get(handle)!.push(onResolve);\n}\n","import type { FutureAwait, FutureHandle } from './internal';\nimport { registerFutureAwait } from '../internal';\n\nexport class FutureRef<T = unknown> {\n private isResolved = false;\n private resolvedValue?: T;\n\n constructor(\n private readonly handle: FutureHandle,\n private readonly postProcess: (value: unknown) => T = (v) => v as T,\n ) {\n registerFutureAwait(handle, (value) => {\n this.resolvedValue = postProcess(value);\n this.isResolved = true;\n });\n }\n\n public map<R>(mapping: (v: T) => R): FutureRef<R> {\n return new FutureRef<R>(this.handle, (v) => mapping(this.postProcess(v)));\n }\n\n public mapDefined<R>(mapping: (v: NonNullable<T>) => R): FutureRef<R | undefined> {\n return new FutureRef<R | undefined>(this.handle, (v) => {\n const vv = this.postProcess(v);\n return vv ? mapping(vv) : undefined;\n });\n }\n\n toJSON() {\n return this.isResolved\n ? this.resolvedValue\n : ({ __awaited_futures__: [this.handle] } as FutureAwait);\n }\n}\n\nexport type ExtractFutureRefType<Ref extends FutureRef> =\n Ref extends FutureRef<infer T> ? T : never;\n","import type {\n AnyLogHandle,\n ImportProgress,\n LocalBlobHandleAndSize,\n PColumn,\n PObject,\n RemoteBlobHandleAndSize,\n FolderURL,\n ArchiveFormat,\n ProgressLogWithInfo,\n RangeBytes,\n} from '@milaboratories/pl-model-common';\nimport {\n isPColumn,\n mapPObjectData,\n} from '@milaboratories/pl-model-common';\nimport { getCfgRenderCtx } from '../internal';\nimport { FutureRef } from './future';\nimport type { AccessorHandle } from './internal';\nimport type { CommonFieldTraverseOps, FieldTraversalStep, ResourceType } from './traversal_ops';\n\nexport function ifDef<T, R>(value: T | undefined, cb: (value: T) => R): R | undefined {\n return value === undefined ? undefined : cb(value);\n}\n\ntype FieldMapOps = {\n /**\n * Type of fields to iterate over.\n * (default 'Input')\n * */\n readonly fieldType?: 'Input' | 'Output' | 'Dynamic';\n /**\n * If not locked, `undefined` value will be returned. Do nothing if mapping `Dynamic` fields.\n * (default true)\n * */\n readonly requireLocked?: boolean;\n /**\n * Will skip unresolved fields.\n * (default false)\n * */\n readonly skipUnresolved?: boolean;\n};\n\n/** Represent resource tree node accessor */\nexport class TreeNodeAccessor {\n constructor(\n public readonly handle: AccessorHandle,\n public readonly resolvePath: string[],\n ) {}\n\n /** Shortcut for {@link resolveInput} */\n public resolve(\n ...steps: [\n Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {\n errorIfFieldNotAssigned: true;\n },\n ]\n ): TreeNodeAccessor;\n /** Shortcut for {@link resolveInput} */\n public resolve(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;\n public resolve(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {\n const transformedSteps = steps.map(\n (s) =>\n ({\n assertFieldType: 'Input',\n ...(typeof s === 'string' ? { field: s } : s),\n }) satisfies FieldTraversalStep,\n );\n return this.resolveWithCommon({}, ...transformedSteps);\n }\n\n /** If field type assertion is not specified for the step, default is Output. */\n public resolveOutput(\n ...steps: [\n Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {\n errorIfFieldNotAssigned: true;\n },\n ]\n ): TreeNodeAccessor;\n /** If field type assertion is not specified for the step, default is Output. */\n public resolveOutput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;\n public resolveOutput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {\n const transformedSteps = steps.map(\n (s) =>\n ({\n assertFieldType: 'Output',\n ...(typeof s === 'string' ? { field: s } : s),\n }) satisfies FieldTraversalStep,\n );\n return this.resolveWithCommon({}, ...transformedSteps);\n }\n\n /** If field type assertion is not specified for the step, default is Input. */\n public resolveInput(\n ...steps: [\n Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {\n errorIfFieldNotAssigned: true;\n },\n ]\n ): TreeNodeAccessor;\n /** If field type assertion is not specified for the step, default is Input. */\n public resolveInput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;\n public resolveInput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {\n const transformedSteps = steps.map(\n (s) =>\n ({\n assertFieldType: 'Input',\n ...(typeof s === 'string' ? { field: s } : s),\n }) satisfies FieldTraversalStep,\n );\n return this.resolveWithCommon({}, ...transformedSteps);\n }\n\n public resolveAny(\n ...steps: [\n Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {\n errorIfFieldNotAssigned: true;\n },\n ]\n ): TreeNodeAccessor;\n public resolveAny(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;\n public resolveAny(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {\n return this.resolveWithCommon({}, ...steps);\n }\n\n public resolveWithCommon(\n commonOptions: CommonFieldTraverseOps,\n ...steps: (FieldTraversalStep | string)[]\n ): TreeNodeAccessor | undefined {\n const resolvePath = [\n ...this.resolvePath,\n ...steps.map((step) => typeof step === 'string' ? step : step.field),\n ];\n return ifDef(\n getCfgRenderCtx().resolveWithCommon(this.handle, commonOptions, ...steps),\n (accessor) => new TreeNodeAccessor(accessor, resolvePath),\n );\n }\n\n public get resourceType(): ResourceType {\n return getCfgRenderCtx().getResourceType(this.handle);\n }\n\n public getInputsLocked(): boolean {\n return getCfgRenderCtx().getInputsLocked(this.handle);\n }\n\n public getOutputsLocked(): boolean {\n return getCfgRenderCtx().getOutputsLocked(this.handle);\n }\n\n public getIsReadyOrError(): boolean {\n return getCfgRenderCtx().getIsReadyOrError(this.handle);\n }\n\n public getIsFinal(): boolean {\n return getCfgRenderCtx().getIsFinal(this.handle);\n }\n\n public getError(): TreeNodeAccessor | undefined {\n const resolvePath = [...this.resolvePath, 'error'];\n return ifDef(\n getCfgRenderCtx().getError(this.handle),\n (accsessor) => new TreeNodeAccessor(accsessor, resolvePath),\n );\n }\n\n public listInputFields(): string[] {\n return getCfgRenderCtx().listInputFields(this.handle);\n }\n\n public listOutputFields(): string[] {\n return getCfgRenderCtx().listOutputFields(this.handle);\n }\n\n public listDynamicFields(): string[] {\n return getCfgRenderCtx().listDynamicFields(this.handle);\n }\n\n public getKeyValueBase64(key: string): string | undefined {\n return getCfgRenderCtx().getKeyValueBase64(this.handle, key);\n }\n\n public getKeyValueAsString(key: string): string | undefined {\n return getCfgRenderCtx().getKeyValueAsString(this.handle, key);\n }\n\n public getKeyValueAsJson<T>(key: string): T {\n const content = this.getKeyValueAsString(key);\n if (content == undefined) throw new Error('Resource has no content.');\n return JSON.parse(content);\n }\n\n public getDataBase64(): string | undefined {\n return getCfgRenderCtx().getDataBase64(this.handle);\n }\n\n public getDataAsString(): string | undefined {\n return getCfgRenderCtx().getDataAsString(this.handle);\n }\n\n public getDataAsJson<T>(): T {\n const content = this.getDataAsString();\n if (content == undefined) throw new Error('Resource has no content.');\n return JSON.parse(content);\n }\n\n /**\n *\n */\n public getPColumns(\n errorOnUnknownField: boolean = false,\n prefix: string = '',\n ): PColumn<TreeNodeAccessor>[] | undefined {\n const result = this.parsePObjectCollection(errorOnUnknownField, prefix);\n if (result === undefined) return undefined;\n\n const pf = Object.entries(result).map(([, obj]) => {\n if (!isPColumn(obj)) throw new Error(`not a PColumn (kind = ${obj.spec.kind})`);\n return obj;\n });\n\n return pf;\n }\n\n /**\n *\n */\n public parsePObjectCollection(\n errorOnUnknownField: boolean = false,\n prefix: string = '',\n ): Record<string, PObject<TreeNodeAccessor>> | undefined {\n const pObjects = getCfgRenderCtx().parsePObjectCollection(\n this.handle,\n errorOnUnknownField,\n prefix,\n ...this.resolvePath,\n );\n if (pObjects === undefined) return undefined;\n const result: Record<string, PObject<TreeNodeAccessor>> = {};\n for (const [key, value] of Object.entries(pObjects)) {\n const resolvePath = [...this.resolvePath, key];\n result[key] = mapPObjectData(value, (c) => new TreeNodeAccessor(c, resolvePath));\n }\n return result;\n }\n\n public getFileContentAsBase64(range?: RangeBytes): FutureRef<string | undefined> {\n return new FutureRef(getCfgRenderCtx().getBlobContentAsBase64(this.handle, range));\n }\n\n public getFileContentAsString(range?: RangeBytes): FutureRef<string | undefined> {\n return new FutureRef(getCfgRenderCtx().getBlobContentAsString(this.handle, range));\n }\n\n public getFileContentAsJson<T>(range?: RangeBytes): FutureRef<T | undefined> {\n return new FutureRef<string | undefined>(\n getCfgRenderCtx().getBlobContentAsString(this.handle, range),\n ).mapDefined((v) => JSON.parse(v) as T);\n }\n\n /**\n * @deprecated use getFileContentAsBase64\n */\n public getBlobContentAsBase64(): FutureRef<string | undefined> {\n return this.getFileContentAsBase64();\n }\n\n /**\n * @deprecated use getFileContentAsString\n */\n public getBlobContentAsString(): FutureRef<string | undefined> {\n return this.getFileContentAsString();\n }\n\n /**\n * @returns downloaded file handle\n */\n public getFileHandle(): FutureRef<LocalBlobHandleAndSize | undefined> {\n return new FutureRef(getCfgRenderCtx().getDownloadedBlobContentHandle(this.handle));\n }\n\n /**\n * @deprecated use getFileHandle\n */\n public getDownloadedBlobHandle(): FutureRef<LocalBlobHandleAndSize | undefined> {\n return this.getFileHandle();\n }\n\n /**\n * @returns downloaded file handle\n */\n public getRemoteFileHandle(): FutureRef<RemoteBlobHandleAndSize | undefined> {\n return new FutureRef(getCfgRenderCtx().getOnDemandBlobContentHandle(this.handle));\n }\n\n /**\n * @deprecated use getRemoteFileHandle\n */\n public getOnDemandBlobHandle(): FutureRef<RemoteBlobHandleAndSize | undefined> {\n return this.getRemoteFileHandle();\n }\n\n /**\n * @returns the url to the extracted folder\n */\n public extractArchiveAndGetURL(format: ArchiveFormat): FutureRef<FolderURL | undefined> {\n return new FutureRef(getCfgRenderCtx().extractArchiveAndGetURL(this.handle, format));\n }\n\n public getImportProgress(): FutureRef<ImportProgress> {\n return new FutureRef(getCfgRenderCtx().getImportProgress(this.handle));\n }\n\n public getLastLogs(nLines: number): FutureRef<string | undefined> {\n return new FutureRef(getCfgRenderCtx().getLastLogs(this.handle, nLines));\n }\n\n public getProgressLog(patternToSearch: string): FutureRef<string | undefined> {\n return new FutureRef(getCfgRenderCtx().getProgressLog(this.handle, patternToSearch));\n }\n\n public getProgressLogWithInfo(patternToSearch: string): FutureRef<ProgressLogWithInfo | undefined> {\n return new FutureRef(getCfgRenderCtx().getProgressLogWithInfo(this.handle, patternToSearch));\n }\n\n public getLogHandle(): FutureRef<AnyLogHandle | undefined> {\n return new FutureRef(getCfgRenderCtx().getLogHandle(this.handle));\n }\n\n public allFieldsResolved(fieldType: 'Input' | 'Output' = 'Input'): boolean {\n switch (fieldType) {\n case 'Input':\n return (\n this.getInputsLocked()\n && this.listInputFields().every(\n (field) => this.resolve({ field, assertFieldType: 'Input' }) !== undefined,\n )\n );\n case 'Output':\n return (\n this.getOutputsLocked()\n && this.listOutputFields().every(\n (field) => this.resolve({ field, assertFieldType: 'Output' }) !== undefined,\n )\n );\n }\n }\n\n public mapFields<T>(\n _mapping: (name: string, value: TreeNodeAccessor) => T,\n _ops: FieldMapOps & { skipUnresolved: true }\n ): T[] | undefined;\n public mapFields<T>(\n _mapping: (name: string, value: TreeNodeAccessor | undefined) => T,\n _ops?: FieldMapOps\n ): T[] | undefined;\n public mapFields<T>(\n _mapping: (name: string, value: TreeNodeAccessor) => T,\n _ops?: FieldMapOps,\n ): T[] | undefined {\n const { fieldType, requireLocked, skipUnresolved } = {\n fieldType: 'Input' as const,\n requireLocked: true,\n skipUnresolved: false,\n ..._ops,\n };\n const mapping = _mapping as (name: string, value: TreeNodeAccessor | undefined) => T;\n if (requireLocked) {\n if (fieldType === 'Input' && !this.getInputsLocked()) return undefined;\n if (fieldType === 'Output' && !this.getOutputsLocked()) return undefined;\n }\n const fieldList\n = fieldType === 'Input'\n ? this.listInputFields()\n : fieldType === 'Output'\n ? this.listOutputFields()\n : this.listDynamicFields();\n let fieldEntries = fieldList.map(\n (field) => [field, this.resolve({ field, assertFieldType: fieldType })] as const,\n );\n if (skipUnresolved) fieldEntries = fieldEntries.filter((e) => e[1] !== undefined);\n return fieldEntries.map(([name, value]) => mapping(name, value));\n }\n}\n","import type { Optional } from 'utility-types';\nimport type { Branded } from '../branding';\nimport type { CommonFieldTraverseOps, FieldTraversalStep, ResourceType } from './traversal_ops';\nimport type {\n ArchiveFormat,\n AnyFunction,\n Option,\n PColumn,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PTableDef,\n PTableHandle,\n ResultCollection,\n ValueOrError,\n DataInfo,\n RangeBytes,\n} from '@milaboratories/pl-model-common';\n\nexport const StagingAccessorName = 'staging';\nexport const MainAccessorName = 'main';\n\nexport type AccessorHandle = Branded<string, 'AccessorHandle'>;\nexport type FutureHandle = Branded<string, 'FutureHandle'>;\n\nexport interface GlobalCfgRenderCtxMethods<AHandle = AccessorHandle, FHandle = FutureHandle> {\n\n //\n // Root accessor creation\n //\n\n getAccessorHandleByName(name: string): AHandle | undefined;\n\n //\n // Basic resource accessor actions\n //\n\n resolveWithCommon(\n handle: AHandle,\n commonOptions: CommonFieldTraverseOps,\n ...steps: (FieldTraversalStep | string)[]\n ): AHandle | undefined;\n\n getResourceType(handle: AHandle): ResourceType;\n\n getInputsLocked(handle: AHandle): boolean;\n\n getOutputsLocked(handle: AHandle): boolean;\n\n getIsReadyOrError(handle: AHandle): boolean;\n\n getIsFinal(handle: AHandle): boolean;\n\n getError(handle: AHandle): AHandle | undefined;\n\n listInputFields(handle: AHandle): string[];\n\n listOutputFields(handle: AHandle): string[];\n\n listDynamicFields(handle: AHandle): string[];\n\n getKeyValueBase64(handle: AHandle, key: string): string | undefined;\n\n getKeyValueAsString(handle: AHandle, key: string): string | undefined;\n\n getDataBase64(handle: AHandle): string | undefined;\n\n getDataAsString(handle: AHandle): string | undefined;\n\n /** If not final returns undefined */\n parsePObjectCollection(\n handle: AHandle,\n errorOnUnknownField: boolean,\n prefix: string,\n ...resolvePath: string[]\n ): Record<string, PObject<AHandle>> | undefined;\n\n //\n // Blob\n //\n\n getBlobContentAsBase64(handle: AHandle, range?: RangeBytes): FHandle; // string | undefined\n\n getBlobContentAsString(handle: AHandle, range?: RangeBytes): FHandle; // string | undefined\n\n getDownloadedBlobContentHandle(handle: AHandle): FHandle; // LocalBlobHandleAndSize | undefined;\n\n getOnDemandBlobContentHandle(handle: AHandle): FHandle; // RemoteBlobHandleAndSize | undefined;\n\n //\n // Blobs to URLs\n //\n\n extractArchiveAndGetURL(handle: AHandle, format: ArchiveFormat): FHandle;\n\n //\n // Import progress\n //\n\n getImportProgress(handle: AHandle): FHandle; // ImportProgress;\n\n //\n // Logs\n //\n\n getLastLogs(handle: AHandle, nLines: number): FHandle; // string | undefined;\n\n getProgressLog(handle: AHandle, patternToSearch: string): FHandle; // string | undefined;\n\n getProgressLogWithInfo(handle: AHandle, patternToSearch: string): FHandle; // ProgressLogWithInfo | undefined;\n\n getLogHandle(handle: AHandle): FHandle; // AnyLogHandle | undefined;\n\n //\n // Blocks\n //\n\n /** @deprecated at some point will stop working and will return dummy values */\n getBlockLabel(blockId: string): string;\n\n //\n // Result Pool\n //\n\n getDataFromResultPool(): ResultCollection<PObject<AHandle>>;\n\n getDataWithErrorsFromResultPool(): ResultCollection<\n Optional<PObject<ValueOrError<AHandle, Error>>, 'id'>\n >;\n\n getSpecsFromResultPool(): ResultCollection<PObjectSpec>;\n\n getSpecFromResultPoolByRef(blockId: string, exportName: string): PObjectSpec | undefined;\n\n getDataFromResultPoolByRef(blockId: string, exportName: string): PObject<AHandle> | undefined;\n\n calculateOptions(predicate: PSpecPredicate): Option[];\n\n //\n // PFrame / PTable\n //\n\n createPFrame(def: PFrameDef<AHandle | PColumnValues | DataInfo<AHandle>>): PFrameHandle;\n\n createPTable(def: PTableDef<PColumn<AHandle | PColumnValues | DataInfo<AHandle>>>): PTableHandle;\n\n //\n // Computable\n //\n\n getCurrentUnstableMarker(): string | undefined;\n\n //\n // Logging\n //\n\n logInfo(message: string): void;\n\n logWarn(message: string): void;\n\n logError(message: string): void;\n}\n\nexport const GlobalCfgRenderCtxFeatureFlags = {\n explicitColumnsSupport: true as const,\n inlineColumnsSupport: true as const,\n activeArgs: true as const,\n pTablePartitionFiltersSupport: true as const,\n pFrameInSetFilterSupport: true as const,\n};\n\nexport interface GlobalCfgRenderCtx extends GlobalCfgRenderCtxMethods {\n //\n // State: Args, UI State, Active Args\n //\n // Old runtime injects these values as strings, new runtime injects them as functions\n // that return strings, if block declares supportsLazyState flag.\n // If function not called in lazy state API, then resulting output will not depend on these values,\n // and thus will not be recalculated on corresponding state change.\n //\n\n readonly args: string | (() => string);\n readonly uiState: string | (() => string);\n readonly activeArgs: undefined | string | (() => string | undefined);\n\n // Note: strings below are used because, anyway, using strings is the only way\n // to get data inside the QuickJS context, as it is implemented now. With this\n // approach deserialization can be lazily postponed until it is actually needed.\n readonly callbackRegistry: Record<string, AnyFunction>;\n readonly featureFlags?: typeof GlobalCfgRenderCtxFeatureFlags;\n}\n\nexport type FutureAwait = {\n __awaited_futures__: FutureHandle[];\n};\n\nexport function isFutureAwait(obj: unknown): obj is FutureAwait {\n return typeof obj === 'object' && obj !== null && '__awaited_futures__' in obj;\n}\n\nfunction addAllFutureAwaits(set: Set<string>, visited: Set<unknown>, node: unknown) {\n if (visited.has(node)) return;\n visited.add(node);\n\n const type = typeof node;\n if (type === 'object') {\n if (isFutureAwait(node)) node.__awaited_futures__.forEach((a) => set.add(a));\n else if (Array.isArray(node))\n for (const nested of node) addAllFutureAwaits(set, visited, nested);\n else\n for (const [, nested] of Object.entries(node as object))\n if (nested !== node) addAllFutureAwaits(set, visited, nested);\n }\n}\n\nexport function getAllFutureAwaits(obj: unknown): Set<string> {\n const set = new Set<string>();\n addAllFutureAwaits(set, new Set(), obj);\n return set;\n}\n","import type { PObjectSpec } from '@milaboratories/pl-model-common';\nimport { z } from 'zod';\n\nexport const PAnnotationLabel = 'pl7.app/label';\nexport const PAnnotationTrace = 'pl7.app/trace';\n\nexport type RecordsWithLabel<T> = {\n value: T;\n label: string;\n};\n\nexport type LabelDerivationOps = {\n /** Force inclusion of native column label */\n includeNativeLabel?: boolean;\n /** Separator to use between label parts (\" / \" by default) */\n separator?: string;\n /** If true, label will be added as suffix (at the end of the generated label). By default label added as a prefix. */\n addLabelAsSuffix?: boolean;\n /** Trace elements list that will be forced to be included in the label. */\n forceTraceElements?: string[];\n};\n\nexport const TraceEntry = z.object({\n type: z.string(),\n importance: z.number().optional(),\n id: z.string().optional(),\n label: z.string(),\n});\nexport type TraceEntry = z.infer<typeof TraceEntry>;\ntype FullTraceEntry = TraceEntry & { fullType: string; occurrenceIndex: number };\n\nexport const Trace = z.array(TraceEntry);\nexport type Trace = z.infer<typeof Trace>;\ntype FullTrace = FullTraceEntry[];\n\n// Define the possible return types for the specExtractor function\ntype SpecExtractorResult = PObjectSpec | {\n spec: PObjectSpec;\n prefixTrace?: TraceEntry[];\n suffixTrace?: TraceEntry[];\n};\n\nconst DistancePenalty = 0.001;\n\nconst LabelType = '__LABEL__';\nconst LabelTypeFull = '__LABEL__@1';\n\nexport function deriveLabels<T>(\n values: T[],\n specExtractor: (obj: T) => SpecExtractorResult,\n ops: LabelDerivationOps = {},\n): RecordsWithLabel<T>[] {\n const importances = new Map<string, number>();\n\n const forceTraceElements = (ops.forceTraceElements !== undefined && ops.forceTraceElements.length > 0)\n ? new Set(ops.forceTraceElements)\n : undefined;\n\n // number of times certain type occurred among all of the\n const numberOfRecordsWithType = new Map<string, number>();\n\n const enrichedRecords = values.map((value) => {\n const extractorResult = specExtractor(value);\n let spec: PObjectSpec;\n let prefixTrace: TraceEntry[] | undefined;\n let suffixTrace: TraceEntry[] | undefined;\n\n // Check if the result is the new structure or just PObjectSpec\n if ('spec' in extractorResult && typeof extractorResult.spec === 'object') {\n // It's the new structure { spec, prefixTrace?, suffixTrace? }\n spec = extractorResult.spec;\n prefixTrace = extractorResult.prefixTrace;\n suffixTrace = extractorResult.suffixTrace;\n } else {\n // It's just PObjectSpec\n spec = extractorResult as PObjectSpec;\n }\n\n const label = spec.annotations?.[PAnnotationLabel];\n const traceStr = spec.annotations?.[PAnnotationTrace];\n const baseTrace = (traceStr ? Trace.safeParse(JSON.parse(traceStr)).data : undefined) ?? [];\n\n const trace = [\n ...(prefixTrace ?? []),\n ...baseTrace,\n ...(suffixTrace ?? []),\n ];\n\n if (label !== undefined) {\n const labelEntry = { label, type: LabelType, importance: -2 };\n if (ops.addLabelAsSuffix) trace.push(labelEntry);\n else trace.splice(0, 0, labelEntry);\n }\n\n const fullTrace: FullTrace = [];\n\n const occurrences = new Map<string, number>();\n for (let i = trace.length - 1; i >= 0; --i) {\n const { type: typeName } = trace[i];\n const importance = trace[i].importance ?? 0;\n const occurrenceIndex = (occurrences.get(typeName) ?? 0) + 1;\n occurrences.set(typeName, occurrenceIndex);\n const fullType = `${typeName}@${occurrenceIndex}`;\n numberOfRecordsWithType.set(fullType, (numberOfRecordsWithType.get(fullType) ?? 0) + 1);\n importances.set(\n fullType,\n Math.max(\n importances.get(fullType) ?? Number.NEGATIVE_INFINITY,\n importance - (trace.length - i) * DistancePenalty,\n ),\n );\n fullTrace.push({ ...trace[i], fullType, occurrenceIndex: occurrenceIndex });\n }\n fullTrace.reverse();\n return {\n value,\n spec,\n label,\n fullTrace,\n };\n });\n\n // excluding repeated types (i.e. ..@2, ..@3, etc.) not found in some records\n const mainTypes: string[] = [];\n // repeated types (i.e. ..@2, ..@3, etc.) not found in some records\n const secondaryTypes: string[] = [];\n\n const allTypeRecords = [...importances];\n // sorting: most important types go first\n allTypeRecords.sort(([, i1], [, i2]) => i2 - i1);\n\n for (const [typeName] of allTypeRecords) {\n if (typeName.endsWith('@1') || numberOfRecordsWithType.get(typeName) === values.length)\n mainTypes.push(typeName);\n else secondaryTypes.push(typeName);\n }\n\n const calculate = (includedTypes: Set<string>, force: boolean = false) => {\n const result: RecordsWithLabel<T>[] = [];\n for (let i = 0; i < enrichedRecords.length; i++) {\n const r = enrichedRecords[i];\n const includedTrace = r.fullTrace\n .filter((fm) => includedTypes.has(fm.fullType)\n || (forceTraceElements && forceTraceElements.has(fm.type)));\n if (includedTrace.length === 0) {\n if (force)\n result.push({\n label: 'Unlabeled',\n value: r.value,\n } satisfies RecordsWithLabel<T>);\n else return undefined;\n }\n const labelSet = includedTrace\n .map((fm) => fm.label);\n const sep = ops.separator ?? ' / ';\n result.push({\n label: labelSet.join(sep),\n value: r.value,\n } satisfies RecordsWithLabel<T>);\n }\n return result;\n };\n\n if (mainTypes.length === 0) {\n if (secondaryTypes.length !== 0) throw new Error('Non-empty secondary types list while main types list is empty.');\n return calculate(new Set(LabelTypeFull), true)!;\n }\n\n //\n // includedTypes = 2\n // * *\n // T0 T1 T2 T3 T4 T5\n // *\n // additionalType = 3\n //\n // Resulting set: T0, T1, T3\n //\n let includedTypes = 0;\n let additionalType = -1;\n while (includedTypes < mainTypes.length) {\n const currentSet = new Set<string>();\n if (ops.includeNativeLabel) currentSet.add(LabelTypeFull);\n for (let i = 0; i < includedTypes; ++i) currentSet.add(mainTypes[i]);\n if (additionalType >= 0)\n currentSet.add(mainTypes[additionalType]);\n\n const candidateResult = calculate(currentSet);\n\n // checking if labels uniquely separate our records\n if (candidateResult !== undefined && new Set(candidateResult.map((c) => c.label)).size === values.length) return candidateResult;\n\n additionalType++;\n if (additionalType >= mainTypes.length) {\n includedTypes++;\n additionalType = includedTypes;\n }\n }\n\n return calculate(new Set([...mainTypes, ...secondaryTypes]), true)!;\n}\n","import type {\n DataInfo } from '@milaboratories/pl-model-common';\nimport {\n dataInfoToEntries,\n isDataInfo,\n isDataInfoEntries,\n type BinaryChunk,\n type BinaryPartitionedDataInfoEntries,\n type DataInfoEntries,\n type JsonPartitionedDataInfoEntries,\n type PColumnDataEntry,\n type PColumnKey,\n} from '@milaboratories/pl-model-common';\nimport { TreeNodeAccessor } from '../accessor';\n\nconst PCD_PREFIX = 'PColumnData/';\n\nexport const RT_RESOURCE_MAP = PCD_PREFIX + 'ResourceMap';\nexport const RT_RESOURCE_MAP_PARTITIONED = PCD_PREFIX + 'Partitioned/ResourceMap';\n\nexport const RT_JSON_PARTITIONED = PCD_PREFIX + 'JsonPartitioned';\nexport const RT_BINARY_PARTITIONED = PCD_PREFIX + 'BinaryPartitioned';\n\nconst PCD_SUP_PREFIX = PCD_PREFIX + 'Partitioned/';\nexport const RT_JSON_SUPER_PARTITIONED = PCD_SUP_PREFIX + 'JsonPartitioned';\nexport const RT_BINARY_SUPER_PARTITIONED = PCD_SUP_PREFIX + 'BinaryPartitioned';\n\nexport type PColumnResourceMapEntry<T> = {\n key: PColumnKey;\n value: T;\n};\n\nexport type PColumnResourceMapData<T> = {\n isComplete: boolean;\n data: PColumnResourceMapEntry<T>[];\n};\n\nfunction populateResourceMapData<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n data: PColumnResourceMapEntry<T | undefined>[],\n keyPrefix: PColumnKey = [],\n addEntriesWithNoData: boolean,\n): boolean {\n if (acc === undefined) return false;\n switch (acc.resourceType.name) {\n case RT_RESOURCE_MAP: {\n let isComplete = acc.getInputsLocked();\n for (const keyStr of acc.listInputFields()) {\n const value = acc.resolve({ field: keyStr, assertFieldType: 'Input' });\n const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;\n const converted = value === undefined ? undefined : resourceParser(value);\n if (converted === undefined) isComplete = false;\n if (converted !== undefined || addEntriesWithNoData) data.push({ key, value: converted });\n }\n return isComplete;\n }\n case RT_RESOURCE_MAP_PARTITIONED: {\n let isComplete = acc.getInputsLocked();\n for (const keyStr of acc.listInputFields()) {\n const value = acc.resolve({ field: keyStr, assertFieldType: 'Input' });\n if (value === undefined) isComplete = false;\n else {\n const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;\n const populateResult = populateResourceMapData(\n value,\n resourceParser,\n data,\n key,\n addEntriesWithNoData,\n );\n isComplete = isComplete && populateResult;\n }\n }\n return isComplete;\n }\n default:\n throw new Error(`Unknown resource type: ${acc.resourceType.name}`);\n }\n}\n\nexport function parseResourceMap<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n addEntriesWithNoData: false\n): PColumnResourceMapData<NonNullable<T>>;\nexport function parseResourceMap<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n addEntriesWithNoData: true\n): PColumnResourceMapData<T | undefined>;\nexport function parseResourceMap<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n addEntriesWithNoData: boolean = false,\n): PColumnResourceMapData<T | undefined> {\n const data: PColumnResourceMapEntry<T | undefined>[] = [];\n const isComplete = populateResourceMapData(acc, resourceParser, data, [], addEntriesWithNoData);\n return { isComplete, data };\n}\n\nexport type PColumnKeyList = {\n /** array of keys */\n data: PColumnKey[];\n /** length of partition key */\n keyLength: number;\n};\n\nconst removeIndexSuffix = (keyStr: string): { baseKey: string; type: 'index' | 'values' } => {\n if (keyStr.endsWith('.index')) {\n return { baseKey: keyStr.substring(0, keyStr.length - 6), type: 'index' };\n } else if (keyStr.endsWith('.values')) {\n return { baseKey: keyStr.substring(0, keyStr.length - 7), type: 'values' };\n } else {\n throw new Error(`key must ends on .index/.values for binary p-column, got: ${keyStr}`);\n }\n};\n\n// @TODO define a class with various resource map operations\n/** Returns a list of all partition keys appeared in the p-column */\nexport function getPartitionKeysList(\n acc: TreeNodeAccessor | undefined,\n): PColumnKeyList | undefined {\n if (!acc) return undefined;\n\n const rt = acc.resourceType.name;\n const meta = acc.getDataAsJson<Record<string, number>>();\n const data: PColumnKey[] = [];\n\n let keyLength = 0;\n // @TODO validate meta shape\n switch (rt) {\n case RT_RESOURCE_MAP:\n keyLength = meta['keyLength'];\n break;\n\n case RT_RESOURCE_MAP_PARTITIONED:\n keyLength = meta['partitionKeyLength'] + meta['keyLength'];\n break;\n\n case RT_JSON_PARTITIONED:\n case RT_BINARY_PARTITIONED:\n keyLength = meta['partitionKeyLength'];\n break;\n\n case RT_BINARY_SUPER_PARTITIONED:\n case RT_JSON_SUPER_PARTITIONED:\n keyLength = meta['superPartitionKeyLength'] + meta['partitionKeyLength'];\n break;\n }\n\n switch (rt) {\n case RT_RESOURCE_MAP:\n case RT_JSON_PARTITIONED:\n case RT_BINARY_PARTITIONED:\n for (let keyStr of acc.listInputFields()) {\n if (rt === RT_BINARY_PARTITIONED) {\n keyStr = removeIndexSuffix(keyStr).baseKey;\n }\n const key = [...JSON.parse(keyStr)] as PColumnKey;\n data.push(key);\n }\n\n break;\n\n case RT_RESOURCE_MAP_PARTITIONED:\n case RT_BINARY_SUPER_PARTITIONED:\n case RT_JSON_SUPER_PARTITIONED:\n for (const supKeyStr of acc.listInputFields()) {\n const keyPrefix = [...JSON.parse(supKeyStr)] as PColumnKey;\n\n const value = acc.resolve({ field: supKeyStr, assertFieldType: 'Input' });\n if (value !== undefined) {\n for (let keyStr of value.listInputFields()) {\n if (rt === RT_BINARY_SUPER_PARTITIONED) {\n keyStr = removeIndexSuffix(keyStr).baseKey;\n }\n const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;\n data.push(key);\n }\n }\n }\n break;\n }\n\n return { data, keyLength };\n}\n\nfunction getUniquePartitionKeysForDataEntries(list: DataInfoEntries<unknown>): (string | number)[][] {\n if (list.type !== 'JsonPartitioned' && list.type !== 'BinaryPartitioned')\n throw new Error(`Splitting requires Partitioned DataInfoEntries, got ${list.type}`);\n\n const { parts, partitionKeyLength } = list;\n\n const result: Set<string | number>[] = [];\n for (let i = 0; i < partitionKeyLength; ++i) {\n result.push(new Set());\n }\n\n for (const part of parts) {\n const key = part.key;\n if (key.length !== partitionKeyLength) {\n throw new Error(\n `Key length (${key.length}) does not match partition length (${partitionKeyLength}) for key: ${JSON.stringify(\n key,\n )}`,\n );\n }\n for (let i = 0; i < partitionKeyLength; ++i) {\n result[i].add(key[i]);\n }\n }\n\n return result.map((s) => Array.from(s.values()));\n}\n\n/** Returns an array of unique partition keys for each column: the i-th element in the resulting 2d array contains all unique values of i-th partition axis. */\nexport function getUniquePartitionKeys(acc: DataInfoEntries<unknown>): (string | number)[][];\nexport function getUniquePartitionKeys(acc: DataInfoEntries<unknown> | TreeNodeAccessor | undefined): (string | number)[][] | undefined;\nexport function getUniquePartitionKeys(\n acc: TreeNodeAccessor | DataInfoEntries<unknown> | undefined,\n): (string | number)[][] | undefined {\n if (acc === undefined) return undefined;\n\n if (isDataInfoEntries(acc))\n return getUniquePartitionKeysForDataEntries(acc);\n\n const list = getPartitionKeysList(acc);\n if (!list) return undefined;\n\n const { data, keyLength } = list;\n\n const result: Set<string | number>[] = [];\n\n for (let i = 0; i < keyLength; ++i) {\n result.push(new Set());\n }\n\n for (const l of data) {\n if (l.length !== keyLength) {\n throw new Error('key length does not match partition length');\n }\n for (let i = 0; i < keyLength; ++i) {\n result[i].add(l[i]);\n }\n }\n\n return result.map((s) => Array.from(s.values()));\n}\n\n/**\n * Parses the PColumn data from a TreeNodeAccessor into a DataInfoEntries structure.\n * Returns undefined if any required data is missing.\n * Throws error on validation failures.\n *\n * @param acc - The TreeNodeAccessor containing PColumn data\n * @param keyPrefix - Optional key prefix for recursive calls\n * @returns DataInfoEntries representation of the PColumn data, or undefined if incomplete\n */\nexport function parsePColumnData(\n acc: TreeNodeAccessor | undefined,\n keyPrefix: PColumnKey = [],\n): JsonPartitionedDataInfoEntries<TreeNodeAccessor> | BinaryPartitionedDataInfoEntries<TreeNodeAccessor> | undefined {\n if (acc === undefined) return undefined;\n\n if (!acc.getIsReadyOrError()) return undefined;\n\n const resourceType = acc.resourceType.name;\n const meta = acc.getDataAsJson<Record<string, number>>();\n\n // Prevent recursive super-partitioned resources\n if (keyPrefix.length > 0\n && (resourceType === RT_JSON_SUPER_PARTITIONED || resourceType === RT_BINARY_SUPER_PARTITIONED)) {\n throw new Error(`Unexpected nested super-partitioned resource: ${resourceType}`);\n }\n\n switch (resourceType) {\n case RT_RESOURCE_MAP:\n case RT_RESOURCE_MAP_PARTITIONED:\n throw new Error(`Only data columns are supported, got: ${resourceType}`);\n\n case RT_JSON_PARTITIONED: {\n if (typeof meta?.partitionKeyLength !== 'number') {\n throw new Error(`Missing partitionKeyLength in metadata for ${resourceType}`);\n }\n\n const parts: PColumnDataEntry<TreeNodeAccessor>[] = [];\n for (const keyStr of acc.listInputFields()) {\n const value = acc.resolve({ field: keyStr, assertFieldType: 'Input' });\n if (value === undefined) return undefined;\n\n const key = [...keyPrefix, ...JSON.parse(keyStr)];\n parts.push({ key, value });\n }\n\n return {\n type: 'JsonPartitioned',\n partitionKeyLength: meta.partitionKeyLength,\n parts,\n };\n }\n\n case RT_BINARY_PARTITIONED: {\n if (typeof meta?.partitionKeyLength !== 'number') {\n throw new Error(`Missing partitionKeyLength in metadata for ${resourceType}`);\n }\n\n const parts: PColumnDataEntry<BinaryChunk<TreeNodeAccessor>>[] = [];\n const baseKeys = new Map<string, { index?: TreeNodeAccessor; values?: TreeNodeAccessor }>();\n\n // Group fields by base key (without .index/.values suffix)\n for (const keyStr of acc.listInputFields()) {\n const suffix = removeIndexSuffix(keyStr);\n\n const value = acc.resolve({ field: keyStr, assertFieldType: 'Input' });\n if (value === undefined) return undefined;\n\n let entry = baseKeys.get(suffix.baseKey);\n if (!entry) {\n entry = {};\n baseKeys.set(suffix.baseKey, entry);\n }\n\n if (suffix.type === 'index') {\n entry.index = value;\n } else {\n entry.values = value;\n }\n }\n\n // Process complete binary chunks only\n for (const [baseKeyStr, entry] of baseKeys.entries()) {\n if (!entry.index || !entry.values) return undefined;\n\n const key = [...keyPrefix, ...JSON.parse(baseKeyStr)];\n parts.push({\n key,\n value: {\n index: entry.index,\n values: entry.values,\n },\n });\n }\n\n return {\n type: 'BinaryPartitioned',\n partitionKeyLength: meta.partitionKeyLength,\n parts,\n };\n }\n\n case RT_JSON_SUPER_PARTITIONED: {\n if (typeof meta?.superPartitionKeyLength !== 'number'\n || typeof meta?.partitionKeyLength !== 'number') {\n throw new Error(`Missing superPartitionKeyLength or partitionKeyLength in metadata for ${resourceType}`);\n }\n\n const totalKeyLength = meta.superPartitionKeyLength + meta.partitionKeyLength;\n const parts: PColumnDataEntry<TreeNodeAccessor>[] = [];\n\n // Process all super partitions\n for (const supKeyStr of acc.listInputFields()) {\n const superPartition = acc.resolve({ field: supKeyStr, assertFieldType: 'Input' });\n if (superPartition === undefined) return undefined;\n\n // Validate inner type\n if (superPartition.resourceType.name !== RT_JSON_PARTITIONED) {\n throw new Error(`Expected ${RT_JSON_PARTITIONED} inside ${resourceType}, but got ${superPartition.resourceType.name}`);\n }\n\n const innerResult = parsePColumnData(superPartition, JSON.parse(supKeyStr) as PColumnKey);\n\n if (innerResult === undefined) return undefined;\n\n if (innerResult.type !== 'JsonPartitioned')\n throw new Error(`Unexpected inner result type for ${resourceType}: ${innerResult.type}`);\n\n parts.push(...innerResult.parts);\n }\n\n return {\n type: 'JsonPartitioned',\n partitionKeyLength: totalKeyLength,\n parts,\n };\n }\n\n case RT_BINARY_SUPER_PARTITIONED: {\n if (typeof meta?.superPartitionKeyLength !== 'number'\n || typeof meta?.partitionKeyLength !== 'number') {\n throw new Error(`Missing superPartitionKeyLength or partitionKeyLength in metadata for ${resourceType}`);\n }\n\n const totalKeyLength = meta.superPartitionKeyLength + meta.partitionKeyLength;\n const parts: PColumnDataEntry<BinaryChunk<TreeNodeAccessor>>[] = [];\n\n // Process all super partitions\n for (const supKeyStr of acc.listInputFields()) {\n const superPartition = acc.resolve({ field: supKeyStr, assertFieldType: 'Input' });\n if (superPartition === undefined) return undefined;\n\n // Validate inner type\n if (superPartition.resourceType.name !== RT_BINARY_PARTITIONED) {\n throw new Error(`Expected ${RT_BINARY_PARTITIONED} inside ${resourceType}, but got ${superPartition.resourceType.name}`);\n }\n\n const innerResult = parsePColumnData(superPartition, JSON.parse(supKeyStr) as PColumnKey);\n\n if (innerResult === undefined) return undefined;\n\n if (innerResult.type !== 'BinaryPartitioned')\n throw new Error(`Unexpected inner result type for ${resourceType}: ${innerResult.type}`);\n\n parts.push(...innerResult.parts);\n }\n\n return {\n type: 'BinaryPartitioned',\n partitionKeyLength: totalKeyLength,\n parts,\n };\n }\n\n default:\n throw new Error(`Unknown resource type: ${resourceType}`);\n }\n}\n\n/**\n * Converts or parses the input into DataInfoEntries format.\n\n * @param acc - The input data, which can be TreeNodeAccessor, DataInfoEntries, DataInfo, or undefined.\n * @returns The data in DataInfoEntries format, or undefined if the input was undefined or data is not ready.\n */\nexport function convertOrParsePColumnData(acc: TreeNodeAccessor | DataInfoEntries<TreeNodeAccessor> | DataInfo<TreeNodeAccessor> | undefined):\nDataInfoEntries<TreeNodeAccessor> | undefined {\n if (acc === undefined) return undefined;\n\n if (isDataInfoEntries(acc)) return acc;\n if (isDataInfo(acc)) return dataInfoToEntries(acc);\n if (acc instanceof TreeNodeAccessor) return parsePColumnData(acc);\n\n throw new Error(`Unexpected input type: ${typeof acc}`);\n}\n","import type {\n BinaryChunk,\n DataInfoEntries,\n PColumnDataEntry,\n PColumnKey,\n PColumnValue,\n JsonDataInfoEntries,\n JsonPartitionedDataInfoEntries,\n BinaryPartitionedDataInfoEntries,\n} from '@milaboratories/pl-model-common';\nimport type { AxisFilterByIdx } from '@milaboratories/pl-model-common';\n\n/**\n * Filters DataInfoEntries using axis filters, removing specified axes from keys and\n * only keeping entries that match the filter values.\n *\n * @param dataInfoEntries - The data info object to filter\n * @param axisFilters - Array of axis filters (index, value pairs)\n * @throws Error if any filter axis is outside the partitioning axes or data axes for Json data\n */\nexport function filterDataInfoEntries<Blob>(\n dataInfoEntries: BinaryPartitionedDataInfoEntries<Blob>,\n axisFilters: AxisFilterByIdx[],\n): BinaryPartitionedDataInfoEntries<Blob>;\nexport function filterDataInfoEntries<Blob>(\n dataInfoEntries: JsonPartitionedDataInfoEntries<Blob>,\n axisFilters: AxisFilterByIdx[],\n): JsonPartitionedDataInfoEntries<Blob>;\nexport function filterDataInfoEntries<Blob>(\n dataInfoEntries: BinaryPartitionedDataInfoEntries<Blob> | JsonPartitionedDataInfoEntries<Blob>,\n axisFilters: AxisFilterByIdx[],\n): BinaryPartitionedDataInfoEntries<Blob> | JsonPartitionedDataInfoEntries<Blob>;\nexport function filterDataInfoEntries(\n dataInfoEntries: JsonDataInfoEntries,\n axisFilters: AxisFilterByIdx[],\n): JsonDataInfoEntries;\nexport function filterDataInfoEntries<Blob>(\n dataInfoEntries: DataInfoEntries<Blob>,\n axisFilters: AxisFilterByIdx[],\n): DataInfoEntries<Blob> {\n // Sort filters by axis index in descending order to safely remove elements from arrays\n const sortedFilters = [...axisFilters].sort((a, b) => b[0] - a[0]);\n\n // Check for invalid filter axes\n if (dataInfoEntries.type === 'JsonPartitioned' || dataInfoEntries.type === 'BinaryPartitioned') {\n const { partitionKeyLength } = dataInfoEntries;\n for (const [axisIdx] of axisFilters)\n if (axisIdx >= partitionKeyLength)\n throw new Error(`Can't filter on non-partitioned axis ${axisIdx}. Must be >= ${partitionKeyLength}`);\n } else if (dataInfoEntries.type === 'Json') {\n const { keyLength } = dataInfoEntries;\n for (const [axisIdx] of axisFilters)\n if (axisIdx >= keyLength)\n throw new Error(`Can't filter on non-data axis ${axisIdx}. Must be >= ${keyLength}`);\n }\n\n const keyMatchesFilters = (key: PColumnKey): boolean => {\n for (const [axisIdx, axisValue] of sortedFilters)\n if (key[axisIdx] !== axisValue)\n return false;\n return true;\n };\n\n const removeFilteredAxes = (key: PColumnKey): PColumnKey => {\n const newKey = [...key];\n\n // Remove axes in descending order to maintain correct indices\n for (const [axisIdx] of sortedFilters)\n newKey.splice(axisIdx, 1);\n\n return newKey;\n };\n\n switch (dataInfoEntries.type) {\n case 'Json': {\n const filteredData: PColumnDataEntry<PColumnValue>[] = dataInfoEntries.data\n .filter((entry: PColumnDataEntry<PColumnValue>) => keyMatchesFilters(entry.key))\n .map((entry: PColumnDataEntry<PColumnValue>) => ({\n key: removeFilteredAxes(entry.key),\n value: entry.value,\n }));\n\n return {\n type: 'Json',\n keyLength: dataInfoEntries.keyLength - axisFilters.length,\n data: filteredData,\n };\n }\n\n case 'JsonPartitioned': {\n const filteredParts = dataInfoEntries.parts\n .filter((entry: PColumnDataEntry<Blob>) => keyMatchesFilters(entry.key))\n .map((entry: PColumnDataEntry<Blob>) => ({\n key: removeFilteredAxes(entry.key),\n value: entry.value,\n }));\n\n return {\n type: 'JsonPartitioned',\n partitionKeyLength: dataInfoEntries.partitionKeyLength - axisFilters.length,\n parts: filteredParts,\n };\n }\n\n case 'BinaryPartitioned': {\n const filteredParts = dataInfoEntries.parts\n .filter((entry: PColumnDataEntry<BinaryChunk<Blob>>) => keyMatchesFilters(entry.key))\n .map((entry: PColumnDataEntry<BinaryChunk<Blob>>) => ({\n key: removeFilteredAxes(entry.key),\n value: entry.value,\n }));\n\n return {\n type: 'BinaryPartitioned',\n partitionKeyLength: dataInfoEntries.partitionKeyLength - axisFilters.length,\n parts: filteredParts,\n };\n }\n }\n}\n","import type {\n AnchoredIdDeriver,\n AxisId,\n PColumn,\n PColumnSelector,\n PColumnSpec,\n PObjectId,\n SUniversalPColumnId,\n PValue,\n AxisFilterByIdx,\n AnchoredPColumnSelector,\n PartitionedDataInfoEntries,\n ResolveAnchorsOptions,\n NativePObjectId,\n PColumnValues,\n} from '@milaboratories/pl-model-common';\nimport {\n selectorsToPredicate,\n resolveAnchors,\n getAxisId,\n isPColumnSpec,\n canonicalizeAxisId,\n isPartitionedDataInfoEntries,\n entriesToDataInfo,\n deriveNativeId,\n} from '@milaboratories/pl-model-common';\nimport type { TreeNodeAccessor } from '../accessor';\nimport type { LabelDerivationOps, TraceEntry } from './label';\nimport { deriveLabels } from './label';\nimport type { Optional } from 'utility-types';\nimport type { APColumnSelectorWithSplit, PColumnSelectorWithSplit } from './split_selectors';\nimport canonicalize from 'canonicalize';\nimport { getUniquePartitionKeys, convertOrParsePColumnData } from './pcolumn_data';\nimport { filterDataInfoEntries } from './axis_filtering';\nimport type { PColumnDataUniversal } from '../api';\n\nfunction isPColumnValues(value: unknown): value is PColumnValues {\n if (!Array.isArray(value)) return false;\n if (value.length === 0) return true;\n const first = value[0];\n return typeof first === 'object' && first !== null && 'key' in first && 'val' in first;\n}\n\nexport interface ColumnProvider {\n selectColumns(selectors: ((spec: PColumnSpec) => boolean) | PColumnSelector | PColumnSelector[]): PColumn<PColumnDataUniversal | undefined>[];\n}\n\nexport interface AxisLabelProvider {\n findLabels(axis: AxisId): Record<string | number, string> | undefined;\n}\n\n/**\n * A simple implementation of {@link ColumnProvider} backed by a pre-defined array of columns.\n */\nclass ArrayColumnProvider implements ColumnProvider {\n constructor(private readonly columns: PColumn<PColumnDataUniversal | undefined>[]) {}\n\n selectColumns(selectors: ((spec: PColumnSpec) => boolean) | PColumnSelector | PColumnSelector[]):\n PColumn<PColumnDataUniversal | undefined>[] {\n const predicate = typeof selectors === 'function' ? selectors : selectorsToPredicate(selectors);\n // Filter based on spec, ignoring data type for now\n return this.columns.filter((column): column is PColumn<PColumnDataUniversal | undefined> => predicate(column.spec));\n }\n}\n\nexport type PColumnEntryWithLabel = {\n id: PObjectId;\n spec: PColumnSpec;\n /** Lazy calculates the data, returns undefined if data is not ready. */\n data(): PColumnDataUniversal | undefined;\n label: string;\n};\n\n/** Universal column is a column that uses a universal column id, and always have label. */\nexport type PColumnEntryUniversal = PColumnEntryWithLabel & {\n id: SUniversalPColumnId;\n};\n\n// Helper types similar to those in api.ts\ntype AxisFilterInfo = {\n axisIdx: number;\n axisId: AxisId;\n value: PValue;\n label: string;\n};\n\n// Intermediate representation for columns requiring splitting\ntype IntermediateSplitEntry = {\n type: 'split';\n originalColumn: PColumn<PColumnDataUniversal | undefined>;\n spec: PColumnSpec;\n /** With splitting axes removed */\n adjustedSpec: PColumnSpec;\n dataEntries: PartitionedDataInfoEntries<TreeNodeAccessor>;\n axisFilters: AxisFilterInfo[];\n};\n\n// Intermediate representation for columns NOT requiring splitting\ntype IntermediateDirectEntry = {\n type: 'direct';\n originalColumn: PColumn<PColumnDataUniversal | undefined>;\n spec: PColumnSpec;\n /** The same as `spec` */\n adjustedSpec: PColumnSpec;\n};\n\n// Union type for intermediate processing\ntype IntermediateColumnEntry = IntermediateSplitEntry | IntermediateDirectEntry;\n\nfunction splitFiltersToTrace(splitFilters?: AxisFilterInfo[]): TraceEntry[] | undefined {\n if (!splitFilters) return undefined;\n return splitFilters.map((filter) => ({\n type: `split:${canonicalizeAxisId(filter.axisId)}`,\n label: filter.label,\n importance: 1_000_000, // High importance for split filters in labels\n }));\n}\n\nfunction splitFiltersToAxisFilter(splitFilters?: AxisFilterInfo[]): AxisFilterByIdx[] | undefined {\n if (!splitFilters) return undefined;\n return splitFilters.map((filter): AxisFilterByIdx => [filter.axisIdx, filter.value]);\n}\n\nfunction fallbackIdDeriver(originalId: PObjectId, axisFilters?: AxisFilterByIdx[]): PObjectId {\n if (!axisFilters || axisFilters.length === 0) return originalId;\n const filtersToCanonicalize = [...axisFilters].sort((a, b) => a[0] - b[0]);\n return canonicalize({ id: originalId, axisFilters: filtersToCanonicalize })! as PObjectId;\n}\n\n/** Checks if a selector object uses any anchor properties */\nfunction hasAnchors(selector: unknown): selector is AnchoredPColumnSelector {\n if (!selector || typeof selector !== 'object') return false;\n const potentialAnchored = selector as Record<string, any>;\n const domainHasAnchors = potentialAnchored['domain'] && typeof potentialAnchored['domain'] === 'object' && Object.values(potentialAnchored['domain']).some((v: unknown) => typeof v === 'object' && v !== null && 'anchor' in v);\n const axesHaveAnchors = potentialAnchored['axes'] && Array.isArray(potentialAnchored['axes']) && potentialAnchored['axes'].some((a: unknown) => typeof a === 'object' && a !== null && 'anchor' in a);\n return !!potentialAnchored['domainAnchor'] || domainHasAnchors || axesHaveAnchors;\n}\n\n/**\n * Derives the indices of axes marked for splitting based on the selector.\n * Throws an error if splitting is requested alongside `partialAxesMatch`.\n */\nfunction getSplitAxisIndices(selector: APColumnSelectorWithSplit | ((spec: PColumnSpec) => boolean)): number[] {\n if (typeof selector !== 'object' || !('axes' in selector) || selector.axes === undefined) {\n return []; // No axes specified or not an object selector, no splitting\n }\n\n const splitIndices = selector.axes\n .map((axis, index) => (typeof axis === 'object' && 'split' in axis && axis.split === true) ? index : -1)\n .filter((index) => index !== -1);\n\n if (splitIndices.length > 0 && selector.partialAxesMatch !== undefined) {\n throw new Error('Axis splitting is not supported when `partialAxesMatch` is defined.');\n }\n\n splitIndices.sort((a, b) => a - b);\n return splitIndices;\n}\n\ntype UniversalPColumnOptsNoDeriver = {\n /** If provided, columns matching the provided selectors will be excluded from the result. */\n exclude?: AnchoredPColumnSelector | AnchoredPColumnSelector[];\n labelOps?: LabelDerivationOps;\n /** If true, incomplete data will cause the column to be skipped instead of returning undefined for the whole request. */\n dontWaitAllData?: boolean;\n /**\n * If true, the derived label will override the 'pl7.app/label' annotation\n * in the resulting PColumnSpec. It also forces `includeNativeLabel` in `labelOps` to true,\n * unless `labelOps.includeNativeLabel` is explicitly set to false.\n * Default value in getUniversalEntries is false, in getColumns it is true.\n */\n overrideLabelAnnotation?: boolean;\n};\n\ntype UniversalPColumnOpts = UniversalPColumnOptsNoDeriver & {\n anchorCtx: AnchoredIdDeriver;\n} & ResolveAnchorsOptions;\n\nexport class PColumnCollection {\n private readonly defaultProviderStore: PColumn<PColumnDataUniversal | undefined>[] = [];\n private readonly providers: ColumnProvider[] = [new ArrayColumnProvider(this.defaultProviderStore)];\n private readonly axisLabelProviders: AxisLabelProvider[] = [];\n\n constructor() {}\n\n public addColumnProvider(provider: ColumnProvider): this {\n this.providers.push(provider);\n return this;\n }\n\n public addAxisLabelProvider(provider: AxisLabelProvider): this {\n this.axisLabelProviders.push(provider);\n return this;\n }\n\n public addColumns(columns: PColumn<PColumnDataUniversal | undefined>[]): this {\n this.defaultProviderStore.push(...columns);\n return this;\n }\n\n public addColumn(column: PColumn<PColumnDataUniversal | undefined>): this {\n this.defaultProviderStore.push(column);\n return this;\n }\n\n /** Fetches labels for a given axis from the registered providers */\n private findLabels(axis: AxisId): Record<string | number, string> | undefined {\n for (const provider of this.axisLabelProviders) {\n const labels = provider.findLabels(axis);\n if (labels) return labels; // First provider wins\n }\n return undefined;\n }\n\n // Overload signatures updated to return PColumnEntry types\n public getUniversalEntries(\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | APColumnSelectorWithSplit[],\n opts: UniversalPColumnOpts): PColumnEntryUniversal[] | undefined;\n public getUniversalEntries(\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | PColumnSelectorWithSplit | PColumnSelectorWithSplit[],\n opts?: UniversalPColumnOptsNoDeriver): PColumnEntryWithLabel[] | undefined;\n public getUniversalEntries(\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | APColumnSelectorWithSplit[],\n opts?: Optional<UniversalPColumnOpts, 'anchorCtx'>): (PColumnEntryWithLabel | PColumnEntryUniversal)[] | undefined {\n const { anchorCtx, labelOps: rawLabelOps, dontWaitAllData = false, overrideLabelAnnotation = false, exclude } = opts ?? {};\n\n const labelOps: LabelDerivationOps = {\n ...(overrideLabelAnnotation && rawLabelOps?.includeNativeLabel !== false ? { includeNativeLabel: true } : {}),\n ...(rawLabelOps ?? {}),\n };\n\n let excludePredicate: ((spec: PColumnSpec) => boolean) = () => false;\n if (exclude) {\n const excludePredicartes = (Array.isArray(exclude) ? exclude : [exclude])\n .map((selector) => {\n if (hasAnchors(selector)) {\n if (!anchorCtx)\n throw new Error('Anchored selectors in exclude require an AnchoredIdDeriver to be provided in options.');\n return selectorsToPredicate(resolveAnchors(anchorCtx.anchors, selector, opts));\n } else\n return selectorsToPredicate(selector);\n });\n excludePredicate = (spec) => excludePredicartes.some((predicate) => predicate(spec));\n }\n\n const selectorsArray = typeof predicateOrSelectors === 'function'\n ? [predicateOrSelectors]\n : Array.isArray(predicateOrSelectors)\n ? predicateOrSelectors\n : [predicateOrSelectors];\n\n const intermediateResults: IntermediateColumnEntry[] = [];\n const selectedNativeIds = new Set<NativePObjectId>();\n\n for (const rawSelector of selectorsArray) {\n const usesAnchors = hasAnchors(rawSelector);\n\n let currentSelector: PColumnSelectorWithSplit | ((spec: PColumnSpec) => boolean);\n if (usesAnchors) {\n if (!anchorCtx)\n throw new Error('Anchored selectors require an AnchoredIdDeriver to be provided in options.');\n currentSelector = resolveAnchors(anchorCtx.anchors, rawSelector as AnchoredPColumnSelector, opts);\n } else\n currentSelector = rawSelector as PColumnSelectorWithSplit | ((spec: PColumnSpec) => boolean);\n\n const selectedIds = new Set<PObjectId>();\n const selectedColumns: PColumn<PColumnDataUniversal | undefined>[] = [];\n for (const provider of this.providers) {\n const providerColumns = provider.selectColumns(currentSelector);\n for (const col of providerColumns) {\n if (excludePredicate(col.spec)) continue;\n if (selectedIds.has(col.id))\n throw new Error(`Duplicate column id ${col.id} in provider ${provider.constructor.name}`);\n const nativeId = deriveNativeId(col.spec);\n if (selectedNativeIds.has(nativeId))\n continue;\n selectedIds.add(col.id);\n selectedNativeIds.add(nativeId);\n selectedColumns.push(col);\n }\n }\n\n if (selectedColumns.length === 0) continue;\n\n const splitAxisIdxs = getSplitAxisIndices(rawSelector);\n const needsSplitting = splitAxisIdxs.length > 0;\n\n for (const column of selectedColumns) {\n if (!isPColumnSpec(column.spec)) continue;\n\n const originalSpec = column.spec;\n\n if (needsSplitting) {\n if (isPColumnValues(column.data))\n throw new Error(`Splitting is not supported for PColumns with PColumnValues data format. Column id: ${column.id}`);\n const dataEntries = convertOrParsePColumnData(column.data);\n\n if (!dataEntries) {\n if (dontWaitAllData) continue;\n return undefined;\n }\n\n if (!isPartitionedDataInfoEntries(dataEntries))\n throw new Error(`Splitting requires Partitioned DataInfoEntries, but parsing resulted in ${dataEntries.type} for column ${column.id}`);\n\n const uniqueKeys = getUniquePartitionKeys(dataEntries);\n\n const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];\n if (maxSplitIdx >= dataEntries.partitionKeyLength)\n throw new Error(`Not enough partition keys (${dataEntries.partitionKeyLength}) for requested split axes (max index ${maxSplitIdx}) in column ${originalSpec.name}`);\n\n const axesLabels: (Record<string | number, string> | undefined)[] = splitAxisIdxs\n .map((idx) => this.findLabels(getAxisId(originalSpec.axesSpec[idx])));\n\n const keyCombinations: (string | number)[][] = [];\n const generateCombinations = (currentCombo: (string | number)[], sAxisIdx: number) => {\n if (sAxisIdx >= splitAxisIdxs.length) {\n keyCombinations.push([...currentCombo]);\n if (keyCombinations.length > 10000)\n throw new Error('Too many key combinations, aborting.');\n return;\n }\n const axisIdx = splitAxisIdxs[sAxisIdx];\n if (axisIdx >= uniqueKeys.length)\n throw new Error(`Axis index ${axisIdx} out of bounds for unique keys array (length ${uniqueKeys.length}) during split key generation for column ${column.id}`);\n const axisValues = uniqueKeys[axisIdx];\n if (!axisValues || axisValues.length === 0) {\n keyCombinations.length = 0; // No combinations possible if one axis has no keys\n return;\n }\n for (const val of axisValues) {\n currentCombo.push(val);\n generateCombinations(currentCombo, sAxisIdx + 1);\n currentCombo.pop();\n }\n };\n\n generateCombinations([], 0);\n\n if (keyCombinations.length === 0)\n continue;\n\n const newAxesSpec = [...originalSpec.axesSpec];\n const splitAxisOriginalIdxs = splitAxisIdxs.map((idx) => idx); // Keep original indices for axisId lookup\n // Remove axes in reverse order to maintain correct indices during removal\n for (let i = splitAxisIdxs.length - 1; i >= 0; i--) {\n newAxesSpec.splice(splitAxisIdxs[i], 1);\n }\n const adjustedSpec = { ...originalSpec, axesSpec: newAxesSpec };\n\n for (const keyCombo of keyCombinations) {\n const splitFilters: AxisFilterInfo[] = keyCombo.map((value, sAxisIdx) => {\n const axisIdx = splitAxisOriginalIdxs[sAxisIdx]; // Use original index for lookup\n const axisId = getAxisId(originalSpec.axesSpec[axisIdx]);\n const axisLabelMap = axesLabels[sAxisIdx];\n const label = axisLabelMap?.[value] ?? String(value);\n return { axisIdx, axisId, value: value as PValue, label };\n });\n\n intermediateResults.push({\n type: 'split',\n originalColumn: column,\n spec: originalSpec,\n adjustedSpec,\n dataEntries,\n axisFilters: splitFilters,\n });\n }\n } else {\n intermediateResults.push({\n type: 'direct',\n originalColumn: column,\n spec: originalSpec,\n adjustedSpec: originalSpec,\n });\n }\n }\n }\n\n if (intermediateResults.length === 0) return [];\n\n const labeledResults = deriveLabels(\n intermediateResults,\n (entry) => ({\n spec: entry.spec,\n suffixTrace: entry.type === 'split' ? splitFiltersToTrace(entry.axisFilters) : undefined,\n }),\n labelOps,\n );\n\n const result: (PColumnEntryWithLabel | PColumnEntryUniversal)[] = [];\n\n for (const { value: entry, label } of labeledResults) {\n const { originalColumn, spec: originalSpec } = entry;\n\n const axisFilters = entry.type === 'split' ? entry.axisFilters : undefined;\n const axisFiltersTuple = splitFiltersToAxisFilter(axisFilters);\n\n let finalId: SUniversalPColumnId | PObjectId;\n if (anchorCtx) finalId = anchorCtx.deriveS(originalSpec, axisFiltersTuple);\n else finalId = fallbackIdDeriver(originalColumn.id, axisFiltersTuple);\n\n let finalSpec = { ...entry.adjustedSpec };\n\n if (overrideLabelAnnotation) {\n finalSpec = {\n ...finalSpec,\n annotations: {\n ...(finalSpec.annotations ?? {}),\n 'pl7.app/label': label,\n },\n };\n }\n\n result.push({\n id: finalId,\n spec: finalSpec,\n data: () => entry.type === 'split'\n ? entriesToDataInfo(filterDataInfoEntries(entry.dataEntries, axisFiltersTuple!))\n : entry.originalColumn.data,\n label: label,\n });\n }\n\n return result;\n }\n\n public getColumns(\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | APColumnSelectorWithSplit[],\n opts: UniversalPColumnOpts): PColumn<PColumnDataUniversal>[] | undefined;\n public getColumns(\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | PColumnSelectorWithSplit | PColumnSelectorWithSplit[],\n opts?: UniversalPColumnOptsNoDeriver): PColumn<PColumnDataUniversal>[] | undefined;\n public getColumns(\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | APColumnSelectorWithSplit[],\n opts?: Optional<UniversalPColumnOpts, 'anchorCtx'>): PColumn<PColumnDataUniversal>[] | undefined {\n const entries = this.getUniversalEntries(predicateOrSelectors, {\n overrideLabelAnnotation: true, // default for getColumns\n ...(opts ?? {}),\n } as UniversalPColumnOpts);\n if (!entries) return undefined;\n\n const columns: PColumn<PColumnDataUniversal>[] = [];\n for (const entry of entries) {\n const data = entry.data();\n if (!data) {\n if (opts?.dontWaitAllData) continue;\n return undefined;\n }\n columns.push({\n id: entry.id,\n spec: entry.spec,\n data,\n });\n }\n\n return columns;\n }\n}\n","import {\n type SingleValuePredicateV2,\n type SingleValueEqualPredicate,\n type SingleValueOrPredicateV2,\n type SingleValueAndPredicateV2,\n type SingleValueNotPredicateV2,\n type PTableRecordSingleValueFilterV2,\n type PTableRecordFilter,\n} from '@milaboratories/pl-model-common';\n\nexport function patchInSetFilters(filters: PTableRecordSingleValueFilterV2[]): PTableRecordFilter[] {\n const inSetToOrEqual = (predicate: SingleValuePredicateV2): SingleValuePredicateV2 => {\n if (predicate.operator !== 'InSet') return predicate;\n return {\n operator: 'Or',\n operands: predicate.references.map((reference) => ({\n operator: 'Equal',\n reference,\n } satisfies SingleValueEqualPredicate)),\n } satisfies SingleValueOrPredicateV2;\n };\n\n const mapSingleValuePredicate = (filter: SingleValuePredicateV2, cb: (predicate: SingleValuePredicateV2) => SingleValuePredicateV2): SingleValuePredicateV2 => {\n const operator = filter.operator;\n switch (operator) {\n case 'And':\n return {\n ...filter,\n operands: filter.operands.map((operand) => mapSingleValuePredicate(operand, cb)),\n } satisfies SingleValueAndPredicateV2;\n case 'Or':\n return {\n ...filter,\n operands: filter.operands.map((operand) => mapSingleValuePredicate(operand, cb)),\n } satisfies SingleValueOrPredicateV2;\n case 'Not':\n return {\n ...filter,\n operand: mapSingleValuePredicate(filter.operand, cb),\n } satisfies SingleValueNotPredicateV2;\n default:\n return cb(filter);\n }\n };\n\n const mapFilter = (filter: PTableRecordSingleValueFilterV2, cb: (predicate: SingleValuePredicateV2) => SingleValuePredicateV2): PTableRecordSingleValueFilterV2 => {\n return {\n ...filter,\n predicate: mapSingleValuePredicate(filter.predicate, cb),\n } satisfies PTableRecordSingleValueFilterV2;\n };\n\n return filters.map((filter) => mapFilter(filter, inSetToOrEqual));\n}\n","import type {\n AnchoredPColumnSelector,\n AnyFunction,\n AxisId,\n DataInfo,\n Option,\n PColumn,\n PColumnSelector,\n PColumnSpec,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectId,\n PObjectSpec,\n PSpecPredicate,\n PTableDef,\n PTableHandle,\n PTableRecordFilter,\n PTableSorting,\n PlRef,\n ResolveAnchorsOptions,\n ResultCollection,\n SUniversalPColumnId,\n ValueOrError,\n} from '@milaboratories/pl-model-common';\nimport {\n AnchoredIdDeriver,\n ensurePColumn,\n extractAllColumns,\n isDataInfo,\n isPColumn,\n isPColumnSpec,\n isPlRef,\n mapDataInfo,\n mapPObjectData,\n mapPTableDef,\n mapValueInVOE,\n selectorsToPredicate,\n withEnrichments,\n} from '@milaboratories/pl-model-common';\nimport canonicalize from 'canonicalize';\nimport type { Optional } from 'utility-types';\nimport { getCfgRenderCtx } from '../internal';\nimport { TreeNodeAccessor, ifDef } from './accessor';\nimport type { FutureRef } from './future';\nimport type { AccessorHandle, GlobalCfgRenderCtx } from './internal';\nimport { MainAccessorName, StagingAccessorName } from './internal';\nimport { PColumnCollection, type AxisLabelProvider, type ColumnProvider } from './util/column_collection';\nimport type { LabelDerivationOps } from './util/label';\nimport { deriveLabels } from './util/label';\nimport type { APColumnSelectorWithSplit } from './util/split_selectors';\nimport { patchInSetFilters } from './util/pframe_upgraders';\n\nexport type PColumnDataUniversal = TreeNodeAccessor | DataInfo<TreeNodeAccessor> | PColumnValues;\n\n/**\n * Helper function to match domain objects\n * @param query Optional domain to match against\n * @param target Optional domain to match\n * @returns true if domains match, false otherwise\n */\nfunction matchDomain(query?: Record<string, string>, target?: Record<string, string>) {\n if (query === undefined) return target === undefined;\n if (target === undefined) return true;\n for (const k in target) {\n if (query[k] !== target[k]) return false;\n }\n return true;\n}\n\nexport type UniversalColumnOption = { label: string; value: SUniversalPColumnId };\n\n/**\n * Transforms PColumn data into the internal representation expected by the platform\n * @param data Data from a PColumn to transform\n * @returns Transformed data compatible with platform API\n */\nfunction transformPColumnData(data: PColumn<PColumnDataUniversal>):\nPColumn<PColumnValues | AccessorHandle | DataInfo<AccessorHandle>> {\n return mapPObjectData(data, (d) => {\n if (d instanceof TreeNodeAccessor) {\n return d.handle;\n } else if (isDataInfo(d)) {\n return mapDataInfo(d, (accessor) => accessor.handle);\n } else {\n return d;\n }\n });\n}\n\ntype UniversalPColumnOpts = {\n labelOps?: LabelDerivationOps;\n dontWaitAllData?: boolean;\n exclude?: AnchoredPColumnSelector | AnchoredPColumnSelector[];\n} & ResolveAnchorsOptions;\n\ntype GetOptionsOpts = {\n /**\n * If true, references returned by the method will contain `requireEnrichments` flag set to true.\n * If this reference is added to the block's args, it will communicate to the platform that the block\n * expects enrichments of the referenced block to be available in the context of the current block.\n */\n refsWithEnrichments?: boolean;\n /**\n * Label derivation options.\n * If provided, it will be used to derive labels for the options.\n * If not provided, labels will be derived using the default logic.\n */\n label?: ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps;\n};\n\nexport class ResultPool implements ColumnProvider, AxisLabelProvider {\n private readonly ctx: GlobalCfgRenderCtx = getCfgRenderCtx();\n\n /**\n * @deprecated use getOptions()\n */\n public calculateOptions(predicate: PSpecPredicate): Option[] {\n return this.ctx.calculateOptions(predicate);\n }\n\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n opts?: GetOptionsOpts,\n ): Option[];\n /** @deprecated wrap label ops with { label: <...> } */\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n label?: ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps,\n ): Option[];\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n opts?: GetOptionsOpts | ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps,\n ): Option[] {\n const predicate = typeof predicateOrSelector === 'function'\n ? predicateOrSelector\n : selectorsToPredicate(predicateOrSelector);\n const filtered = this.getSpecs().entries.filter((s) => predicate(s.obj));\n\n let labelOps: LabelDerivationOps | ((spec: PObjectSpec, ref: PlRef) => string) = {};\n let refsWithEnrichments: boolean = false;\n if (typeof opts !== 'undefined') {\n if (typeof opts === 'function') {\n labelOps = opts;\n } else if (typeof opts === 'object') {\n if ('includeNativeLabel' in opts || 'separator' in opts || 'addLabelAsSuffix' in opts) {\n labelOps = opts;\n } else {\n opts = opts as GetOptionsOpts;\n labelOps = opts.label ?? {};\n refsWithEnrichments = opts.refsWithEnrichments ?? false;\n }\n }\n }\n\n if (typeof labelOps === 'object')\n return deriveLabels(filtered, (o) => o.obj, labelOps ?? {}).map(({ value: { ref }, label }) => ({\n ref: withEnrichments(ref, refsWithEnrichments),\n label,\n }));\n else\n return filtered.map(({ ref, obj }) => ({\n ref: withEnrichments(ref, refsWithEnrichments),\n label: labelOps(obj, ref),\n }));\n }\n\n public resolveAnchorCtx(anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>): AnchoredIdDeriver | undefined {\n if (anchorsOrCtx instanceof AnchoredIdDeriver) return anchorsOrCtx;\n const resolvedAnchors: Record<string, PColumnSpec> = {};\n for (const [key, value] of Object.entries(anchorsOrCtx)) {\n if (isPlRef(value)) {\n const resolvedSpec = this.getPColumnSpecByRef(value);\n if (!resolvedSpec)\n return undefined;\n resolvedAnchors[key] = resolvedSpec;\n } else {\n resolvedAnchors[key] = value;\n }\n }\n return new AnchoredIdDeriver(resolvedAnchors);\n }\n\n /**\n * Returns columns that match the provided anchors and selectors. It applies axis filters and label derivation.\n *\n * @param anchorsOrCtx - Anchor context for column selection (same as in getCanonicalOptions)\n * @param predicateOrSelectors - Predicate or selectors for filtering columns (same as in getCanonicalOptions)\n * @param opts - Optional configuration for label generation and data waiting\n * @returns A PFrameHandle for the created PFrame, or undefined if any required data is missing\n */\n public getAnchoredPColumns(\n anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>,\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | APColumnSelectorWithSplit[],\n opts?: UniversalPColumnOpts,\n ): PColumn<PColumnDataUniversal>[] | undefined {\n const anchorCtx = this.resolveAnchorCtx(anchorsOrCtx);\n if (!anchorCtx) return undefined;\n return new PColumnCollection()\n .addColumnProvider(this)\n .addAxisLabelProvider(this)\n .getColumns(predicateOrSelectors, {\n ...opts,\n anchorCtx,\n });\n }\n\n /**\n * Calculates anchored identifier options for columns matching a given predicate and returns their\n * canonicalized representations.\n *\n * This function filters column specifications from the result pool that match the provided predicate,\n * creates a standardized AnchorCtx from the provided anchors, and generates a list of label-value\n * pairs for UI components (like dropdowns).\n *\n * @param anchorsOrCtx - Either:\n * - An existing AnchorCtx instance\n * - A record mapping anchor IDs to PColumnSpec objects\n * - A record mapping anchor IDs to PlRef objects (which will be resolved to PColumnSpec)\n * @param predicateOrSelectors - Either:\n * - A predicate function that takes a PColumnSpec and returns a boolean.\n * Only specs that return true will be included.\n * - An APColumnSelector object for declarative filtering, which will be\n * resolved against the provided anchors and matched using matchPColumn.\n * - An array of APColumnSelector objects - columns matching ANY selector\n * in the array will be included (OR operation).\n * @param opts - Optional configuration for label generation:\n * - labelOps: Optional configuration for label generation:\n * - includeNativeLabel: Whether to include native column labels\n * - separator: String to use between label parts (defaults to \" / \")\n * - addLabelAsSuffix: Whether to add labels as suffix instead of prefix\n * - dontWaitAllData: Whether to skip columns that don't have all data (if not set, will return undefined,\n * if at least one column that requires splitting is missing data)\n * @returns An array of objects with `label` (display text) and `value` (anchored ID string) properties,\n * or undefined if any PlRef resolution fails.\n */\n getCanonicalOptions(\n anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>,\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | APColumnSelectorWithSplit[],\n opts?: UniversalPColumnOpts,\n ): { label: string; value: SUniversalPColumnId }[] | undefined {\n const anchorCtx = this.resolveAnchorCtx(anchorsOrCtx);\n if (!anchorCtx) return undefined;\n const entries = new PColumnCollection()\n .addColumnProvider(this)\n .addAxisLabelProvider(this)\n .getUniversalEntries(predicateOrSelectors, {\n ...opts,\n anchorCtx,\n });\n if (!entries) return undefined;\n return entries.map((item) => ({\n value: item.id,\n label: item.label,\n }));\n }\n\n /**\n * @deprecated use getData()\n */\n public getDataFromResultPool(): ResultCollection<PObject<TreeNodeAccessor>> {\n return this.getData();\n }\n\n public getData(): ResultCollection<PObject<TreeNodeAccessor>> {\n const result = this.ctx.getDataFromResultPool();\n return {\n isComplete: result.isComplete,\n entries: result.entries.map((e) => ({\n ref: e.ref,\n obj: {\n ...e.obj,\n data: new TreeNodeAccessor(e.obj.data, [e.ref.blockId, e.ref.name]),\n },\n })),\n };\n }\n\n /**\n * @deprecated use getDataWithErrors()\n */\n public getDataWithErrorsFromResultPool(): ResultCollection<\n Optional<PObject<ValueOrError<TreeNodeAccessor, Error>>, 'id'>\n > {\n return this.getDataWithErrors();\n }\n\n public getDataWithErrors(): ResultCollection<\n Optional<PObject<ValueOrError<TreeNodeAccessor, Error>>, 'id'>\n > {\n const result = this.ctx.getDataWithErrorsFromResultPool();\n return {\n isComplete: result.isComplete,\n entries: result.entries.map((e) => ({\n ref: e.ref,\n obj: {\n ...e.obj,\n data: mapValueInVOE(\n e.obj.data,\n (handle) => new TreeNodeAccessor(handle, [e.ref.blockId, e.ref.name]),\n ),\n },\n })),\n };\n }\n\n /**\n * @deprecated use getSpecs()\n */\n public getSpecsFromResultPool(): ResultCollection<PObjectSpec> {\n return this.getSpecs();\n }\n\n public getSpecs(): ResultCollection<PObjectSpec> {\n return this.ctx.getSpecsFromResultPool();\n }\n\n /**\n * @param ref a Ref\n * @returns data associated with the ref\n */\n public getDataByRef(ref: PlRef): PObject<TreeNodeAccessor> | undefined {\n // @TODO remove after 1 Jan 2025; forward compatibility\n if (typeof this.ctx.getDataFromResultPoolByRef === 'undefined')\n return this.getData().entries.find(\n (f) => f.ref.blockId === ref.blockId && f.ref.name === ref.name,\n )?.obj;\n const data = this.ctx.getDataFromResultPoolByRef(ref.blockId, ref.name); // Keep original call\n // Need to handle undefined case before mapping\n if (!data) return undefined;\n return mapPObjectData(\n data,\n (handle) => new TreeNodeAccessor(handle, [ref.blockId, ref.name]),\n );\n }\n\n /**\n * Returns data associated with the ref ensuring that it is a p-column.\n * @param ref a Ref\n * @returns p-column associated with the ref\n */\n public getPColumnByRef(ref: PlRef): PColumn<TreeNodeAccessor> | undefined {\n const data = this.getDataByRef(ref);\n if (!data) return undefined;\n return ensurePColumn(data);\n }\n\n /**\n * Returns spec associated with the ref ensuring that it is a p-column spec.\n * @param ref a Ref\n * @returns p-column spec associated with the ref\n */\n public getPColumnSpecByRef(ref: PlRef): PColumnSpec | undefined {\n const spec = this.getSpecByRef(ref);\n if (!spec) return undefined;\n if (!isPColumnSpec(spec)) throw new Error(`not a PColumn spec (kind = ${spec.kind})`);\n return spec;\n }\n\n /**\n * @param ref a Ref\n * @returns object spec associated with the ref\n */\n public getSpecByRef(ref: PlRef): PObjectSpec | undefined {\n return this.ctx.getSpecFromResultPoolByRef(ref.blockId, ref.name);\n }\n\n /**\n * @param spec object specification\n * @returns array of data objects with compatible specs\n * @deprecated delete this method after Jan 1, 2025\n */\n public findDataWithCompatibleSpec(spec: PColumnSpec): PObject<TreeNodeAccessor>[] {\n const result: PObject<TreeNodeAccessor>[] = [];\n\n out: for (const data of this.getData().entries) {\n if (!isPColumnSpec(data.obj.spec)) {\n continue;\n }\n\n const oth = data.obj.spec;\n\n if (spec.name !== oth.name) {\n continue;\n }\n\n if (spec.valueType !== oth.valueType) {\n continue;\n }\n\n if (spec.axesSpec.length !== oth.axesSpec.length) {\n continue;\n }\n\n if (!matchDomain(spec.domain, oth.domain)) {\n continue;\n }\n\n for (let i = 0; i < spec.axesSpec.length; ++i) {\n const qAx = spec.axesSpec[i];\n const tAx = oth.axesSpec[i];\n if (qAx.name !== tAx.name) {\n continue out;\n }\n if (qAx.type !== tAx.type) {\n continue out;\n }\n if (!matchDomain(qAx.domain, tAx.domain)) {\n continue out;\n }\n }\n\n result.push(data.obj);\n }\n return result;\n }\n\n /**\n * Find labels data for a given axis id. It will search for a label column and return its data as a map.\n * @returns a map of axis value => label\n */\n public findLabels(axis: AxisId): Record<string | number, string> | undefined {\n const dataPool = this.getData();\n for (const column of dataPool.entries) {\n if (!isPColumn(column.obj)) continue;\n\n const spec = column.obj.spec;\n if (\n spec.name === 'pl7.app/label'\n && spec.axesSpec.length === 1\n && spec.axesSpec[0].name === axis.name\n && spec.axesSpec[0].type === axis.type\n && matchDomain(axis.domain, spec.axesSpec[0].domain)\n ) {\n if (column.obj.data.resourceType.name !== 'PColumnData/Json') {\n throw Error(`Expected JSON column for labels, got: ${column.obj.data.resourceType.name}`);\n }\n const labels: Record<string | number, string> = Object.fromEntries(\n Object.entries(\n column.obj.data.getDataAsJson<{\n data: Record<string | number, string>;\n }>().data,\n ).map((e) => [JSON.parse(e[0])[0], e[1]]),\n );\n\n return labels;\n }\n }\n return undefined;\n }\n\n /**\n * Selects columns based on the provided selectors, returning PColumn objects\n * with lazily loaded data.\n *\n * @param selectors - A predicate function, a single selector, or an array of selectors.\n * @returns An array of PColumn objects matching the selectors. Data is loaded on first access.\n */\n public selectColumns(\n selectors: ((spec: PColumnSpec) => boolean) | PColumnSelector | PColumnSelector[],\n ): PColumn<TreeNodeAccessor | undefined>[] {\n const predicate = typeof selectors === 'function' ? selectors : selectorsToPredicate(selectors);\n\n const matchedSpecs = this.getSpecs().entries.filter(({ obj: spec }) => {\n if (!isPColumnSpec(spec)) return false;\n return predicate(spec);\n });\n\n // Map specs to PColumn objects with lazy data loading\n return matchedSpecs.map(({ ref, obj: spec }) => {\n // Type assertion needed because filter ensures it's PColumnSpec\n const pcolumnSpec = spec as PColumnSpec;\n let _cachedData: TreeNodeAccessor | undefined | null = null; // Use null to distinguish initial state from undefined result\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this; // Capture 'this' for use inside the getter\n\n return {\n id: canonicalize(ref) as PObjectId,\n spec: pcolumnSpec,\n get data(): TreeNodeAccessor | undefined {\n if (_cachedData !== null) {\n return _cachedData; // Return cached data (could be undefined if fetch failed)\n }\n\n _cachedData = self.getPColumnByRef(ref)?.data;\n return _cachedData;\n },\n } satisfies PColumn<TreeNodeAccessor | undefined>; // Cast needed because 'data' is a getter\n });\n }\n\n /**\n * Find labels data for a given axis id of a p-column.\n * @returns a map of axis value => label\n */\n public findLabelsForColumnAxis(column: PColumnSpec, axisIdx: number): Record<string | number, string> | undefined {\n const labels = this.findLabels(column.axesSpec[axisIdx]);\n if (!labels) return undefined;\n const axisKeys = column.annotations?.['pl7.app/axisKeys/' + axisIdx];\n if (axisKeys !== undefined) {\n const keys = JSON.parse(axisKeys) as string[];\n return Object.fromEntries(keys.map((key) => {\n return [key, labels[key] ?? 'Unlabelled'];\n }));\n } else {\n return labels;\n }\n }\n}\n\n/** Main entry point to the API available within model lambdas (like outputs, sections, etc..) */\nexport class RenderCtx<Args, UiState> {\n private readonly ctx: GlobalCfgRenderCtx;\n\n constructor() {\n this.ctx = getCfgRenderCtx();\n }\n\n private _argsCache?: { v: Args };\n\n public get args(): Args {\n if (this._argsCache === undefined) {\n const raw = this.ctx.args;\n const value = typeof raw === 'function' ? raw() : raw;\n this._argsCache = { v: JSON.parse(value) };\n }\n return this._argsCache.v;\n }\n\n private _uiStateCache?: { v: UiState };\n\n public get uiState(): UiState {\n if (this._uiStateCache === undefined) {\n const raw = this.ctx.uiState;\n const value = typeof raw === 'function' ? raw() : raw;\n this._uiStateCache = { v: value ? JSON.parse(value) : ({} as UiState) };\n }\n return this._uiStateCache.v;\n }\n\n // lazy rendering because this feature is rarely used\n private _activeArgsCache?: { v?: Args };\n\n /**\n * Returns args snapshot the block was executed for (i.e. when \"Run\" button was pressed).\n * Returns undefined, if block was never executed or stopped mid-way execution, so that the result was cleared.\n * */\n public get activeArgs(): Args | undefined {\n if (this._activeArgsCache === undefined) {\n const raw = this.ctx.activeArgs;\n const value = typeof raw === 'function' ? raw() : raw;\n this._activeArgsCache = {\n v: value ? JSON.parse(value) : undefined,\n };\n }\n return this._activeArgsCache.v;\n }\n\n // /** Can be used to determine features provided by the desktop instance. */\n // public get featureFlags() {\n // return this.ctx.featureFlags;\n // }\n\n private getNamedAccessor(name: string): TreeNodeAccessor | undefined {\n return ifDef(\n this.ctx.getAccessorHandleByName(name),\n (accessor) => new TreeNodeAccessor(accessor, [name]),\n );\n }\n\n public get prerun(): TreeNodeAccessor | undefined {\n return this.getNamedAccessor(StagingAccessorName);\n }\n\n public get outputs(): TreeNodeAccessor | undefined {\n return this.getNamedAccessor(MainAccessorName);\n }\n\n public readonly resultPool = new ResultPool();\n\n /**\n * Find labels data for a given axis id. It will search for a label column and return its data as a map.\n * @returns a map of axis value => label\n * @deprecated Use resultPool.findLabels instead\n */\n public findLabels(axis: AxisId): Record<string | number, string> | undefined {\n return this.resultPool.findLabels(axis);\n }\n\n private verifyInlineAndExplicitColumnsSupport(columns: PColumn<PColumnDataUniversal>[]) {\n const hasInlineColumns = columns.some((c) => !(c.data instanceof TreeNodeAccessor) || isDataInfo(c.data)); // Updated check for DataInfo\n const inlineColumnsSupport = this.ctx.featureFlags?.inlineColumnsSupport === true;\n if (hasInlineColumns && !inlineColumnsSupport) throw Error(`Inline or explicit columns not supported`); // Combined check\n\n // Removed redundant explicitColumns check\n }\n\n private patchPTableDef(def: PTableDef<PColumn<PColumnDataUniversal>>): PTableDef<PColumn<PColumnDataUniversal>> {\n if (!this.ctx.featureFlags?.pTablePartitionFiltersSupport) {\n // For old desktop move all partition filters to filters field as it doesn't read partitionFilters field\n def = {\n ...def,\n partitionFilters: [],\n filters: [...def.partitionFilters, ...def.filters],\n };\n }\n if (!this.ctx.featureFlags?.pFrameInSetFilterSupport) {\n def = {\n ...def,\n partitionFilters: patchInSetFilters(def.partitionFilters),\n filters: patchInSetFilters(def.filters),\n };\n }\n return def;\n }\n\n // TODO remove all non-PColumn fields\n public createPFrame(def: PFrameDef<PColumnDataUniversal>): PFrameHandle {\n this.verifyInlineAndExplicitColumnsSupport(def);\n return this.ctx.createPFrame(\n def.map((c) => transformPColumnData(c)),\n );\n }\n\n // TODO remove all non-PColumn fields\n public createPTable(def: PTableDef<PColumn<PColumnDataUniversal>>): PTableHandle;\n public createPTable(def: {\n columns: PColumn<PColumnDataUniversal>[];\n filters?: PTableRecordFilter[];\n /** Table sorting */\n sorting?: PTableSorting[];\n }): PTableHandle;\n public createPTable(\n def:\n | PTableDef<PColumn<PColumnDataUniversal>>\n | {\n columns: PColumn<PColumnDataUniversal>[];\n filters?: PTableRecordFilter[];\n /** Table sorting */\n sorting?: PTableSorting[];\n },\n ): PTableHandle {\n let rawDef: PTableDef<PColumn<PColumnDataUniversal>>;\n if ('columns' in def) {\n rawDef = this.patchPTableDef({\n src: {\n type: 'full',\n entries: def.columns.map((c) => ({ type: 'column', column: c })),\n },\n partitionFilters: def.filters ?? [],\n filters: [],\n sorting: def.sorting ?? [],\n });\n } else {\n rawDef = this.patchPTableDef(def);\n }\n this.verifyInlineAndExplicitColumnsSupport(extractAllColumns(rawDef.src));\n return this.ctx.createPTable(\n mapPTableDef(rawDef, (po) => transformPColumnData(po)),\n );\n }\n\n /** @deprecated scheduled for removal from SDK */\n public getBlockLabel(blockId: string): string {\n return this.ctx.getBlockLabel(blockId);\n }\n\n public getCurrentUnstableMarker(): string | undefined {\n return this.ctx.getCurrentUnstableMarker();\n }\n\n public logInfo(msg: string): void {\n this.ctx.logInfo(msg);\n }\n\n public logWarn(msg: string): void {\n this.ctx.logWarn(msg);\n }\n\n public logError(msg: string): void {\n this.ctx.logError(msg);\n }\n}\n\nexport type RenderFunction<Args = unknown, UiState = unknown, Ret = unknown> = (\n rCtx: RenderCtx<Args, UiState>\n) => Ret;\n\nexport type UnwrapFutureRef<K> =\n K extends FutureRef<infer T>\n ? T\n : K extends bigint | boolean | null | number | string | symbol | undefined\n ? K\n : { [key in keyof K]: UnwrapFutureRef<K[key]> };\n\nexport type InferRenderFunctionReturn<RF extends AnyFunction> = RF extends (...args: any) => infer R\n ? UnwrapFutureRef<R>\n : never;\n","import { version } from '../package.json';\nexport const PlatformaSDKVersion = version;\n","import type { TypedConfig } from '../config';\nimport type { ConfigRenderLambda } from './lambdas';\n\nexport function isConfigLambda(\n cfgOrFh: TypedConfigOrConfigLambda,\n): cfgOrFh is ConfigRenderLambda {\n return (cfgOrFh as any).__renderLambda === true;\n}\n\nexport type TypedConfigOrConfigLambda = TypedConfig | ConfigRenderLambda;\n\n/** @deprecated */\nexport type TypedConfigOrString = TypedConfig | string;\n","import { extractConfigGeneric, type BlockConfigContainer } from '@milaboratories/pl-model-common';\nimport type { TypedConfigOrConfigLambda, TypedConfigOrString } from './types';\nimport { isConfigLambda } from './types';\nimport type { BlockConfig } from './v3';\n\nexport function downgradeCfgOrLambda(data: TypedConfigOrConfigLambda): TypedConfigOrString;\nexport function downgradeCfgOrLambda(\n data: TypedConfigOrConfigLambda | undefined\n): TypedConfigOrString | undefined;\nexport function downgradeCfgOrLambda(\n data: TypedConfigOrConfigLambda | undefined,\n): TypedConfigOrString | undefined {\n if (data === undefined) return undefined;\n if (isConfigLambda(data)) return data.handle;\n return data;\n}\n\nexport function extractConfig(cfg: BlockConfigContainer): BlockConfig {\n return extractConfigGeneric(cfg) as BlockConfig;\n}\n","import type { BlockRenderingMode, BlockSection, ValueOrErrors, AnyFunction, PlRef, BlockCodeKnownFeatureFlags, BlockConfigContainer } from '@milaboratories/pl-model-common';\nimport type { Checked, ConfigResult, TypedConfig } from './config';\nimport { getImmediate } from './config';\nimport { getPlatformaInstance, isInUI, tryRegisterCallback } from './internal';\nimport type { Platforma, PlatformaApiVersion, PlatformaV1, PlatformaV2 } from './platforma';\nimport type { InferRenderFunctionReturn, RenderFunction } from './render';\nimport { RenderCtx } from './render';\nimport { PlatformaSDKVersion } from './version';\nimport type {\n TypedConfigOrConfigLambda,\n ConfigRenderLambda,\n StdCtxArgsOnly,\n DeriveHref,\n ResolveCfgType,\n ExtractFunctionHandleReturn,\n ConfigRenderLambdaFlags,\n} from './bconfig';\nimport {\n downgradeCfgOrLambda,\n} from './bconfig';\n\ntype SectionsExpectedType = readonly BlockSection[];\n\ntype SectionsCfgChecked<Cfg extends TypedConfig, Args, UiState> = Checked<\n Cfg,\n ConfigResult<Cfg, StdCtxArgsOnly<Args, UiState>> extends SectionsExpectedType ? true : false\n>;\n\n// TODO (Unused type in code)\n// type SectionsRFChecked<RF extends Function> = Checked<\n// RF,\n// InferRenderFunctionReturn<RF> extends SectionsExpectedType ? true : false\n// >;\n\ntype InputsValidExpectedType = boolean;\n\ntype InputsValidCfgChecked<Cfg extends TypedConfig, Args, UiState> = Checked<\n Cfg,\n ConfigResult<Cfg, StdCtxArgsOnly<Args, UiState>> extends InputsValidExpectedType ? true : false\n>;\n\n// TODO (Unused type in code)\n// type InputsValidRFChecked<RF extends Function> = Checked<\n// RF,\n// InferRenderFunctionReturn<RF> extends InputsValidExpectedType ? true : false\n// >;\n\ntype NoOb = Record<string, never>;\n\n/** Main entry point that each block should use in it's \"config\" module. Don't forget\n * to call {@link done()} at the end of configuration. Value returned by this builder must be\n * exported as constant with name \"platforma\" from the \"config\" module. */\nexport class BlockModel<\n Args,\n OutputsCfg extends Record<string, TypedConfigOrConfigLambda>,\n UiState,\n Href extends `/${string}` = '/',\n> {\n private constructor(\n private readonly _renderingMode: BlockRenderingMode,\n private readonly _initialArgs: Args | undefined,\n private readonly _initialUiState: UiState,\n private readonly _outputs: OutputsCfg,\n private readonly _inputsValid: TypedConfigOrConfigLambda,\n private readonly _sections: TypedConfigOrConfigLambda,\n private readonly _title: ConfigRenderLambda | undefined,\n private readonly _enrichmentTargets: ConfigRenderLambda | undefined,\n private readonly _featureFlags: BlockCodeKnownFeatureFlags,\n ) {}\n\n public static readonly INITIAL_BLOCK_FEATURE_FLAGS: BlockCodeKnownFeatureFlags = {\n supportsLazyState: true,\n requiresUIAPIVersion: 1,\n requiresModelAPIVersion: 1,\n };\n\n /** Initiates configuration builder */\n public static create(renderingMode: BlockRenderingMode): BlockModel<NoOb, {}, NoOb>;\n /** Initiates configuration builder */\n public static create(): BlockModel<NoOb, {}, NoOb>;\n /**\n * Initiates configuration builder\n * @deprecated use create method without generic parameter\n */\n public static create<Args>(renderingMode: BlockRenderingMode): BlockModel<Args, {}, NoOb>;\n /**\n * Initiates configuration builder\n * @deprecated use create method without generic parameter\n */\n public static create<Args>(): BlockModel<Args, {}, NoOb>;\n public static create(renderingMode: BlockRenderingMode = 'Heavy'): BlockModel<NoOb, {}, NoOb> {\n return new BlockModel<NoOb, {}, NoOb>(\n renderingMode,\n undefined,\n {},\n {},\n getImmediate(true),\n getImmediate([]),\n undefined,\n undefined,\n { ...BlockModel.INITIAL_BLOCK_FEATURE_FLAGS },\n );\n }\n\n /**\n * Add output cell to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param cfg configuration describing how to render cell value from the blocks\n * workflow outputs\n * @deprecated use lambda-based API\n * */\n public output<const Key extends string, const Cfg extends TypedConfig>(\n key: Key,\n cfg: Cfg\n ): BlockModel<Args, OutputsCfg & { [K in Key]: Cfg }, UiState, Href>;\n /**\n * Add output cell to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param rf callback calculating output value using context, that allows to access\n * workflows outputs and interact with platforma drivers\n * @param flags additional flags that may alter lambda rendering procedure\n * */\n public output<const Key extends string, const RF extends RenderFunction<Args, UiState>>(\n key: Key,\n rf: RF,\n flags?: ConfigRenderLambdaFlags\n ): BlockModel<\n Args,\n OutputsCfg & { [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> },\n UiState,\n Href\n >;\n public output(\n key: string,\n cfgOrRf: TypedConfig | AnyFunction,\n flags: ConfigRenderLambdaFlags = {},\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n if (typeof cfgOrRf === 'function') {\n const handle = `output#${key}`;\n tryRegisterCallback(handle, () => cfgOrRf(new RenderCtx()));\n return new BlockModel(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n {\n ...this._outputs,\n [key]: {\n __renderLambda: true,\n handle,\n ...flags,\n } satisfies ConfigRenderLambda,\n },\n this._inputsValid,\n this._sections,\n this._title,\n this._enrichmentTargets,\n this._featureFlags,\n );\n } else\n return new BlockModel(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n {\n ...this._outputs,\n [key]: cfgOrRf,\n },\n this._inputsValid,\n this._sections,\n this._title,\n this._enrichmentTargets,\n this._featureFlags,\n );\n }\n\n /** Shortcut for {@link output} with retentive flag set to true. */\n public retentiveOutput<const Key extends string, const RF extends RenderFunction<Args, UiState>>(\n key: Key,\n rf: RF,\n ): BlockModel<\n Args,\n OutputsCfg & { [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> },\n UiState,\n Href\n > {\n return this.output(key, rf, { retentive: true });\n }\n\n /** Sets custom configuration predicate on the block args at which block can be executed\n * @deprecated use lambda-based API */\n public argsValid<Cfg extends TypedConfig>(\n cfg: Cfg & InputsValidCfgChecked<Cfg, Args, UiState>\n ): BlockModel<Args, OutputsCfg, UiState, Href>;\n /** Sets custom configuration predicate on the block args at which block can be executed */\n public argsValid<RF extends RenderFunction<Args, UiState, boolean>>(\n rf: RF\n ): BlockModel<Args, OutputsCfg, UiState, Href>;\n public argsValid(\n cfgOrRf: TypedConfig | AnyFunction,\n ): BlockModel<Args, OutputsCfg, UiState, `/${string}`> {\n if (typeof cfgOrRf === 'function') {\n tryRegisterCallback('inputsValid', () => cfgOrRf(new RenderCtx()));\n return new BlockModel<Args, OutputsCfg, UiState>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n {\n __renderLambda: true,\n handle: 'inputsValid',\n } satisfies ConfigRenderLambda,\n this._sections,\n this._title,\n this._enrichmentTargets,\n this._featureFlags,\n );\n } else\n return new BlockModel<Args, OutputsCfg, UiState>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n cfgOrRf,\n this._sections,\n this._title,\n this._enrichmentTargets,\n this._featureFlags,\n );\n }\n\n /** Sets the config to generate list of section in the left block overviews panel\n * @deprecated use lambda-based API */\n public sections<const S extends SectionsExpectedType>(\n rf: S\n ): BlockModel<Args, OutputsCfg, UiState, DeriveHref<S>>;\n /** Sets the config to generate list of section in the left block overviews panel */\n public sections<\n const Ret extends SectionsExpectedType,\n const RF extends RenderFunction<Args, UiState, Ret>,\n >(rf: RF): BlockModel<Args, OutputsCfg, UiState, DeriveHref<ReturnType<RF>>>;\n public sections<const Cfg extends TypedConfig>(\n cfg: Cfg & SectionsCfgChecked<Cfg, Args, UiState>\n ): BlockModel<\n Args,\n OutputsCfg,\n UiState,\n DeriveHref<ConfigResult<Cfg, StdCtxArgsOnly<Args, UiState>>>\n >;\n public sections(\n arrOrCfgOrRf: SectionsExpectedType | TypedConfig | AnyFunction,\n ): BlockModel<Args, OutputsCfg, UiState, `/${string}`> {\n if (Array.isArray(arrOrCfgOrRf)) {\n return this.sections(getImmediate(arrOrCfgOrRf));\n } else if (typeof arrOrCfgOrRf === 'function') {\n tryRegisterCallback('sections', () => arrOrCfgOrRf(new RenderCtx()));\n return new BlockModel<Args, OutputsCfg, UiState>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n { __renderLambda: true, handle: 'sections' } as ConfigRenderLambda,\n this._title,\n this._enrichmentTargets,\n this._featureFlags,\n );\n } else\n return new BlockModel<Args, OutputsCfg, UiState>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n arrOrCfgOrRf as TypedConfig,\n this._title,\n this._enrichmentTargets,\n this._featureFlags,\n );\n }\n\n /** Sets a rendering function to derive block title, shown for the block in the left blocks-overview panel. */\n public title(\n rf: RenderFunction<Args, UiState, string>,\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n tryRegisterCallback('title', () => rf(new RenderCtx()));\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n this._sections,\n { __renderLambda: true, handle: 'title' } as ConfigRenderLambda,\n this._enrichmentTargets,\n this._featureFlags,\n );\n }\n\n /**\n * Sets initial args for the block, this value must be specified.\n * @deprecated use {@link withArgs}\n * */\n public initialArgs(value: Args): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n value,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n this._sections,\n this._title,\n this._enrichmentTargets,\n this._featureFlags,\n );\n }\n\n /** Sets initial args for the block, this value must be specified. */\n public withArgs<Args>(initialValue: Args): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n initialValue,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n this._sections,\n this._title,\n this._enrichmentTargets,\n this._featureFlags,\n );\n }\n\n /** Defines type and sets initial value for block UiState. */\n public withUiState<UiState>(initialValue: UiState): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n this._initialArgs,\n initialValue,\n this._outputs,\n this._inputsValid,\n this._sections,\n this._title,\n this._enrichmentTargets,\n this._featureFlags,\n );\n }\n\n /** Sets or overrides feature flags for the block. */\n public withFeatureFlags(flags: Partial<BlockCodeKnownFeatureFlags>): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n this._sections,\n this._title,\n this._enrichmentTargets,\n { ...this._featureFlags, ...flags },\n );\n }\n\n /**\n * Defines how to derive list of upstream references this block is meant to enrich with its exports from block args.\n * Influences dependency graph construction.\n */\n public enriches(\n lambda: (args: Args) => PlRef[],\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n tryRegisterCallback('enrichmentTargets', lambda);\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n this._sections,\n this._title,\n { __renderLambda: true, handle: 'enrichmentTargets' } as ConfigRenderLambda,\n this._featureFlags,\n );\n }\n\n public done(apiVersion?: 1): PlatformaV1<\n Args,\n InferOutputsFromConfigs<Args, OutputsCfg, UiState>,\n UiState,\n Href\n >;\n\n public done(apiVersion: 2): PlatformaV2<\n Args,\n InferOutputsFromConfigs<Args, OutputsCfg, UiState>,\n UiState,\n Href\n >;\n\n /** Renders all provided block settings into a pre-configured platforma API\n * instance, that can be used in frontend to interact with block state, and\n * other features provided by the platforma to the block. */\n public done(apiVersion?: PlatformaApiVersion): Platforma<\n Args,\n InferOutputsFromConfigs<Args, OutputsCfg, UiState>,\n UiState,\n Href\n > {\n const requiresUIAPIVersion = apiVersion ?? 1;\n return this.withFeatureFlags({\n ...this._featureFlags,\n requiresUIAPIVersion,\n })._done(requiresUIAPIVersion);\n }\n\n public _done(apiVersion: PlatformaApiVersion): Platforma<\n Args,\n InferOutputsFromConfigs<Args, OutputsCfg, UiState>,\n UiState,\n Href\n > {\n if (this._initialArgs === undefined) throw new Error('Initial arguments not set.');\n\n const config: BlockConfigContainer = {\n v3: {\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this._renderingMode,\n initialArgs: this._initialArgs,\n initialUiState: this._initialUiState,\n inputsValid: this._inputsValid,\n sections: this._sections,\n title: this._title,\n outputs: this._outputs,\n enrichmentTargets: this._enrichmentTargets,\n featureFlags: this._featureFlags,\n },\n\n // fields below are added to allow previous desktop versions read generated configs\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this._renderingMode,\n initialArgs: this._initialArgs,\n inputsValid: downgradeCfgOrLambda(this._inputsValid),\n sections: downgradeCfgOrLambda(this._sections),\n outputs: Object.fromEntries(\n Object.entries(this._outputs).map(([key, value]) => [key, downgradeCfgOrLambda(value)]),\n ),\n };\n\n globalThis.platformaApiVersion = apiVersion;\n\n if (!isInUI())\n // we are in the configuration rendering routine, not in actual UI\n return { config } as any;\n // normal operation inside the UI\n else return getPlatformaInstance({ sdkVersion: PlatformaSDKVersion, apiVersion: platformaApiVersion }) as any;\n }\n}\n\nexport type InferOutputType<CfgOrFH, Args, UiState> = CfgOrFH extends TypedConfig\n ? ResolveCfgType<CfgOrFH, Args, UiState>\n : CfgOrFH extends ConfigRenderLambda\n ? ExtractFunctionHandleReturn<CfgOrFH>\n : never;\n\ntype InferOutputsFromConfigs<\n Args,\n OutputsCfg extends Record<string, TypedConfigOrConfigLambda>,\n UiState,\n> = {\n [Key in keyof OutputsCfg]: ValueOrErrors<InferOutputType<OutputsCfg[Key], Args, UiState>>;\n};\n","import type {\n AxisId,\n AxisSpec,\n CanonicalizedJson,\n DataInfo,\n ListOptionBase,\n PColumn,\n PColumnIdAndSpec,\n PColumnSpec,\n PColumnValues,\n PObjectId,\n PTableColumnId,\n PTableColumnIdAxis,\n PTableColumnIdColumn,\n PTableColumnSpec,\n PTableDef,\n PTableHandle,\n PTableRecordFilter,\n PTableRecordSingleValueFilterV2,\n PTableSorting,\n} from '@milaboratories/pl-model-common';\nimport {\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n matchAxisId,\n} from '@milaboratories/pl-model-common';\nimport type {\n AxisLabelProvider,\n ColumnProvider,\n PColumnDataUniversal,\n RenderCtx,\n} from '../render';\nimport {\n PColumnCollection,\n TreeNodeAccessor,\n} from '../render';\nimport { isLinkerColumn } from './PFrameForGraphs';\n\nexport type PlTableColumnId = {\n /** Original column spec */\n source: PTableColumnSpec;\n /** Column spec with labeled axes replaced by label columns */\n labeled: PTableColumnSpec;\n};\n\nexport type PlTableColumnIdJson = CanonicalizedJson<PlTableColumnId>;\n\nexport type PlDataTableGridStateCore = {\n /** Includes column ordering */\n columnOrder?: {\n /** All colIds in order */\n orderedColIds: PlTableColumnIdJson[];\n };\n /** Includes current sort columns and direction */\n sort?: {\n /** Sorted columns and directions in order */\n sortModel: {\n /** Column Id to apply the sort to. */\n colId: PlTableColumnIdJson;\n /** Sort direction */\n sort: 'asc' | 'desc';\n }[];\n };\n /** Includes column visibility */\n columnVisibility?: {\n /** All colIds which were hidden */\n hiddenColIds: PlTableColumnIdJson[];\n };\n};\n\nexport type PlDataTableSheet = {\n /** spec of the axis to use */\n axis: AxisSpec;\n /** options to show in the filter dropdown */\n options: ListOptionBase<string | number>[];\n /** default (selected) value */\n defaultValue?: string | number;\n};\n\nexport type PlDataTableSheetState = {\n /** id of the axis */\n axisId: AxisId;\n /** selected value */\n value: string | number;\n};\n\n/**\n * PlDataTableV2 persisted state\n */\nexport type PlDataTableStateV2 =\n // Old versions of the state\n | {\n // no version\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: 'asc' | 'desc';\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sourceId?: string;\n sheets?: Record<CanonicalizedJson<AxisId>, string | number>;\n };\n pTableParams?: {\n sorting?: PTableSorting[];\n filters?: PTableRecordFilter[];\n };\n }\n | {\n version: 2;\n stateCache: {\n sourceId: string;\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: 'asc' | 'desc';\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n };\n sheetsState: PlDataTableSheetState[];\n }[];\n pTableParams: {\n hiddenColIds: PObjectId[] | null;\n filters: PTableRecordFilter[];\n sorting: PTableSorting[];\n };\n }\n | {\n version: 3;\n stateCache: {\n sourceId: string;\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: 'asc' | 'desc';\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n };\n sheetsState: PlDataTableSheetState[];\n filtersState: PlDataTableFilterState[];\n }[];\n pTableParams: PTableParamsV2;\n }\n // Normalized state\n | PlDataTableStateV2Normalized;\n\nexport type PlDataTableStateV2CacheEntry = {\n /** DataSource identifier for state management */\n sourceId: string;\n /** Internal ag-grid state */\n gridState: PlDataTableGridStateCore;\n /** Sheets state */\n sheetsState: PlDataTableSheetState[];\n /** Filters state */\n filtersState: PlDataTableFilterState[];\n};\n\nexport type PTableParamsV2 =\n | {\n sourceId: null;\n hiddenColIds: null;\n partitionFilters: [];\n filters: [];\n sorting: [];\n }\n | {\n sourceId: string;\n hiddenColIds: PObjectId[] | null;\n partitionFilters: PTableRecordFilter[];\n filters: PTableRecordFilter[];\n sorting: PTableSorting[];\n };\n\nexport type PlDataTableStateV2Normalized = {\n /** Version for upgrades */\n version: 4;\n /** Internal states, LRU cache for 5 sourceId-s */\n stateCache: PlDataTableStateV2CacheEntry[];\n /** PTable params derived from the cache state for the current sourceId */\n pTableParams: PTableParamsV2;\n};\n\nexport function makeDefaultPTableParams(): PTableParamsV2 {\n return {\n sourceId: null,\n hiddenColIds: null,\n partitionFilters: [],\n filters: [],\n sorting: [],\n };\n}\n\n/** Create default PlDataTableStateV2 */\nexport function createPlDataTableStateV2(): PlDataTableStateV2Normalized {\n return {\n version: 4,\n stateCache: [],\n pTableParams: makeDefaultPTableParams(),\n };\n}\n\n/** Upgrade PlDataTableStateV2 to the latest version */\nexport function upgradePlDataTableStateV2(state: PlDataTableStateV2): PlDataTableStateV2Normalized {\n // v1 -> v2\n if (!('version' in state)) {\n // Non upgradeable as sourceId calculation algorithm has changed, resetting state to default\n state = createPlDataTableStateV2();\n }\n // v2 -> v3\n if (state.version === 2) {\n state = {\n version: 3,\n stateCache: state.stateCache.map((entry) => ({\n ...entry,\n filtersState: [],\n })),\n pTableParams: makeDefaultPTableParams(),\n };\n }\n // v3 -> v4\n if (state.version === 3) {\n // Non upgradeable as column ids calculation algorithm has changed, resetting state to default\n state = createPlDataTableStateV2();\n }\n return state;\n}\n\nexport type PlDataTableFilterState = {\n id: PTableColumnId;\n alphabetic: boolean;\n filter: null | {\n value: PlTableFilter;\n disabled: boolean;\n };\n};\n\n/** PlTableFilters filter entry */\nexport type PlTableFilterIsNotNA = {\n /** Predicate type */\n type: 'isNotNA';\n};\n\n/** PlTableFilters filter entry */\nexport type PlTableFilterIsNA = {\n /** Predicate type */\n type: 'isNA';\n};\n\n/** PlTableFilters filter entries applicable to both string and number values */\nexport type PlTableFilterCommon = PlTableFilterIsNotNA | PlTableFilterIsNA;\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberEquals = {\n /** Predicate type */\n type: 'number_equals';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberNotEquals = {\n /** Predicate type */\n type: 'number_notEquals';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberGreaterThan = {\n /** Predicate type */\n type: 'number_greaterThan';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberGreaterThanOrEqualTo = {\n /** Predicate type */\n type: 'number_greaterThanOrEqualTo';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberLessThan = {\n /** Predicate type */\n type: 'number_lessThan';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberLessThanOrEqualTo = {\n /** Predicate type */\n type: 'number_lessThanOrEqualTo';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberBetween = {\n /** Predicate type */\n type: 'number_between';\n /** Referense value for the lower bound */\n lowerBound: number;\n /** Defines whether values equal to lower bound reference value should be matched */\n includeLowerBound: boolean;\n /** Referense value for the upper bound */\n upperBound: number;\n /** Defines whether values equal to upper bound reference value should be matched */\n includeUpperBound: boolean;\n};\n\n/** All PlTableFilters numeric filter entries */\nexport type PlTableFilterNumber =\n | PlTableFilterCommon\n | PlTableFilterNumberEquals\n | PlTableFilterNumberNotEquals\n | PlTableFilterNumberGreaterThan\n | PlTableFilterNumberGreaterThanOrEqualTo\n | PlTableFilterNumberLessThan\n | PlTableFilterNumberLessThanOrEqualTo\n | PlTableFilterNumberBetween;\n/** All types of PlTableFilters numeric filter entries */\nexport type PlTableFilterNumberType = PlTableFilterNumber['type'];\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringEquals = {\n /** Predicate type */\n type: 'string_equals';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringNotEquals = {\n /** Predicate type */\n type: 'string_notEquals';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringContains = {\n /** Predicate type */\n type: 'string_contains';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringDoesNotContain = {\n /** Predicate type */\n type: 'string_doesNotContain';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringMatches = {\n /** Predicate type */\n type: 'string_matches';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringDoesNotMatch = {\n /** Predicate type */\n type: 'string_doesNotMatch';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringContainsFuzzyMatch = {\n /** Predicate type */\n type: 'string_containsFuzzyMatch';\n /** Referense value */\n reference: string;\n /**\n * Maximum acceptable edit distance between reference value and matched substring\n * @see https://en.wikipedia.org/wiki/Edit_distance\n */\n maxEdits: number;\n /**\n * When {@link substitutionsOnly} is set to false\n * Levenshtein distance is used as edit distance (substitutions and indels)\n * @see https://en.wikipedia.org/wiki/Levenshtein_distance\n * When {@link substitutionsOnly} is set to true\n * Hamming distance is used as edit distance (substitutions only)\n * @see https://en.wikipedia.org/wiki/Hamming_distance\n */\n substitutionsOnly: boolean;\n /**\n * Single character in {@link reference} that will labelColumn any\n * single character in searched text.\n */\n wildcard?: string;\n};\n\n/** All PlTableFilters string filter entries */\nexport type PlTableFilterString =\n | PlTableFilterCommon\n | PlTableFilterStringEquals\n | PlTableFilterStringNotEquals\n | PlTableFilterStringContains\n | PlTableFilterStringDoesNotContain\n | PlTableFilterStringMatches\n | PlTableFilterStringDoesNotMatch\n | PlTableFilterStringContainsFuzzyMatch;\n/** All types of PlTableFilters string filter entries */\nexport type PlTableFilterStringType = PlTableFilterString['type'];\n\n/** All PlTableFilters filter entries */\nexport type PlTableFilter = PlTableFilterNumber | PlTableFilterString;\n/** All types of PlTableFilters filter entries */\nexport type PlTableFilterType = PlTableFilter['type'];\n\nexport type CreatePlDataTableOps = {\n /** Filters for columns and non-partitioned axes */\n filters?: PTableRecordFilter[];\n\n /** Sorting to columns hidden from user */\n sorting?: PTableSorting[];\n\n /**\n * Selects columns for which will be inner-joined to the table.\n *\n * Default behaviour: all columns are considered to be core\n */\n coreColumnPredicate?: (spec: PColumnSpec) => boolean;\n\n /**\n * Determines how core columns should be joined together:\n * inner - so user will only see records present in all core columns\n * full - so user will only see records present in any of the core columns\n *\n * All non-core columns will be left joined to the table produced by the core\n * columns, in other words records form the pool of non-core columns will only\n * make their way into the final table if core table contins corresponding key.\n *\n * Default: 'full'\n */\n coreJoinType?: 'inner' | 'full';\n};\n\n/** Check if column is a label column */\nexport function isLabelColumn(column: PColumnSpec) {\n return column.axesSpec.length === 1 && column.name === 'pl7.app/label';\n}\n\n/** Get all label columns from the result pool */\nexport function getAllLabelColumns(\n resultPool: AxisLabelProvider & ColumnProvider,\n): PColumn<PColumnDataUniversal>[] | undefined {\n return new PColumnCollection()\n .addAxisLabelProvider(resultPool)\n .addColumnProvider(resultPool)\n .getColumns({\n name: 'pl7.app/label',\n axes: [{}], // exactly one axis\n }, { dontWaitAllData: true });\n}\n\n/** Get label columns matching the provided columns from the result pool */\nexport function getMatchingLabelColumns(\n columns: PColumnIdAndSpec[],\n allLabelColumns: PColumn<PColumnDataUniversal>[],\n): PColumn<PColumnDataUniversal>[] {\n // split input columns into label and value columns\n const inputLabelColumns: typeof columns = [];\n const inputValueColumns: typeof columns = [];\n for (const column of columns) {\n if (isLabelColumn(column.spec)) {\n inputLabelColumns.push(column);\n } else {\n inputValueColumns.push(column);\n }\n }\n\n // collect distinct axes of value columns\n const unlabeledAxes: AxisId[] = [];\n for (const column of inputValueColumns) {\n for (const axis of column.spec.axesSpec) {\n const axisId = getAxisId(axis);\n if (!unlabeledAxes.some((id) => matchAxisId(id, axisId))) {\n unlabeledAxes.push(axisId);\n }\n }\n }\n\n // remove axes matched by input label columns\n for (const labelColumn of inputLabelColumns) {\n const labelAxisId = getAxisId(labelColumn.spec.axesSpec[0]);\n const labelMatch = unlabeledAxes.findIndex((axisId) => matchAxisId(axisId, labelAxisId));\n if (labelMatch !== -1) {\n unlabeledAxes.splice(labelMatch, 1);\n }\n }\n\n // warning: changing this id will break backward compatibility\n const colId = (id: PObjectId, domain?: Record<string, string>): PObjectId => {\n let wid = id.toString();\n if (domain) {\n for (const k in domain) {\n wid += k;\n wid += domain[k];\n }\n }\n return wid as PObjectId;\n };\n\n // search label columns for unmatched axes\n const labelColumns: typeof allLabelColumns = [];\n for (const labelColumn of allLabelColumns) {\n const labelAxis = labelColumn.spec.axesSpec[0];\n const labelAxisId = getAxisId(labelAxis);\n const labelMatch = unlabeledAxes.findIndex((axisId) => matchAxisId(axisId, labelAxisId));\n if (labelMatch !== -1) {\n const axisId = unlabeledAxes[labelMatch];\n const dataDomainLen = Object.keys(axisId.domain ?? {}).length;\n const labelDomainLen = Object.keys(labelAxis.domain ?? {}).length;\n if (dataDomainLen > labelDomainLen) {\n labelColumns.push({\n id: colId(labelColumn.id, axisId.domain),\n spec: {\n ...labelColumn.spec,\n axesSpec: [{ ...axisId, annotations: labelAxis.annotations }],\n },\n data: labelColumn.data,\n });\n } else {\n labelColumns.push(labelColumn);\n }\n unlabeledAxes.splice(labelMatch, 1);\n }\n }\n return labelColumns;\n}\n\n/** Check if all columns are computed */\nexport function allColumnsComputed(\n columns: PColumn<PColumnValues | TreeNodeAccessor | DataInfo<TreeNodeAccessor>>[],\n): boolean {\n type Data = typeof columns[number]['data'];\n const isValues = (d: Data): d is PColumnValues => Array.isArray(d);\n const isAccessor = (d: Data): d is TreeNodeAccessor => d instanceof TreeNodeAccessor;\n const isDataInfo = (d: Data): d is DataInfo<TreeNodeAccessor> =>\n typeof d === 'object' && 'type' in d;\n\n return columns\n .map((c) => c.data)\n .every((d): boolean => {\n if (isValues(d)) {\n return true;\n } else if (isAccessor(d)) {\n return d.getIsReadyOrError();\n } else if (isDataInfo(d)) {\n const type = d.type;\n switch (type) {\n case 'Json':\n return true;\n case 'JsonPartitioned':\n return Object.values(d.parts).every((p) => p.getIsReadyOrError());\n case 'BinaryPartitioned':\n return Object.values(d.parts)\n .every((p) => p.index.getIsReadyOrError() && p.values.getIsReadyOrError());\n }\n } else {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n throw Error(`unsupported column data type: ${d satisfies never}`);\n }\n });\n}\n\nfunction createPTableDef(params: {\n columns: PColumn<PColumnDataUniversal>[];\n labelColumns: PColumn<PColumnDataUniversal>[];\n coreJoinType: 'inner' | 'full';\n partitionFilters: PTableRecordSingleValueFilterV2[];\n filters: PTableRecordSingleValueFilterV2[];\n sorting: PTableSorting[];\n coreColumnPredicate?: ((spec: PColumnSpec) => boolean);\n}): PTableDef<PColumn<TreeNodeAccessor | PColumnValues | DataInfo<TreeNodeAccessor>>> {\n let coreColumns = params.columns;\n const secondaryColumns: typeof params.columns = [];\n\n if (params.coreColumnPredicate) {\n coreColumns = [];\n for (const c of params.columns)\n if (params.coreColumnPredicate(c.spec)) coreColumns.push(c);\n else secondaryColumns.push(c);\n }\n\n secondaryColumns.push(...params.labelColumns);\n\n return {\n src: {\n type: 'outer',\n primary: {\n type: params.coreJoinType,\n entries: coreColumns.map((c) => ({ type: 'column', column: c })),\n },\n secondary: secondaryColumns.map((c) => ({ type: 'column', column: c })),\n },\n partitionFilters: params.partitionFilters,\n filters: params.filters,\n sorting: params.sorting,\n };\n}\n\n/** PlAgDataTable model */\nexport type PlDataTableModel = {\n /** DataSource identifier for state management */\n sourceId: string | null;\n /** p-table including all columns, used to show the full specification of the table */\n fullTableHandle: PTableHandle;\n /** p-table including only visible columns, used to get the data */\n visibleTableHandle: PTableHandle;\n};\n\n/** Check if column should be omitted from the table */\nexport function isColumnHidden(spec: { annotations?: Record<string, string> }): boolean {\n return spec.annotations?.['pl7.app/table/visibility'] === 'hidden';\n}\n\n/** Check if column is hidden by default */\nexport function isColumnOptional(spec: { annotations?: Record<string, string> }): boolean {\n return spec.annotations?.['pl7.app/table/visibility'] === 'optional';\n}\n\n/**\n * Return unique entries of the array by the provided id\n * For each id, the last entry is kept\n */\nexport function uniqueBy<T>(array: T[], makeId: (entry: T) => string): T[] {\n return [...new Map(array.map((e) => [makeId(e), e])).values()];\n}\n\n/**\n * Create p-table spec and handle given ui table state\n *\n * @param ctx context\n * @param columns column list\n * @param tableState table ui state\n * @returns PlAgDataTableV2 table source\n */\nexport function createPlDataTableV2<A, U>(\n ctx: RenderCtx<A, U>,\n inputColumns: PColumn<TreeNodeAccessor | PColumnValues | DataInfo<TreeNodeAccessor>>[],\n tableState: PlDataTableStateV2,\n ops?: CreatePlDataTableOps,\n): PlDataTableModel | undefined {\n if (inputColumns.length === 0) return undefined;\n const columns = inputColumns.filter((c) => isLinkerColumn(c.spec) || !isColumnHidden(c.spec));\n\n const tableStateNormalized = upgradePlDataTableStateV2(tableState);\n\n const allLabelColumns = getAllLabelColumns(ctx.resultPool);\n if (!allLabelColumns) return undefined;\n\n const fullLabelColumns = getMatchingLabelColumns(columns.map(getColumnIdAndSpec), allLabelColumns);\n const fullColumns = [...columns, ...fullLabelColumns];\n\n const fullColumnsAxes = uniqueBy(\n [...fullColumns.flatMap((c) => c.spec.axesSpec.map((a) => getAxisId(a)))],\n (a) => canonicalizeJson<AxisId>(a),\n );\n const fullColumnsIds: PTableColumnId[] = [\n ...fullColumnsAxes.map((a) => ({ type: 'axis', id: a } satisfies PTableColumnIdAxis)),\n ...fullColumns.map((c) => ({ type: 'column', id: c.id } satisfies PTableColumnIdColumn)),\n ];\n const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n const isValidColumnId = (id: PTableColumnId): boolean => fullColumnsIdsSet.has(canonicalizeJson<PTableColumnId>(id));\n\n const coreJoinType = ops?.coreJoinType ?? 'full';\n const partitionFilters: PTableRecordSingleValueFilterV2[]\n = tableStateNormalized.pTableParams.partitionFilters\n .filter((f) => {\n const valid = isValidColumnId(f.column);\n if (!valid) ctx.logWarn(`Partition filter ${JSON.stringify(f)} does not match provided columns, skipping`);\n return valid;\n });\n const filters: PTableRecordSingleValueFilterV2[]\n = uniqueBy(\n [...(ops?.filters ?? []), ...tableStateNormalized.pTableParams.filters],\n (f) => canonicalizeJson<PTableColumnId>(f.column),\n ).filter((f) => {\n const valid = isValidColumnId(f.column);\n if (!valid) ctx.logWarn(`Filter ${JSON.stringify(f)} does not match provided columns, skipping`);\n return valid;\n });\n const sorting: PTableSorting[]\n = uniqueBy(\n [...(ops?.sorting ?? []), ...tableStateNormalized.pTableParams.sorting],\n (s) => canonicalizeJson<PTableColumnId>(s.column),\n ).filter((s) => {\n const valid = isValidColumnId(s.column);\n if (!valid) ctx.logWarn(`Sorting ${JSON.stringify(s)} does not match provided columns, skipping`);\n return valid;\n });\n\n const fullDef = createPTableDef({\n columns,\n labelColumns: fullLabelColumns,\n coreJoinType,\n partitionFilters,\n filters,\n sorting,\n coreColumnPredicate: ops?.coreColumnPredicate,\n });\n const fullHandle = ctx.createPTable(fullDef);\n\n const hiddenColumns = new Set<PObjectId>(((): PObjectId[] => {\n // Inner join works as a filter - all columns must be present\n if (coreJoinType === 'inner') return [];\n\n const hiddenColIds = tableStateNormalized.pTableParams.hiddenColIds;\n if (hiddenColIds) return hiddenColIds;\n\n return columns\n .filter((c) => isColumnOptional(c.spec))\n .map((c) => c.id);\n })());\n\n // Preserve linker columns\n columns\n .filter((c) => isLinkerColumn(c.spec))\n .forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve core columns as they change the shape of join.\n if (ops?.coreColumnPredicate) {\n const coreColumns = columns.flatMap((c) => ops?.coreColumnPredicate?.(c.spec) ? [c.id] : []);\n coreColumns.forEach((c) => hiddenColumns.delete(c));\n }\n\n // Filters decrease the number of result rows, sorting changes the order of result rows\n [...partitionFilters.map((f) => f.column), ...filters.map((f) => f.column), ...sorting.map((s) => s.column)]\n .filter((c): c is PTableColumnIdColumn => c.type === 'column')\n .forEach((c) => hiddenColumns.delete(c.id));\n\n const visibleColumns = columns.filter((c) => !hiddenColumns.has(c.id));\n const visibleLabelColumns = getMatchingLabelColumns(visibleColumns.map(getColumnIdAndSpec), allLabelColumns);\n\n // if at least one column is not yet computed, we can't show the table\n if (!allColumnsComputed([...visibleColumns, ...visibleLabelColumns])) return undefined;\n\n const visibleDef = createPTableDef({\n columns: visibleColumns,\n labelColumns: visibleLabelColumns,\n coreJoinType,\n partitionFilters,\n filters,\n sorting,\n coreColumnPredicate: ops?.coreColumnPredicate,\n });\n const visibleHandle = ctx.createPTable(visibleDef);\n\n return {\n sourceId: tableStateNormalized.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n visibleTableHandle: visibleHandle,\n } satisfies PlDataTableModel;\n}\n\n/** Create sheet entries for PlDataTable */\nexport function createPlDataTableSheet<A, U>(\n ctx: RenderCtx<A, U>,\n axis: AxisSpec,\n values: (string | number)[],\n): PlDataTableSheet {\n const labels = ctx.resultPool.findLabels(axis);\n return {\n axis,\n options: values.map((v) => ({\n value: v,\n label: labels?.[v] ?? v.toString(),\n })),\n defaultValue: values[0],\n };\n}\n","import type {\n AxisId,\n CanonicalizedJson,\n PColumn,\n PColumnSpec,\n PFrameHandle,\n PObjectId,\n} from '@milaboratories/pl-model-common';\nimport {\n canonicalizeJson,\n getAxisId,\n isDataInfo,\n matchAxisId, parseJson,\n visitDataInfo,\n} from '@milaboratories/pl-model-common';\nimport type { PColumnDataUniversal, RenderCtx } from '../render';\nimport { PColumnCollection, TreeNodeAccessor } from '../render';\nimport { isLabelColumn } from './PlDataTable';\n\n/** Create id for column copy with added keys in axes domains */\nconst colId = (id: PObjectId, domains: (Record<string, string> | undefined)[]) => {\n let wid = id.toString();\n domains?.forEach((domain) => {\n if (domain) {\n for (const [k, v] of Object.entries(domain)) {\n wid += k;\n wid += v;\n }\n }\n });\n return wid;\n};\n\n/** All combinations with 1 key from each list */\nfunction getKeysCombinations(idsLists: AxisId[][]) {\n if (!idsLists.length) {\n return [];\n }\n let result: AxisId[][] = [[]];\n idsLists.forEach((list) => {\n const nextResult: AxisId[][] = [];\n list.forEach((key) => {\n nextResult.push(...result.map((resultItem) => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\n\n/** Check if column is a linker column */\nexport function isLinkerColumn(column: PColumnSpec) {\n return column.annotations?.[LINKER_COLUMN_ANNOTATION] === 'true';\n}\n\nexport const IS_VIRTUAL_COLUMN = 'pl7.app/graph/isVirtual'; // annotation for column duplicates with extended domains\nexport const LABEL_ANNOTATION = 'pl7.app/label';\nexport const LINKER_COLUMN_ANNOTATION = 'pl7.app/isLinkerColumn';\n\nexport type LinkerColumnsMap = Map<CanonicalizedJson<AxisId>, Set<CanonicalizedJson<AxisId>>>;\nexport function getLinkerColumnsMap(linkerColumns: PColumn<PColumnDataUniversal>[]) {\n const resultMap: LinkerColumnsMap = new Map();\n for (const { spec } of linkerColumns) {\n const axisIds = spec.axesSpec.map(getAxisId).map(canonicalizeJson);\n axisIds.forEach((id) => {\n if (!resultMap.has(id)) {\n resultMap.set(id, new Set());\n }\n });\n for (let i = 0; i < axisIds.length - 1; i++) {\n for (let j = i + 1; j < axisIds.length; j++) {\n const id1 = axisIds[i];\n const id2 = axisIds[j];\n resultMap.get(id1)?.add(id2);\n resultMap.get(id2)?.add(id1);\n }\n }\n }\n return resultMap;\n}\n\nexport function getAvailableWithLinkersAxes(\n linkerColumns: PColumn<PColumnDataUniversal>[],\n blockAxes: Map<CanonicalizedJson<AxisId>, AxisId>,\n): Map<CanonicalizedJson<AxisId>, AxisId> {\n const linkerColumnsMap = getLinkerColumnsMap(linkerColumns);\n const linkerColumnsMapIds = [...linkerColumnsMap.keys()].map(parseJson);\n const startKeys: CanonicalizedJson<AxisId>[] = [];\n for (const startId of blockAxes.values()) {\n const matched = linkerColumnsMapIds.find((id) => matchAxisId(startId, id));\n if (matched) {\n startKeys.push(canonicalizeJson(matched)); // linker column can contain fewer domains than in block's columns, it's fixed on next step in enrichCompatible\n }\n }\n const visited: Set<CanonicalizedJson<AxisId>> = new Set(startKeys);\n const addedAvailableAxes: Map<CanonicalizedJson<AxisId>, AxisId> = new Map();\n let nextKeys = [...startKeys];\n\n while (nextKeys.length) {\n const next: CanonicalizedJson<AxisId>[] = [];\n for (const nextKey of nextKeys) {\n for (const availableKey of linkerColumnsMap.get(nextKey) ?? []) {\n if (!visited.has(availableKey)) {\n next.push(availableKey);\n visited.add(availableKey);\n addedAvailableAxes.set(availableKey, parseJson(availableKey));\n }\n }\n }\n nextKeys = next;\n }\n return addedAvailableAxes;\n}\n/** Add columns with fully compatible axes created from partial compatible ones */\nexport function enrichCompatible(blockAxes: Map<string, AxisId>, columns: PColumn<PColumnDataUniversal>[]) {\n const result: PColumn<PColumnDataUniversal>[] = [];\n columns.forEach((column) => {\n result.push(...getAdditionalColumnsForColumn(blockAxes, column));\n });\n return result;\n}\n\nfunction getAdditionalColumnsForColumn(\n blockAxes: Map<string, AxisId>,\n column: PColumn<PColumnDataUniversal>,\n): PColumn<PColumnDataUniversal>[] {\n const columnAxesIds = column.spec.axesSpec.map(getAxisId);\n\n if (columnAxesIds.every((id) => blockAxes.has(canonicalizeJson(id)))) {\n return [column]; // the column is compatible with its own domains without modifications\n }\n\n // options with different possible domains for every axis of secondary column\n const secondaryIdsOptions = columnAxesIds.map((id) => {\n const result = [];\n for (const [_, mainId] of blockAxes) {\n if (matchAxisId(mainId, id) && !matchAxisId(id, mainId)) {\n result.push(mainId);\n }\n }\n return result;\n });\n // all possible combinations of axes with added domains\n const secondaryIdsVariants = getKeysCombinations(secondaryIdsOptions);\n\n // sets of added to column domain fields\n const allAddedDomainValues = new Set<string>();\n const addedNotToAllVariantsDomainValues = new Set<string>();\n const addedByVariantsDomainValues = secondaryIdsVariants.map((idsList) => {\n const addedSet = new Set<string>();\n idsList.map((axisId, idx) => {\n const d1 = column.spec.axesSpec[idx].domain;\n const d2 = axisId.domain;\n Object.entries(d2 ?? {}).forEach(([key, value]) => {\n if (d1?.[key] === undefined) {\n const item = JSON.stringify([key, value]);\n addedSet.add(item);\n allAddedDomainValues.add(item);\n }\n });\n return ({\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n });\n });\n return addedSet;\n });\n [...allAddedDomainValues].forEach((addedPart) => {\n if (addedByVariantsDomainValues.some((s) => !s.has(addedPart))) {\n addedNotToAllVariantsDomainValues.add(addedPart);\n }\n });\n\n const additionalColumns = secondaryIdsVariants.map((idsList, idx) => {\n const id = colId(column.id, idsList.map((id) => id.domain));\n\n const label = column.spec.annotations?.[LABEL_ANNOTATION] ?? '';\n const labelDomainPart = ([...addedByVariantsDomainValues[idx]])\n .filter((str) => addedNotToAllVariantsDomainValues.has(str))\n .sort()\n .map((v) => JSON.parse(v)?.[1]) // use in labels only domain values, but sort them by key to save the same order in all column variants\n .join(' / ');\n\n const annotations: Record<string, string> = {\n ...column.spec.annotations,\n [IS_VIRTUAL_COLUMN]: 'true',\n };\n if (label || labelDomainPart) {\n annotations[LABEL_ANNOTATION] = label && labelDomainPart ? label + ' / ' + labelDomainPart : label + labelDomainPart;\n }\n\n return {\n id: id as PObjectId,\n spec: {\n ...column.spec,\n axesSpec: idsList.map((axisId, idx) => ({\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n })),\n annotations,\n },\n data: column.data,\n };\n });\n\n return [column, ...additionalColumns];\n}\n\nexport function isColumnReady(c: PColumn<PColumnDataUniversal>) {\n let ready = true;\n if (c.data instanceof TreeNodeAccessor) {\n ready = ready && c.data.getIsReadyOrError();\n } else if (isDataInfo(c.data)) {\n visitDataInfo(c.data, (v) => {\n ready = ready && v.getIsReadyOrError();\n });\n }\n return ready;\n}\n\nexport function allColumnsReady(columns: PColumn<PColumnDataUniversal>[]): boolean {\n return columns.every(isColumnReady);\n}\n\n/**\n The aim of createPFrameForGraphs: to create pframe with block’s columns and all compatible columns from result pool\n (including linker columns and all label columns).\n Block’s columns are added to pframe as is.\n Other columns are added basing on set of axes of block’s columns, considering available with linker columns.\n Compatible columns must have at least one axis from block’s axes set. This axis of the compatible column from\n result pool must satisfy matchAxisId (it can have less domain keys than in block’s axis, but without conflicting values\n among existing ones).\n In requests to pframe (calculateTableData) columns must have strictly the same axes. For compatibility in case\n of partially matched axis we add to pframe a copy of this column with modified axis (with filled missed domains)\n and modified label (with added domain values in case if more than one copy with different domains exist).\n */\nexport function createPFrameForGraphs<A, U>(\n ctx: RenderCtx<A, U>,\n blockColumns?: PColumn<PColumnDataUniversal>[],\n): PFrameHandle | undefined {\n // if current block doesn't produce own columns then use all columns from result pool\n if (!blockColumns) {\n const columns = new PColumnCollection();\n columns.addColumnProvider(ctx.resultPool);\n\n const allColumns = columns.getColumns(() => true, { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? [];\n // if at least one column is not yet ready, we can't show the graph\n if (!allColumnsReady(allColumns)) {\n return undefined;\n }\n\n const allAxes = new Map(allColumns\n .flatMap((column) => column.spec.axesSpec)\n .map((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return [canonicalizeJson(axisId), axisId];\n }));\n\n // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match\n const extendedColumns = enrichCompatible(allAxes, allColumns);\n\n return ctx.createPFrame(extendedColumns);\n };\n\n if (!allColumnsReady(blockColumns)) {\n return undefined;\n }\n\n // if current block has its own columns then take from result pool only compatible with them\n const columns = new PColumnCollection();\n columns.addColumnProvider(ctx.resultPool);\n columns.addColumns(blockColumns);\n\n // all possible axes from block columns\n const blockAxes = new Map<CanonicalizedJson<AxisId>, AxisId>();\n // axes from block columns and compatible result pool columns\n const allAxes = new Map<CanonicalizedJson<AxisId>, AxisId>();\n for (const c of blockColumns) {\n for (const id of c.spec.axesSpec) {\n const aid = getAxisId(id);\n blockAxes.set(canonicalizeJson(aid), aid);\n allAxes.set(canonicalizeJson(aid), aid);\n }\n }\n\n // all linker columns always go to pFrame - even it's impossible to use some of them they all are hidden\n const linkerColumns = columns.getColumns((spec) => isLinkerColumn(spec)) ?? [];\n const availableWithLinkersAxes = getAvailableWithLinkersAxes(linkerColumns, blockAxes);\n\n // all possible axes from connected linkers\n for (const item of availableWithLinkersAxes) {\n blockAxes.set(...item);\n allAxes.set(...item);\n }\n\n // all compatible with block columns but without label columns\n const compatibleWithoutLabels = (columns.getColumns((spec) => spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n for (const selectorAxisId of blockAxes.values()) {\n if (matchAxisId(selectorAxisId, axisId)) {\n return true;\n }\n }\n return false;\n }), { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? []).filter((column) => !isLabelColumn(column.spec));\n\n // if at least one column is not yet ready, we can't show the graph\n if (!allColumnsReady(compatibleWithoutLabels)) {\n return undefined;\n }\n\n // extend axes set for label columns request\n for (const c of compatibleWithoutLabels) {\n for (const id of c.spec.axesSpec) {\n const aid = getAxisId(id);\n allAxes.set(canonicalizeJson(aid), aid);\n }\n }\n\n // label columns must be compatible with full set of axes - block axes and axes from compatible columns from result pool\n const compatibleLabels = (columns.getColumns((spec) => spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n for (const selectorAxisId of allAxes.values()) {\n if (matchAxisId(selectorAxisId, axisId)) {\n return true;\n }\n }\n return false;\n }), { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? []).filter((column) => isLabelColumn(column.spec));\n\n // if at least one column is not yet ready, we can't show the graph\n if (!allColumnsReady(compatibleLabels)) {\n return undefined;\n }\n\n const compatible = [...compatibleWithoutLabels, ...compatibleLabels];\n\n // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match\n const extendedColumns = enrichCompatible(blockAxes, compatible);\n\n return ctx.createPFrame(extendedColumns);\n}\n","import {\n isPTableAbsent,\n type PColumn,\n type PColumnIdAndSpec,\n type PColumnKey,\n type PColumnValues,\n type PObjectId,\n type PTableColumnId,\n uniquePlId,\n} from '@milaboratories/pl-model-common';\nimport { type PlSelectionModel } from './PlSelectionModel';\n\nexport type PColumnPredicate = (column: PColumnIdAndSpec) => boolean;\n\nexport interface PlMultiSequenceAlignmentSettings {\n sequenceColumnIds?: PObjectId[];\n labelColumnIds?: PTableColumnId[];\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n widgets: ('consensus' | 'seqLogo' | 'legend')[];\n alignmentParams: {\n gpo: number;\n gpe: number;\n tgpe: number;\n };\n}\n\nexport interface PlMultiSequenceAlignmentModel\n extends Partial<PlMultiSequenceAlignmentSettings> {\n version?: number;\n}\n\nexport type PlMultiSequenceAlignmentColorSchemeOption =\n | { type: 'no-color' }\n | { type: 'chemical-properties' }\n | { type: 'markup'; columnId: PObjectId };\n\nexport function createRowSelectionColumn({\n selection,\n columnId = uniquePlId() as string as PObjectId,\n label = 'Selection marker',\n domain,\n}: {\n selection: PlSelectionModel | undefined;\n columnId?: PObjectId;\n label?: string;\n domain?: Record<string, string>;\n}): PColumn<PColumnValues> | undefined {\n if (!selection?.axesSpec.length) {\n return;\n }\n const data: PColumnValues = selection.selectedKeys\n .filter((r): r is PColumnKey => r.every((v) => !isPTableAbsent(v)))\n .map((r) => ({ key: r, val: 1 }));\n if (!data.length) {\n return;\n }\n return {\n id: columnId,\n spec: {\n kind: 'PColumn',\n valueType: 'Int',\n name: 'pl7.app/table/row-selection',\n axesSpec: selection.axesSpec,\n ...(domain && Object.keys(domain).length && { domain }),\n annotations: {\n 'pl7.app/label': label,\n 'pl7.app/discreteValues': '[1]',\n },\n },\n data,\n };\n}\n","import type { AxesSpec, PTableAbsent, PTableValue } from '@milaboratories/pl-model-common';\nimport { PTableNA } from '@milaboratories/pl-model-common';\n\n/** Key is a set of all axes values, which means it is unique across rows */\nexport type PTableKey = AxisValue[];\n\n/** Readable axis value */\nexport type AxisValue = string | number | PTableAbsent;\n\n/**\n * Information on selected rows.\n * for selectedKeys = [[axis1Value, axis2Value, axis3Value], ...]\n * axesSpec would be [axis1Spec, axis2Spec, axis3Spec]\n */\nexport type PlSelectionModel = {\n /** Specs for {@link AxisValue}'s in {@link PTableKey} */\n axesSpec: AxesSpec;\n /** Row keys (arrays of axes values) of selected rows */\n selectedKeys: PTableKey[];\n};\n\nexport function createPlSelectionModel(): PlSelectionModel {\n return {\n axesSpec: [],\n selectedKeys: [],\n };\n}\n\nexport function mapPTableValueToAxisKey(value: PTableValue): AxisValue {\n if (value === PTableNA) {\n console.error('Axis value can never be N/A');\n return ''; // @TODO: add proper handling\n }\n return value;\n}\n","import type { SUniversalPColumnId } from '@milaboratories/pl-model-common';\nimport type { AnnotationFilter, AnnotationMode, AnnotationScript, IsNA, NotFilter, NumericalComparisonFilter, PatternFilter, PatternPredicate, ValueRank } from './filter';\nimport type { SimplifiedPColumnSpec } from './types';\n\nexport function unreachable(x: never): never {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n throw new Error('Unexpected object: ' + x);\n}\n\nfunction isNumericValueType(spec: SimplifiedPColumnSpec): boolean {\n return spec.valueType === 'Int' || spec.valueType === 'Long' || spec.valueType === 'Float' || spec.valueType === 'Double';\n}\n\nfunction isStringValueType(spec: SimplifiedPColumnSpec): boolean {\n return spec.valueType === 'String';\n}\n\n// Define recursive type explicitly\nexport type FilterUi = { id?: number; name?: string; isExpanded?: boolean }\n & ({ type: undefined }\n | { type: 'or'; filters: FilterUi[] }\n | { type: 'and'; filters: FilterUi[] }\n | { type: 'not'; filter: FilterUi }\n | { type: 'isNA'; column: SUniversalPColumnId }\n | { type: 'isNotNA'; column: SUniversalPColumnId }\n | { type: 'patternEquals'; column: SUniversalPColumnId; value: string }\n | { type: 'patternNotEquals'; column: SUniversalPColumnId; value: string }\n | { type: 'patternContainSubsequence'; column: SUniversalPColumnId; value: string }\n | { type: 'patternNotContainSubsequence'; column: SUniversalPColumnId; value: string }\n | { type: 'topN'; column: SUniversalPColumnId; n: number }\n | { type: 'bottomN'; column: SUniversalPColumnId; n: number }\n | { type: 'lessThan'; column: SUniversalPColumnId; x: number }\n | { type: 'greaterThan'; column: SUniversalPColumnId; x: number }\n | { type: 'lessThanOrEqual'; column: SUniversalPColumnId; x: number }\n | { type: 'greaterThanOrEqual'; column: SUniversalPColumnId; x: number }\n | { type: 'lessThanColumn'; column: SUniversalPColumnId; rhs: SUniversalPColumnId; minDiff?: number }\n | { type: 'lessThanColumnOrEqual'; column: SUniversalPColumnId; rhs: SUniversalPColumnId; minDiff?: number });\n\nexport type FilterUiType = Exclude<FilterUi, { type: undefined }>['type'];\n\nexport type FilterUiOfType<T extends FilterUiType> = Extract<FilterUi, { type: T }>;\n\nexport type TypeToLiteral<T> =\n[T] extends [FilterUiType] ? 'FilterUiType' :\n [T] extends [SUniversalPColumnId] ? 'SUniversalPColumnId' :\n [T] extends [PatternPredicate] ? 'PatternPredicate' :\n [T] extends [AnnotationFilter[]] ? 'AnnotationFilter[]' :\n [T] extends [AnnotationFilter] ? 'AnnotationFilter' :\n [T] extends [number] ? 'number' :\n [T] extends [number | undefined] ? 'number?' :\n [T] extends [string] ? 'string' :\n [T] extends [string | undefined] ? 'string?' :\n [T] extends [boolean] ? 'boolean' :\n [T] extends [boolean | undefined] ? 'boolean?' :\n [T] extends [unknown[]] ? 'unknown[]' :\n // this is special\n T extends number ? 'number' :\n T extends string ? 'string' :\n T extends boolean ? 'boolean' :\n T extends Record<string, unknown> ? 'form' :\n 'unknown';\n\n// @TODO: \"parse\" option\nexport type TypeField<V> = {\n fieldType: TypeToLiteral<V>;\n label: string;\n defaultValue: () => V | undefined;\n};\n\nexport type TypeFieldRecord<T> = { [K in keyof T]: TypeField<T[K]>; };\n\nexport type TypeForm<T> = {\n [P in keyof T]: T[P] extends Record<string, unknown> ? {\n fieldType: 'form';\n label?: string;\n form?: T[P] extends Record<string, unknown> ? TypeForm<T[P]> : undefined;\n defaultValue: () => T[P];\n } : TypeField<T[P]>;\n};\n\nexport type FormField =\n {\n fieldType: 'form';\n form?: Record<string, FormField>;\n defaultValue: () => Record<string, unknown>;\n }\n | TypeField<FilterUiType>\n | TypeField<string>\n | TypeField<number>\n | TypeField<number | undefined>\n | TypeField<boolean>\n | TypeField<boolean | undefined>\n | TypeField<SUniversalPColumnId>;\n\nexport type AnyForm = Record<string, FormField>;\n\ntype CreateFilterUiMetadataMap<T extends FilterUiType> = {\n [P in T]: {\n label: string;\n form: TypeForm<FilterUiOfType<T>>; // TODO: simplify this to `TypeField<T>`\n supportedFor: (spec1: SimplifiedPColumnSpec, spec2: SimplifiedPColumnSpec | undefined) => boolean;\n }\n};\n\nexport const filterUiMetadata = {\n lessThan: {\n label: 'Col < X (Less Than)',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'lessThan',\n },\n x: {\n label: 'X',\n fieldType: 'number',\n defaultValue: () => 0,\n },\n },\n supportedFor: isNumericValueType,\n },\n greaterThan: {\n label: 'Col > X (Greater Than)',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'greaterThan',\n },\n x: {\n label: 'X',\n fieldType: 'number',\n defaultValue: () => 0,\n },\n },\n supportedFor: isNumericValueType,\n },\n lessThanOrEqual: {\n label: 'Col ≤ X (Less Than or Equal)',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'lessThanOrEqual',\n },\n x: {\n label: 'X',\n fieldType: 'number',\n defaultValue: () => 0,\n },\n },\n supportedFor: isNumericValueType,\n },\n greaterThanOrEqual: {\n label: 'Col ≥ X (Greater Than or Equal)',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'greaterThanOrEqual',\n },\n x: {\n label: 'X',\n fieldType: 'number',\n defaultValue: () => 0,\n },\n },\n supportedFor: isNumericValueType,\n },\n lessThanColumn: {\n label: 'Col₁ < Col₂ (Compare Columns)',\n form: {\n column: {\n label: 'Col₁',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'lessThanColumn',\n },\n rhs: {\n label: 'Col₂',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n minDiff: {\n label: 'Margin (positive)',\n fieldType: 'number?',\n defaultValue: () => undefined,\n },\n },\n supportedFor: (spec1: SimplifiedPColumnSpec, spec2?: SimplifiedPColumnSpec): boolean => {\n return isNumericValueType(spec1) && (spec2 === undefined || isNumericValueType(spec2));\n },\n },\n lessThanColumnOrEqual: {\n label: 'Col₁ ≤ Col₂ (Compare Columns)',\n form: {\n column: {\n label: 'Col₁',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'lessThanColumnOrEqual',\n },\n rhs: {\n label: 'Col₂',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n minDiff: {\n label: 'Margin (positive)',\n fieldType: 'number?',\n defaultValue: () => undefined,\n },\n },\n supportedFor: (spec1: SimplifiedPColumnSpec, spec2?: SimplifiedPColumnSpec): boolean => {\n return isNumericValueType(spec1) && (spec2 === undefined || isNumericValueType(spec2));\n },\n },\n topN: {\n label: 'Top N',\n form: {\n column: {\n label: 'Rank By Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'topN',\n },\n n: {\n label: 'N',\n fieldType: 'number',\n defaultValue: () => 10,\n },\n },\n supportedFor: isNumericValueType,\n },\n bottomN: {\n label: 'Bottom N',\n form: {\n column: {\n label: 'Rank By Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'bottomN',\n },\n n: {\n label: 'N',\n fieldType: 'number',\n defaultValue: () => 10,\n },\n },\n supportedFor: isNumericValueType,\n },\n patternContainSubsequence: {\n label: 'Col ~ Seq (Contain Subsequence)',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'patternContainSubsequence',\n },\n value: {\n label: 'Seq',\n fieldType: 'string',\n defaultValue: () => '',\n },\n },\n supportedFor: isStringValueType,\n },\n patternNotContainSubsequence: {\n label: 'Col ≁ Seq (Not Contain Subsequence)',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'patternNotContainSubsequence',\n },\n value: {\n label: 'Seq',\n fieldType: 'string',\n defaultValue: () => '',\n },\n },\n supportedFor: isStringValueType,\n },\n patternEquals: {\n label: 'Col = Seq (Equals)',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'patternEquals',\n },\n value: {\n label: 'Seq',\n fieldType: 'string',\n defaultValue: () => '',\n },\n },\n supportedFor: isStringValueType,\n },\n patternNotEquals: {\n label: 'Col ≠ Seq (Not Equal)',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'patternNotEquals',\n },\n value: {\n label: 'Seq',\n fieldType: 'string',\n defaultValue: () => '',\n },\n },\n supportedFor: isStringValueType,\n },\n isNA: {\n label: 'Is NA',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'isNA',\n },\n },\n supportedFor: () => true,\n },\n isNotNA: {\n label: 'Is Not NA',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'isNotNA',\n },\n },\n supportedFor: () => true,\n },\n or: {\n label: 'Or',\n form: {\n type: {\n fieldType: 'FilterUiType',\n label: 'Predicate',\n defaultValue: () => 'or',\n },\n filters: {\n fieldType: 'unknown[]',\n label: 'Filters',\n defaultValue: () => [],\n },\n },\n supportedFor: () => false,\n },\n and: {\n label: 'And',\n form: {\n type: {\n fieldType: 'FilterUiType',\n label: 'Predicate',\n defaultValue: () => 'and',\n },\n filters: {\n fieldType: 'unknown[]',\n label: 'Filters',\n defaultValue: () => [],\n },\n },\n supportedFor: () => false,\n },\n not: {\n label: 'Not',\n form: {\n type: {\n fieldType: 'FilterUiType',\n label: 'Predicate',\n defaultValue: () => 'not',\n },\n filter: {\n fieldType: 'form',\n label: 'Filter',\n defaultValue: () => undefined as unknown as FilterUi, // TODO:\n },\n },\n supportedFor: () => false,\n },\n} satisfies CreateFilterUiMetadataMap<FilterUiType>;\n\nexport function getFilterUiTypeOptions(columnSpec?: SimplifiedPColumnSpec) {\n if (!columnSpec) {\n return [];\n }\n\n return Object.entries(filterUiMetadata).filter(([_, metadata]) => metadata.supportedFor(columnSpec)).map(([type, metadata]) => ({\n label: metadata.label,\n value: type,\n }));\n}\n\nexport function getFilterUiMetadata(type: FilterUiType) {\n return filterUiMetadata[type];\n}\n\nexport function compileFilter(ui: FilterUi): AnnotationFilter {\n if (ui.type === 'or') {\n return {\n type: 'or' as const,\n filters: compileFilters(ui.filters),\n };\n }\n\n if (ui.type === 'and') {\n return {\n type: 'and' as const,\n filters: compileFilters(ui.filters),\n };\n }\n\n if (ui.type === 'not') {\n return {\n type: 'not' as const,\n filter: compileFilter(ui.filter),\n };\n }\n\n if (ui.type === 'isNA') {\n return {\n type: 'isNA' as const,\n column: ui.column,\n };\n }\n\n if (ui.type === 'isNotNA') {\n const isNAFilter: IsNA = { type: 'isNA', column: ui.column };\n const notFilter: NotFilter = { type: 'not', filter: isNAFilter };\n return notFilter;\n }\n\n if (ui.type === 'patternEquals') {\n return {\n type: 'pattern' as const,\n column: ui.column,\n predicate: {\n type: 'equals' as const,\n value: ui.value,\n },\n };\n }\n\n if (ui.type === 'patternNotEquals') {\n const patternFilter: PatternFilter = {\n type: 'pattern',\n column: ui.column,\n predicate: { type: 'equals', value: ui.value },\n };\n const notFilter: NotFilter = { type: 'not', filter: patternFilter };\n return notFilter;\n }\n\n if (ui.type === 'patternContainSubsequence') {\n return {\n type: 'pattern' as const,\n column: ui.column,\n predicate: {\n type: 'containSubsequence' as const,\n value: ui.value,\n },\n };\n }\n\n if (ui.type === 'patternNotContainSubsequence') {\n const patternFilter: PatternFilter = {\n type: 'pattern',\n column: ui.column,\n predicate: { type: 'containSubsequence', value: ui.value },\n };\n const notFilter: NotFilter = { type: 'not', filter: patternFilter };\n return notFilter;\n }\n\n if (ui.type === 'topN') {\n const rankTransform: ValueRank = {\n transformer: 'rank',\n column: ui.column,\n descending: true,\n };\n const comparisonFilter: NumericalComparisonFilter = {\n type: 'numericalComparison',\n lhs: rankTransform,\n rhs: ui.n,\n allowEqual: true,\n };\n return comparisonFilter;\n }\n\n if (ui.type === 'bottomN') {\n const rankTransform: ValueRank = {\n transformer: 'rank',\n column: ui.column,\n };\n const comparisonFilter: NumericalComparisonFilter = {\n type: 'numericalComparison',\n lhs: rankTransform,\n rhs: ui.n,\n allowEqual: true,\n };\n return comparisonFilter;\n }\n\n if (ui.type === 'lessThan') {\n return {\n type: 'numericalComparison' as const,\n lhs: ui.column,\n rhs: ui.x,\n };\n }\n\n if (ui.type === 'greaterThan') {\n return {\n type: 'numericalComparison' as const,\n rhs: ui.column,\n lhs: ui.x,\n };\n }\n\n if (ui.type === 'greaterThanOrEqual') {\n return {\n type: 'numericalComparison' as const,\n rhs: ui.column,\n lhs: ui.x,\n allowEqual: true,\n };\n }\n\n if (ui.type === 'lessThanOrEqual') {\n return {\n type: 'numericalComparison' as const,\n lhs: ui.column,\n rhs: ui.x,\n allowEqual: true,\n };\n }\n\n if (ui.type === 'lessThanColumn') {\n return {\n type: 'numericalComparison' as const,\n lhs: ui.column,\n rhs: ui.rhs,\n minDiff: ui.minDiff,\n allowEqual: undefined,\n };\n }\n\n if (ui.type === 'lessThanColumnOrEqual') {\n return {\n type: 'numericalComparison' as const,\n lhs: ui.column,\n rhs: ui.rhs,\n minDiff: ui.minDiff,\n allowEqual: true,\n };\n }\n\n if (ui.type === undefined) {\n throw new Error('Filter type is undefined, this should not happen');\n }\n\n unreachable(ui);\n}\n\nexport function compileFilters(uiFilters: FilterUi[]): AnnotationFilter[] {\n return uiFilters.filter((f) => f.type !== undefined).map(compileFilter);\n}\n\nexport type AnnotationStepUi = {\n id?: number;\n label: string;\n filter: Extract<FilterUi, { type: 'and' | 'or' }>;\n};\n\nexport type AnnotationScriptUi = {\n isCreated?: boolean;\n title: string;\n mode: AnnotationMode;\n steps: AnnotationStepUi[];\n};\n\nexport function compileAnnotationScript(uiScript: AnnotationScriptUi): AnnotationScript {\n return {\n title: uiScript.title,\n mode: uiScript.mode,\n steps: uiScript.steps\n .filter((step) => {\n // No need to compile empty steps\n if (step.filter.type == null) {\n return false;\n }\n\n if (step.filter.type === 'or') {\n return step.filter.filters.length > 0;\n }\n\n if (step.filter.type === 'and') {\n return step.filter.filters.length > 0;\n }\n\n return false;\n })\n .map((step) => ({\n label: step.label.trim(),\n filter: compileFilter(step.filter),\n })),\n };\n}\n","import type { ValueOrErrors } from '@milaboratories/pl-model-common';\nimport {} from './global';\nimport { getPlatformaInstance } from './internal';\nimport type { Platforma, PlatformaApiVersion } from './platforma';\nimport { PlatformaSDKVersion } from './version';\n\nexport function getPlatformaApiVersion(): PlatformaApiVersion {\n return platformaApiVersion ?? 1; // undefined means 1 for backward compatibility\n}\n\nexport function getRawPlatformaInstance<\n Args = unknown,\n Outputs extends Record<string, ValueOrErrors<unknown>> = Record<string, ValueOrErrors<unknown>>,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n>(): Platforma<Args, Outputs, UiState, Href> {\n return getPlatformaInstance<Args, Outputs, UiState, Href>({ sdkVersion: PlatformaSDKVersion, apiVersion: platformaApiVersion });\n}\n\n/** Returns a global platforma instance or a provided fallback if it's not available. */\n// export function getPlatformaOrDefault<\n// Args = unknown,\n// Outputs extends Record<string, ValueOrErrors<unknown>> = Record<string, ValueOrErrors<unknown>>,\n// UiState = unknown,\n// Href extends `/${string}` = `/${string}`,\n// >(): PlatformaV1<Args, Outputs, UiState, Href> | PlatformaV2<Args, Outputs, UiState, Href> {\n// try {\n// return getRawPlatformaInstance<Args, Outputs, UiState, Href>();\n// } catch {\n// return platforma;\n// }\n// }\n","import {} from './global';\n\nexport function getEnvironmentValue(name: string): string | undefined {\n if (typeof globalThis.getEnvironmentValue !== 'function') return undefined;\n else return globalThis.getEnvironmentValue(name);\n}\n"],"names":["getImmediate","value","isInUI","getPlatformaInstance","config","tryGetCfgRenderCtx","getCfgRenderCtx","tryRegisterCallback","key","callback","ctx","futureResolves","registerFutureAwait","handle","onResolve","res","FutureRef","postProcess","v","__publicField","mapping","vv","ifDef","cb","TreeNodeAccessor","resolvePath","steps","transformedSteps","s","commonOptions","step","accessor","accsessor","content","errorOnUnknownField","prefix","result","obj","isPColumn","pObjects","mapPObjectData","c","range","format","nLines","patternToSearch","fieldType","field","_mapping","_ops","requireLocked","skipUnresolved","fieldEntries","e","name","StagingAccessorName","MainAccessorName","PAnnotationLabel","PAnnotationTrace","TraceEntry","z","Trace","DistancePenalty","LabelType","LabelTypeFull","deriveLabels","values","specExtractor","ops","importances","forceTraceElements","numberOfRecordsWithType","enrichedRecords","extractorResult","spec","prefixTrace","suffixTrace","label","_a","traceStr","_b","baseTrace","trace","labelEntry","fullTrace","occurrences","i","typeName","importance","occurrenceIndex","fullType","mainTypes","secondaryTypes","allTypeRecords","i1","i2","calculate","includedTypes","force","r","includedTrace","fm","labelSet","sep","additionalType","currentSet","candidateResult","PCD_PREFIX","RT_RESOURCE_MAP","RT_RESOURCE_MAP_PARTITIONED","RT_JSON_PARTITIONED","RT_BINARY_PARTITIONED","PCD_SUP_PREFIX","RT_JSON_SUPER_PARTITIONED","RT_BINARY_SUPER_PARTITIONED","removeIndexSuffix","keyStr","getPartitionKeysList","acc","rt","meta","data","keyLength","supKeyStr","keyPrefix","getUniquePartitionKeysForDataEntries","list","parts","partitionKeyLength","part","getUniquePartitionKeys","isDataInfoEntries","l","parsePColumnData","resourceType","baseKeys","suffix","entry","baseKeyStr","totalKeyLength","superPartition","innerResult","convertOrParsePColumnData","isDataInfo","dataInfoToEntries","filterDataInfoEntries","dataInfoEntries","axisFilters","sortedFilters","a","b","axisIdx","keyMatchesFilters","axisValue","removeFilteredAxes","newKey","filteredData","filteredParts","isPColumnValues","first","ArrayColumnProvider","columns","selectors","predicate","selectorsToPredicate","column","splitFiltersToTrace","splitFilters","filter","canonicalizeAxisId","splitFiltersToAxisFilter","fallbackIdDeriver","originalId","filtersToCanonicalize","canonicalize","hasAnchors","selector","potentialAnchored","domainHasAnchors","axesHaveAnchors","getSplitAxisIndices","splitIndices","axis","index","PColumnCollection","provider","labels","predicateOrSelectors","opts","anchorCtx","rawLabelOps","dontWaitAllData","overrideLabelAnnotation","exclude","labelOps","excludePredicate","excludePredicartes","resolveAnchors","selectorsArray","intermediateResults","selectedNativeIds","rawSelector","usesAnchors","currentSelector","selectedIds","selectedColumns","providerColumns","col","nativeId","deriveNativeId","splitAxisIdxs","needsSplitting","isPColumnSpec","originalSpec","dataEntries","isPartitionedDataInfoEntries","uniqueKeys","maxSplitIdx","axesLabels","idx","getAxisId","keyCombinations","generateCombinations","currentCombo","sAxisIdx","axisValues","val","newAxesSpec","splitAxisOriginalIdxs","adjustedSpec","keyCombo","axisId","axisLabelMap","labeledResults","originalColumn","axisFiltersTuple","finalId","finalSpec","entriesToDataInfo","entries","patchInSetFilters","filters","inSetToOrEqual","reference","mapSingleValuePredicate","operand","mapFilter","matchDomain","query","target","k","transformPColumnData","d","mapDataInfo","ResultPool","predicateOrSelector","filtered","refsWithEnrichments","o","ref","withEnrichments","anchorsOrCtx","AnchoredIdDeriver","resolvedAnchors","isPlRef","resolvedSpec","item","mapValueInVOE","f","ensurePColumn","out","oth","qAx","tAx","dataPool","pcolumnSpec","_cachedData","self","axisKeys","keys","RenderCtx","raw","hasInlineColumns","inlineColumnsSupport","def","rawDef","extractAllColumns","mapPTableDef","po","blockId","msg","PlatformaSDKVersion","version","isConfigLambda","cfgOrFh","downgradeCfgOrLambda","_BlockModel","_renderingMode","_initialArgs","_initialUiState","_outputs","_inputsValid","_sections","_title","_enrichmentTargets","_featureFlags","renderingMode","cfgOrRf","flags","rf","arrOrCfgOrRf","initialValue","lambda","apiVersion","requiresUIAPIVersion","makeDefaultPTableParams","createPlDataTableStateV2","upgradePlDataTableStateV2","state","isLabelColumn","isColumnHidden","isColumnOptional","isLinkerColumn","LINKER_COLUMN_ANNOTATION","createRowSelectionColumn","selection","columnId","uniquePlId","domain","isPTableAbsent","createPlSelectionModel","mapPTableValueToAxisKey","PTableNA","isNumericValueType","isStringValueType","filterUiMetadata","spec1","spec2","getFilterUiTypeOptions","columnSpec","_","metadata","type","getFilterUiMetadata","getPlatformaApiVersion","getRawPlatformaInstance","getEnvironmentValue"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../model/src/config/actions.ts","../../../../../model/src/internal.ts","../../../../../model/src/render/future.ts","../../../../../model/src/render/accessor.ts","../../../../../model/src/render/internal.ts","../../../../../model/src/render/util/label.ts","../../../../../model/src/render/util/pcolumn_data.ts","../../../../../model/src/render/util/axis_filtering.ts","../../../../../model/src/render/util/column_collection.ts","../../../../../model/src/render/util/pframe_upgraders.ts","../../../../../model/src/render/api.ts","../../../../../model/src/version.ts","../../../../../model/src/bconfig/types.ts","../../../../../model/src/bconfig/normalization.ts","../../../../../model/src/builder.ts","../../../../../model/src/components/PlDataTable.ts","../../../../../model/src/components/PFrameForGraphs.ts","../../../../../model/src/components/PlMultiSequenceAlignment.ts","../../../../../model/src/components/PlSelectionModel.ts","../../../../../model/src/components/PlAnnotations/filters_ui.ts","../../../../../model/src/raw_globals.ts","../../../../../model/src/env_value.ts"],"sourcesContent":["import type {\n ActGetField,\n ActGetFromCtx,\n ActGetImmediate,\n ActGetResourceField,\n ActGetResourceValueAsJson,\n ActMakeObject,\n ActMapRecordValues,\n ActMapResourceFields,\n ActMapArrayValues,\n ActIsEmpty,\n ActNot,\n ActIsolate,\n ActGetBlobContentAsJson,\n ActGetBlobContentAsString,\n ActGetBlobContent,\n ActAnd,\n ActOr,\n ActMakeArray,\n ActFlatten,\n ActGetDownloadedBlobContent,\n ActGetOnDemandBlobContent,\n ActImportProgress,\n ActGetLastLogs,\n ActGetProgressLog,\n ActGetProgressLogWithInfo,\n ActGetLogHandle,\n ActExtractArchiveAndGetURL,\n} from './actions_kinds';\nimport type { ExtractAction, POCExtractAction, PrimitiveOrConfig, TypedConfig } from './type_engine';\nimport type { Cfg } from './model';\nimport type { CheckedSyncConf } from './type_util';\nimport type { ArchiveFormat, RangeBytes } from '@milaboratories/pl-model-common';\n\n//\n// Helpers\n//\n\nfunction primitiveToConfig(value: PrimitiveOrConfig): TypedConfig {\n if (\n typeof value === 'string'\n || typeof value === 'number'\n || typeof value === 'boolean'\n || value === null\n )\n return getImmediate(value);\n else return value as TypedConfig;\n}\n\n//\n// Context\n//\n\nexport function getFromCfg<const V extends string>(variable: V): TypedConfig<ActGetFromCtx<V>> {\n return { type: 'GetFromCtx', variable } as Cfg as any;\n}\n\n//\n// Isolate\n//\n\nexport function isolate<const Config extends TypedConfig>(\n cfg: Config,\n): TypedConfig<ActIsolate<ExtractAction<Config>>> {\n return {\n type: 'Isolate',\n cfg,\n } as Cfg as any;\n}\n\n//\n// Well-known Context Vars\n//\n\nexport const Args = getFromCfg('$args');\nexport const It = getFromCfg('$it');\nexport const MainOutputs = getFromCfg('$prod');\nexport const StagingOutputs = getFromCfg('$staging');\nexport const UiState = getFromCfg('$ui');\n\n//\n// Json\n//\n\nexport function getImmediate<const T>(value: T): TypedConfig<ActGetImmediate<T>> {\n return { type: 'Immediate', value } as Cfg as any;\n}\n\nexport function makeObject<const T extends Record<string, PrimitiveOrConfig>>(\n template: T,\n): TypedConfig<ActMakeObject<{ [Key in keyof T]: POCExtractAction<T[Key]> }>> {\n const normalizedTemplate: Record<string, TypedConfig> = {};\n for (const [k, cfg] of Object.entries(template)) normalizedTemplate[k] = primitiveToConfig(cfg);\n return {\n type: 'MakeObject',\n template: normalizedTemplate,\n } as Cfg as any;\n}\n\nexport function makeArray<const T extends PrimitiveOrConfig[]>(\n ...template: T\n): TypedConfig<ActMakeArray<{ [Key in keyof T]: POCExtractAction<T[Key]> }>> {\n const normalizedTemplate: TypedConfig[] = [];\n for (const cfg of template) normalizedTemplate.push(primitiveToConfig(cfg));\n return {\n type: 'MakeArray',\n template: normalizedTemplate,\n } as Cfg as any;\n}\n\nexport function getJsonField<\n const Source extends PrimitiveOrConfig,\n const Field extends PrimitiveOrConfig,\n>(\n source: Source,\n field: Field,\n): TypedConfig<ActGetField<POCExtractAction<Source>, POCExtractAction<Field>>> {\n return {\n type: 'GetJsonField',\n source: primitiveToConfig(source),\n field: primitiveToConfig(field),\n } as Cfg as any;\n}\n\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n>(\n source: Source & CheckedSyncConf<Source>,\n mapping: Mapping\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n>(\n source: Source,\n mapping: Mapping & CheckedSyncConf<Mapping>\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string,\n>(\n source: Source & CheckedSyncConf<Source>,\n mapping: Mapping,\n itVar: ItVar\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string,\n>(\n source: Source,\n mapping: Mapping & CheckedSyncConf<Mapping>,\n itVar: ItVar\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapRecordValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string,\n>(\n source: Source,\n mapping: Mapping,\n itVar: ItVar = '$it' as ItVar,\n): TypedConfig<ActMapRecordValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>> {\n return {\n type: 'MapRecordValues',\n source,\n mapping,\n itVar,\n } as Cfg as any;\n}\n\nexport function mapArrayValues<const Source extends TypedConfig, const Mapping extends TypedConfig>(\n source: Source & CheckedSyncConf<Source>,\n mapping: Mapping\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapArrayValues<const Source extends TypedConfig, const Mapping extends TypedConfig>(\n source: Source,\n mapping: Mapping & CheckedSyncConf<Mapping>\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapArrayValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string,\n>(\n source: Source & CheckedSyncConf<Source>,\n mapping: Mapping,\n itVar: ItVar\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapArrayValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string,\n>(\n source: Source,\n mapping: Mapping & CheckedSyncConf<Mapping>,\n itVar: ItVar\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapArrayValues<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string,\n>(\n source: Source,\n mapping: Mapping,\n itVar: ItVar = '$it' as ItVar,\n): TypedConfig<ActMapArrayValues<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>> {\n return {\n type: 'MapArrayValues',\n source,\n mapping,\n itVar,\n } as Cfg as any;\n}\n\nexport function flatten<const Source extends TypedConfig>(\n source: Source,\n): TypedConfig<ActFlatten<ExtractAction<Source>>> {\n return {\n type: 'Flatten',\n source,\n } as Cfg as any;\n}\n\n//\n// Boolean\n//\n\nexport function isEmpty<const Arg extends TypedConfig>(\n arg: Arg,\n): TypedConfig<ActIsEmpty<ExtractAction<Arg>>> {\n return {\n type: 'IsEmpty',\n arg,\n } as Cfg as any;\n}\n\nexport function not<const Operand extends TypedConfig>(\n operand: Operand,\n): TypedConfig<ActNot<ExtractAction<Operand>>> {\n return {\n type: 'Not',\n operand,\n } as Cfg as any;\n}\n\nexport function and<const Operand1 extends TypedConfig, const Operand2 extends TypedConfig>(\n operand1: Operand1,\n operand2: Operand2,\n): TypedConfig<ActAnd<ExtractAction<Operand1>, ExtractAction<Operand2>>> {\n return {\n type: 'And',\n operand1,\n operand2,\n } as Cfg as any;\n}\n\nexport function or<const Operand1 extends TypedConfig, const Operand2 extends TypedConfig>(\n operand1: Operand1,\n operand2: Operand2,\n): TypedConfig<ActOr<ExtractAction<Operand1>, ExtractAction<Operand2>>> {\n return {\n type: 'Or',\n operand1,\n operand2,\n } as Cfg as any;\n}\n\n//\n// Resources\n//\n\nexport function getResourceField<\n const Source extends PrimitiveOrConfig,\n const Field extends PrimitiveOrConfig,\n>(\n source: Source,\n field: Field,\n): TypedConfig<ActGetResourceField<POCExtractAction<Source>, POCExtractAction<Field>>> {\n return {\n type: 'GetResourceField',\n source: primitiveToConfig(source),\n field: primitiveToConfig(field),\n } as Cfg as any;\n}\n\nexport function getResourceValueAsJson<T>() {\n return function <const Source extends PrimitiveOrConfig>(\n source: Source,\n ): TypedConfig<ActGetResourceValueAsJson<POCExtractAction<Source>, T>> {\n return {\n type: 'GetResourceValueAsJson',\n source: primitiveToConfig(source),\n } as Cfg as any;\n };\n}\n\nexport function mapResourceFields<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n>(\n source: Source,\n mapping: Mapping\n): TypedConfig<ActMapResourceFields<ExtractAction<Source>, ExtractAction<Mapping>, '$it'>>;\nexport function mapResourceFields<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string,\n>(\n source: Source,\n mapping: Mapping,\n itVar: ItVar\n): TypedConfig<ActMapResourceFields<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>>;\nexport function mapResourceFields<\n const Source extends TypedConfig,\n const Mapping extends TypedConfig,\n const ItVar extends string,\n>(\n source: Source,\n mapping: Mapping,\n itVar: ItVar = '$it' as ItVar,\n): TypedConfig<ActMapResourceFields<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>> {\n return {\n type: 'MapResourceFields',\n source,\n mapping,\n itVar,\n } as Cfg as TypedConfig<\n ActMapResourceFields<ExtractAction<Source>, ExtractAction<Mapping>, ItVar>\n >;\n}\n\n//\n// Download Blobs\n//\n\nexport function getBlobContent<const Source extends TypedConfig>(\n source: Source,\n range?: RangeBytes,\n): TypedConfig<ActGetBlobContent<ExtractAction<Source>>> {\n return {\n type: 'GetBlobContent',\n range,\n source: primitiveToConfig(source),\n } as Cfg as any;\n}\n\nexport function getBlobContentAsString<const Source extends TypedConfig>(\n source: Source,\n range?: RangeBytes,\n): TypedConfig<ActGetBlobContentAsString<ExtractAction<Source>>> {\n return {\n type: 'GetBlobContentAsString',\n range,\n source: primitiveToConfig(source),\n } as Cfg as any;\n}\n\nexport function getBlobContentAsJson<T>() {\n return function <const Source extends TypedConfig>(\n source: Source,\n range?: RangeBytes,\n ): TypedConfig<ActGetBlobContentAsJson<ExtractAction<Source>, T>> {\n return {\n type: 'GetBlobContentAsJson',\n range,\n source: primitiveToConfig(source),\n } as Cfg as any;\n };\n}\n\nexport function getDownloadedBlobContent<const Source extends TypedConfig>(\n source: Source,\n): TypedConfig<ActGetDownloadedBlobContent<ExtractAction<Source>>> {\n return {\n type: 'GetDownloadedBlobContent',\n source: primitiveToConfig(source),\n } as Cfg as any;\n}\n\nexport function getOnDemandBlobContent<const Source extends TypedConfig>(\n source: Source,\n): TypedConfig<ActGetOnDemandBlobContent<ExtractAction<Source>>> {\n return {\n type: 'GetOnDemandBlobContent',\n source: primitiveToConfig(source),\n } as Cfg as any;\n}\n\n//\n// Download Blobs to URLs\n//\n\nexport function extractArchiveAndGetURL<const Source extends TypedConfig>(\n source: Source,\n format: ArchiveFormat,\n): TypedConfig<ActExtractArchiveAndGetURL<ExtractAction<Source>>> {\n return {\n type: 'ExtractArchiveAndGetURL',\n format,\n source: primitiveToConfig(source),\n } as Cfg as any;\n}\n\n//\n// Upload Blobs\n//\n\nexport function getImportProgress<const Source extends TypedConfig>(\n source: Source,\n): TypedConfig<ActImportProgress<ExtractAction<Source>>> {\n return {\n type: 'GetImportProgress',\n source: primitiveToConfig(source),\n } as Cfg as any;\n}\n\n//\n// Logs\n//\n\nexport function getLastLogs<const Source extends TypedConfig>(\n source: Source,\n lines: number,\n): TypedConfig<ActGetLastLogs<ExtractAction<Source>>> {\n return {\n type: 'GetLastLogs',\n source: primitiveToConfig(source),\n lines,\n } as Cfg as any;\n}\n\nexport function getProgressLog<const Source extends TypedConfig>(\n source: Source,\n patternToSearch: string,\n): TypedConfig<ActGetProgressLog<ExtractAction<Source>>> {\n return {\n type: 'GetProgressLog',\n source: primitiveToConfig(source),\n patternToSearch,\n } as Cfg as any;\n}\n\nexport function getProgressLogWithInfo<const Source extends TypedConfig>(\n source: Source,\n patternToSearch: string,\n): TypedConfig<ActGetProgressLogWithInfo<ExtractAction<Source>>> {\n return {\n type: 'GetProgressLogWithInfo',\n source: primitiveToConfig(source),\n patternToSearch,\n } as Cfg as any;\n}\n\nexport function getLogHandle<const Source extends TypedConfig>(\n source: Source,\n): TypedConfig<ActGetLogHandle<ExtractAction<Source>>> {\n return {\n type: 'GetLogHandle',\n source: primitiveToConfig(source),\n } as Cfg as any;\n}\n","import type { ValueOrErrors } from '@milaboratories/pl-model-common';\nimport {} from './global';\nimport type { Platforma, PlatformaApiVersion } from './platforma';\nimport type { FutureHandle, GlobalCfgRenderCtx } from './render/internal';\n\n/** Utility code helping to identify whether the code is running in actual UI environment */\nexport function isInUI() {\n return (\n typeof globalThis.getPlatforma !== 'undefined' || typeof globalThis.platforma !== 'undefined'\n );\n}\n\n/** Utility code helping to retrieve a platforma instance form the environment */\nexport function getPlatformaInstance<\n Args = unknown,\n Outputs extends Record<string, ValueOrErrors<unknown>> = Record<string, ValueOrErrors<unknown>>,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n>(config?: { sdkVersion: string; apiVersion: PlatformaApiVersion }): Platforma<Args, Outputs, UiState, Href> {\n if (config && typeof globalThis.getPlatforma === 'function')\n return globalThis.getPlatforma(config);\n else if (typeof globalThis.platforma !== 'undefined') return globalThis.platforma;\n else throw new Error('Can\\'t get platforma instance.');\n}\n\nexport function tryGetCfgRenderCtx(): GlobalCfgRenderCtx | undefined {\n if (typeof globalThis.cfgRenderCtx !== 'undefined') return globalThis.cfgRenderCtx;\n else return undefined;\n}\n\nexport function getCfgRenderCtx(): GlobalCfgRenderCtx {\n if (typeof globalThis.cfgRenderCtx !== 'undefined') return globalThis.cfgRenderCtx;\n else throw new Error('Not in config rendering context');\n}\n\nexport function tryRegisterCallback(key: string, callback: (...args: any[]) => any): boolean {\n const ctx = tryGetCfgRenderCtx();\n if (ctx === undefined) return false;\n if (key in ctx.callbackRegistry) throw new Error(`Callback with key ${key} already registered.`);\n ctx.callbackRegistry[key] = callback;\n return true;\n}\n\nconst futureResolves = new Map<string, ((value: unknown) => void)[]>();\n\nexport function registerFutureAwait(handle: FutureHandle, onResolve: (value: unknown) => void) {\n if (!(handle in getCfgRenderCtx().callbackRegistry)) {\n getCfgRenderCtx().callbackRegistry[handle] = (value: unknown) => {\n for (const res of futureResolves.get(handle)!) {\n res(value);\n }\n };\n futureResolves.set(handle, []);\n }\n futureResolves.get(handle)!.push(onResolve);\n}\n","import type { FutureAwait, FutureHandle } from './internal';\nimport { registerFutureAwait } from '../internal';\n\nexport class FutureRef<T = unknown> {\n private isResolved = false;\n private resolvedValue?: T;\n\n constructor(\n private readonly handle: FutureHandle,\n private readonly postProcess: (value: unknown) => T = (v) => v as T,\n ) {\n registerFutureAwait(handle, (value) => {\n this.resolvedValue = postProcess(value);\n this.isResolved = true;\n });\n }\n\n public map<R>(mapping: (v: T) => R): FutureRef<R> {\n return new FutureRef<R>(this.handle, (v) => mapping(this.postProcess(v)));\n }\n\n public mapDefined<R>(mapping: (v: NonNullable<T>) => R): FutureRef<R | undefined> {\n return new FutureRef<R | undefined>(this.handle, (v) => {\n const vv = this.postProcess(v);\n return vv ? mapping(vv) : undefined;\n });\n }\n\n toJSON() {\n return this.isResolved\n ? this.resolvedValue\n : ({ __awaited_futures__: [this.handle] } as FutureAwait);\n }\n}\n\nexport type ExtractFutureRefType<Ref extends FutureRef> =\n Ref extends FutureRef<infer T> ? T : never;\n","import type {\n AnyLogHandle,\n ImportProgress,\n LocalBlobHandleAndSize,\n PColumn,\n PObject,\n RemoteBlobHandleAndSize,\n FolderURL,\n ArchiveFormat,\n ProgressLogWithInfo,\n RangeBytes,\n} from '@milaboratories/pl-model-common';\nimport {\n isPColumn,\n mapPObjectData,\n} from '@milaboratories/pl-model-common';\nimport { getCfgRenderCtx } from '../internal';\nimport { FutureRef } from './future';\nimport type { AccessorHandle } from './internal';\nimport type { CommonFieldTraverseOps, FieldTraversalStep, ResourceType } from './traversal_ops';\n\nexport function ifDef<T, R>(value: T | undefined, cb: (value: T) => R): R | undefined {\n return value === undefined ? undefined : cb(value);\n}\n\ntype FieldMapOps = {\n /**\n * Type of fields to iterate over.\n * (default 'Input')\n * */\n readonly fieldType?: 'Input' | 'Output' | 'Dynamic';\n /**\n * If not locked, `undefined` value will be returned. Do nothing if mapping `Dynamic` fields.\n * (default true)\n * */\n readonly requireLocked?: boolean;\n /**\n * Will skip unresolved fields.\n * (default false)\n * */\n readonly skipUnresolved?: boolean;\n};\n\n/** Represent resource tree node accessor */\nexport class TreeNodeAccessor {\n constructor(\n public readonly handle: AccessorHandle,\n public readonly resolvePath: string[],\n ) {}\n\n /** Shortcut for {@link resolveInput} */\n public resolve(\n ...steps: [\n Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {\n errorIfFieldNotAssigned: true;\n },\n ]\n ): TreeNodeAccessor;\n /** Shortcut for {@link resolveInput} */\n public resolve(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;\n public resolve(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {\n const transformedSteps = steps.map(\n (s) =>\n ({\n assertFieldType: 'Input',\n ...(typeof s === 'string' ? { field: s } : s),\n }) satisfies FieldTraversalStep,\n );\n return this.resolveWithCommon({}, ...transformedSteps);\n }\n\n /** If field type assertion is not specified for the step, default is Output. */\n public resolveOutput(\n ...steps: [\n Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {\n errorIfFieldNotAssigned: true;\n },\n ]\n ): TreeNodeAccessor;\n /** If field type assertion is not specified for the step, default is Output. */\n public resolveOutput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;\n public resolveOutput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {\n const transformedSteps = steps.map(\n (s) =>\n ({\n assertFieldType: 'Output',\n ...(typeof s === 'string' ? { field: s } : s),\n }) satisfies FieldTraversalStep,\n );\n return this.resolveWithCommon({}, ...transformedSteps);\n }\n\n /** If field type assertion is not specified for the step, default is Input. */\n public resolveInput(\n ...steps: [\n Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {\n errorIfFieldNotAssigned: true;\n },\n ]\n ): TreeNodeAccessor;\n /** If field type assertion is not specified for the step, default is Input. */\n public resolveInput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;\n public resolveInput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {\n const transformedSteps = steps.map(\n (s) =>\n ({\n assertFieldType: 'Input',\n ...(typeof s === 'string' ? { field: s } : s),\n }) satisfies FieldTraversalStep,\n );\n return this.resolveWithCommon({}, ...transformedSteps);\n }\n\n public resolveAny(\n ...steps: [\n Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {\n errorIfFieldNotAssigned: true;\n },\n ]\n ): TreeNodeAccessor;\n public resolveAny(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;\n public resolveAny(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {\n return this.resolveWithCommon({}, ...steps);\n }\n\n public resolveWithCommon(\n commonOptions: CommonFieldTraverseOps,\n ...steps: (FieldTraversalStep | string)[]\n ): TreeNodeAccessor | undefined {\n const resolvePath = [\n ...this.resolvePath,\n ...steps.map((step) => typeof step === 'string' ? step : step.field),\n ];\n return ifDef(\n getCfgRenderCtx().resolveWithCommon(this.handle, commonOptions, ...steps),\n (accessor) => new TreeNodeAccessor(accessor, resolvePath),\n );\n }\n\n public get resourceType(): ResourceType {\n return getCfgRenderCtx().getResourceType(this.handle);\n }\n\n public getInputsLocked(): boolean {\n return getCfgRenderCtx().getInputsLocked(this.handle);\n }\n\n public getOutputsLocked(): boolean {\n return getCfgRenderCtx().getOutputsLocked(this.handle);\n }\n\n public getIsReadyOrError(): boolean {\n return getCfgRenderCtx().getIsReadyOrError(this.handle);\n }\n\n public getIsFinal(): boolean {\n return getCfgRenderCtx().getIsFinal(this.handle);\n }\n\n public getError(): TreeNodeAccessor | undefined {\n const resolvePath = [...this.resolvePath, 'error'];\n return ifDef(\n getCfgRenderCtx().getError(this.handle),\n (accsessor) => new TreeNodeAccessor(accsessor, resolvePath),\n );\n }\n\n public listInputFields(): string[] {\n return getCfgRenderCtx().listInputFields(this.handle);\n }\n\n public listOutputFields(): string[] {\n return getCfgRenderCtx().listOutputFields(this.handle);\n }\n\n public listDynamicFields(): string[] {\n return getCfgRenderCtx().listDynamicFields(this.handle);\n }\n\n public getKeyValueBase64(key: string): string | undefined {\n return getCfgRenderCtx().getKeyValueBase64(this.handle, key);\n }\n\n public getKeyValueAsString(key: string): string | undefined {\n return getCfgRenderCtx().getKeyValueAsString(this.handle, key);\n }\n\n public getKeyValueAsJson<T>(key: string): T {\n const content = this.getKeyValueAsString(key);\n if (content == undefined) throw new Error('Resource has no content.');\n return JSON.parse(content);\n }\n\n public getDataBase64(): string | undefined {\n return getCfgRenderCtx().getDataBase64(this.handle);\n }\n\n public getDataAsString(): string | undefined {\n return getCfgRenderCtx().getDataAsString(this.handle);\n }\n\n public getDataAsJson<T>(): T {\n const content = this.getDataAsString();\n if (content == undefined) throw new Error('Resource has no content.');\n return JSON.parse(content);\n }\n\n /**\n *\n */\n public getPColumns(\n errorOnUnknownField: boolean = false,\n prefix: string = '',\n ): PColumn<TreeNodeAccessor>[] | undefined {\n const result = this.parsePObjectCollection(errorOnUnknownField, prefix);\n if (result === undefined) return undefined;\n\n const pf = Object.entries(result).map(([, obj]) => {\n if (!isPColumn(obj)) throw new Error(`not a PColumn (kind = ${obj.spec.kind})`);\n return obj;\n });\n\n return pf;\n }\n\n /**\n *\n */\n public parsePObjectCollection(\n errorOnUnknownField: boolean = false,\n prefix: string = '',\n ): Record<string, PObject<TreeNodeAccessor>> | undefined {\n const pObjects = getCfgRenderCtx().parsePObjectCollection(\n this.handle,\n errorOnUnknownField,\n prefix,\n ...this.resolvePath,\n );\n if (pObjects === undefined) return undefined;\n const result: Record<string, PObject<TreeNodeAccessor>> = {};\n for (const [key, value] of Object.entries(pObjects)) {\n const resolvePath = [...this.resolvePath, key];\n result[key] = mapPObjectData(value, (c) => new TreeNodeAccessor(c, resolvePath));\n }\n return result;\n }\n\n public getFileContentAsBase64(range?: RangeBytes): FutureRef<string | undefined> {\n return new FutureRef(getCfgRenderCtx().getBlobContentAsBase64(this.handle, range));\n }\n\n public getFileContentAsString(range?: RangeBytes): FutureRef<string | undefined> {\n return new FutureRef(getCfgRenderCtx().getBlobContentAsString(this.handle, range));\n }\n\n public getFileContentAsJson<T>(range?: RangeBytes): FutureRef<T | undefined> {\n return new FutureRef<string | undefined>(\n getCfgRenderCtx().getBlobContentAsString(this.handle, range),\n ).mapDefined((v) => JSON.parse(v) as T);\n }\n\n /**\n * @deprecated use getFileContentAsBase64\n */\n public getBlobContentAsBase64(): FutureRef<string | undefined> {\n return this.getFileContentAsBase64();\n }\n\n /**\n * @deprecated use getFileContentAsString\n */\n public getBlobContentAsString(): FutureRef<string | undefined> {\n return this.getFileContentAsString();\n }\n\n /**\n * @returns downloaded file handle\n */\n public getFileHandle(): FutureRef<LocalBlobHandleAndSize | undefined> {\n return new FutureRef(getCfgRenderCtx().getDownloadedBlobContentHandle(this.handle));\n }\n\n /**\n * @deprecated use getFileHandle\n */\n public getDownloadedBlobHandle(): FutureRef<LocalBlobHandleAndSize | undefined> {\n return this.getFileHandle();\n }\n\n /**\n * @returns downloaded file handle\n */\n public getRemoteFileHandle(): FutureRef<RemoteBlobHandleAndSize | undefined> {\n return new FutureRef(getCfgRenderCtx().getOnDemandBlobContentHandle(this.handle));\n }\n\n /**\n * @deprecated use getRemoteFileHandle\n */\n public getOnDemandBlobHandle(): FutureRef<RemoteBlobHandleAndSize | undefined> {\n return this.getRemoteFileHandle();\n }\n\n /**\n * @returns the url to the extracted folder\n */\n public extractArchiveAndGetURL(format: ArchiveFormat): FutureRef<FolderURL | undefined> {\n return new FutureRef(getCfgRenderCtx().extractArchiveAndGetURL(this.handle, format));\n }\n\n public getImportProgress(): FutureRef<ImportProgress> {\n return new FutureRef(getCfgRenderCtx().getImportProgress(this.handle));\n }\n\n public getLastLogs(nLines: number): FutureRef<string | undefined> {\n return new FutureRef(getCfgRenderCtx().getLastLogs(this.handle, nLines));\n }\n\n public getProgressLog(patternToSearch: string): FutureRef<string | undefined> {\n return new FutureRef(getCfgRenderCtx().getProgressLog(this.handle, patternToSearch));\n }\n\n public getProgressLogWithInfo(patternToSearch: string): FutureRef<ProgressLogWithInfo | undefined> {\n return new FutureRef(getCfgRenderCtx().getProgressLogWithInfo(this.handle, patternToSearch));\n }\n\n public getLogHandle(): FutureRef<AnyLogHandle | undefined> {\n return new FutureRef(getCfgRenderCtx().getLogHandle(this.handle));\n }\n\n public allFieldsResolved(fieldType: 'Input' | 'Output' = 'Input'): boolean {\n switch (fieldType) {\n case 'Input':\n return (\n this.getInputsLocked()\n && this.listInputFields().every(\n (field) => this.resolve({ field, assertFieldType: 'Input' }) !== undefined,\n )\n );\n case 'Output':\n return (\n this.getOutputsLocked()\n && this.listOutputFields().every(\n (field) => this.resolve({ field, assertFieldType: 'Output' }) !== undefined,\n )\n );\n }\n }\n\n public mapFields<T>(\n _mapping: (name: string, value: TreeNodeAccessor) => T,\n _ops: FieldMapOps & { skipUnresolved: true }\n ): T[] | undefined;\n public mapFields<T>(\n _mapping: (name: string, value: TreeNodeAccessor | undefined) => T,\n _ops?: FieldMapOps\n ): T[] | undefined;\n public mapFields<T>(\n _mapping: (name: string, value: TreeNodeAccessor) => T,\n _ops?: FieldMapOps,\n ): T[] | undefined {\n const { fieldType, requireLocked, skipUnresolved } = {\n fieldType: 'Input' as const,\n requireLocked: true,\n skipUnresolved: false,\n ..._ops,\n };\n const mapping = _mapping as (name: string, value: TreeNodeAccessor | undefined) => T;\n if (requireLocked) {\n if (fieldType === 'Input' && !this.getInputsLocked()) return undefined;\n if (fieldType === 'Output' && !this.getOutputsLocked()) return undefined;\n }\n const fieldList\n = fieldType === 'Input'\n ? this.listInputFields()\n : fieldType === 'Output'\n ? this.listOutputFields()\n : this.listDynamicFields();\n let fieldEntries = fieldList.map(\n (field) => [field, this.resolve({ field, assertFieldType: fieldType })] as const,\n );\n if (skipUnresolved) fieldEntries = fieldEntries.filter((e) => e[1] !== undefined);\n return fieldEntries.map(([name, value]) => mapping(name, value));\n }\n}\n","import type { Optional } from 'utility-types';\nimport type { Branded } from '../branding';\nimport type { CommonFieldTraverseOps, FieldTraversalStep, ResourceType } from './traversal_ops';\nimport type {\n ArchiveFormat,\n AnyFunction,\n Option,\n PColumn,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PTableDef,\n PTableHandle,\n ResultCollection,\n ValueOrError,\n DataInfo,\n RangeBytes,\n} from '@milaboratories/pl-model-common';\n\nexport const StagingAccessorName = 'staging';\nexport const MainAccessorName = 'main';\n\nexport type AccessorHandle = Branded<string, 'AccessorHandle'>;\nexport type FutureHandle = Branded<string, 'FutureHandle'>;\n\nexport interface GlobalCfgRenderCtxMethods<AHandle = AccessorHandle, FHandle = FutureHandle> {\n\n //\n // Root accessor creation\n //\n\n getAccessorHandleByName(name: string): AHandle | undefined;\n\n //\n // Basic resource accessor actions\n //\n\n resolveWithCommon(\n handle: AHandle,\n commonOptions: CommonFieldTraverseOps,\n ...steps: (FieldTraversalStep | string)[]\n ): AHandle | undefined;\n\n getResourceType(handle: AHandle): ResourceType;\n\n getInputsLocked(handle: AHandle): boolean;\n\n getOutputsLocked(handle: AHandle): boolean;\n\n getIsReadyOrError(handle: AHandle): boolean;\n\n getIsFinal(handle: AHandle): boolean;\n\n getError(handle: AHandle): AHandle | undefined;\n\n listInputFields(handle: AHandle): string[];\n\n listOutputFields(handle: AHandle): string[];\n\n listDynamicFields(handle: AHandle): string[];\n\n getKeyValueBase64(handle: AHandle, key: string): string | undefined;\n\n getKeyValueAsString(handle: AHandle, key: string): string | undefined;\n\n getDataBase64(handle: AHandle): string | undefined;\n\n getDataAsString(handle: AHandle): string | undefined;\n\n /** If not final returns undefined */\n parsePObjectCollection(\n handle: AHandle,\n errorOnUnknownField: boolean,\n prefix: string,\n ...resolvePath: string[]\n ): Record<string, PObject<AHandle>> | undefined;\n\n //\n // Blob\n //\n\n getBlobContentAsBase64(handle: AHandle, range?: RangeBytes): FHandle; // string | undefined\n\n getBlobContentAsString(handle: AHandle, range?: RangeBytes): FHandle; // string | undefined\n\n getDownloadedBlobContentHandle(handle: AHandle): FHandle; // LocalBlobHandleAndSize | undefined;\n\n getOnDemandBlobContentHandle(handle: AHandle): FHandle; // RemoteBlobHandleAndSize | undefined;\n\n //\n // Blobs to URLs\n //\n\n extractArchiveAndGetURL(handle: AHandle, format: ArchiveFormat): FHandle;\n\n //\n // Import progress\n //\n\n getImportProgress(handle: AHandle): FHandle; // ImportProgress;\n\n //\n // Logs\n //\n\n getLastLogs(handle: AHandle, nLines: number): FHandle; // string | undefined;\n\n getProgressLog(handle: AHandle, patternToSearch: string): FHandle; // string | undefined;\n\n getProgressLogWithInfo(handle: AHandle, patternToSearch: string): FHandle; // ProgressLogWithInfo | undefined;\n\n getLogHandle(handle: AHandle): FHandle; // AnyLogHandle | undefined;\n\n //\n // Blocks\n //\n\n /** @deprecated at some point will stop working and will return dummy values */\n getBlockLabel(blockId: string): string;\n\n //\n // Result Pool\n //\n\n getDataFromResultPool(): ResultCollection<PObject<AHandle>>;\n\n getDataWithErrorsFromResultPool(): ResultCollection<\n Optional<PObject<ValueOrError<AHandle, Error>>, 'id'>\n >;\n\n getSpecsFromResultPool(): ResultCollection<PObjectSpec>;\n\n getSpecFromResultPoolByRef(blockId: string, exportName: string): PObjectSpec | undefined;\n\n getDataFromResultPoolByRef(blockId: string, exportName: string): PObject<AHandle> | undefined;\n\n calculateOptions(predicate: PSpecPredicate): Option[];\n\n //\n // PFrame / PTable\n //\n\n createPFrame(def: PFrameDef<AHandle | PColumnValues | DataInfo<AHandle>>): PFrameHandle;\n\n createPTable(def: PTableDef<PColumn<AHandle | PColumnValues | DataInfo<AHandle>>>): PTableHandle;\n\n //\n // Computable\n //\n\n getCurrentUnstableMarker(): string | undefined;\n\n //\n // Logging\n //\n\n logInfo(message: string): void;\n\n logWarn(message: string): void;\n\n logError(message: string): void;\n}\n\nexport const GlobalCfgRenderCtxFeatureFlags = {\n explicitColumnsSupport: true as const,\n inlineColumnsSupport: true as const,\n activeArgs: true as const,\n pTablePartitionFiltersSupport: true as const,\n pFrameInSetFilterSupport: true as const,\n};\n\nexport interface GlobalCfgRenderCtx extends GlobalCfgRenderCtxMethods {\n //\n // State: Args, UI State, Active Args\n //\n // Old runtime injects these values as strings, new runtime injects them as functions\n // that return strings, if block declares supportsLazyState flag.\n // If function not called in lazy state API, then resulting output will not depend on these values,\n // and thus will not be recalculated on corresponding state change.\n //\n\n readonly args: string | (() => string);\n readonly uiState: string | (() => string);\n readonly activeArgs: undefined | string | (() => string | undefined);\n\n // Note: strings below are used because, anyway, using strings is the only way\n // to get data inside the QuickJS context, as it is implemented now. With this\n // approach deserialization can be lazily postponed until it is actually needed.\n readonly callbackRegistry: Record<string, AnyFunction>;\n readonly featureFlags?: typeof GlobalCfgRenderCtxFeatureFlags;\n}\n\nexport type FutureAwait = {\n __awaited_futures__: FutureHandle[];\n};\n\nexport function isFutureAwait(obj: unknown): obj is FutureAwait {\n return typeof obj === 'object' && obj !== null && '__awaited_futures__' in obj;\n}\n\nfunction addAllFutureAwaits(set: Set<string>, visited: Set<unknown>, node: unknown) {\n if (visited.has(node)) return;\n visited.add(node);\n\n const type = typeof node;\n if (type === 'object') {\n if (isFutureAwait(node)) node.__awaited_futures__.forEach((a) => set.add(a));\n else if (Array.isArray(node))\n for (const nested of node) addAllFutureAwaits(set, visited, nested);\n else\n for (const [, nested] of Object.entries(node as object))\n if (nested !== node) addAllFutureAwaits(set, visited, nested);\n }\n}\n\nexport function getAllFutureAwaits(obj: unknown): Set<string> {\n const set = new Set<string>();\n addAllFutureAwaits(set, new Set(), obj);\n return set;\n}\n","import type { PObjectSpec } from '@milaboratories/pl-model-common';\nimport { z } from 'zod';\n\nexport const PAnnotationLabel = 'pl7.app/label';\nexport const PAnnotationTrace = 'pl7.app/trace';\n\nexport type RecordsWithLabel<T> = {\n value: T;\n label: string;\n};\n\nexport type LabelDerivationOps = {\n /** Force inclusion of native column label */\n includeNativeLabel?: boolean;\n /** Separator to use between label parts (\" / \" by default) */\n separator?: string;\n /** If true, label will be added as suffix (at the end of the generated label). By default label added as a prefix. */\n addLabelAsSuffix?: boolean;\n /** Trace elements list that will be forced to be included in the label. */\n forceTraceElements?: string[];\n};\n\nexport const TraceEntry = z.object({\n type: z.string(),\n importance: z.number().optional(),\n id: z.string().optional(),\n label: z.string(),\n});\nexport type TraceEntry = z.infer<typeof TraceEntry>;\ntype FullTraceEntry = TraceEntry & { fullType: string; occurrenceIndex: number };\n\nexport const Trace = z.array(TraceEntry);\nexport type Trace = z.infer<typeof Trace>;\ntype FullTrace = FullTraceEntry[];\n\n// Define the possible return types for the specExtractor function\ntype SpecExtractorResult = PObjectSpec | {\n spec: PObjectSpec;\n prefixTrace?: TraceEntry[];\n suffixTrace?: TraceEntry[];\n};\n\nconst DistancePenalty = 0.001;\n\nconst LabelType = '__LABEL__';\nconst LabelTypeFull = '__LABEL__@1';\n\nexport function deriveLabels<T>(\n values: T[],\n specExtractor: (obj: T) => SpecExtractorResult,\n ops: LabelDerivationOps = {},\n): RecordsWithLabel<T>[] {\n const importances = new Map<string, number>();\n\n const forceTraceElements = (ops.forceTraceElements !== undefined && ops.forceTraceElements.length > 0)\n ? new Set(ops.forceTraceElements)\n : undefined;\n\n // number of times certain type occurred among all of the\n const numberOfRecordsWithType = new Map<string, number>();\n\n const enrichedRecords = values.map((value) => {\n const extractorResult = specExtractor(value);\n let spec: PObjectSpec;\n let prefixTrace: TraceEntry[] | undefined;\n let suffixTrace: TraceEntry[] | undefined;\n\n // Check if the result is the new structure or just PObjectSpec\n if ('spec' in extractorResult && typeof extractorResult.spec === 'object') {\n // It's the new structure { spec, prefixTrace?, suffixTrace? }\n spec = extractorResult.spec;\n prefixTrace = extractorResult.prefixTrace;\n suffixTrace = extractorResult.suffixTrace;\n } else {\n // It's just PObjectSpec\n spec = extractorResult as PObjectSpec;\n }\n\n const label = spec.annotations?.[PAnnotationLabel];\n const traceStr = spec.annotations?.[PAnnotationTrace];\n const baseTrace = (traceStr ? Trace.safeParse(JSON.parse(traceStr)).data : undefined) ?? [];\n\n const trace = [\n ...(prefixTrace ?? []),\n ...baseTrace,\n ...(suffixTrace ?? []),\n ];\n\n if (label !== undefined) {\n const labelEntry = { label, type: LabelType, importance: -2 };\n if (ops.addLabelAsSuffix) trace.push(labelEntry);\n else trace.splice(0, 0, labelEntry);\n }\n\n const fullTrace: FullTrace = [];\n\n const occurrences = new Map<string, number>();\n for (let i = trace.length - 1; i >= 0; --i) {\n const { type: typeName } = trace[i];\n const importance = trace[i].importance ?? 0;\n const occurrenceIndex = (occurrences.get(typeName) ?? 0) + 1;\n occurrences.set(typeName, occurrenceIndex);\n const fullType = `${typeName}@${occurrenceIndex}`;\n numberOfRecordsWithType.set(fullType, (numberOfRecordsWithType.get(fullType) ?? 0) + 1);\n importances.set(\n fullType,\n Math.max(\n importances.get(fullType) ?? Number.NEGATIVE_INFINITY,\n importance - (trace.length - i) * DistancePenalty,\n ),\n );\n fullTrace.push({ ...trace[i], fullType, occurrenceIndex: occurrenceIndex });\n }\n fullTrace.reverse();\n return {\n value,\n spec,\n label,\n fullTrace,\n };\n });\n\n // excluding repeated types (i.e. ..@2, ..@3, etc.) not found in some records\n const mainTypes: string[] = [];\n // repeated types (i.e. ..@2, ..@3, etc.) not found in some records\n const secondaryTypes: string[] = [];\n\n const allTypeRecords = [...importances];\n // sorting: most important types go first\n allTypeRecords.sort(([, i1], [, i2]) => i2 - i1);\n\n for (const [typeName] of allTypeRecords) {\n if (typeName.endsWith('@1') || numberOfRecordsWithType.get(typeName) === values.length)\n mainTypes.push(typeName);\n else secondaryTypes.push(typeName);\n }\n\n const calculate = (includedTypes: Set<string>, force: boolean = false) => {\n const result: RecordsWithLabel<T>[] = [];\n for (let i = 0; i < enrichedRecords.length; i++) {\n const r = enrichedRecords[i];\n const includedTrace = r.fullTrace\n .filter((fm) => includedTypes.has(fm.fullType)\n || (forceTraceElements && forceTraceElements.has(fm.type)));\n if (includedTrace.length === 0) {\n if (force)\n result.push({\n label: 'Unlabeled',\n value: r.value,\n } satisfies RecordsWithLabel<T>);\n else return undefined;\n }\n const labelSet = includedTrace\n .map((fm) => fm.label);\n const sep = ops.separator ?? ' / ';\n result.push({\n label: labelSet.join(sep),\n value: r.value,\n } satisfies RecordsWithLabel<T>);\n }\n return result;\n };\n\n if (mainTypes.length === 0) {\n if (secondaryTypes.length !== 0) throw new Error('Non-empty secondary types list while main types list is empty.');\n return calculate(new Set(LabelTypeFull), true)!;\n }\n\n //\n // includedTypes = 2\n // * *\n // T0 T1 T2 T3 T4 T5\n // *\n // additionalType = 3\n //\n // Resulting set: T0, T1, T3\n //\n let includedTypes = 0;\n let additionalType = -1;\n while (includedTypes < mainTypes.length) {\n const currentSet = new Set<string>();\n if (ops.includeNativeLabel) currentSet.add(LabelTypeFull);\n for (let i = 0; i < includedTypes; ++i) currentSet.add(mainTypes[i]);\n if (additionalType >= 0)\n currentSet.add(mainTypes[additionalType]);\n\n const candidateResult = calculate(currentSet);\n\n // checking if labels uniquely separate our records\n if (candidateResult !== undefined && new Set(candidateResult.map((c) => c.label)).size === values.length) return candidateResult;\n\n additionalType++;\n if (additionalType >= mainTypes.length) {\n includedTypes++;\n additionalType = includedTypes;\n }\n }\n\n return calculate(new Set([...mainTypes, ...secondaryTypes]), true)!;\n}\n","import type {\n DataInfo } from '@milaboratories/pl-model-common';\nimport {\n dataInfoToEntries,\n isDataInfo,\n isDataInfoEntries,\n type BinaryChunk,\n type BinaryPartitionedDataInfoEntries,\n type DataInfoEntries,\n type JsonPartitionedDataInfoEntries,\n type PColumnDataEntry,\n type PColumnKey,\n} from '@milaboratories/pl-model-common';\nimport { TreeNodeAccessor } from '../accessor';\n\nconst PCD_PREFIX = 'PColumnData/';\n\nexport const RT_RESOURCE_MAP = PCD_PREFIX + 'ResourceMap';\nexport const RT_RESOURCE_MAP_PARTITIONED = PCD_PREFIX + 'Partitioned/ResourceMap';\n\nexport const RT_JSON_PARTITIONED = PCD_PREFIX + 'JsonPartitioned';\nexport const RT_BINARY_PARTITIONED = PCD_PREFIX + 'BinaryPartitioned';\n\nconst PCD_SUP_PREFIX = PCD_PREFIX + 'Partitioned/';\nexport const RT_JSON_SUPER_PARTITIONED = PCD_SUP_PREFIX + 'JsonPartitioned';\nexport const RT_BINARY_SUPER_PARTITIONED = PCD_SUP_PREFIX + 'BinaryPartitioned';\n\nexport type PColumnResourceMapEntry<T> = {\n key: PColumnKey;\n value: T;\n};\n\nexport type PColumnResourceMapData<T> = {\n isComplete: boolean;\n data: PColumnResourceMapEntry<T>[];\n};\n\nfunction populateResourceMapData<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n data: PColumnResourceMapEntry<T | undefined>[],\n keyPrefix: PColumnKey = [],\n addEntriesWithNoData: boolean,\n): boolean {\n if (acc === undefined) return false;\n switch (acc.resourceType.name) {\n case RT_RESOURCE_MAP: {\n let isComplete = acc.getInputsLocked();\n for (const keyStr of acc.listInputFields()) {\n const value = acc.resolve({ field: keyStr, assertFieldType: 'Input' });\n const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;\n const converted = value === undefined ? undefined : resourceParser(value);\n if (converted === undefined) isComplete = false;\n if (converted !== undefined || addEntriesWithNoData) data.push({ key, value: converted });\n }\n return isComplete;\n }\n case RT_RESOURCE_MAP_PARTITIONED: {\n let isComplete = acc.getInputsLocked();\n for (const keyStr of acc.listInputFields()) {\n const value = acc.resolve({ field: keyStr, assertFieldType: 'Input' });\n if (value === undefined) isComplete = false;\n else {\n const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;\n const populateResult = populateResourceMapData(\n value,\n resourceParser,\n data,\n key,\n addEntriesWithNoData,\n );\n isComplete = isComplete && populateResult;\n }\n }\n return isComplete;\n }\n default:\n throw new Error(`Unknown resource type: ${acc.resourceType.name}`);\n }\n}\n\nexport function parseResourceMap<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n addEntriesWithNoData: false\n): PColumnResourceMapData<NonNullable<T>>;\nexport function parseResourceMap<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n addEntriesWithNoData: true\n): PColumnResourceMapData<T | undefined>;\nexport function parseResourceMap<T>(\n acc: TreeNodeAccessor | undefined,\n resourceParser: (acc: TreeNodeAccessor) => T | undefined,\n addEntriesWithNoData: boolean = false,\n): PColumnResourceMapData<T | undefined> {\n const data: PColumnResourceMapEntry<T | undefined>[] = [];\n const isComplete = populateResourceMapData(acc, resourceParser, data, [], addEntriesWithNoData);\n return { isComplete, data };\n}\n\nexport type PColumnKeyList = {\n /** array of keys */\n data: PColumnKey[];\n /** length of partition key */\n keyLength: number;\n};\n\nconst removeIndexSuffix = (keyStr: string): { baseKey: string; type: 'index' | 'values' } => {\n if (keyStr.endsWith('.index')) {\n return { baseKey: keyStr.substring(0, keyStr.length - 6), type: 'index' };\n } else if (keyStr.endsWith('.values')) {\n return { baseKey: keyStr.substring(0, keyStr.length - 7), type: 'values' };\n } else {\n throw new Error(`key must ends on .index/.values for binary p-column, got: ${keyStr}`);\n }\n};\n\n// @TODO define a class with various resource map operations\n/** Returns a list of all partition keys appeared in the p-column */\nexport function getPartitionKeysList(\n acc: TreeNodeAccessor | undefined,\n): PColumnKeyList | undefined {\n if (!acc) return undefined;\n\n const rt = acc.resourceType.name;\n const meta = acc.getDataAsJson<Record<string, number>>();\n const data: PColumnKey[] = [];\n\n let keyLength = 0;\n // @TODO validate meta shape\n switch (rt) {\n case RT_RESOURCE_MAP:\n keyLength = meta['keyLength'];\n break;\n\n case RT_RESOURCE_MAP_PARTITIONED:\n keyLength = meta['partitionKeyLength'] + meta['keyLength'];\n break;\n\n case RT_JSON_PARTITIONED:\n case RT_BINARY_PARTITIONED:\n keyLength = meta['partitionKeyLength'];\n break;\n\n case RT_BINARY_SUPER_PARTITIONED:\n case RT_JSON_SUPER_PARTITIONED:\n keyLength = meta['superPartitionKeyLength'] + meta['partitionKeyLength'];\n break;\n }\n\n switch (rt) {\n case RT_RESOURCE_MAP:\n case RT_JSON_PARTITIONED:\n case RT_BINARY_PARTITIONED:\n for (let keyStr of acc.listInputFields()) {\n if (rt === RT_BINARY_PARTITIONED) {\n keyStr = removeIndexSuffix(keyStr).baseKey;\n }\n const key = [...JSON.parse(keyStr)] as PColumnKey;\n data.push(key);\n }\n\n break;\n\n case RT_RESOURCE_MAP_PARTITIONED:\n case RT_BINARY_SUPER_PARTITIONED:\n case RT_JSON_SUPER_PARTITIONED:\n for (const supKeyStr of acc.listInputFields()) {\n const keyPrefix = [...JSON.parse(supKeyStr)] as PColumnKey;\n\n const value = acc.resolve({ field: supKeyStr, assertFieldType: 'Input' });\n if (value !== undefined) {\n for (let keyStr of value.listInputFields()) {\n if (rt === RT_BINARY_SUPER_PARTITIONED) {\n keyStr = removeIndexSuffix(keyStr).baseKey;\n }\n const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;\n data.push(key);\n }\n }\n }\n break;\n }\n\n return { data, keyLength };\n}\n\nfunction getUniquePartitionKeysForDataEntries(list: DataInfoEntries<unknown>): (string | number)[][] {\n if (list.type !== 'JsonPartitioned' && list.type !== 'BinaryPartitioned')\n throw new Error(`Splitting requires Partitioned DataInfoEntries, got ${list.type}`);\n\n const { parts, partitionKeyLength } = list;\n\n const result: Set<string | number>[] = [];\n for (let i = 0; i < partitionKeyLength; ++i) {\n result.push(new Set());\n }\n\n for (const part of parts) {\n const key = part.key;\n if (key.length !== partitionKeyLength) {\n throw new Error(\n `Key length (${key.length}) does not match partition length (${partitionKeyLength}) for key: ${JSON.stringify(\n key,\n )}`,\n );\n }\n for (let i = 0; i < partitionKeyLength; ++i) {\n result[i].add(key[i]);\n }\n }\n\n return result.map((s) => Array.from(s.values()));\n}\n\n/** Returns an array of unique partition keys for each column: the i-th element in the resulting 2d array contains all unique values of i-th partition axis. */\nexport function getUniquePartitionKeys(acc: DataInfoEntries<unknown>): (string | number)[][];\nexport function getUniquePartitionKeys(acc: DataInfoEntries<unknown> | TreeNodeAccessor | undefined): (string | number)[][] | undefined;\nexport function getUniquePartitionKeys(\n acc: TreeNodeAccessor | DataInfoEntries<unknown> | undefined,\n): (string | number)[][] | undefined {\n if (acc === undefined) return undefined;\n\n if (isDataInfoEntries(acc))\n return getUniquePartitionKeysForDataEntries(acc);\n\n const list = getPartitionKeysList(acc);\n if (!list) return undefined;\n\n const { data, keyLength } = list;\n\n const result: Set<string | number>[] = [];\n\n for (let i = 0; i < keyLength; ++i) {\n result.push(new Set());\n }\n\n for (const l of data) {\n if (l.length !== keyLength) {\n throw new Error('key length does not match partition length');\n }\n for (let i = 0; i < keyLength; ++i) {\n result[i].add(l[i]);\n }\n }\n\n return result.map((s) => Array.from(s.values()));\n}\n\n/**\n * Parses the PColumn data from a TreeNodeAccessor into a DataInfoEntries structure.\n * Returns undefined if any required data is missing.\n * Throws error on validation failures.\n *\n * @param acc - The TreeNodeAccessor containing PColumn data\n * @param keyPrefix - Optional key prefix for recursive calls\n * @returns DataInfoEntries representation of the PColumn data, or undefined if incomplete\n */\nexport function parsePColumnData(\n acc: TreeNodeAccessor | undefined,\n keyPrefix: PColumnKey = [],\n): JsonPartitionedDataInfoEntries<TreeNodeAccessor> | BinaryPartitionedDataInfoEntries<TreeNodeAccessor> | undefined {\n if (acc === undefined) return undefined;\n\n if (!acc.getIsReadyOrError()) return undefined;\n\n const resourceType = acc.resourceType.name;\n const meta = acc.getDataAsJson<Record<string, number>>();\n\n // Prevent recursive super-partitioned resources\n if (keyPrefix.length > 0\n && (resourceType === RT_JSON_SUPER_PARTITIONED || resourceType === RT_BINARY_SUPER_PARTITIONED)) {\n throw new Error(`Unexpected nested super-partitioned resource: ${resourceType}`);\n }\n\n switch (resourceType) {\n case RT_RESOURCE_MAP:\n case RT_RESOURCE_MAP_PARTITIONED:\n throw new Error(`Only data columns are supported, got: ${resourceType}`);\n\n case RT_JSON_PARTITIONED: {\n if (typeof meta?.partitionKeyLength !== 'number') {\n throw new Error(`Missing partitionKeyLength in metadata for ${resourceType}`);\n }\n\n const parts: PColumnDataEntry<TreeNodeAccessor>[] = [];\n for (const keyStr of acc.listInputFields()) {\n const value = acc.resolve({ field: keyStr, assertFieldType: 'Input' });\n if (value === undefined) return undefined;\n\n const key = [...keyPrefix, ...JSON.parse(keyStr)];\n parts.push({ key, value });\n }\n\n return {\n type: 'JsonPartitioned',\n partitionKeyLength: meta.partitionKeyLength,\n parts,\n };\n }\n\n case RT_BINARY_PARTITIONED: {\n if (typeof meta?.partitionKeyLength !== 'number') {\n throw new Error(`Missing partitionKeyLength in metadata for ${resourceType}`);\n }\n\n const parts: PColumnDataEntry<BinaryChunk<TreeNodeAccessor>>[] = [];\n const baseKeys = new Map<string, { index?: TreeNodeAccessor; values?: TreeNodeAccessor }>();\n\n // Group fields by base key (without .index/.values suffix)\n for (const keyStr of acc.listInputFields()) {\n const suffix = removeIndexSuffix(keyStr);\n\n const value = acc.resolve({ field: keyStr, assertFieldType: 'Input' });\n if (value === undefined) return undefined;\n\n let entry = baseKeys.get(suffix.baseKey);\n if (!entry) {\n entry = {};\n baseKeys.set(suffix.baseKey, entry);\n }\n\n if (suffix.type === 'index') {\n entry.index = value;\n } else {\n entry.values = value;\n }\n }\n\n // Process complete binary chunks only\n for (const [baseKeyStr, entry] of baseKeys.entries()) {\n if (!entry.index || !entry.values) return undefined;\n\n const key = [...keyPrefix, ...JSON.parse(baseKeyStr)];\n parts.push({\n key,\n value: {\n index: entry.index,\n values: entry.values,\n },\n });\n }\n\n return {\n type: 'BinaryPartitioned',\n partitionKeyLength: meta.partitionKeyLength,\n parts,\n };\n }\n\n case RT_JSON_SUPER_PARTITIONED: {\n if (typeof meta?.superPartitionKeyLength !== 'number'\n || typeof meta?.partitionKeyLength !== 'number') {\n throw new Error(`Missing superPartitionKeyLength or partitionKeyLength in metadata for ${resourceType}`);\n }\n\n const totalKeyLength = meta.superPartitionKeyLength + meta.partitionKeyLength;\n const parts: PColumnDataEntry<TreeNodeAccessor>[] = [];\n\n // Process all super partitions\n for (const supKeyStr of acc.listInputFields()) {\n const superPartition = acc.resolve({ field: supKeyStr, assertFieldType: 'Input' });\n if (superPartition === undefined) return undefined;\n\n // Validate inner type\n if (superPartition.resourceType.name !== RT_JSON_PARTITIONED) {\n throw new Error(`Expected ${RT_JSON_PARTITIONED} inside ${resourceType}, but got ${superPartition.resourceType.name}`);\n }\n\n const innerResult = parsePColumnData(superPartition, JSON.parse(supKeyStr) as PColumnKey);\n\n if (innerResult === undefined) return undefined;\n\n if (innerResult.type !== 'JsonPartitioned')\n throw new Error(`Unexpected inner result type for ${resourceType}: ${innerResult.type}`);\n\n parts.push(...innerResult.parts);\n }\n\n return {\n type: 'JsonPartitioned',\n partitionKeyLength: totalKeyLength,\n parts,\n };\n }\n\n case RT_BINARY_SUPER_PARTITIONED: {\n if (typeof meta?.superPartitionKeyLength !== 'number'\n || typeof meta?.partitionKeyLength !== 'number') {\n throw new Error(`Missing superPartitionKeyLength or partitionKeyLength in metadata for ${resourceType}`);\n }\n\n const totalKeyLength = meta.superPartitionKeyLength + meta.partitionKeyLength;\n const parts: PColumnDataEntry<BinaryChunk<TreeNodeAccessor>>[] = [];\n\n // Process all super partitions\n for (const supKeyStr of acc.listInputFields()) {\n const superPartition = acc.resolve({ field: supKeyStr, assertFieldType: 'Input' });\n if (superPartition === undefined) return undefined;\n\n // Validate inner type\n if (superPartition.resourceType.name !== RT_BINARY_PARTITIONED) {\n throw new Error(`Expected ${RT_BINARY_PARTITIONED} inside ${resourceType}, but got ${superPartition.resourceType.name}`);\n }\n\n const innerResult = parsePColumnData(superPartition, JSON.parse(supKeyStr) as PColumnKey);\n\n if (innerResult === undefined) return undefined;\n\n if (innerResult.type !== 'BinaryPartitioned')\n throw new Error(`Unexpected inner result type for ${resourceType}: ${innerResult.type}`);\n\n parts.push(...innerResult.parts);\n }\n\n return {\n type: 'BinaryPartitioned',\n partitionKeyLength: totalKeyLength,\n parts,\n };\n }\n\n default:\n throw new Error(`Unknown resource type: ${resourceType}`);\n }\n}\n\n/**\n * Converts or parses the input into DataInfoEntries format.\n\n * @param acc - The input data, which can be TreeNodeAccessor, DataInfoEntries, DataInfo, or undefined.\n * @returns The data in DataInfoEntries format, or undefined if the input was undefined or data is not ready.\n */\nexport function convertOrParsePColumnData(acc: TreeNodeAccessor | DataInfoEntries<TreeNodeAccessor> | DataInfo<TreeNodeAccessor> | undefined):\nDataInfoEntries<TreeNodeAccessor> | undefined {\n if (acc === undefined) return undefined;\n\n if (isDataInfoEntries(acc)) return acc;\n if (isDataInfo(acc)) return dataInfoToEntries(acc);\n if (acc instanceof TreeNodeAccessor) return parsePColumnData(acc);\n\n throw new Error(`Unexpected input type: ${typeof acc}`);\n}\n","import type {\n BinaryChunk,\n DataInfoEntries,\n PColumnDataEntry,\n PColumnKey,\n PColumnValue,\n JsonDataInfoEntries,\n JsonPartitionedDataInfoEntries,\n BinaryPartitionedDataInfoEntries,\n} from '@milaboratories/pl-model-common';\nimport type { AxisFilterByIdx } from '@milaboratories/pl-model-common';\n\n/**\n * Filters DataInfoEntries using axis filters, removing specified axes from keys and\n * only keeping entries that match the filter values.\n *\n * @param dataInfoEntries - The data info object to filter\n * @param axisFilters - Array of axis filters (index, value pairs)\n * @throws Error if any filter axis is outside the partitioning axes or data axes for Json data\n */\nexport function filterDataInfoEntries<Blob>(\n dataInfoEntries: BinaryPartitionedDataInfoEntries<Blob>,\n axisFilters: AxisFilterByIdx[],\n): BinaryPartitionedDataInfoEntries<Blob>;\nexport function filterDataInfoEntries<Blob>(\n dataInfoEntries: JsonPartitionedDataInfoEntries<Blob>,\n axisFilters: AxisFilterByIdx[],\n): JsonPartitionedDataInfoEntries<Blob>;\nexport function filterDataInfoEntries<Blob>(\n dataInfoEntries: BinaryPartitionedDataInfoEntries<Blob> | JsonPartitionedDataInfoEntries<Blob>,\n axisFilters: AxisFilterByIdx[],\n): BinaryPartitionedDataInfoEntries<Blob> | JsonPartitionedDataInfoEntries<Blob>;\nexport function filterDataInfoEntries(\n dataInfoEntries: JsonDataInfoEntries,\n axisFilters: AxisFilterByIdx[],\n): JsonDataInfoEntries;\nexport function filterDataInfoEntries<Blob>(\n dataInfoEntries: DataInfoEntries<Blob>,\n axisFilters: AxisFilterByIdx[],\n): DataInfoEntries<Blob> {\n // Sort filters by axis index in descending order to safely remove elements from arrays\n const sortedFilters = [...axisFilters].sort((a, b) => b[0] - a[0]);\n\n // Check for invalid filter axes\n if (dataInfoEntries.type === 'JsonPartitioned' || dataInfoEntries.type === 'BinaryPartitioned') {\n const { partitionKeyLength } = dataInfoEntries;\n for (const [axisIdx] of axisFilters)\n if (axisIdx >= partitionKeyLength)\n throw new Error(`Can't filter on non-partitioned axis ${axisIdx}. Must be >= ${partitionKeyLength}`);\n } else if (dataInfoEntries.type === 'Json') {\n const { keyLength } = dataInfoEntries;\n for (const [axisIdx] of axisFilters)\n if (axisIdx >= keyLength)\n throw new Error(`Can't filter on non-data axis ${axisIdx}. Must be >= ${keyLength}`);\n }\n\n const keyMatchesFilters = (key: PColumnKey): boolean => {\n for (const [axisIdx, axisValue] of sortedFilters)\n if (key[axisIdx] !== axisValue)\n return false;\n return true;\n };\n\n const removeFilteredAxes = (key: PColumnKey): PColumnKey => {\n const newKey = [...key];\n\n // Remove axes in descending order to maintain correct indices\n for (const [axisIdx] of sortedFilters)\n newKey.splice(axisIdx, 1);\n\n return newKey;\n };\n\n switch (dataInfoEntries.type) {\n case 'Json': {\n const filteredData: PColumnDataEntry<PColumnValue>[] = dataInfoEntries.data\n .filter((entry: PColumnDataEntry<PColumnValue>) => keyMatchesFilters(entry.key))\n .map((entry: PColumnDataEntry<PColumnValue>) => ({\n key: removeFilteredAxes(entry.key),\n value: entry.value,\n }));\n\n return {\n type: 'Json',\n keyLength: dataInfoEntries.keyLength - axisFilters.length,\n data: filteredData,\n };\n }\n\n case 'JsonPartitioned': {\n const filteredParts = dataInfoEntries.parts\n .filter((entry: PColumnDataEntry<Blob>) => keyMatchesFilters(entry.key))\n .map((entry: PColumnDataEntry<Blob>) => ({\n key: removeFilteredAxes(entry.key),\n value: entry.value,\n }));\n\n return {\n type: 'JsonPartitioned',\n partitionKeyLength: dataInfoEntries.partitionKeyLength - axisFilters.length,\n parts: filteredParts,\n };\n }\n\n case 'BinaryPartitioned': {\n const filteredParts = dataInfoEntries.parts\n .filter((entry: PColumnDataEntry<BinaryChunk<Blob>>) => keyMatchesFilters(entry.key))\n .map((entry: PColumnDataEntry<BinaryChunk<Blob>>) => ({\n key: removeFilteredAxes(entry.key),\n value: entry.value,\n }));\n\n return {\n type: 'BinaryPartitioned',\n partitionKeyLength: dataInfoEntries.partitionKeyLength - axisFilters.length,\n parts: filteredParts,\n };\n }\n }\n}\n","import type {\n AnchoredIdDeriver,\n AxisId,\n PColumn,\n PColumnSelector,\n PColumnSpec,\n PObjectId,\n SUniversalPColumnId,\n AxisFilterValue,\n AxisFilterByIdx,\n AnchoredPColumnSelector,\n PartitionedDataInfoEntries,\n ResolveAnchorsOptions,\n NativePObjectId,\n PColumnValues,\n} from '@milaboratories/pl-model-common';\nimport {\n selectorsToPredicate,\n resolveAnchors,\n getAxisId,\n isPColumnSpec,\n canonicalizeAxisId,\n isPartitionedDataInfoEntries,\n entriesToDataInfo,\n deriveNativeId,\n} from '@milaboratories/pl-model-common';\nimport type { TreeNodeAccessor } from '../accessor';\nimport type { LabelDerivationOps, TraceEntry } from './label';\nimport { deriveLabels } from './label';\nimport type { Optional } from 'utility-types';\nimport type { APColumnSelectorWithSplit, PColumnSelectorWithSplit } from './split_selectors';\nimport canonicalize from 'canonicalize';\nimport { getUniquePartitionKeys, convertOrParsePColumnData } from './pcolumn_data';\nimport { filterDataInfoEntries } from './axis_filtering';\nimport type { PColumnDataUniversal } from '../api';\n\nfunction isPColumnValues(value: unknown): value is PColumnValues {\n if (!Array.isArray(value)) return false;\n if (value.length === 0) return true;\n const first = value[0];\n return typeof first === 'object' && first !== null && 'key' in first && 'val' in first;\n}\n\nexport interface ColumnProvider {\n selectColumns(selectors: ((spec: PColumnSpec) => boolean) | PColumnSelector | PColumnSelector[]): PColumn<PColumnDataUniversal | undefined>[];\n}\n\nexport interface AxisLabelProvider {\n findLabels(axis: AxisId): Record<string | number, string> | undefined;\n}\n\n/**\n * A simple implementation of {@link ColumnProvider} backed by a pre-defined array of columns.\n */\nclass ArrayColumnProvider implements ColumnProvider {\n constructor(private readonly columns: PColumn<PColumnDataUniversal | undefined>[]) {}\n\n selectColumns(selectors: ((spec: PColumnSpec) => boolean) | PColumnSelector | PColumnSelector[]):\n PColumn<PColumnDataUniversal | undefined>[] {\n const predicate = typeof selectors === 'function' ? selectors : selectorsToPredicate(selectors);\n // Filter based on spec, ignoring data type for now\n return this.columns.filter((column): column is PColumn<PColumnDataUniversal | undefined> => predicate(column.spec));\n }\n}\n\nexport type PColumnEntryWithLabel = {\n id: PObjectId;\n spec: PColumnSpec;\n /** Lazy calculates the data, returns undefined if data is not ready. */\n data(): PColumnDataUniversal | undefined;\n label: string;\n};\n\n/** Universal column is a column that uses a universal column id, and always have label. */\nexport type PColumnEntryUniversal = PColumnEntryWithLabel & {\n id: SUniversalPColumnId;\n};\n\n// Helper types similar to those in api.ts\ntype AxisFilterInfo = {\n axisIdx: number;\n axisId: AxisId;\n value: AxisFilterValue;\n label: string;\n};\n\n// Intermediate representation for columns requiring splitting\ntype IntermediateSplitEntry = {\n type: 'split';\n originalColumn: PColumn<PColumnDataUniversal | undefined>;\n spec: PColumnSpec;\n /** With splitting axes removed */\n adjustedSpec: PColumnSpec;\n dataEntries: PartitionedDataInfoEntries<TreeNodeAccessor>;\n axisFilters: AxisFilterInfo[];\n};\n\n// Intermediate representation for columns NOT requiring splitting\ntype IntermediateDirectEntry = {\n type: 'direct';\n originalColumn: PColumn<PColumnDataUniversal | undefined>;\n spec: PColumnSpec;\n /** The same as `spec` */\n adjustedSpec: PColumnSpec;\n};\n\n// Union type for intermediate processing\ntype IntermediateColumnEntry = IntermediateSplitEntry | IntermediateDirectEntry;\n\nfunction splitFiltersToTrace(splitFilters?: AxisFilterInfo[]): TraceEntry[] | undefined {\n if (!splitFilters) return undefined;\n return splitFilters.map((filter) => ({\n type: `split:${canonicalizeAxisId(filter.axisId)}`,\n label: filter.label,\n importance: 1_000_000, // High importance for split filters in labels\n }));\n}\n\nfunction splitFiltersToAxisFilter(splitFilters?: AxisFilterInfo[]): AxisFilterByIdx[] | undefined {\n if (!splitFilters) return undefined;\n return splitFilters.map((filter): AxisFilterByIdx => [filter.axisIdx, filter.value]);\n}\n\nfunction fallbackIdDeriver(originalId: PObjectId, axisFilters?: AxisFilterByIdx[]): PObjectId {\n if (!axisFilters || axisFilters.length === 0) return originalId;\n const filtersToCanonicalize = [...axisFilters].sort((a, b) => a[0] - b[0]);\n return canonicalize({ id: originalId, axisFilters: filtersToCanonicalize })! as PObjectId;\n}\n\n/** Checks if a selector object uses any anchor properties */\nfunction hasAnchors(selector: unknown): selector is AnchoredPColumnSelector {\n if (!selector || typeof selector !== 'object') return false;\n const potentialAnchored = selector as Record<string, any>;\n const domainHasAnchors = potentialAnchored['domain'] && typeof potentialAnchored['domain'] === 'object' && Object.values(potentialAnchored['domain']).some((v: unknown) => typeof v === 'object' && v !== null && 'anchor' in v);\n const axesHaveAnchors = potentialAnchored['axes'] && Array.isArray(potentialAnchored['axes']) && potentialAnchored['axes'].some((a: unknown) => typeof a === 'object' && a !== null && 'anchor' in a);\n return !!potentialAnchored['domainAnchor'] || domainHasAnchors || axesHaveAnchors;\n}\n\n/**\n * Derives the indices of axes marked for splitting based on the selector.\n * Throws an error if splitting is requested alongside `partialAxesMatch`.\n */\nfunction getSplitAxisIndices(selector: APColumnSelectorWithSplit | ((spec: PColumnSpec) => boolean)): number[] {\n if (typeof selector !== 'object' || !('axes' in selector) || selector.axes === undefined) {\n return []; // No axes specified or not an object selector, no splitting\n }\n\n const splitIndices = selector.axes\n .map((axis, index) => (typeof axis === 'object' && 'split' in axis && axis.split === true) ? index : -1)\n .filter((index) => index !== -1);\n\n if (splitIndices.length > 0 && selector.partialAxesMatch !== undefined) {\n throw new Error('Axis splitting is not supported when `partialAxesMatch` is defined.');\n }\n\n splitIndices.sort((a, b) => a - b);\n return splitIndices;\n}\n\ntype UniversalPColumnOptsNoDeriver = {\n /** If provided, columns matching the provided selectors will be excluded from the result. */\n exclude?: AnchoredPColumnSelector | AnchoredPColumnSelector[];\n labelOps?: LabelDerivationOps;\n /** If true, incomplete data will cause the column to be skipped instead of returning undefined for the whole request. */\n dontWaitAllData?: boolean;\n /**\n * If true, the derived label will override the 'pl7.app/label' annotation\n * in the resulting PColumnSpec. It also forces `includeNativeLabel` in `labelOps` to true,\n * unless `labelOps.includeNativeLabel` is explicitly set to false.\n * Default value in getUniversalEntries is false, in getColumns it is true.\n */\n overrideLabelAnnotation?: boolean;\n};\n\ntype UniversalPColumnOpts = UniversalPColumnOptsNoDeriver & {\n anchorCtx: AnchoredIdDeriver;\n} & ResolveAnchorsOptions;\n\nexport class PColumnCollection {\n private readonly defaultProviderStore: PColumn<PColumnDataUniversal | undefined>[] = [];\n private readonly providers: ColumnProvider[] = [new ArrayColumnProvider(this.defaultProviderStore)];\n private readonly axisLabelProviders: AxisLabelProvider[] = [];\n\n constructor() {}\n\n public addColumnProvider(provider: ColumnProvider): this {\n this.providers.push(provider);\n return this;\n }\n\n public addAxisLabelProvider(provider: AxisLabelProvider): this {\n this.axisLabelProviders.push(provider);\n return this;\n }\n\n public addColumns(columns: PColumn<PColumnDataUniversal | undefined>[]): this {\n this.defaultProviderStore.push(...columns);\n return this;\n }\n\n public addColumn(column: PColumn<PColumnDataUniversal | undefined>): this {\n this.defaultProviderStore.push(column);\n return this;\n }\n\n /** Fetches labels for a given axis from the registered providers */\n private findLabels(axis: AxisId): Record<string | number, string> | undefined {\n for (const provider of this.axisLabelProviders) {\n const labels = provider.findLabels(axis);\n if (labels) return labels; // First provider wins\n }\n return undefined;\n }\n\n // Overload signatures updated to return PColumnEntry types\n public getUniversalEntries(\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | APColumnSelectorWithSplit[],\n opts: UniversalPColumnOpts): PColumnEntryUniversal[] | undefined;\n public getUniversalEntries(\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | PColumnSelectorWithSplit | PColumnSelectorWithSplit[],\n opts?: UniversalPColumnOptsNoDeriver): PColumnEntryWithLabel[] | undefined;\n public getUniversalEntries(\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | APColumnSelectorWithSplit[],\n opts?: Optional<UniversalPColumnOpts, 'anchorCtx'>): (PColumnEntryWithLabel | PColumnEntryUniversal)[] | undefined {\n const { anchorCtx, labelOps: rawLabelOps, dontWaitAllData = false, overrideLabelAnnotation = false, exclude } = opts ?? {};\n\n const labelOps: LabelDerivationOps = {\n ...(overrideLabelAnnotation && rawLabelOps?.includeNativeLabel !== false ? { includeNativeLabel: true } : {}),\n ...(rawLabelOps ?? {}),\n };\n\n let excludePredicate: ((spec: PColumnSpec) => boolean) = () => false;\n if (exclude) {\n const excludePredicartes = (Array.isArray(exclude) ? exclude : [exclude])\n .map((selector) => {\n if (hasAnchors(selector)) {\n if (!anchorCtx)\n throw new Error('Anchored selectors in exclude require an AnchoredIdDeriver to be provided in options.');\n return selectorsToPredicate(resolveAnchors(anchorCtx.anchors, selector, opts));\n } else\n return selectorsToPredicate(selector);\n });\n excludePredicate = (spec) => excludePredicartes.some((predicate) => predicate(spec));\n }\n\n const selectorsArray = typeof predicateOrSelectors === 'function'\n ? [predicateOrSelectors]\n : Array.isArray(predicateOrSelectors)\n ? predicateOrSelectors\n : [predicateOrSelectors];\n\n const intermediateResults: IntermediateColumnEntry[] = [];\n const selectedNativeIds = new Set<NativePObjectId>();\n\n for (const rawSelector of selectorsArray) {\n const usesAnchors = hasAnchors(rawSelector);\n\n let currentSelector: PColumnSelectorWithSplit | ((spec: PColumnSpec) => boolean);\n if (usesAnchors) {\n if (!anchorCtx)\n throw new Error('Anchored selectors require an AnchoredIdDeriver to be provided in options.');\n currentSelector = resolveAnchors(anchorCtx.anchors, rawSelector as AnchoredPColumnSelector, opts);\n } else\n currentSelector = rawSelector as PColumnSelectorWithSplit | ((spec: PColumnSpec) => boolean);\n\n const selectedIds = new Set<PObjectId>();\n const selectedColumns: PColumn<PColumnDataUniversal | undefined>[] = [];\n for (const provider of this.providers) {\n const providerColumns = provider.selectColumns(currentSelector);\n for (const col of providerColumns) {\n if (excludePredicate(col.spec)) continue;\n if (selectedIds.has(col.id))\n throw new Error(`Duplicate column id ${col.id} in provider ${provider.constructor.name}`);\n const nativeId = deriveNativeId(col.spec);\n if (selectedNativeIds.has(nativeId))\n continue;\n selectedIds.add(col.id);\n selectedNativeIds.add(nativeId);\n selectedColumns.push(col);\n }\n }\n\n if (selectedColumns.length === 0) continue;\n\n const splitAxisIdxs = getSplitAxisIndices(rawSelector);\n const needsSplitting = splitAxisIdxs.length > 0;\n\n for (const column of selectedColumns) {\n if (!isPColumnSpec(column.spec)) continue;\n\n const originalSpec = column.spec;\n\n if (needsSplitting) {\n if (isPColumnValues(column.data))\n throw new Error(`Splitting is not supported for PColumns with PColumnValues data format. Column id: ${column.id}`);\n const dataEntries = convertOrParsePColumnData(column.data);\n\n if (!dataEntries) {\n if (dontWaitAllData) continue;\n return undefined;\n }\n\n if (!isPartitionedDataInfoEntries(dataEntries))\n throw new Error(`Splitting requires Partitioned DataInfoEntries, but parsing resulted in ${dataEntries.type} for column ${column.id}`);\n\n const uniqueKeys = getUniquePartitionKeys(dataEntries);\n\n const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];\n if (maxSplitIdx >= dataEntries.partitionKeyLength)\n throw new Error(`Not enough partition keys (${dataEntries.partitionKeyLength}) for requested split axes (max index ${maxSplitIdx}) in column ${originalSpec.name}`);\n\n const axesLabels: (Record<string | number, string> | undefined)[] = splitAxisIdxs\n .map((idx) => this.findLabels(getAxisId(originalSpec.axesSpec[idx])));\n\n const keyCombinations: (string | number)[][] = [];\n const generateCombinations = (currentCombo: (string | number)[], sAxisIdx: number) => {\n if (sAxisIdx >= splitAxisIdxs.length) {\n keyCombinations.push([...currentCombo]);\n if (keyCombinations.length > 10000)\n throw new Error('Too many key combinations, aborting.');\n return;\n }\n const axisIdx = splitAxisIdxs[sAxisIdx];\n if (axisIdx >= uniqueKeys.length)\n throw new Error(`Axis index ${axisIdx} out of bounds for unique keys array (length ${uniqueKeys.length}) during split key generation for column ${column.id}`);\n const axisValues = uniqueKeys[axisIdx];\n if (!axisValues || axisValues.length === 0) {\n keyCombinations.length = 0; // No combinations possible if one axis has no keys\n return;\n }\n for (const val of axisValues) {\n currentCombo.push(val);\n generateCombinations(currentCombo, sAxisIdx + 1);\n currentCombo.pop();\n }\n };\n\n generateCombinations([], 0);\n\n if (keyCombinations.length === 0)\n continue;\n\n const newAxesSpec = [...originalSpec.axesSpec];\n const splitAxisOriginalIdxs = splitAxisIdxs.map((idx) => idx); // Keep original indices for axisId lookup\n // Remove axes in reverse order to maintain correct indices during removal\n for (let i = splitAxisIdxs.length - 1; i >= 0; i--) {\n newAxesSpec.splice(splitAxisIdxs[i], 1);\n }\n const adjustedSpec = { ...originalSpec, axesSpec: newAxesSpec };\n\n for (const keyCombo of keyCombinations) {\n const splitFilters: AxisFilterInfo[] = keyCombo.map((value, sAxisIdx) => {\n const axisIdx = splitAxisOriginalIdxs[sAxisIdx]; // Use original index for lookup\n const axisId = getAxisId(originalSpec.axesSpec[axisIdx]);\n const axisLabelMap = axesLabels[sAxisIdx];\n const label = axisLabelMap?.[value] ?? String(value);\n return { axisIdx, axisId, value: value as AxisFilterValue, label };\n });\n\n intermediateResults.push({\n type: 'split',\n originalColumn: column,\n spec: originalSpec,\n adjustedSpec,\n dataEntries,\n axisFilters: splitFilters,\n });\n }\n } else {\n intermediateResults.push({\n type: 'direct',\n originalColumn: column,\n spec: originalSpec,\n adjustedSpec: originalSpec,\n });\n }\n }\n }\n\n if (intermediateResults.length === 0) return [];\n\n const labeledResults = deriveLabels(\n intermediateResults,\n (entry) => ({\n spec: entry.spec,\n suffixTrace: entry.type === 'split' ? splitFiltersToTrace(entry.axisFilters) : undefined,\n }),\n labelOps,\n );\n\n const result: (PColumnEntryWithLabel | PColumnEntryUniversal)[] = [];\n\n for (const { value: entry, label } of labeledResults) {\n const { originalColumn, spec: originalSpec } = entry;\n\n const axisFilters = entry.type === 'split' ? entry.axisFilters : undefined;\n const axisFiltersTuple = splitFiltersToAxisFilter(axisFilters);\n\n let finalId: SUniversalPColumnId | PObjectId;\n if (anchorCtx) finalId = anchorCtx.deriveS(originalSpec, axisFiltersTuple);\n else finalId = fallbackIdDeriver(originalColumn.id, axisFiltersTuple);\n\n let finalSpec = { ...entry.adjustedSpec };\n\n if (overrideLabelAnnotation) {\n finalSpec = {\n ...finalSpec,\n annotations: {\n ...(finalSpec.annotations ?? {}),\n 'pl7.app/label': label,\n },\n };\n }\n\n result.push({\n id: finalId,\n spec: finalSpec,\n data: () => entry.type === 'split'\n ? entriesToDataInfo(filterDataInfoEntries(entry.dataEntries, axisFiltersTuple!))\n : entry.originalColumn.data,\n label: label,\n });\n }\n\n return result;\n }\n\n public getColumns(\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | APColumnSelectorWithSplit[],\n opts: UniversalPColumnOpts): PColumn<PColumnDataUniversal>[] | undefined;\n public getColumns(\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | PColumnSelectorWithSplit | PColumnSelectorWithSplit[],\n opts?: UniversalPColumnOptsNoDeriver): PColumn<PColumnDataUniversal>[] | undefined;\n public getColumns(\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | APColumnSelectorWithSplit[],\n opts?: Optional<UniversalPColumnOpts, 'anchorCtx'>): PColumn<PColumnDataUniversal>[] | undefined {\n const entries = this.getUniversalEntries(predicateOrSelectors, {\n overrideLabelAnnotation: true, // default for getColumns\n ...(opts ?? {}),\n } as UniversalPColumnOpts);\n if (!entries) return undefined;\n\n const columns: PColumn<PColumnDataUniversal>[] = [];\n for (const entry of entries) {\n const data = entry.data();\n if (!data) {\n if (opts?.dontWaitAllData) continue;\n return undefined;\n }\n columns.push({\n id: entry.id,\n spec: entry.spec,\n data,\n });\n }\n\n return columns;\n }\n}\n","import {\n type SingleValuePredicateV2,\n type SingleValueEqualPredicate,\n type SingleValueOrPredicateV2,\n type SingleValueAndPredicateV2,\n type SingleValueNotPredicateV2,\n type PTableRecordSingleValueFilterV2,\n type PTableRecordFilter,\n} from '@milaboratories/pl-model-common';\n\nexport function patchInSetFilters(filters: PTableRecordSingleValueFilterV2[]): PTableRecordFilter[] {\n const inSetToOrEqual = (predicate: SingleValuePredicateV2): SingleValuePredicateV2 => {\n if (predicate.operator !== 'InSet') return predicate;\n return {\n operator: 'Or',\n operands: predicate.references.map((reference) => ({\n operator: 'Equal',\n reference,\n } satisfies SingleValueEqualPredicate)),\n } satisfies SingleValueOrPredicateV2;\n };\n\n const mapSingleValuePredicate = (filter: SingleValuePredicateV2, cb: (predicate: SingleValuePredicateV2) => SingleValuePredicateV2): SingleValuePredicateV2 => {\n const operator = filter.operator;\n switch (operator) {\n case 'And':\n return {\n ...filter,\n operands: filter.operands.map((operand) => mapSingleValuePredicate(operand, cb)),\n } satisfies SingleValueAndPredicateV2;\n case 'Or':\n return {\n ...filter,\n operands: filter.operands.map((operand) => mapSingleValuePredicate(operand, cb)),\n } satisfies SingleValueOrPredicateV2;\n case 'Not':\n return {\n ...filter,\n operand: mapSingleValuePredicate(filter.operand, cb),\n } satisfies SingleValueNotPredicateV2;\n default:\n return cb(filter);\n }\n };\n\n const mapFilter = (filter: PTableRecordSingleValueFilterV2, cb: (predicate: SingleValuePredicateV2) => SingleValuePredicateV2): PTableRecordSingleValueFilterV2 => {\n return {\n ...filter,\n predicate: mapSingleValuePredicate(filter.predicate, cb),\n } satisfies PTableRecordSingleValueFilterV2;\n };\n\n return filters.map((filter) => mapFilter(filter, inSetToOrEqual));\n}\n","import type {\n AnchoredPColumnSelector,\n AnyFunction,\n AxisId,\n DataInfo,\n Option,\n PColumn,\n PColumnSelector,\n PColumnSpec,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectId,\n PObjectSpec,\n PSpecPredicate,\n PTableDef,\n PTableHandle,\n PTableRecordFilter,\n PTableSorting,\n PlRef,\n ResolveAnchorsOptions,\n ResultCollection,\n SUniversalPColumnId,\n ValueOrError,\n} from '@milaboratories/pl-model-common';\nimport {\n AnchoredIdDeriver,\n ensurePColumn,\n extractAllColumns,\n isDataInfo,\n isPColumn,\n isPColumnSpec,\n isPlRef,\n mapDataInfo,\n mapPObjectData,\n mapPTableDef,\n mapValueInVOE,\n selectorsToPredicate,\n withEnrichments,\n} from '@milaboratories/pl-model-common';\nimport canonicalize from 'canonicalize';\nimport type { Optional } from 'utility-types';\nimport { getCfgRenderCtx } from '../internal';\nimport { TreeNodeAccessor, ifDef } from './accessor';\nimport type { FutureRef } from './future';\nimport type { AccessorHandle, GlobalCfgRenderCtx } from './internal';\nimport { MainAccessorName, StagingAccessorName } from './internal';\nimport { PColumnCollection, type AxisLabelProvider, type ColumnProvider } from './util/column_collection';\nimport type { LabelDerivationOps } from './util/label';\nimport { deriveLabels } from './util/label';\nimport type { APColumnSelectorWithSplit } from './util/split_selectors';\nimport { patchInSetFilters } from './util/pframe_upgraders';\n\nexport type PColumnDataUniversal = TreeNodeAccessor | DataInfo<TreeNodeAccessor> | PColumnValues;\n\n/**\n * Helper function to match domain objects\n * @param query Optional domain to match against\n * @param target Optional domain to match\n * @returns true if domains match, false otherwise\n */\nfunction matchDomain(query?: Record<string, string>, target?: Record<string, string>) {\n if (query === undefined) return target === undefined;\n if (target === undefined) return true;\n for (const k in target) {\n if (query[k] !== target[k]) return false;\n }\n return true;\n}\n\nexport type UniversalColumnOption = { label: string; value: SUniversalPColumnId };\n\n/**\n * Transforms PColumn data into the internal representation expected by the platform\n * @param data Data from a PColumn to transform\n * @returns Transformed data compatible with platform API\n */\nfunction transformPColumnData(data: PColumn<PColumnDataUniversal>):\nPColumn<PColumnValues | AccessorHandle | DataInfo<AccessorHandle>> {\n return mapPObjectData(data, (d) => {\n if (d instanceof TreeNodeAccessor) {\n return d.handle;\n } else if (isDataInfo(d)) {\n return mapDataInfo(d, (accessor) => accessor.handle);\n } else {\n return d;\n }\n });\n}\n\ntype UniversalPColumnOpts = {\n labelOps?: LabelDerivationOps;\n dontWaitAllData?: boolean;\n exclude?: AnchoredPColumnSelector | AnchoredPColumnSelector[];\n} & ResolveAnchorsOptions;\n\ntype GetOptionsOpts = {\n /**\n * If true, references returned by the method will contain `requireEnrichments` flag set to true.\n * If this reference is added to the block's args, it will communicate to the platform that the block\n * expects enrichments of the referenced block to be available in the context of the current block.\n */\n refsWithEnrichments?: boolean;\n /**\n * Label derivation options.\n * If provided, it will be used to derive labels for the options.\n * If not provided, labels will be derived using the default logic.\n */\n label?: ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps;\n};\n\nexport class ResultPool implements ColumnProvider, AxisLabelProvider {\n private readonly ctx: GlobalCfgRenderCtx = getCfgRenderCtx();\n\n /**\n * @deprecated use getOptions()\n */\n public calculateOptions(predicate: PSpecPredicate): Option[] {\n return this.ctx.calculateOptions(predicate);\n }\n\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n opts?: GetOptionsOpts,\n ): Option[];\n /** @deprecated wrap label ops with { label: <...> } */\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n label?: ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps,\n ): Option[];\n public getOptions(\n predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[],\n opts?: GetOptionsOpts | ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps,\n ): Option[] {\n const predicate = typeof predicateOrSelector === 'function'\n ? predicateOrSelector\n : selectorsToPredicate(predicateOrSelector);\n const filtered = this.getSpecs().entries.filter((s) => predicate(s.obj));\n\n let labelOps: LabelDerivationOps | ((spec: PObjectSpec, ref: PlRef) => string) = {};\n let refsWithEnrichments: boolean = false;\n if (typeof opts !== 'undefined') {\n if (typeof opts === 'function') {\n labelOps = opts;\n } else if (typeof opts === 'object') {\n if ('includeNativeLabel' in opts || 'separator' in opts || 'addLabelAsSuffix' in opts) {\n labelOps = opts;\n } else {\n opts = opts as GetOptionsOpts;\n labelOps = opts.label ?? {};\n refsWithEnrichments = opts.refsWithEnrichments ?? false;\n }\n }\n }\n\n if (typeof labelOps === 'object')\n return deriveLabels(filtered, (o) => o.obj, labelOps ?? {}).map(({ value: { ref }, label }) => ({\n ref: withEnrichments(ref, refsWithEnrichments),\n label,\n }));\n else\n return filtered.map(({ ref, obj }) => ({\n ref: withEnrichments(ref, refsWithEnrichments),\n label: labelOps(obj, ref),\n }));\n }\n\n public resolveAnchorCtx(anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>): AnchoredIdDeriver | undefined {\n if (anchorsOrCtx instanceof AnchoredIdDeriver) return anchorsOrCtx;\n const resolvedAnchors: Record<string, PColumnSpec> = {};\n for (const [key, value] of Object.entries(anchorsOrCtx)) {\n if (isPlRef(value)) {\n const resolvedSpec = this.getPColumnSpecByRef(value);\n if (!resolvedSpec)\n return undefined;\n resolvedAnchors[key] = resolvedSpec;\n } else {\n resolvedAnchors[key] = value;\n }\n }\n return new AnchoredIdDeriver(resolvedAnchors);\n }\n\n /**\n * Returns columns that match the provided anchors and selectors. It applies axis filters and label derivation.\n *\n * @param anchorsOrCtx - Anchor context for column selection (same as in getCanonicalOptions)\n * @param predicateOrSelectors - Predicate or selectors for filtering columns (same as in getCanonicalOptions)\n * @param opts - Optional configuration for label generation and data waiting\n * @returns A PFrameHandle for the created PFrame, or undefined if any required data is missing\n */\n public getAnchoredPColumns(\n anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>,\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | APColumnSelectorWithSplit[],\n opts?: UniversalPColumnOpts,\n ): PColumn<PColumnDataUniversal>[] | undefined {\n const anchorCtx = this.resolveAnchorCtx(anchorsOrCtx);\n if (!anchorCtx) return undefined;\n return new PColumnCollection()\n .addColumnProvider(this)\n .addAxisLabelProvider(this)\n .getColumns(predicateOrSelectors, {\n ...opts,\n anchorCtx,\n });\n }\n\n /**\n * Calculates anchored identifier options for columns matching a given predicate and returns their\n * canonicalized representations.\n *\n * This function filters column specifications from the result pool that match the provided predicate,\n * creates a standardized AnchorCtx from the provided anchors, and generates a list of label-value\n * pairs for UI components (like dropdowns).\n *\n * @param anchorsOrCtx - Either:\n * - An existing AnchorCtx instance\n * - A record mapping anchor IDs to PColumnSpec objects\n * - A record mapping anchor IDs to PlRef objects (which will be resolved to PColumnSpec)\n * @param predicateOrSelectors - Either:\n * - A predicate function that takes a PColumnSpec and returns a boolean.\n * Only specs that return true will be included.\n * - An APColumnSelector object for declarative filtering, which will be\n * resolved against the provided anchors and matched using matchPColumn.\n * - An array of APColumnSelector objects - columns matching ANY selector\n * in the array will be included (OR operation).\n * @param opts - Optional configuration for label generation:\n * - labelOps: Optional configuration for label generation:\n * - includeNativeLabel: Whether to include native column labels\n * - separator: String to use between label parts (defaults to \" / \")\n * - addLabelAsSuffix: Whether to add labels as suffix instead of prefix\n * - dontWaitAllData: Whether to skip columns that don't have all data (if not set, will return undefined,\n * if at least one column that requires splitting is missing data)\n * @returns An array of objects with `label` (display text) and `value` (anchored ID string) properties,\n * or undefined if any PlRef resolution fails.\n */\n getCanonicalOptions(\n anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>,\n predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | APColumnSelectorWithSplit[],\n opts?: UniversalPColumnOpts,\n ): { label: string; value: SUniversalPColumnId }[] | undefined {\n const anchorCtx = this.resolveAnchorCtx(anchorsOrCtx);\n if (!anchorCtx) return undefined;\n const entries = new PColumnCollection()\n .addColumnProvider(this)\n .addAxisLabelProvider(this)\n .getUniversalEntries(predicateOrSelectors, {\n ...opts,\n anchorCtx,\n });\n if (!entries) return undefined;\n return entries.map((item) => ({\n value: item.id,\n label: item.label,\n }));\n }\n\n /**\n * @deprecated use getData()\n */\n public getDataFromResultPool(): ResultCollection<PObject<TreeNodeAccessor>> {\n return this.getData();\n }\n\n public getData(): ResultCollection<PObject<TreeNodeAccessor>> {\n const result = this.ctx.getDataFromResultPool();\n return {\n isComplete: result.isComplete,\n entries: result.entries.map((e) => ({\n ref: e.ref,\n obj: {\n ...e.obj,\n data: new TreeNodeAccessor(e.obj.data, [e.ref.blockId, e.ref.name]),\n },\n })),\n };\n }\n\n /**\n * @deprecated use getDataWithErrors()\n */\n public getDataWithErrorsFromResultPool(): ResultCollection<\n Optional<PObject<ValueOrError<TreeNodeAccessor, Error>>, 'id'>\n > {\n return this.getDataWithErrors();\n }\n\n public getDataWithErrors(): ResultCollection<\n Optional<PObject<ValueOrError<TreeNodeAccessor, Error>>, 'id'>\n > {\n const result = this.ctx.getDataWithErrorsFromResultPool();\n return {\n isComplete: result.isComplete,\n entries: result.entries.map((e) => ({\n ref: e.ref,\n obj: {\n ...e.obj,\n data: mapValueInVOE(\n e.obj.data,\n (handle) => new TreeNodeAccessor(handle, [e.ref.blockId, e.ref.name]),\n ),\n },\n })),\n };\n }\n\n /**\n * @deprecated use getSpecs()\n */\n public getSpecsFromResultPool(): ResultCollection<PObjectSpec> {\n return this.getSpecs();\n }\n\n public getSpecs(): ResultCollection<PObjectSpec> {\n return this.ctx.getSpecsFromResultPool();\n }\n\n /**\n * @param ref a Ref\n * @returns data associated with the ref\n */\n public getDataByRef(ref: PlRef): PObject<TreeNodeAccessor> | undefined {\n // @TODO remove after 1 Jan 2025; forward compatibility\n if (typeof this.ctx.getDataFromResultPoolByRef === 'undefined')\n return this.getData().entries.find(\n (f) => f.ref.blockId === ref.blockId && f.ref.name === ref.name,\n )?.obj;\n const data = this.ctx.getDataFromResultPoolByRef(ref.blockId, ref.name); // Keep original call\n // Need to handle undefined case before mapping\n if (!data) return undefined;\n return mapPObjectData(\n data,\n (handle) => new TreeNodeAccessor(handle, [ref.blockId, ref.name]),\n );\n }\n\n /**\n * Returns data associated with the ref ensuring that it is a p-column.\n * @param ref a Ref\n * @returns p-column associated with the ref\n */\n public getPColumnByRef(ref: PlRef): PColumn<TreeNodeAccessor> | undefined {\n const data = this.getDataByRef(ref);\n if (!data) return undefined;\n return ensurePColumn(data);\n }\n\n /**\n * Returns spec associated with the ref ensuring that it is a p-column spec.\n * @param ref a Ref\n * @returns p-column spec associated with the ref\n */\n public getPColumnSpecByRef(ref: PlRef): PColumnSpec | undefined {\n const spec = this.getSpecByRef(ref);\n if (!spec) return undefined;\n if (!isPColumnSpec(spec)) throw new Error(`not a PColumn spec (kind = ${spec.kind})`);\n return spec;\n }\n\n /**\n * @param ref a Ref\n * @returns object spec associated with the ref\n */\n public getSpecByRef(ref: PlRef): PObjectSpec | undefined {\n return this.ctx.getSpecFromResultPoolByRef(ref.blockId, ref.name);\n }\n\n /**\n * @param spec object specification\n * @returns array of data objects with compatible specs\n * @deprecated delete this method after Jan 1, 2025\n */\n public findDataWithCompatibleSpec(spec: PColumnSpec): PObject<TreeNodeAccessor>[] {\n const result: PObject<TreeNodeAccessor>[] = [];\n\n out: for (const data of this.getData().entries) {\n if (!isPColumnSpec(data.obj.spec)) {\n continue;\n }\n\n const oth = data.obj.spec;\n\n if (spec.name !== oth.name) {\n continue;\n }\n\n if (spec.valueType !== oth.valueType) {\n continue;\n }\n\n if (spec.axesSpec.length !== oth.axesSpec.length) {\n continue;\n }\n\n if (!matchDomain(spec.domain, oth.domain)) {\n continue;\n }\n\n for (let i = 0; i < spec.axesSpec.length; ++i) {\n const qAx = spec.axesSpec[i];\n const tAx = oth.axesSpec[i];\n if (qAx.name !== tAx.name) {\n continue out;\n }\n if (qAx.type !== tAx.type) {\n continue out;\n }\n if (!matchDomain(qAx.domain, tAx.domain)) {\n continue out;\n }\n }\n\n result.push(data.obj);\n }\n return result;\n }\n\n /**\n * Find labels data for a given axis id. It will search for a label column and return its data as a map.\n * @returns a map of axis value => label\n */\n public findLabels(axis: AxisId): Record<string | number, string> | undefined {\n const dataPool = this.getData();\n for (const column of dataPool.entries) {\n if (!isPColumn(column.obj)) continue;\n\n const spec = column.obj.spec;\n if (\n spec.name === 'pl7.app/label'\n && spec.axesSpec.length === 1\n && spec.axesSpec[0].name === axis.name\n && spec.axesSpec[0].type === axis.type\n && matchDomain(axis.domain, spec.axesSpec[0].domain)\n ) {\n if (column.obj.data.resourceType.name !== 'PColumnData/Json') {\n throw Error(`Expected JSON column for labels, got: ${column.obj.data.resourceType.name}`);\n }\n const labels: Record<string | number, string> = Object.fromEntries(\n Object.entries(\n column.obj.data.getDataAsJson<{\n data: Record<string | number, string>;\n }>().data,\n ).map((e) => [JSON.parse(e[0])[0], e[1]]),\n );\n\n return labels;\n }\n }\n return undefined;\n }\n\n /**\n * Selects columns based on the provided selectors, returning PColumn objects\n * with lazily loaded data.\n *\n * @param selectors - A predicate function, a single selector, or an array of selectors.\n * @returns An array of PColumn objects matching the selectors. Data is loaded on first access.\n */\n public selectColumns(\n selectors: ((spec: PColumnSpec) => boolean) | PColumnSelector | PColumnSelector[],\n ): PColumn<TreeNodeAccessor | undefined>[] {\n const predicate = typeof selectors === 'function' ? selectors : selectorsToPredicate(selectors);\n\n const matchedSpecs = this.getSpecs().entries.filter(({ obj: spec }) => {\n if (!isPColumnSpec(spec)) return false;\n return predicate(spec);\n });\n\n // Map specs to PColumn objects with lazy data loading\n return matchedSpecs.map(({ ref, obj: spec }) => {\n // Type assertion needed because filter ensures it's PColumnSpec\n const pcolumnSpec = spec as PColumnSpec;\n let _cachedData: TreeNodeAccessor | undefined | null = null; // Use null to distinguish initial state from undefined result\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this; // Capture 'this' for use inside the getter\n\n return {\n id: canonicalize(ref) as PObjectId,\n spec: pcolumnSpec,\n get data(): TreeNodeAccessor | undefined {\n if (_cachedData !== null) {\n return _cachedData; // Return cached data (could be undefined if fetch failed)\n }\n\n _cachedData = self.getPColumnByRef(ref)?.data;\n return _cachedData;\n },\n } satisfies PColumn<TreeNodeAccessor | undefined>; // Cast needed because 'data' is a getter\n });\n }\n\n /**\n * Find labels data for a given axis id of a p-column.\n * @returns a map of axis value => label\n */\n public findLabelsForColumnAxis(column: PColumnSpec, axisIdx: number): Record<string | number, string> | undefined {\n const labels = this.findLabels(column.axesSpec[axisIdx]);\n if (!labels) return undefined;\n const axisKeys = column.annotations?.['pl7.app/axisKeys/' + axisIdx];\n if (axisKeys !== undefined) {\n const keys = JSON.parse(axisKeys) as string[];\n return Object.fromEntries(keys.map((key) => {\n return [key, labels[key] ?? 'Unlabelled'];\n }));\n } else {\n return labels;\n }\n }\n}\n\n/** Main entry point to the API available within model lambdas (like outputs, sections, etc..) */\nexport class RenderCtx<Args, UiState> {\n private readonly ctx: GlobalCfgRenderCtx;\n\n constructor() {\n this.ctx = getCfgRenderCtx();\n }\n\n private _argsCache?: { v: Args };\n\n public get args(): Args {\n if (this._argsCache === undefined) {\n const raw = this.ctx.args;\n const value = typeof raw === 'function' ? raw() : raw;\n this._argsCache = { v: JSON.parse(value) };\n }\n return this._argsCache.v;\n }\n\n private _uiStateCache?: { v: UiState };\n\n public get uiState(): UiState {\n if (this._uiStateCache === undefined) {\n const raw = this.ctx.uiState;\n const value = typeof raw === 'function' ? raw() : raw;\n this._uiStateCache = { v: value ? JSON.parse(value) : ({} as UiState) };\n }\n return this._uiStateCache.v;\n }\n\n // lazy rendering because this feature is rarely used\n private _activeArgsCache?: { v?: Args };\n\n /**\n * Returns args snapshot the block was executed for (i.e. when \"Run\" button was pressed).\n * Returns undefined, if block was never executed or stopped mid-way execution, so that the result was cleared.\n * */\n public get activeArgs(): Args | undefined {\n if (this._activeArgsCache === undefined) {\n const raw = this.ctx.activeArgs;\n const value = typeof raw === 'function' ? raw() : raw;\n this._activeArgsCache = {\n v: value ? JSON.parse(value) : undefined,\n };\n }\n return this._activeArgsCache.v;\n }\n\n // /** Can be used to determine features provided by the desktop instance. */\n // public get featureFlags() {\n // return this.ctx.featureFlags;\n // }\n\n private getNamedAccessor(name: string): TreeNodeAccessor | undefined {\n return ifDef(\n this.ctx.getAccessorHandleByName(name),\n (accessor) => new TreeNodeAccessor(accessor, [name]),\n );\n }\n\n public get prerun(): TreeNodeAccessor | undefined {\n return this.getNamedAccessor(StagingAccessorName);\n }\n\n public get outputs(): TreeNodeAccessor | undefined {\n return this.getNamedAccessor(MainAccessorName);\n }\n\n public readonly resultPool = new ResultPool();\n\n /**\n * Find labels data for a given axis id. It will search for a label column and return its data as a map.\n * @returns a map of axis value => label\n * @deprecated Use resultPool.findLabels instead\n */\n public findLabels(axis: AxisId): Record<string | number, string> | undefined {\n return this.resultPool.findLabels(axis);\n }\n\n private verifyInlineAndExplicitColumnsSupport(columns: PColumn<PColumnDataUniversal>[]) {\n const hasInlineColumns = columns.some((c) => !(c.data instanceof TreeNodeAccessor) || isDataInfo(c.data)); // Updated check for DataInfo\n const inlineColumnsSupport = this.ctx.featureFlags?.inlineColumnsSupport === true;\n if (hasInlineColumns && !inlineColumnsSupport) throw Error(`Inline or explicit columns not supported`); // Combined check\n\n // Removed redundant explicitColumns check\n }\n\n private patchPTableDef(def: PTableDef<PColumn<PColumnDataUniversal>>): PTableDef<PColumn<PColumnDataUniversal>> {\n if (!this.ctx.featureFlags?.pTablePartitionFiltersSupport) {\n // For old desktop move all partition filters to filters field as it doesn't read partitionFilters field\n def = {\n ...def,\n partitionFilters: [],\n filters: [...def.partitionFilters, ...def.filters],\n };\n }\n if (!this.ctx.featureFlags?.pFrameInSetFilterSupport) {\n def = {\n ...def,\n partitionFilters: patchInSetFilters(def.partitionFilters),\n filters: patchInSetFilters(def.filters),\n };\n }\n return def;\n }\n\n // TODO remove all non-PColumn fields\n public createPFrame(def: PFrameDef<PColumnDataUniversal>): PFrameHandle {\n this.verifyInlineAndExplicitColumnsSupport(def);\n return this.ctx.createPFrame(\n def.map((c) => transformPColumnData(c)),\n );\n }\n\n // TODO remove all non-PColumn fields\n public createPTable(def: PTableDef<PColumn<PColumnDataUniversal>>): PTableHandle;\n public createPTable(def: {\n columns: PColumn<PColumnDataUniversal>[];\n filters?: PTableRecordFilter[];\n /** Table sorting */\n sorting?: PTableSorting[];\n }): PTableHandle;\n public createPTable(\n def:\n | PTableDef<PColumn<PColumnDataUniversal>>\n | {\n columns: PColumn<PColumnDataUniversal>[];\n filters?: PTableRecordFilter[];\n /** Table sorting */\n sorting?: PTableSorting[];\n },\n ): PTableHandle {\n let rawDef: PTableDef<PColumn<PColumnDataUniversal>>;\n if ('columns' in def) {\n rawDef = this.patchPTableDef({\n src: {\n type: 'full',\n entries: def.columns.map((c) => ({ type: 'column', column: c })),\n },\n partitionFilters: def.filters ?? [],\n filters: [],\n sorting: def.sorting ?? [],\n });\n } else {\n rawDef = this.patchPTableDef(def);\n }\n this.verifyInlineAndExplicitColumnsSupport(extractAllColumns(rawDef.src));\n return this.ctx.createPTable(\n mapPTableDef(rawDef, (po) => transformPColumnData(po)),\n );\n }\n\n /** @deprecated scheduled for removal from SDK */\n public getBlockLabel(blockId: string): string {\n return this.ctx.getBlockLabel(blockId);\n }\n\n public getCurrentUnstableMarker(): string | undefined {\n return this.ctx.getCurrentUnstableMarker();\n }\n\n public logInfo(msg: string): void {\n this.ctx.logInfo(msg);\n }\n\n public logWarn(msg: string): void {\n this.ctx.logWarn(msg);\n }\n\n public logError(msg: string): void {\n this.ctx.logError(msg);\n }\n}\n\nexport type RenderFunction<Args = unknown, UiState = unknown, Ret = unknown> = (\n rCtx: RenderCtx<Args, UiState>\n) => Ret;\n\nexport type UnwrapFutureRef<K> =\n K extends FutureRef<infer T>\n ? T\n : K extends bigint | boolean | null | number | string | symbol | undefined\n ? K\n : { [key in keyof K]: UnwrapFutureRef<K[key]> };\n\nexport type InferRenderFunctionReturn<RF extends AnyFunction> = RF extends (...args: any) => infer R\n ? UnwrapFutureRef<R>\n : never;\n","import { version } from '../package.json';\nexport const PlatformaSDKVersion = version;\n","import type { TypedConfig } from '../config';\nimport type { ConfigRenderLambda } from './lambdas';\n\nexport function isConfigLambda(\n cfgOrFh: TypedConfigOrConfigLambda,\n): cfgOrFh is ConfigRenderLambda {\n return (cfgOrFh as any).__renderLambda === true;\n}\n\nexport type TypedConfigOrConfigLambda = TypedConfig | ConfigRenderLambda;\n\n/** @deprecated */\nexport type TypedConfigOrString = TypedConfig | string;\n","import { extractConfigGeneric, type BlockConfigContainer } from '@milaboratories/pl-model-common';\nimport type { TypedConfigOrConfigLambda, TypedConfigOrString } from './types';\nimport { isConfigLambda } from './types';\nimport type { BlockConfig } from './v3';\n\nexport function downgradeCfgOrLambda(data: TypedConfigOrConfigLambda): TypedConfigOrString;\nexport function downgradeCfgOrLambda(\n data: TypedConfigOrConfigLambda | undefined\n): TypedConfigOrString | undefined;\nexport function downgradeCfgOrLambda(\n data: TypedConfigOrConfigLambda | undefined,\n): TypedConfigOrString | undefined {\n if (data === undefined) return undefined;\n if (isConfigLambda(data)) return data.handle;\n return data;\n}\n\nexport function extractConfig(cfg: BlockConfigContainer): BlockConfig {\n return extractConfigGeneric(cfg) as BlockConfig;\n}\n","import type { BlockRenderingMode, BlockSection, ValueOrErrors, AnyFunction, PlRef, BlockCodeKnownFeatureFlags, BlockConfigContainer } from '@milaboratories/pl-model-common';\nimport type { Checked, ConfigResult, TypedConfig } from './config';\nimport { getImmediate } from './config';\nimport { getPlatformaInstance, isInUI, tryRegisterCallback } from './internal';\nimport type { Platforma, PlatformaApiVersion, PlatformaV1, PlatformaV2 } from './platforma';\nimport type { InferRenderFunctionReturn, RenderFunction } from './render';\nimport { RenderCtx } from './render';\nimport { PlatformaSDKVersion } from './version';\nimport type {\n TypedConfigOrConfigLambda,\n ConfigRenderLambda,\n StdCtxArgsOnly,\n DeriveHref,\n ResolveCfgType,\n ExtractFunctionHandleReturn,\n ConfigRenderLambdaFlags,\n} from './bconfig';\nimport {\n downgradeCfgOrLambda,\n} from './bconfig';\n\ntype SectionsExpectedType = readonly BlockSection[];\n\ntype SectionsCfgChecked<Cfg extends TypedConfig, Args, UiState> = Checked<\n Cfg,\n ConfigResult<Cfg, StdCtxArgsOnly<Args, UiState>> extends SectionsExpectedType ? true : false\n>;\n\n// TODO (Unused type in code)\n// type SectionsRFChecked<RF extends Function> = Checked<\n// RF,\n// InferRenderFunctionReturn<RF> extends SectionsExpectedType ? true : false\n// >;\n\ntype InputsValidExpectedType = boolean;\n\ntype InputsValidCfgChecked<Cfg extends TypedConfig, Args, UiState> = Checked<\n Cfg,\n ConfigResult<Cfg, StdCtxArgsOnly<Args, UiState>> extends InputsValidExpectedType ? true : false\n>;\n\n// TODO (Unused type in code)\n// type InputsValidRFChecked<RF extends Function> = Checked<\n// RF,\n// InferRenderFunctionReturn<RF> extends InputsValidExpectedType ? true : false\n// >;\n\ntype NoOb = Record<string, never>;\n\n/** Main entry point that each block should use in it's \"config\" module. Don't forget\n * to call {@link done()} at the end of configuration. Value returned by this builder must be\n * exported as constant with name \"platforma\" from the \"config\" module. */\nexport class BlockModel<\n Args,\n OutputsCfg extends Record<string, TypedConfigOrConfigLambda>,\n UiState,\n Href extends `/${string}` = '/',\n> {\n private constructor(\n private readonly _renderingMode: BlockRenderingMode,\n private readonly _initialArgs: Args | undefined,\n private readonly _initialUiState: UiState,\n private readonly _outputs: OutputsCfg,\n private readonly _inputsValid: TypedConfigOrConfigLambda,\n private readonly _sections: TypedConfigOrConfigLambda,\n private readonly _title: ConfigRenderLambda | undefined,\n private readonly _enrichmentTargets: ConfigRenderLambda | undefined,\n private readonly _featureFlags: BlockCodeKnownFeatureFlags,\n ) {}\n\n public static readonly INITIAL_BLOCK_FEATURE_FLAGS: BlockCodeKnownFeatureFlags = {\n supportsLazyState: true,\n requiresUIAPIVersion: 1,\n requiresModelAPIVersion: 1,\n };\n\n /** Initiates configuration builder */\n public static create(renderingMode: BlockRenderingMode): BlockModel<NoOb, {}, NoOb>;\n /** Initiates configuration builder */\n public static create(): BlockModel<NoOb, {}, NoOb>;\n /**\n * Initiates configuration builder\n * @deprecated use create method without generic parameter\n */\n public static create<Args>(renderingMode: BlockRenderingMode): BlockModel<Args, {}, NoOb>;\n /**\n * Initiates configuration builder\n * @deprecated use create method without generic parameter\n */\n public static create<Args>(): BlockModel<Args, {}, NoOb>;\n public static create(renderingMode: BlockRenderingMode = 'Heavy'): BlockModel<NoOb, {}, NoOb> {\n return new BlockModel<NoOb, {}, NoOb>(\n renderingMode,\n undefined,\n {},\n {},\n getImmediate(true),\n getImmediate([]),\n undefined,\n undefined,\n { ...BlockModel.INITIAL_BLOCK_FEATURE_FLAGS },\n );\n }\n\n /**\n * Add output cell to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param cfg configuration describing how to render cell value from the blocks\n * workflow outputs\n * @deprecated use lambda-based API\n * */\n public output<const Key extends string, const Cfg extends TypedConfig>(\n key: Key,\n cfg: Cfg\n ): BlockModel<Args, OutputsCfg & { [K in Key]: Cfg }, UiState, Href>;\n /**\n * Add output cell to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param rf callback calculating output value using context, that allows to access\n * workflows outputs and interact with platforma drivers\n * @param flags additional flags that may alter lambda rendering procedure\n * */\n public output<const Key extends string, const RF extends RenderFunction<Args, UiState>>(\n key: Key,\n rf: RF,\n flags?: ConfigRenderLambdaFlags\n ): BlockModel<\n Args,\n OutputsCfg & { [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> },\n UiState,\n Href\n >;\n public output(\n key: string,\n cfgOrRf: TypedConfig | AnyFunction,\n flags: ConfigRenderLambdaFlags = {},\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n if (typeof cfgOrRf === 'function') {\n const handle = `output#${key}`;\n tryRegisterCallback(handle, () => cfgOrRf(new RenderCtx()));\n return new BlockModel(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n {\n ...this._outputs,\n [key]: {\n __renderLambda: true,\n handle,\n ...flags,\n } satisfies ConfigRenderLambda,\n },\n this._inputsValid,\n this._sections,\n this._title,\n this._enrichmentTargets,\n this._featureFlags,\n );\n } else\n return new BlockModel(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n {\n ...this._outputs,\n [key]: cfgOrRf,\n },\n this._inputsValid,\n this._sections,\n this._title,\n this._enrichmentTargets,\n this._featureFlags,\n );\n }\n\n /** Shortcut for {@link output} with retentive flag set to true. */\n public retentiveOutput<const Key extends string, const RF extends RenderFunction<Args, UiState>>(\n key: Key,\n rf: RF,\n ): BlockModel<\n Args,\n OutputsCfg & { [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> },\n UiState,\n Href\n > {\n return this.output(key, rf, { retentive: true });\n }\n\n /** Sets custom configuration predicate on the block args at which block can be executed\n * @deprecated use lambda-based API */\n public argsValid<Cfg extends TypedConfig>(\n cfg: Cfg & InputsValidCfgChecked<Cfg, Args, UiState>\n ): BlockModel<Args, OutputsCfg, UiState, Href>;\n /** Sets custom configuration predicate on the block args at which block can be executed */\n public argsValid<RF extends RenderFunction<Args, UiState, boolean>>(\n rf: RF\n ): BlockModel<Args, OutputsCfg, UiState, Href>;\n public argsValid(\n cfgOrRf: TypedConfig | AnyFunction,\n ): BlockModel<Args, OutputsCfg, UiState, `/${string}`> {\n if (typeof cfgOrRf === 'function') {\n tryRegisterCallback('inputsValid', () => cfgOrRf(new RenderCtx()));\n return new BlockModel<Args, OutputsCfg, UiState>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n {\n __renderLambda: true,\n handle: 'inputsValid',\n } satisfies ConfigRenderLambda,\n this._sections,\n this._title,\n this._enrichmentTargets,\n this._featureFlags,\n );\n } else\n return new BlockModel<Args, OutputsCfg, UiState>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n cfgOrRf,\n this._sections,\n this._title,\n this._enrichmentTargets,\n this._featureFlags,\n );\n }\n\n /** Sets the config to generate list of section in the left block overviews panel\n * @deprecated use lambda-based API */\n public sections<const S extends SectionsExpectedType>(\n rf: S\n ): BlockModel<Args, OutputsCfg, UiState, DeriveHref<S>>;\n /** Sets the config to generate list of section in the left block overviews panel */\n public sections<\n const Ret extends SectionsExpectedType,\n const RF extends RenderFunction<Args, UiState, Ret>,\n >(rf: RF): BlockModel<Args, OutputsCfg, UiState, DeriveHref<ReturnType<RF>>>;\n public sections<const Cfg extends TypedConfig>(\n cfg: Cfg & SectionsCfgChecked<Cfg, Args, UiState>\n ): BlockModel<\n Args,\n OutputsCfg,\n UiState,\n DeriveHref<ConfigResult<Cfg, StdCtxArgsOnly<Args, UiState>>>\n >;\n public sections(\n arrOrCfgOrRf: SectionsExpectedType | TypedConfig | AnyFunction,\n ): BlockModel<Args, OutputsCfg, UiState, `/${string}`> {\n if (Array.isArray(arrOrCfgOrRf)) {\n return this.sections(getImmediate(arrOrCfgOrRf));\n } else if (typeof arrOrCfgOrRf === 'function') {\n tryRegisterCallback('sections', () => arrOrCfgOrRf(new RenderCtx()));\n return new BlockModel<Args, OutputsCfg, UiState>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n { __renderLambda: true, handle: 'sections' } as ConfigRenderLambda,\n this._title,\n this._enrichmentTargets,\n this._featureFlags,\n );\n } else\n return new BlockModel<Args, OutputsCfg, UiState>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n arrOrCfgOrRf as TypedConfig,\n this._title,\n this._enrichmentTargets,\n this._featureFlags,\n );\n }\n\n /** Sets a rendering function to derive block title, shown for the block in the left blocks-overview panel. */\n public title(\n rf: RenderFunction<Args, UiState, string>,\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n tryRegisterCallback('title', () => rf(new RenderCtx()));\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n this._sections,\n { __renderLambda: true, handle: 'title' } as ConfigRenderLambda,\n this._enrichmentTargets,\n this._featureFlags,\n );\n }\n\n /**\n * Sets initial args for the block, this value must be specified.\n * @deprecated use {@link withArgs}\n * */\n public initialArgs(value: Args): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n value,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n this._sections,\n this._title,\n this._enrichmentTargets,\n this._featureFlags,\n );\n }\n\n /** Sets initial args for the block, this value must be specified. */\n public withArgs<Args>(initialValue: Args): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n initialValue,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n this._sections,\n this._title,\n this._enrichmentTargets,\n this._featureFlags,\n );\n }\n\n /** Defines type and sets initial value for block UiState. */\n public withUiState<UiState>(initialValue: UiState): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n this._initialArgs,\n initialValue,\n this._outputs,\n this._inputsValid,\n this._sections,\n this._title,\n this._enrichmentTargets,\n this._featureFlags,\n );\n }\n\n /** Sets or overrides feature flags for the block. */\n public withFeatureFlags(flags: Partial<BlockCodeKnownFeatureFlags>): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n this._sections,\n this._title,\n this._enrichmentTargets,\n { ...this._featureFlags, ...flags },\n );\n }\n\n /**\n * Defines how to derive list of upstream references this block is meant to enrich with its exports from block args.\n * Influences dependency graph construction.\n */\n public enriches(\n lambda: (args: Args) => PlRef[],\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n tryRegisterCallback('enrichmentTargets', lambda);\n return new BlockModel<Args, OutputsCfg, UiState, Href>(\n this._renderingMode,\n this._initialArgs,\n this._initialUiState,\n this._outputs,\n this._inputsValid,\n this._sections,\n this._title,\n { __renderLambda: true, handle: 'enrichmentTargets' } as ConfigRenderLambda,\n this._featureFlags,\n );\n }\n\n public done(apiVersion?: 1): PlatformaV1<\n Args,\n InferOutputsFromConfigs<Args, OutputsCfg, UiState>,\n UiState,\n Href\n >;\n\n public done(apiVersion: 2): PlatformaV2<\n Args,\n InferOutputsFromConfigs<Args, OutputsCfg, UiState>,\n UiState,\n Href\n >;\n\n /** Renders all provided block settings into a pre-configured platforma API\n * instance, that can be used in frontend to interact with block state, and\n * other features provided by the platforma to the block. */\n public done(apiVersion?: PlatformaApiVersion): Platforma<\n Args,\n InferOutputsFromConfigs<Args, OutputsCfg, UiState>,\n UiState,\n Href\n > {\n const requiresUIAPIVersion = apiVersion ?? 1;\n return this.withFeatureFlags({\n ...this._featureFlags,\n requiresUIAPIVersion,\n })._done(requiresUIAPIVersion);\n }\n\n public _done(apiVersion: PlatformaApiVersion): Platforma<\n Args,\n InferOutputsFromConfigs<Args, OutputsCfg, UiState>,\n UiState,\n Href\n > {\n if (this._initialArgs === undefined) throw new Error('Initial arguments not set.');\n\n const config: BlockConfigContainer = {\n v3: {\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this._renderingMode,\n initialArgs: this._initialArgs,\n initialUiState: this._initialUiState,\n inputsValid: this._inputsValid,\n sections: this._sections,\n title: this._title,\n outputs: this._outputs,\n enrichmentTargets: this._enrichmentTargets,\n featureFlags: this._featureFlags,\n },\n\n // fields below are added to allow previous desktop versions read generated configs\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this._renderingMode,\n initialArgs: this._initialArgs,\n inputsValid: downgradeCfgOrLambda(this._inputsValid),\n sections: downgradeCfgOrLambda(this._sections),\n outputs: Object.fromEntries(\n Object.entries(this._outputs).map(([key, value]) => [key, downgradeCfgOrLambda(value)]),\n ),\n };\n\n globalThis.platformaApiVersion = apiVersion;\n\n if (!isInUI())\n // we are in the configuration rendering routine, not in actual UI\n return { config } as any;\n // normal operation inside the UI\n else return getPlatformaInstance({ sdkVersion: PlatformaSDKVersion, apiVersion: platformaApiVersion }) as any;\n }\n}\n\nexport type InferOutputType<CfgOrFH, Args, UiState> = CfgOrFH extends TypedConfig\n ? ResolveCfgType<CfgOrFH, Args, UiState>\n : CfgOrFH extends ConfigRenderLambda\n ? ExtractFunctionHandleReturn<CfgOrFH>\n : never;\n\ntype InferOutputsFromConfigs<\n Args,\n OutputsCfg extends Record<string, TypedConfigOrConfigLambda>,\n UiState,\n> = {\n [Key in keyof OutputsCfg]: ValueOrErrors<InferOutputType<OutputsCfg[Key], Args, UiState>>;\n};\n","import type {\n AxisId,\n AxisSpec,\n CanonicalizedJson,\n DataInfo,\n ListOptionBase,\n PColumn,\n PColumnIdAndSpec,\n PColumnSpec,\n PColumnValues,\n PObjectId,\n PTableColumnId,\n PTableColumnIdAxis,\n PTableColumnIdColumn,\n PTableColumnSpec,\n PTableDef,\n PTableHandle,\n PTableRecordFilter,\n PTableRecordSingleValueFilterV2,\n PTableSorting,\n} from '@milaboratories/pl-model-common';\nimport {\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n matchAxisId,\n} from '@milaboratories/pl-model-common';\nimport type {\n AxisLabelProvider,\n ColumnProvider,\n PColumnDataUniversal,\n RenderCtx,\n} from '../render';\nimport {\n PColumnCollection,\n TreeNodeAccessor,\n} from '../render';\nimport { isLinkerColumn } from './PFrameForGraphs';\n\nexport type PlTableColumnId = {\n /** Original column spec */\n source: PTableColumnSpec;\n /** Column spec with labeled axes replaced by label columns */\n labeled: PTableColumnSpec;\n};\n\nexport type PlTableColumnIdJson = CanonicalizedJson<PlTableColumnId>;\n\nexport type PlDataTableGridStateCore = {\n /** Includes column ordering */\n columnOrder?: {\n /** All colIds in order */\n orderedColIds: PlTableColumnIdJson[];\n };\n /** Includes current sort columns and direction */\n sort?: {\n /** Sorted columns and directions in order */\n sortModel: {\n /** Column Id to apply the sort to. */\n colId: PlTableColumnIdJson;\n /** Sort direction */\n sort: 'asc' | 'desc';\n }[];\n };\n /** Includes column visibility */\n columnVisibility?: {\n /** All colIds which were hidden */\n hiddenColIds: PlTableColumnIdJson[];\n };\n};\n\nexport type PlDataTableSheet = {\n /** spec of the axis to use */\n axis: AxisSpec;\n /** options to show in the filter dropdown */\n options: ListOptionBase<string | number>[];\n /** default (selected) value */\n defaultValue?: string | number;\n};\n\nexport type PlDataTableSheetState = {\n /** id of the axis */\n axisId: AxisId;\n /** selected value */\n value: string | number;\n};\n\n/**\n * PlDataTableV2 persisted state\n */\nexport type PlDataTableStateV2 =\n // Old versions of the state\n | {\n // no version\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: 'asc' | 'desc';\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sourceId?: string;\n sheets?: Record<CanonicalizedJson<AxisId>, string | number>;\n };\n pTableParams?: {\n sorting?: PTableSorting[];\n filters?: PTableRecordFilter[];\n };\n }\n | {\n version: 2;\n stateCache: {\n sourceId: string;\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: 'asc' | 'desc';\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n };\n sheetsState: PlDataTableSheetState[];\n }[];\n pTableParams: {\n hiddenColIds: PObjectId[] | null;\n filters: PTableRecordFilter[];\n sorting: PTableSorting[];\n };\n }\n | {\n version: 3;\n stateCache: {\n sourceId: string;\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: 'asc' | 'desc';\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n };\n sheetsState: PlDataTableSheetState[];\n filtersState: PlDataTableFilterState[];\n }[];\n pTableParams: PTableParamsV2;\n }\n // Normalized state\n | PlDataTableStateV2Normalized;\n\nexport type PlDataTableStateV2CacheEntry = {\n /** DataSource identifier for state management */\n sourceId: string;\n /** Internal ag-grid state */\n gridState: PlDataTableGridStateCore;\n /** Sheets state */\n sheetsState: PlDataTableSheetState[];\n /** Filters state */\n filtersState: PlDataTableFilterState[];\n};\n\nexport type PTableParamsV2 =\n | {\n sourceId: null;\n hiddenColIds: null;\n partitionFilters: [];\n filters: [];\n sorting: [];\n }\n | {\n sourceId: string;\n hiddenColIds: PObjectId[] | null;\n partitionFilters: PTableRecordFilter[];\n filters: PTableRecordFilter[];\n sorting: PTableSorting[];\n };\n\nexport type PlDataTableStateV2Normalized = {\n /** Version for upgrades */\n version: 4;\n /** Internal states, LRU cache for 5 sourceId-s */\n stateCache: PlDataTableStateV2CacheEntry[];\n /** PTable params derived from the cache state for the current sourceId */\n pTableParams: PTableParamsV2;\n};\n\nexport function makeDefaultPTableParams(): PTableParamsV2 {\n return {\n sourceId: null,\n hiddenColIds: null,\n partitionFilters: [],\n filters: [],\n sorting: [],\n };\n}\n\n/** Create default PlDataTableStateV2 */\nexport function createPlDataTableStateV2(): PlDataTableStateV2Normalized {\n return {\n version: 4,\n stateCache: [],\n pTableParams: makeDefaultPTableParams(),\n };\n}\n\n/** Upgrade PlDataTableStateV2 to the latest version */\nexport function upgradePlDataTableStateV2(state: PlDataTableStateV2): PlDataTableStateV2Normalized {\n // v1 -> v2\n if (!('version' in state)) {\n // Non upgradeable as sourceId calculation algorithm has changed, resetting state to default\n state = createPlDataTableStateV2();\n }\n // v2 -> v3\n if (state.version === 2) {\n state = {\n version: 3,\n stateCache: state.stateCache.map((entry) => ({\n ...entry,\n filtersState: [],\n })),\n pTableParams: makeDefaultPTableParams(),\n };\n }\n // v3 -> v4\n if (state.version === 3) {\n // Non upgradeable as column ids calculation algorithm has changed, resetting state to default\n state = createPlDataTableStateV2();\n }\n return state;\n}\n\nexport type PlDataTableFilterState = {\n id: PTableColumnId;\n alphabetic: boolean;\n filter: null | {\n value: PlTableFilter;\n disabled: boolean;\n };\n};\n\n/** PlTableFilters filter entry */\nexport type PlTableFilterIsNotNA = {\n /** Predicate type */\n type: 'isNotNA';\n};\n\n/** PlTableFilters filter entry */\nexport type PlTableFilterIsNA = {\n /** Predicate type */\n type: 'isNA';\n};\n\n/** PlTableFilters filter entries applicable to both string and number values */\nexport type PlTableFilterCommon = PlTableFilterIsNotNA | PlTableFilterIsNA;\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberEquals = {\n /** Predicate type */\n type: 'number_equals';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberNotEquals = {\n /** Predicate type */\n type: 'number_notEquals';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberGreaterThan = {\n /** Predicate type */\n type: 'number_greaterThan';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberGreaterThanOrEqualTo = {\n /** Predicate type */\n type: 'number_greaterThanOrEqualTo';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberLessThan = {\n /** Predicate type */\n type: 'number_lessThan';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberLessThanOrEqualTo = {\n /** Predicate type */\n type: 'number_lessThanOrEqualTo';\n /** Referense value */\n reference: number;\n};\n\n/** PlTableFilters numeric filter entry */\nexport type PlTableFilterNumberBetween = {\n /** Predicate type */\n type: 'number_between';\n /** Referense value for the lower bound */\n lowerBound: number;\n /** Defines whether values equal to lower bound reference value should be matched */\n includeLowerBound: boolean;\n /** Referense value for the upper bound */\n upperBound: number;\n /** Defines whether values equal to upper bound reference value should be matched */\n includeUpperBound: boolean;\n};\n\n/** All PlTableFilters numeric filter entries */\nexport type PlTableFilterNumber =\n | PlTableFilterCommon\n | PlTableFilterNumberEquals\n | PlTableFilterNumberNotEquals\n | PlTableFilterNumberGreaterThan\n | PlTableFilterNumberGreaterThanOrEqualTo\n | PlTableFilterNumberLessThan\n | PlTableFilterNumberLessThanOrEqualTo\n | PlTableFilterNumberBetween;\n/** All types of PlTableFilters numeric filter entries */\nexport type PlTableFilterNumberType = PlTableFilterNumber['type'];\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringEquals = {\n /** Predicate type */\n type: 'string_equals';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringNotEquals = {\n /** Predicate type */\n type: 'string_notEquals';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringContains = {\n /** Predicate type */\n type: 'string_contains';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringDoesNotContain = {\n /** Predicate type */\n type: 'string_doesNotContain';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringMatches = {\n /** Predicate type */\n type: 'string_matches';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringDoesNotMatch = {\n /** Predicate type */\n type: 'string_doesNotMatch';\n /** Referense value */\n reference: string;\n};\n\n/** PlTableFilters string filter entry */\nexport type PlTableFilterStringContainsFuzzyMatch = {\n /** Predicate type */\n type: 'string_containsFuzzyMatch';\n /** Referense value */\n reference: string;\n /**\n * Maximum acceptable edit distance between reference value and matched substring\n * @see https://en.wikipedia.org/wiki/Edit_distance\n */\n maxEdits: number;\n /**\n * When {@link substitutionsOnly} is set to false\n * Levenshtein distance is used as edit distance (substitutions and indels)\n * @see https://en.wikipedia.org/wiki/Levenshtein_distance\n * When {@link substitutionsOnly} is set to true\n * Hamming distance is used as edit distance (substitutions only)\n * @see https://en.wikipedia.org/wiki/Hamming_distance\n */\n substitutionsOnly: boolean;\n /**\n * Single character in {@link reference} that will labelColumn any\n * single character in searched text.\n */\n wildcard?: string;\n};\n\n/** All PlTableFilters string filter entries */\nexport type PlTableFilterString =\n | PlTableFilterCommon\n | PlTableFilterStringEquals\n | PlTableFilterStringNotEquals\n | PlTableFilterStringContains\n | PlTableFilterStringDoesNotContain\n | PlTableFilterStringMatches\n | PlTableFilterStringDoesNotMatch\n | PlTableFilterStringContainsFuzzyMatch;\n/** All types of PlTableFilters string filter entries */\nexport type PlTableFilterStringType = PlTableFilterString['type'];\n\n/** All PlTableFilters filter entries */\nexport type PlTableFilter = PlTableFilterNumber | PlTableFilterString;\n/** All types of PlTableFilters filter entries */\nexport type PlTableFilterType = PlTableFilter['type'];\n\nexport type CreatePlDataTableOps = {\n /** Filters for columns and non-partitioned axes */\n filters?: PTableRecordFilter[];\n\n /** Sorting to columns hidden from user */\n sorting?: PTableSorting[];\n\n /**\n * Selects columns for which will be inner-joined to the table.\n *\n * Default behaviour: all columns are considered to be core\n */\n coreColumnPredicate?: (spec: PColumnSpec) => boolean;\n\n /**\n * Determines how core columns should be joined together:\n * inner - so user will only see records present in all core columns\n * full - so user will only see records present in any of the core columns\n *\n * All non-core columns will be left joined to the table produced by the core\n * columns, in other words records form the pool of non-core columns will only\n * make their way into the final table if core table contins corresponding key.\n *\n * Default: 'full'\n */\n coreJoinType?: 'inner' | 'full';\n};\n\n/** Check if column is a label column */\nexport function isLabelColumn(column: PColumnSpec) {\n return column.axesSpec.length === 1 && column.name === 'pl7.app/label';\n}\n\n/** Get all label columns from the result pool */\nexport function getAllLabelColumns(\n resultPool: AxisLabelProvider & ColumnProvider,\n): PColumn<PColumnDataUniversal>[] | undefined {\n return new PColumnCollection()\n .addAxisLabelProvider(resultPool)\n .addColumnProvider(resultPool)\n .getColumns({\n name: 'pl7.app/label',\n axes: [{}], // exactly one axis\n }, { dontWaitAllData: true });\n}\n\n/** Get label columns matching the provided columns from the result pool */\nexport function getMatchingLabelColumns(\n columns: PColumnIdAndSpec[],\n allLabelColumns: PColumn<PColumnDataUniversal>[],\n): PColumn<PColumnDataUniversal>[] {\n // split input columns into label and value columns\n const inputLabelColumns: typeof columns = [];\n const inputValueColumns: typeof columns = [];\n for (const column of columns) {\n if (isLabelColumn(column.spec)) {\n inputLabelColumns.push(column);\n } else {\n inputValueColumns.push(column);\n }\n }\n\n // collect distinct axes of value columns\n const unlabeledAxes: AxisId[] = [];\n for (const column of inputValueColumns) {\n for (const axis of column.spec.axesSpec) {\n const axisId = getAxisId(axis);\n if (!unlabeledAxes.some((id) => matchAxisId(id, axisId))) {\n unlabeledAxes.push(axisId);\n }\n }\n }\n\n // remove axes matched by input label columns\n for (const labelColumn of inputLabelColumns) {\n const labelAxisId = getAxisId(labelColumn.spec.axesSpec[0]);\n const labelMatch = unlabeledAxes.findIndex((axisId) => matchAxisId(axisId, labelAxisId));\n if (labelMatch !== -1) {\n unlabeledAxes.splice(labelMatch, 1);\n }\n }\n\n // warning: changing this id will break backward compatibility\n const colId = (id: PObjectId, domain?: Record<string, string>): PObjectId => {\n let wid = id.toString();\n if (domain) {\n for (const k in domain) {\n wid += k;\n wid += domain[k];\n }\n }\n return wid as PObjectId;\n };\n\n // search label columns for unmatched axes\n const labelColumns: typeof allLabelColumns = [];\n for (const labelColumn of allLabelColumns) {\n const labelAxis = labelColumn.spec.axesSpec[0];\n const labelAxisId = getAxisId(labelAxis);\n const labelMatch = unlabeledAxes.findIndex((axisId) => matchAxisId(axisId, labelAxisId));\n if (labelMatch !== -1) {\n const axisId = unlabeledAxes[labelMatch];\n const dataDomainLen = Object.keys(axisId.domain ?? {}).length;\n const labelDomainLen = Object.keys(labelAxis.domain ?? {}).length;\n if (dataDomainLen > labelDomainLen) {\n labelColumns.push({\n id: colId(labelColumn.id, axisId.domain),\n spec: {\n ...labelColumn.spec,\n axesSpec: [{ ...axisId, annotations: labelAxis.annotations }],\n },\n data: labelColumn.data,\n });\n } else {\n labelColumns.push(labelColumn);\n }\n unlabeledAxes.splice(labelMatch, 1);\n }\n }\n return labelColumns;\n}\n\n/** Check if all columns are computed */\nexport function allColumnsComputed(\n columns: PColumn<PColumnValues | TreeNodeAccessor | DataInfo<TreeNodeAccessor>>[],\n): boolean {\n type Data = typeof columns[number]['data'];\n const isValues = (d: Data): d is PColumnValues => Array.isArray(d);\n const isAccessor = (d: Data): d is TreeNodeAccessor => d instanceof TreeNodeAccessor;\n const isDataInfo = (d: Data): d is DataInfo<TreeNodeAccessor> =>\n typeof d === 'object' && 'type' in d;\n\n return columns\n .map((c) => c.data)\n .every((d): boolean => {\n if (isValues(d)) {\n return true;\n } else if (isAccessor(d)) {\n return d.getIsReadyOrError();\n } else if (isDataInfo(d)) {\n const type = d.type;\n switch (type) {\n case 'Json':\n return true;\n case 'JsonPartitioned':\n return Object.values(d.parts).every((p) => p.getIsReadyOrError());\n case 'BinaryPartitioned':\n return Object.values(d.parts)\n .every((p) => p.index.getIsReadyOrError() && p.values.getIsReadyOrError());\n }\n } else {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n throw Error(`unsupported column data type: ${d satisfies never}`);\n }\n });\n}\n\nfunction createPTableDef(params: {\n columns: PColumn<PColumnDataUniversal>[];\n labelColumns: PColumn<PColumnDataUniversal>[];\n coreJoinType: 'inner' | 'full';\n partitionFilters: PTableRecordSingleValueFilterV2[];\n filters: PTableRecordSingleValueFilterV2[];\n sorting: PTableSorting[];\n coreColumnPredicate?: ((spec: PColumnSpec) => boolean);\n}): PTableDef<PColumn<TreeNodeAccessor | PColumnValues | DataInfo<TreeNodeAccessor>>> {\n let coreColumns = params.columns;\n const secondaryColumns: typeof params.columns = [];\n\n if (params.coreColumnPredicate) {\n coreColumns = [];\n for (const c of params.columns)\n if (params.coreColumnPredicate(c.spec)) coreColumns.push(c);\n else secondaryColumns.push(c);\n }\n\n secondaryColumns.push(...params.labelColumns);\n\n return {\n src: {\n type: 'outer',\n primary: {\n type: params.coreJoinType,\n entries: coreColumns.map((c) => ({ type: 'column', column: c })),\n },\n secondary: secondaryColumns.map((c) => ({ type: 'column', column: c })),\n },\n partitionFilters: params.partitionFilters,\n filters: params.filters,\n sorting: params.sorting,\n };\n}\n\n/** PlAgDataTable model */\nexport type PlDataTableModel = {\n /** DataSource identifier for state management */\n sourceId: string | null;\n /** p-table including all columns, used to show the full specification of the table */\n fullTableHandle: PTableHandle;\n /** p-table including only visible columns, used to get the data */\n visibleTableHandle: PTableHandle;\n};\n\n/** Check if column should be omitted from the table */\nexport function isColumnHidden(spec: { annotations?: Record<string, string> }): boolean {\n return spec.annotations?.['pl7.app/table/visibility'] === 'hidden';\n}\n\n/** Check if column is hidden by default */\nexport function isColumnOptional(spec: { annotations?: Record<string, string> }): boolean {\n return spec.annotations?.['pl7.app/table/visibility'] === 'optional';\n}\n\n/**\n * Return unique entries of the array by the provided id\n * For each id, the last entry is kept\n */\nexport function uniqueBy<T>(array: T[], makeId: (entry: T) => string): T[] {\n return [...new Map(array.map((e) => [makeId(e), e])).values()];\n}\n\n/**\n * Create p-table spec and handle given ui table state\n *\n * @param ctx context\n * @param columns column list\n * @param tableState table ui state\n * @returns PlAgDataTableV2 table source\n */\nexport function createPlDataTableV2<A, U>(\n ctx: RenderCtx<A, U>,\n inputColumns: PColumn<TreeNodeAccessor | PColumnValues | DataInfo<TreeNodeAccessor>>[],\n tableState: PlDataTableStateV2,\n ops?: CreatePlDataTableOps,\n): PlDataTableModel | undefined {\n if (inputColumns.length === 0) return undefined;\n const columns = inputColumns.filter((c) => isLinkerColumn(c.spec) || !isColumnHidden(c.spec));\n\n const tableStateNormalized = upgradePlDataTableStateV2(tableState);\n\n const allLabelColumns = getAllLabelColumns(ctx.resultPool);\n if (!allLabelColumns) return undefined;\n\n const fullLabelColumns = getMatchingLabelColumns(columns.map(getColumnIdAndSpec), allLabelColumns);\n const fullColumns = [...columns, ...fullLabelColumns];\n\n const fullColumnsAxes = uniqueBy(\n [...fullColumns.flatMap((c) => c.spec.axesSpec.map((a) => getAxisId(a)))],\n (a) => canonicalizeJson<AxisId>(a),\n );\n const fullColumnsIds: PTableColumnId[] = [\n ...fullColumnsAxes.map((a) => ({ type: 'axis', id: a } satisfies PTableColumnIdAxis)),\n ...fullColumns.map((c) => ({ type: 'column', id: c.id } satisfies PTableColumnIdColumn)),\n ];\n const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n const isValidColumnId = (id: PTableColumnId): boolean => fullColumnsIdsSet.has(canonicalizeJson<PTableColumnId>(id));\n\n const coreJoinType = ops?.coreJoinType ?? 'full';\n const partitionFilters: PTableRecordSingleValueFilterV2[]\n = tableStateNormalized.pTableParams.partitionFilters\n .filter((f) => {\n const valid = isValidColumnId(f.column);\n if (!valid) ctx.logWarn(`Partition filter ${JSON.stringify(f)} does not match provided columns, skipping`);\n return valid;\n });\n const filters: PTableRecordSingleValueFilterV2[]\n = uniqueBy(\n [...(ops?.filters ?? []), ...tableStateNormalized.pTableParams.filters],\n (f) => canonicalizeJson<PTableColumnId>(f.column),\n ).filter((f) => {\n const valid = isValidColumnId(f.column);\n if (!valid) ctx.logWarn(`Filter ${JSON.stringify(f)} does not match provided columns, skipping`);\n return valid;\n });\n const sorting: PTableSorting[]\n = uniqueBy(\n [...(ops?.sorting ?? []), ...tableStateNormalized.pTableParams.sorting],\n (s) => canonicalizeJson<PTableColumnId>(s.column),\n ).filter((s) => {\n const valid = isValidColumnId(s.column);\n if (!valid) ctx.logWarn(`Sorting ${JSON.stringify(s)} does not match provided columns, skipping`);\n return valid;\n });\n\n const fullDef = createPTableDef({\n columns,\n labelColumns: fullLabelColumns,\n coreJoinType,\n partitionFilters,\n filters,\n sorting,\n coreColumnPredicate: ops?.coreColumnPredicate,\n });\n const fullHandle = ctx.createPTable(fullDef);\n\n const hiddenColumns = new Set<PObjectId>(((): PObjectId[] => {\n // Inner join works as a filter - all columns must be present\n if (coreJoinType === 'inner') return [];\n\n const hiddenColIds = tableStateNormalized.pTableParams.hiddenColIds;\n if (hiddenColIds) return hiddenColIds;\n\n return columns\n .filter((c) => isColumnOptional(c.spec))\n .map((c) => c.id);\n })());\n\n // Preserve linker columns\n columns\n .filter((c) => isLinkerColumn(c.spec))\n .forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve core columns as they change the shape of join.\n if (ops?.coreColumnPredicate) {\n const coreColumns = columns.flatMap((c) => ops?.coreColumnPredicate?.(c.spec) ? [c.id] : []);\n coreColumns.forEach((c) => hiddenColumns.delete(c));\n }\n\n // Filters decrease the number of result rows, sorting changes the order of result rows\n [...partitionFilters.map((f) => f.column), ...filters.map((f) => f.column), ...sorting.map((s) => s.column)]\n .filter((c): c is PTableColumnIdColumn => c.type === 'column')\n .forEach((c) => hiddenColumns.delete(c.id));\n\n const visibleColumns = columns.filter((c) => !hiddenColumns.has(c.id));\n const visibleLabelColumns = getMatchingLabelColumns(visibleColumns.map(getColumnIdAndSpec), allLabelColumns);\n\n // if at least one column is not yet computed, we can't show the table\n if (!allColumnsComputed([...visibleColumns, ...visibleLabelColumns])) return undefined;\n\n const visibleDef = createPTableDef({\n columns: visibleColumns,\n labelColumns: visibleLabelColumns,\n coreJoinType,\n partitionFilters,\n filters,\n sorting,\n coreColumnPredicate: ops?.coreColumnPredicate,\n });\n const visibleHandle = ctx.createPTable(visibleDef);\n\n return {\n sourceId: tableStateNormalized.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n visibleTableHandle: visibleHandle,\n } satisfies PlDataTableModel;\n}\n\n/** Create sheet entries for PlDataTable */\nexport function createPlDataTableSheet<A, U>(\n ctx: RenderCtx<A, U>,\n axis: AxisSpec,\n values: (string | number)[],\n): PlDataTableSheet {\n const labels = ctx.resultPool.findLabels(axis);\n return {\n axis,\n options: values.map((v) => ({\n value: v,\n label: labels?.[v] ?? v.toString(),\n })),\n defaultValue: values[0],\n };\n}\n","import type {\n AxisId,\n CanonicalizedJson,\n PColumn,\n PColumnSpec,\n PFrameHandle,\n PObjectId,\n} from '@milaboratories/pl-model-common';\nimport {\n canonicalizeJson,\n getAxisId,\n isDataInfo,\n matchAxisId, parseJson,\n visitDataInfo,\n} from '@milaboratories/pl-model-common';\nimport type { PColumnDataUniversal, RenderCtx } from '../render';\nimport { PColumnCollection, TreeNodeAccessor } from '../render';\nimport { isLabelColumn } from './PlDataTable';\n\n/** Create id for column copy with added keys in axes domains */\nconst colId = (id: PObjectId, domains: (Record<string, string> | undefined)[]) => {\n let wid = id.toString();\n domains?.forEach((domain) => {\n if (domain) {\n for (const [k, v] of Object.entries(domain)) {\n wid += k;\n wid += v;\n }\n }\n });\n return wid;\n};\n\n/** All combinations with 1 key from each list */\nfunction getKeysCombinations(idsLists: AxisId[][]) {\n if (!idsLists.length) {\n return [];\n }\n let result: AxisId[][] = [[]];\n idsLists.forEach((list) => {\n const nextResult: AxisId[][] = [];\n list.forEach((key) => {\n nextResult.push(...result.map((resultItem) => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\n\n/** Check if column is a linker column */\nexport function isLinkerColumn(column: PColumnSpec) {\n return column.annotations?.[LINKER_COLUMN_ANNOTATION] === 'true';\n}\n\nexport const IS_VIRTUAL_COLUMN = 'pl7.app/graph/isVirtual'; // annotation for column duplicates with extended domains\nexport const LABEL_ANNOTATION = 'pl7.app/label';\nexport const LINKER_COLUMN_ANNOTATION = 'pl7.app/isLinkerColumn';\n\nexport type LinkerColumnsMap = Map<CanonicalizedJson<AxisId>, Set<CanonicalizedJson<AxisId>>>;\nexport function getLinkerColumnsMap(linkerColumns: PColumn<PColumnDataUniversal>[]) {\n const resultMap: LinkerColumnsMap = new Map();\n for (const { spec } of linkerColumns) {\n const axisIds = spec.axesSpec.map(getAxisId).map(canonicalizeJson);\n axisIds.forEach((id) => {\n if (!resultMap.has(id)) {\n resultMap.set(id, new Set());\n }\n });\n for (let i = 0; i < axisIds.length - 1; i++) {\n for (let j = i + 1; j < axisIds.length; j++) {\n const id1 = axisIds[i];\n const id2 = axisIds[j];\n resultMap.get(id1)?.add(id2);\n resultMap.get(id2)?.add(id1);\n }\n }\n }\n return resultMap;\n}\n\nexport function getAvailableWithLinkersAxes(\n linkerColumns: PColumn<PColumnDataUniversal>[],\n blockAxes: Map<CanonicalizedJson<AxisId>, AxisId>,\n): Map<CanonicalizedJson<AxisId>, AxisId> {\n const linkerColumnsMap = getLinkerColumnsMap(linkerColumns);\n const linkerColumnsMapIds = [...linkerColumnsMap.keys()].map(parseJson);\n const startKeys: CanonicalizedJson<AxisId>[] = [];\n for (const startId of blockAxes.values()) {\n const matched = linkerColumnsMapIds.find((id) => matchAxisId(startId, id));\n if (matched) {\n startKeys.push(canonicalizeJson(matched)); // linker column can contain fewer domains than in block's columns, it's fixed on next step in enrichCompatible\n }\n }\n const visited: Set<CanonicalizedJson<AxisId>> = new Set(startKeys);\n const addedAvailableAxes: Map<CanonicalizedJson<AxisId>, AxisId> = new Map();\n let nextKeys = [...startKeys];\n\n while (nextKeys.length) {\n const next: CanonicalizedJson<AxisId>[] = [];\n for (const nextKey of nextKeys) {\n for (const availableKey of linkerColumnsMap.get(nextKey) ?? []) {\n if (!visited.has(availableKey)) {\n next.push(availableKey);\n visited.add(availableKey);\n addedAvailableAxes.set(availableKey, parseJson(availableKey));\n }\n }\n }\n nextKeys = next;\n }\n return addedAvailableAxes;\n}\n/** Add columns with fully compatible axes created from partial compatible ones */\nexport function enrichCompatible(blockAxes: Map<string, AxisId>, columns: PColumn<PColumnDataUniversal>[]) {\n const result: PColumn<PColumnDataUniversal>[] = [];\n columns.forEach((column) => {\n result.push(...getAdditionalColumnsForColumn(blockAxes, column));\n });\n return result;\n}\n\nfunction getAdditionalColumnsForColumn(\n blockAxes: Map<string, AxisId>,\n column: PColumn<PColumnDataUniversal>,\n): PColumn<PColumnDataUniversal>[] {\n const columnAxesIds = column.spec.axesSpec.map(getAxisId);\n\n if (columnAxesIds.every((id) => blockAxes.has(canonicalizeJson(id)))) {\n return [column]; // the column is compatible with its own domains without modifications\n }\n\n // options with different possible domains for every axis of secondary column\n const secondaryIdsOptions = columnAxesIds.map((id) => {\n const result = [];\n for (const [_, mainId] of blockAxes) {\n if (matchAxisId(mainId, id) && !matchAxisId(id, mainId)) {\n result.push(mainId);\n }\n }\n return result;\n });\n // all possible combinations of axes with added domains\n const secondaryIdsVariants = getKeysCombinations(secondaryIdsOptions);\n\n // sets of added to column domain fields\n const allAddedDomainValues = new Set<string>();\n const addedNotToAllVariantsDomainValues = new Set<string>();\n const addedByVariantsDomainValues = secondaryIdsVariants.map((idsList) => {\n const addedSet = new Set<string>();\n idsList.map((axisId, idx) => {\n const d1 = column.spec.axesSpec[idx].domain;\n const d2 = axisId.domain;\n Object.entries(d2 ?? {}).forEach(([key, value]) => {\n if (d1?.[key] === undefined) {\n const item = JSON.stringify([key, value]);\n addedSet.add(item);\n allAddedDomainValues.add(item);\n }\n });\n return ({\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n });\n });\n return addedSet;\n });\n [...allAddedDomainValues].forEach((addedPart) => {\n if (addedByVariantsDomainValues.some((s) => !s.has(addedPart))) {\n addedNotToAllVariantsDomainValues.add(addedPart);\n }\n });\n\n const additionalColumns = secondaryIdsVariants.map((idsList, idx) => {\n const id = colId(column.id, idsList.map((id) => id.domain));\n\n const label = column.spec.annotations?.[LABEL_ANNOTATION] ?? '';\n const labelDomainPart = ([...addedByVariantsDomainValues[idx]])\n .filter((str) => addedNotToAllVariantsDomainValues.has(str))\n .sort()\n .map((v) => JSON.parse(v)?.[1]) // use in labels only domain values, but sort them by key to save the same order in all column variants\n .join(' / ');\n\n const annotations: Record<string, string> = {\n ...column.spec.annotations,\n [IS_VIRTUAL_COLUMN]: 'true',\n };\n if (label || labelDomainPart) {\n annotations[LABEL_ANNOTATION] = label && labelDomainPart ? label + ' / ' + labelDomainPart : label + labelDomainPart;\n }\n\n return {\n id: id as PObjectId,\n spec: {\n ...column.spec,\n axesSpec: idsList.map((axisId, idx) => ({\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n })),\n annotations,\n },\n data: column.data,\n };\n });\n\n return [column, ...additionalColumns];\n}\n\nexport function isColumnReady(c: PColumn<PColumnDataUniversal>) {\n let ready = true;\n if (c.data instanceof TreeNodeAccessor) {\n ready = ready && c.data.getIsReadyOrError();\n } else if (isDataInfo(c.data)) {\n visitDataInfo(c.data, (v) => {\n ready = ready && v.getIsReadyOrError();\n });\n }\n return ready;\n}\n\nexport function allColumnsReady(columns: PColumn<PColumnDataUniversal>[]): boolean {\n return columns.every(isColumnReady);\n}\n\n/**\n The aim of createPFrameForGraphs: to create pframe with block’s columns and all compatible columns from result pool\n (including linker columns and all label columns).\n Block’s columns are added to pframe as is.\n Other columns are added basing on set of axes of block’s columns, considering available with linker columns.\n Compatible columns must have at least one axis from block’s axes set. This axis of the compatible column from\n result pool must satisfy matchAxisId (it can have less domain keys than in block’s axis, but without conflicting values\n among existing ones).\n In requests to pframe (calculateTableData) columns must have strictly the same axes. For compatibility in case\n of partially matched axis we add to pframe a copy of this column with modified axis (with filled missed domains)\n and modified label (with added domain values in case if more than one copy with different domains exist).\n */\nexport function createPFrameForGraphs<A, U>(\n ctx: RenderCtx<A, U>,\n blockColumns?: PColumn<PColumnDataUniversal>[],\n): PFrameHandle | undefined {\n // if current block doesn't produce own columns then use all columns from result pool\n if (!blockColumns) {\n const columns = new PColumnCollection();\n columns.addColumnProvider(ctx.resultPool);\n\n const allColumns = columns.getColumns(() => true, { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? [];\n // if at least one column is not yet ready, we can't show the graph\n if (!allColumnsReady(allColumns)) {\n return undefined;\n }\n\n const allAxes = new Map(allColumns\n .flatMap((column) => column.spec.axesSpec)\n .map((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return [canonicalizeJson(axisId), axisId];\n }));\n\n // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match\n const extendedColumns = enrichCompatible(allAxes, allColumns);\n\n return ctx.createPFrame(extendedColumns);\n };\n\n if (!allColumnsReady(blockColumns)) {\n return undefined;\n }\n\n // if current block has its own columns then take from result pool only compatible with them\n const columns = new PColumnCollection();\n columns.addColumnProvider(ctx.resultPool);\n columns.addColumns(blockColumns);\n\n // all possible axes from block columns\n const blockAxes = new Map<CanonicalizedJson<AxisId>, AxisId>();\n // axes from block columns and compatible result pool columns\n const allAxes = new Map<CanonicalizedJson<AxisId>, AxisId>();\n for (const c of blockColumns) {\n for (const id of c.spec.axesSpec) {\n const aid = getAxisId(id);\n blockAxes.set(canonicalizeJson(aid), aid);\n allAxes.set(canonicalizeJson(aid), aid);\n }\n }\n\n // all linker columns always go to pFrame - even it's impossible to use some of them they all are hidden\n const linkerColumns = columns.getColumns((spec) => isLinkerColumn(spec)) ?? [];\n const availableWithLinkersAxes = getAvailableWithLinkersAxes(linkerColumns, blockAxes);\n\n // all possible axes from connected linkers\n for (const item of availableWithLinkersAxes) {\n blockAxes.set(...item);\n allAxes.set(...item);\n }\n\n // all compatible with block columns but without label columns\n const compatibleWithoutLabels = (columns.getColumns((spec) => spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n for (const selectorAxisId of blockAxes.values()) {\n if (matchAxisId(selectorAxisId, axisId)) {\n return true;\n }\n }\n return false;\n }), { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? []).filter((column) => !isLabelColumn(column.spec));\n\n // if at least one column is not yet ready, we can't show the graph\n if (!allColumnsReady(compatibleWithoutLabels)) {\n return undefined;\n }\n\n // extend axes set for label columns request\n for (const c of compatibleWithoutLabels) {\n for (const id of c.spec.axesSpec) {\n const aid = getAxisId(id);\n allAxes.set(canonicalizeJson(aid), aid);\n }\n }\n\n // label columns must be compatible with full set of axes - block axes and axes from compatible columns from result pool\n const compatibleLabels = (columns.getColumns((spec) => spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n for (const selectorAxisId of allAxes.values()) {\n if (matchAxisId(selectorAxisId, axisId)) {\n return true;\n }\n }\n return false;\n }), { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? []).filter((column) => isLabelColumn(column.spec));\n\n // if at least one column is not yet ready, we can't show the graph\n if (!allColumnsReady(compatibleLabels)) {\n return undefined;\n }\n\n const compatible = [...compatibleWithoutLabels, ...compatibleLabels];\n\n // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match\n const extendedColumns = enrichCompatible(blockAxes, compatible);\n\n return ctx.createPFrame(extendedColumns);\n}\n","import {\n isPTableAbsent,\n type PColumn,\n type PColumnIdAndSpec,\n type PColumnKey,\n type PColumnValues,\n type PObjectId,\n type PTableColumnId,\n uniquePlId,\n} from '@milaboratories/pl-model-common';\nimport { type PlSelectionModel } from './PlSelectionModel';\n\nexport type PColumnPredicate = (column: PColumnIdAndSpec) => boolean;\n\nexport interface PlMultiSequenceAlignmentSettings {\n sequenceColumnIds?: PObjectId[];\n labelColumnIds?: PTableColumnId[];\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n widgets: ('consensus' | 'seqLogo' | 'legend')[];\n alignmentParams: {\n gpo: number;\n gpe: number;\n tgpe: number;\n };\n}\n\nexport interface PlMultiSequenceAlignmentModel\n extends Partial<PlMultiSequenceAlignmentSettings> {\n version?: number;\n}\n\nexport type PlMultiSequenceAlignmentColorSchemeOption =\n | { type: 'no-color' }\n | { type: 'chemical-properties' }\n | { type: 'markup'; columnId: PObjectId };\n\nexport function createRowSelectionColumn({\n selection,\n columnId = uniquePlId() as string as PObjectId,\n label = 'Selection marker',\n domain,\n}: {\n selection: PlSelectionModel | undefined;\n columnId?: PObjectId;\n label?: string;\n domain?: Record<string, string>;\n}): PColumn<PColumnValues> | undefined {\n if (!selection?.axesSpec.length) {\n return;\n }\n const data: PColumnValues = selection.selectedKeys\n .filter((r): r is PColumnKey => r.every((v) => !isPTableAbsent(v)))\n .map((r) => ({ key: r, val: 1 }));\n if (!data.length) {\n return;\n }\n return {\n id: columnId,\n spec: {\n kind: 'PColumn',\n valueType: 'Int',\n name: 'pl7.app/table/row-selection',\n axesSpec: selection.axesSpec,\n ...(domain && Object.keys(domain).length && { domain }),\n annotations: {\n 'pl7.app/label': label,\n 'pl7.app/discreteValues': '[1]',\n },\n },\n data,\n };\n}\n","import type { AxesSpec, PTableValueAxis } from '@milaboratories/pl-model-common';\n\n/** Key is a set of all axes values, which means it is unique across rows */\nexport type PTableKey = PTableValueAxis[];\n\n/**\n * Information on selected rows.\n * for selectedKeys = [[axis1Value, axis2Value, axis3Value], ...]\n * axesSpec would be [axis1Spec, axis2Spec, axis3Spec]\n */\nexport type PlSelectionModel = {\n /** Specs for {@link AxisValue}'s in {@link PTableKey} */\n axesSpec: AxesSpec;\n /** Row keys (arrays of axes values) of selected rows */\n selectedKeys: PTableKey[];\n};\n\nexport function createPlSelectionModel(): PlSelectionModel {\n return {\n axesSpec: [],\n selectedKeys: [],\n };\n}\n","import type { SUniversalPColumnId } from '@milaboratories/pl-model-common';\nimport type { AnnotationFilter, AnnotationMode, AnnotationScript, IsNA, NotFilter, NumericalComparisonFilter, PatternFilter, PatternPredicate, ValueRank } from './filter';\nimport type { SimplifiedPColumnSpec } from './types';\n\nexport function unreachable(x: never): never {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n throw new Error('Unexpected object: ' + x);\n}\n\nfunction isNumericValueType(spec: SimplifiedPColumnSpec): boolean {\n return spec.valueType === 'Int' || spec.valueType === 'Long' || spec.valueType === 'Float' || spec.valueType === 'Double';\n}\n\nfunction isStringValueType(spec: SimplifiedPColumnSpec): boolean {\n return spec.valueType === 'String';\n}\n\n// Define recursive type explicitly\nexport type FilterUi = { id?: number; name?: string; isExpanded?: boolean }\n & ({ type: undefined }\n | { type: 'or'; filters: FilterUi[] }\n | { type: 'and'; filters: FilterUi[] }\n | { type: 'not'; filter: FilterUi }\n | { type: 'isNA'; column: SUniversalPColumnId }\n | { type: 'isNotNA'; column: SUniversalPColumnId }\n | { type: 'patternEquals'; column: SUniversalPColumnId; value: string }\n | { type: 'patternNotEquals'; column: SUniversalPColumnId; value: string }\n | { type: 'patternContainSubsequence'; column: SUniversalPColumnId; value: string }\n | { type: 'patternNotContainSubsequence'; column: SUniversalPColumnId; value: string }\n | { type: 'topN'; column: SUniversalPColumnId; n: number }\n | { type: 'bottomN'; column: SUniversalPColumnId; n: number }\n | { type: 'lessThan'; column: SUniversalPColumnId; x: number }\n | { type: 'greaterThan'; column: SUniversalPColumnId; x: number }\n | { type: 'lessThanOrEqual'; column: SUniversalPColumnId; x: number }\n | { type: 'greaterThanOrEqual'; column: SUniversalPColumnId; x: number }\n | { type: 'lessThanColumn'; column: SUniversalPColumnId; rhs: SUniversalPColumnId; minDiff?: number }\n | { type: 'lessThanColumnOrEqual'; column: SUniversalPColumnId; rhs: SUniversalPColumnId; minDiff?: number });\n\nexport type FilterUiType = Exclude<FilterUi, { type: undefined }>['type'];\n\nexport type FilterUiOfType<T extends FilterUiType> = Extract<FilterUi, { type: T }>;\n\nexport type TypeToLiteral<T> =\n[T] extends [FilterUiType] ? 'FilterUiType' :\n [T] extends [SUniversalPColumnId] ? 'SUniversalPColumnId' :\n [T] extends [PatternPredicate] ? 'PatternPredicate' :\n [T] extends [AnnotationFilter[]] ? 'AnnotationFilter[]' :\n [T] extends [AnnotationFilter] ? 'AnnotationFilter' :\n [T] extends [number] ? 'number' :\n [T] extends [number | undefined] ? 'number?' :\n [T] extends [string] ? 'string' :\n [T] extends [string | undefined] ? 'string?' :\n [T] extends [boolean] ? 'boolean' :\n [T] extends [boolean | undefined] ? 'boolean?' :\n [T] extends [unknown[]] ? 'unknown[]' :\n // this is special\n T extends number ? 'number' :\n T extends string ? 'string' :\n T extends boolean ? 'boolean' :\n T extends Record<string, unknown> ? 'form' :\n 'unknown';\n\n// @TODO: \"parse\" option\nexport type TypeField<V> = {\n fieldType: TypeToLiteral<V>;\n label: string;\n defaultValue: () => V | undefined;\n};\n\nexport type TypeFieldRecord<T> = { [K in keyof T]: TypeField<T[K]>; };\n\nexport type TypeForm<T> = {\n [P in keyof T]: T[P] extends Record<string, unknown> ? {\n fieldType: 'form';\n label?: string;\n form?: T[P] extends Record<string, unknown> ? TypeForm<T[P]> : undefined;\n defaultValue: () => T[P];\n } : TypeField<T[P]>;\n};\n\nexport type FormField =\n {\n fieldType: 'form';\n form?: Record<string, FormField>;\n defaultValue: () => Record<string, unknown>;\n }\n | TypeField<FilterUiType>\n | TypeField<string>\n | TypeField<number>\n | TypeField<number | undefined>\n | TypeField<boolean>\n | TypeField<boolean | undefined>\n | TypeField<SUniversalPColumnId>;\n\nexport type AnyForm = Record<string, FormField>;\n\ntype CreateFilterUiMetadataMap<T extends FilterUiType> = {\n [P in T]: {\n label: string;\n form: TypeForm<FilterUiOfType<T>>; // TODO: simplify this to `TypeField<T>`\n supportedFor: (spec1: SimplifiedPColumnSpec, spec2: SimplifiedPColumnSpec | undefined) => boolean;\n }\n};\n\nexport const filterUiMetadata = {\n lessThan: {\n label: 'Col < X (Less Than)',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'lessThan',\n },\n x: {\n label: 'X',\n fieldType: 'number',\n defaultValue: () => 0,\n },\n },\n supportedFor: isNumericValueType,\n },\n greaterThan: {\n label: 'Col > X (Greater Than)',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'greaterThan',\n },\n x: {\n label: 'X',\n fieldType: 'number',\n defaultValue: () => 0,\n },\n },\n supportedFor: isNumericValueType,\n },\n lessThanOrEqual: {\n label: 'Col ≤ X (Less Than or Equal)',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'lessThanOrEqual',\n },\n x: {\n label: 'X',\n fieldType: 'number',\n defaultValue: () => 0,\n },\n },\n supportedFor: isNumericValueType,\n },\n greaterThanOrEqual: {\n label: 'Col ≥ X (Greater Than or Equal)',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'greaterThanOrEqual',\n },\n x: {\n label: 'X',\n fieldType: 'number',\n defaultValue: () => 0,\n },\n },\n supportedFor: isNumericValueType,\n },\n lessThanColumn: {\n label: 'Col₁ < Col₂ (Compare Columns)',\n form: {\n column: {\n label: 'Col₁',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'lessThanColumn',\n },\n rhs: {\n label: 'Col₂',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n minDiff: {\n label: 'Margin (positive)',\n fieldType: 'number?',\n defaultValue: () => undefined,\n },\n },\n supportedFor: (spec1: SimplifiedPColumnSpec, spec2?: SimplifiedPColumnSpec): boolean => {\n return isNumericValueType(spec1) && (spec2 === undefined || isNumericValueType(spec2));\n },\n },\n lessThanColumnOrEqual: {\n label: 'Col₁ ≤ Col₂ (Compare Columns)',\n form: {\n column: {\n label: 'Col₁',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'lessThanColumnOrEqual',\n },\n rhs: {\n label: 'Col₂',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n minDiff: {\n label: 'Margin (positive)',\n fieldType: 'number?',\n defaultValue: () => undefined,\n },\n },\n supportedFor: (spec1: SimplifiedPColumnSpec, spec2?: SimplifiedPColumnSpec): boolean => {\n return isNumericValueType(spec1) && (spec2 === undefined || isNumericValueType(spec2));\n },\n },\n topN: {\n label: 'Top N',\n form: {\n column: {\n label: 'Rank By Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'topN',\n },\n n: {\n label: 'N',\n fieldType: 'number',\n defaultValue: () => 10,\n },\n },\n supportedFor: isNumericValueType,\n },\n bottomN: {\n label: 'Bottom N',\n form: {\n column: {\n label: 'Rank By Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'bottomN',\n },\n n: {\n label: 'N',\n fieldType: 'number',\n defaultValue: () => 10,\n },\n },\n supportedFor: isNumericValueType,\n },\n patternContainSubsequence: {\n label: 'Col ~ Seq (Contain Subsequence)',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'patternContainSubsequence',\n },\n value: {\n label: 'Seq',\n fieldType: 'string',\n defaultValue: () => '',\n },\n },\n supportedFor: isStringValueType,\n },\n patternNotContainSubsequence: {\n label: 'Col ≁ Seq (Not Contain Subsequence)',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'patternNotContainSubsequence',\n },\n value: {\n label: 'Seq',\n fieldType: 'string',\n defaultValue: () => '',\n },\n },\n supportedFor: isStringValueType,\n },\n patternEquals: {\n label: 'Col = Seq (Equals)',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'patternEquals',\n },\n value: {\n label: 'Seq',\n fieldType: 'string',\n defaultValue: () => '',\n },\n },\n supportedFor: isStringValueType,\n },\n patternNotEquals: {\n label: 'Col ≠ Seq (Not Equal)',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'patternNotEquals',\n },\n value: {\n label: 'Seq',\n fieldType: 'string',\n defaultValue: () => '',\n },\n },\n supportedFor: isStringValueType,\n },\n isNA: {\n label: 'Is NA',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'isNA',\n },\n },\n supportedFor: () => true,\n },\n isNotNA: {\n label: 'Is Not NA',\n form: {\n column: {\n label: 'Column',\n fieldType: 'SUniversalPColumnId',\n defaultValue: () => undefined,\n },\n type: {\n label: 'Predicate',\n fieldType: 'FilterUiType',\n defaultValue: () => 'isNotNA',\n },\n },\n supportedFor: () => true,\n },\n or: {\n label: 'Or',\n form: {\n type: {\n fieldType: 'FilterUiType',\n label: 'Predicate',\n defaultValue: () => 'or',\n },\n filters: {\n fieldType: 'unknown[]',\n label: 'Filters',\n defaultValue: () => [],\n },\n },\n supportedFor: () => false,\n },\n and: {\n label: 'And',\n form: {\n type: {\n fieldType: 'FilterUiType',\n label: 'Predicate',\n defaultValue: () => 'and',\n },\n filters: {\n fieldType: 'unknown[]',\n label: 'Filters',\n defaultValue: () => [],\n },\n },\n supportedFor: () => false,\n },\n not: {\n label: 'Not',\n form: {\n type: {\n fieldType: 'FilterUiType',\n label: 'Predicate',\n defaultValue: () => 'not',\n },\n filter: {\n fieldType: 'form',\n label: 'Filter',\n defaultValue: () => undefined as unknown as FilterUi, // TODO:\n },\n },\n supportedFor: () => false,\n },\n} satisfies CreateFilterUiMetadataMap<FilterUiType>;\n\nexport function getFilterUiTypeOptions(columnSpec?: SimplifiedPColumnSpec) {\n if (!columnSpec) {\n return [];\n }\n\n return Object.entries(filterUiMetadata).filter(([_, metadata]) => metadata.supportedFor(columnSpec)).map(([type, metadata]) => ({\n label: metadata.label,\n value: type,\n }));\n}\n\nexport function getFilterUiMetadata(type: FilterUiType) {\n return filterUiMetadata[type];\n}\n\nexport function compileFilter(ui: FilterUi): AnnotationFilter {\n if (ui.type === 'or') {\n return {\n type: 'or' as const,\n filters: compileFilters(ui.filters),\n };\n }\n\n if (ui.type === 'and') {\n return {\n type: 'and' as const,\n filters: compileFilters(ui.filters),\n };\n }\n\n if (ui.type === 'not') {\n return {\n type: 'not' as const,\n filter: compileFilter(ui.filter),\n };\n }\n\n if (ui.type === 'isNA') {\n return {\n type: 'isNA' as const,\n column: ui.column,\n };\n }\n\n if (ui.type === 'isNotNA') {\n const isNAFilter: IsNA = { type: 'isNA', column: ui.column };\n const notFilter: NotFilter = { type: 'not', filter: isNAFilter };\n return notFilter;\n }\n\n if (ui.type === 'patternEquals') {\n return {\n type: 'pattern' as const,\n column: ui.column,\n predicate: {\n type: 'equals' as const,\n value: ui.value,\n },\n };\n }\n\n if (ui.type === 'patternNotEquals') {\n const patternFilter: PatternFilter = {\n type: 'pattern',\n column: ui.column,\n predicate: { type: 'equals', value: ui.value },\n };\n const notFilter: NotFilter = { type: 'not', filter: patternFilter };\n return notFilter;\n }\n\n if (ui.type === 'patternContainSubsequence') {\n return {\n type: 'pattern' as const,\n column: ui.column,\n predicate: {\n type: 'containSubsequence' as const,\n value: ui.value,\n },\n };\n }\n\n if (ui.type === 'patternNotContainSubsequence') {\n const patternFilter: PatternFilter = {\n type: 'pattern',\n column: ui.column,\n predicate: { type: 'containSubsequence', value: ui.value },\n };\n const notFilter: NotFilter = { type: 'not', filter: patternFilter };\n return notFilter;\n }\n\n if (ui.type === 'topN') {\n const rankTransform: ValueRank = {\n transformer: 'rank',\n column: ui.column,\n descending: true,\n };\n const comparisonFilter: NumericalComparisonFilter = {\n type: 'numericalComparison',\n lhs: rankTransform,\n rhs: ui.n,\n allowEqual: true,\n };\n return comparisonFilter;\n }\n\n if (ui.type === 'bottomN') {\n const rankTransform: ValueRank = {\n transformer: 'rank',\n column: ui.column,\n };\n const comparisonFilter: NumericalComparisonFilter = {\n type: 'numericalComparison',\n lhs: rankTransform,\n rhs: ui.n,\n allowEqual: true,\n };\n return comparisonFilter;\n }\n\n if (ui.type === 'lessThan') {\n return {\n type: 'numericalComparison' as const,\n lhs: ui.column,\n rhs: ui.x,\n };\n }\n\n if (ui.type === 'greaterThan') {\n return {\n type: 'numericalComparison' as const,\n rhs: ui.column,\n lhs: ui.x,\n };\n }\n\n if (ui.type === 'greaterThanOrEqual') {\n return {\n type: 'numericalComparison' as const,\n rhs: ui.column,\n lhs: ui.x,\n allowEqual: true,\n };\n }\n\n if (ui.type === 'lessThanOrEqual') {\n return {\n type: 'numericalComparison' as const,\n lhs: ui.column,\n rhs: ui.x,\n allowEqual: true,\n };\n }\n\n if (ui.type === 'lessThanColumn') {\n return {\n type: 'numericalComparison' as const,\n lhs: ui.column,\n rhs: ui.rhs,\n minDiff: ui.minDiff,\n allowEqual: undefined,\n };\n }\n\n if (ui.type === 'lessThanColumnOrEqual') {\n return {\n type: 'numericalComparison' as const,\n lhs: ui.column,\n rhs: ui.rhs,\n minDiff: ui.minDiff,\n allowEqual: true,\n };\n }\n\n if (ui.type === undefined) {\n throw new Error('Filter type is undefined, this should not happen');\n }\n\n unreachable(ui);\n}\n\nexport function compileFilters(uiFilters: FilterUi[]): AnnotationFilter[] {\n return uiFilters.filter((f) => f.type !== undefined).map(compileFilter);\n}\n\nexport type AnnotationStepUi = {\n id?: number;\n label: string;\n filter: Extract<FilterUi, { type: 'and' | 'or' }>;\n};\n\nexport type AnnotationScriptUi = {\n isCreated?: boolean;\n title: string;\n mode: AnnotationMode;\n steps: AnnotationStepUi[];\n};\n\nexport function compileAnnotationScript(uiScript: AnnotationScriptUi): AnnotationScript {\n return {\n title: uiScript.title,\n mode: uiScript.mode,\n steps: uiScript.steps\n .filter((step) => {\n // No need to compile empty steps\n if (step.filter.type == null) {\n return false;\n }\n\n if (step.filter.type === 'or') {\n return step.filter.filters.length > 0;\n }\n\n if (step.filter.type === 'and') {\n return step.filter.filters.length > 0;\n }\n\n return false;\n })\n .map((step) => ({\n label: step.label.trim(),\n filter: compileFilter(step.filter),\n })),\n };\n}\n","import type { ValueOrErrors } from '@milaboratories/pl-model-common';\nimport {} from './global';\nimport { getPlatformaInstance } from './internal';\nimport type { Platforma, PlatformaApiVersion } from './platforma';\nimport { PlatformaSDKVersion } from './version';\n\nexport function getPlatformaApiVersion(): PlatformaApiVersion {\n return platformaApiVersion ?? 1; // undefined means 1 for backward compatibility\n}\n\nexport function getRawPlatformaInstance<\n Args = unknown,\n Outputs extends Record<string, ValueOrErrors<unknown>> = Record<string, ValueOrErrors<unknown>>,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n>(): Platforma<Args, Outputs, UiState, Href> {\n return getPlatformaInstance<Args, Outputs, UiState, Href>({ sdkVersion: PlatformaSDKVersion, apiVersion: platformaApiVersion });\n}\n\n/** Returns a global platforma instance or a provided fallback if it's not available. */\n// export function getPlatformaOrDefault<\n// Args = unknown,\n// Outputs extends Record<string, ValueOrErrors<unknown>> = Record<string, ValueOrErrors<unknown>>,\n// UiState = unknown,\n// Href extends `/${string}` = `/${string}`,\n// >(): PlatformaV1<Args, Outputs, UiState, Href> | PlatformaV2<Args, Outputs, UiState, Href> {\n// try {\n// return getRawPlatformaInstance<Args, Outputs, UiState, Href>();\n// } catch {\n// return platforma;\n// }\n// }\n","import {} from './global';\n\nexport function getEnvironmentValue(name: string): string | undefined {\n if (typeof globalThis.getEnvironmentValue !== 'function') return undefined;\n else return globalThis.getEnvironmentValue(name);\n}\n"],"names":["getImmediate","value","isInUI","getPlatformaInstance","config","tryGetCfgRenderCtx","getCfgRenderCtx","tryRegisterCallback","key","callback","ctx","futureResolves","registerFutureAwait","handle","onResolve","res","FutureRef","postProcess","v","__publicField","mapping","vv","ifDef","cb","TreeNodeAccessor","resolvePath","steps","transformedSteps","s","commonOptions","step","accessor","accsessor","content","errorOnUnknownField","prefix","result","obj","isPColumn","pObjects","mapPObjectData","c","range","format","nLines","patternToSearch","fieldType","field","_mapping","_ops","requireLocked","skipUnresolved","fieldEntries","e","name","StagingAccessorName","MainAccessorName","PAnnotationLabel","PAnnotationTrace","TraceEntry","z","Trace","DistancePenalty","LabelType","LabelTypeFull","deriveLabels","values","specExtractor","ops","importances","forceTraceElements","numberOfRecordsWithType","enrichedRecords","extractorResult","spec","prefixTrace","suffixTrace","label","_a","traceStr","_b","baseTrace","trace","labelEntry","fullTrace","occurrences","i","typeName","importance","occurrenceIndex","fullType","mainTypes","secondaryTypes","allTypeRecords","i1","i2","calculate","includedTypes","force","r","includedTrace","fm","labelSet","sep","additionalType","currentSet","candidateResult","PCD_PREFIX","RT_RESOURCE_MAP","RT_RESOURCE_MAP_PARTITIONED","RT_JSON_PARTITIONED","RT_BINARY_PARTITIONED","PCD_SUP_PREFIX","RT_JSON_SUPER_PARTITIONED","RT_BINARY_SUPER_PARTITIONED","removeIndexSuffix","keyStr","getPartitionKeysList","acc","rt","meta","data","keyLength","supKeyStr","keyPrefix","getUniquePartitionKeysForDataEntries","list","parts","partitionKeyLength","part","getUniquePartitionKeys","isDataInfoEntries","l","parsePColumnData","resourceType","baseKeys","suffix","entry","baseKeyStr","totalKeyLength","superPartition","innerResult","convertOrParsePColumnData","isDataInfo","dataInfoToEntries","filterDataInfoEntries","dataInfoEntries","axisFilters","sortedFilters","a","b","axisIdx","keyMatchesFilters","axisValue","removeFilteredAxes","newKey","filteredData","filteredParts","isPColumnValues","first","ArrayColumnProvider","columns","selectors","predicate","selectorsToPredicate","column","splitFiltersToTrace","splitFilters","filter","canonicalizeAxisId","splitFiltersToAxisFilter","fallbackIdDeriver","originalId","filtersToCanonicalize","canonicalize","hasAnchors","selector","potentialAnchored","domainHasAnchors","axesHaveAnchors","getSplitAxisIndices","splitIndices","axis","index","PColumnCollection","provider","labels","predicateOrSelectors","opts","anchorCtx","rawLabelOps","dontWaitAllData","overrideLabelAnnotation","exclude","labelOps","excludePredicate","excludePredicartes","resolveAnchors","selectorsArray","intermediateResults","selectedNativeIds","rawSelector","usesAnchors","currentSelector","selectedIds","selectedColumns","providerColumns","col","nativeId","deriveNativeId","splitAxisIdxs","needsSplitting","isPColumnSpec","originalSpec","dataEntries","isPartitionedDataInfoEntries","uniqueKeys","maxSplitIdx","axesLabels","idx","getAxisId","keyCombinations","generateCombinations","currentCombo","sAxisIdx","axisValues","val","newAxesSpec","splitAxisOriginalIdxs","adjustedSpec","keyCombo","axisId","axisLabelMap","labeledResults","originalColumn","axisFiltersTuple","finalId","finalSpec","entriesToDataInfo","entries","patchInSetFilters","filters","inSetToOrEqual","reference","mapSingleValuePredicate","operand","mapFilter","matchDomain","query","target","k","transformPColumnData","d","mapDataInfo","ResultPool","predicateOrSelector","filtered","refsWithEnrichments","o","ref","withEnrichments","anchorsOrCtx","AnchoredIdDeriver","resolvedAnchors","isPlRef","resolvedSpec","item","mapValueInVOE","f","ensurePColumn","out","oth","qAx","tAx","dataPool","pcolumnSpec","_cachedData","self","axisKeys","keys","RenderCtx","raw","hasInlineColumns","inlineColumnsSupport","def","rawDef","extractAllColumns","mapPTableDef","po","blockId","msg","PlatformaSDKVersion","version","isConfigLambda","cfgOrFh","downgradeCfgOrLambda","_BlockModel","_renderingMode","_initialArgs","_initialUiState","_outputs","_inputsValid","_sections","_title","_enrichmentTargets","_featureFlags","renderingMode","cfgOrRf","flags","rf","arrOrCfgOrRf","initialValue","lambda","apiVersion","requiresUIAPIVersion","makeDefaultPTableParams","createPlDataTableStateV2","upgradePlDataTableStateV2","state","isLabelColumn","isColumnHidden","isColumnOptional","isLinkerColumn","LINKER_COLUMN_ANNOTATION","createRowSelectionColumn","selection","columnId","uniquePlId","domain","isPTableAbsent","createPlSelectionModel","isNumericValueType","isStringValueType","filterUiMetadata","spec1","spec2","getFilterUiTypeOptions","columnSpec","_","metadata","type","getFilterUiMetadata","getPlatformaApiVersion","getRawPlatformaInstance","getEnvironmentValue"],"mappings":"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"}