@platforma-sdk/model 1.46.0 → 1.48.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/PFrameForGraphs.cjs +1 -10
- package/dist/components/PFrameForGraphs.cjs.map +1 -1
- package/dist/components/PFrameForGraphs.d.ts.map +1 -1
- package/dist/components/PFrameForGraphs.js +2 -11
- package/dist/components/PFrameForGraphs.js.map +1 -1
- package/dist/package.json.cjs +1 -1
- package/dist/package.json.js +1 -1
- package/dist/render/util/column_collection.cjs +24 -1
- package/dist/render/util/column_collection.cjs.map +1 -1
- package/dist/render/util/column_collection.d.ts +2 -0
- package/dist/render/util/column_collection.d.ts.map +1 -1
- package/dist/render/util/column_collection.js +25 -2
- package/dist/render/util/column_collection.js.map +1 -1
- package/package.json +7 -7
- package/src/components/PFrameForGraphs.ts +4 -18
- package/src/render/util/column_collection.ts +38 -1
|
@@ -41,16 +41,7 @@ function isHiddenFromUIColumn(column) {
|
|
|
41
41
|
}
|
|
42
42
|
function getAvailableWithLinkersAxes(linkerColumns, blockAxes) {
|
|
43
43
|
const linkerMap = plModelCommon.LinkerMap.fromColumns(linkerColumns.map(plModelCommon.getColumnIdAndSpec));
|
|
44
|
-
const
|
|
45
|
-
const blockAxesGrouped = [...blockAxes.values()].map((axis) => plModelCommon.getArrayFromAxisTree(plModelCommon.getAxesTree(axis)).map(plModelCommon.getAxisId));
|
|
46
|
-
for (const axesGroupBlock of blockAxesGrouped) {
|
|
47
|
-
const matched = linkerMap.keyAxesIds.find((keyIds) => keyIds.every((keySourceAxis) => axesGroupBlock.find((axisSpecFromBlock) => plModelCommon.matchAxisId(axisSpecFromBlock, keySourceAxis))));
|
|
48
|
-
if (matched) {
|
|
49
|
-
startKeys.push(plModelCommon.canonicalizeJson(matched)); // linker column can contain fewer domains than in block's columns, it's fixed on next step in enrichCompatible
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
const availableKeys = linkerMap.searchAvailableAxesKeys(startKeys);
|
|
53
|
-
const availableAxes = linkerMap.getAxesListFromKeysList([...availableKeys]);
|
|
44
|
+
const availableAxes = linkerMap.getReachableByLinkersAxesFromAxesNormalized([...blockAxes.values()], (linkerKeyId, sourceAxisId) => plModelCommon.matchAxisId(sourceAxisId, linkerKeyId));
|
|
54
45
|
return new Map(availableAxes.map((axisSpec) => {
|
|
55
46
|
const id = plModelCommon.getAxisId(axisSpec);
|
|
56
47
|
return [plModelCommon.canonicalizeJson(id), axisSpec];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PFrameForGraphs.cjs","sources":["../../src/components/PFrameForGraphs.ts"],"sourcesContent":["import type {\n AxisId,\n AxisSpecNormalized,\n CanonicalizedJson,\n PColumn,\n PColumnSpec,\n PFrameHandle,\n PObjectId,\n} from '@milaboratories/pl-model-common';\nimport {\n Annotation,\n canonicalizeJson,\n getArrayFromAxisTree,\n getAxesTree,\n getAxisId,\n getColumnIdAndSpec,\n getNormalizedAxesList,\n isLabelColumn,\n isLinkerColumn,\n LinkerMap,\n matchAxisId,\n readAnnotation,\n readAnnotationJson,\n stringifyJson,\n} from '@milaboratories/pl-model-common';\nimport type { PColumnDataUniversal, PColumnEntryUniversal, PColumnEntryWithLabel, RenderCtx } from '../render';\nimport { PColumnCollection } from '../render';\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\nexport function isHiddenFromGraphColumn(column: PColumnSpec): boolean {\n return !!readAnnotationJson(column, Annotation.HideDataFromGraphs);\n}\n\nexport function isHiddenFromUIColumn(column: PColumnSpec): boolean {\n return !!readAnnotationJson(column, Annotation.HideDataFromUi);\n}\n\ntype AxesVault = Map<CanonicalizedJson<AxisId>, AxisSpecNormalized>;\n\nexport function getAvailableWithLinkersAxes(\n linkerColumns: (PColumnEntryWithLabel | PColumnEntryUniversal)[],\n blockAxes: AxesVault,\n): AxesVault {\n const linkerMap = LinkerMap.fromColumns(linkerColumns.map(getColumnIdAndSpec));\n const startKeys: CanonicalizedJson<AxisId[]>[] = [];\n const blockAxesGrouped: AxisId[][] = [...blockAxes.values()].map((axis) => getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));\n\n for (const axesGroupBlock of blockAxesGrouped) {\n const matched = linkerMap.keyAxesIds.find(\n (keyIds: AxisId[]) => keyIds.every(\n (keySourceAxis) => axesGroupBlock.find((axisSpecFromBlock) => matchAxisId(axisSpecFromBlock, keySourceAxis)),\n ),\n );\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\n const availableKeys = linkerMap.searchAvailableAxesKeys(startKeys);\n const availableAxes = linkerMap.getAxesListFromKeysList([...availableKeys]);\n\n return new Map(availableAxes.map((axisSpec) => {\n const id = getAxisId(axisSpec);\n return [canonicalizeJson(id), axisSpec];\n }));\n}\n/** Add columns with fully compatible axes created from partial compatible ones */\nexport function enrichCompatible<T extends Omit<PColumn<PColumnDataUniversal>, 'data'>>(blockAxes: AxesVault, columns: T[]): T[] {\n return columns.flatMap((column) => getAdditionalColumnsForColumn(blockAxes, column));\n}\n\nfunction getAdditionalColumnsForColumn<T extends Omit<PColumn<PColumnDataUniversal>, 'data'>>(\n blockAxes: AxesVault,\n column: T,\n): T[] {\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 = readAnnotation(column.spec, Annotation.Label) ?? '';\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: Annotation = {\n ...column.spec.annotations,\n [Annotation.Graph.IsVirtual]: stringifyJson(true),\n };\n if (label || labelDomainPart) {\n annotations[Annotation.Label] = label && labelDomainPart ? label + ' / ' + labelDomainPart : label + labelDomainPart;\n }\n\n return {\n ...column,\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 };\n });\n\n return [column, ...additionalColumns];\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 const suitableSpec = (spec: PColumnSpec) => !isHiddenFromUIColumn(spec) && !isHiddenFromGraphColumn(spec);\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 const allColumns = columns.getUniversalEntries(suitableSpec, { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? [];\n\n const allAxes: AxesVault = new Map(allColumns\n .flatMap((column) => getNormalizedAxesList(column.spec.axesSpec))\n .map((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return [canonicalizeJson(axisId), axisSpec];\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 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: AxesVault = new Map();\n // axes from block columns and compatible result pool columns\n const allAxes: AxesVault = new Map();\n for (const c of blockColumns) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n blockAxes.set(canonicalizeJson(aid), spec);\n allAxes.set(canonicalizeJson(aid), spec);\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.getUniversalEntries((spec) => suitableSpec(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 const blockAxesArr = Array.from(blockAxes.values());\n // all compatible with block columns but without label columns\n let compatibleWithoutLabels = (columns.getUniversalEntries((spec) => suitableSpec(spec) && spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return blockAxesArr.some((selectorAxisSpec) => matchAxisId(getAxisId(selectorAxisSpec), axisId));\n }), { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? []).filter((column) => !isLabelColumn(column.spec));\n\n // extend axes set for label columns request\n for (const c of compatibleWithoutLabels) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n allAxes.set(canonicalizeJson(aid), spec);\n }\n }\n\n const allAxesArr = Array.from(allAxes.values());\n // extend allowed columns - add columns thad doesn't have axes from block, but have all axes in 'allAxes' list (that means all axes from linkers or from 'hanging' of other selected columns)\n compatibleWithoutLabels = (columns.getUniversalEntries((spec) => suitableSpec(spec) && spec.axesSpec.every((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) => matchAxisId(getAxisId(selectorAxisSpec), axisId));\n }), { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? []).filter((column) => !isLabelColumn(column.spec));\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.getUniversalEntries((spec) => suitableSpec(spec) && spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) => matchAxisId(getAxisId(selectorAxisSpec), axisId));\n }), { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? []).filter((column) => isLabelColumn(column.spec));\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"],"names":["readAnnotationJson","Annotation","LinkerMap","getColumnIdAndSpec","getArrayFromAxisTree","getAxesTree","getAxisId","matchAxisId","canonicalizeJson","readAnnotation","stringifyJson","PColumnCollection","getNormalizedAxesList","isLinkerColumn","isLabelColumn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PFrameForGraphs.cjs","sources":["../../src/components/PFrameForGraphs.ts"],"sourcesContent":["import type {\n AxisId,\n AxisSpecNormalized,\n CanonicalizedJson,\n PColumn,\n PColumnSpec,\n PFrameHandle,\n PObjectId,\n} from '@milaboratories/pl-model-common';\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n getNormalizedAxesList,\n isLabelColumn,\n isLinkerColumn,\n LinkerMap,\n matchAxisId,\n readAnnotation,\n readAnnotationJson,\n stringifyJson,\n} from '@milaboratories/pl-model-common';\nimport type { PColumnDataUniversal, PColumnEntryUniversal, PColumnEntryWithLabel, RenderCtx } from '../render';\nimport { PColumnCollection } from '../render';\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\nexport function isHiddenFromGraphColumn(column: PColumnSpec): boolean {\n return !!readAnnotationJson(column, Annotation.HideDataFromGraphs);\n}\n\nexport function isHiddenFromUIColumn(column: PColumnSpec): boolean {\n return !!readAnnotationJson(column, Annotation.HideDataFromUi);\n}\n\ntype AxesVault = Map<CanonicalizedJson<AxisId>, AxisSpecNormalized>;\n\nexport function getAvailableWithLinkersAxes(\n linkerColumns: (PColumnEntryWithLabel | PColumnEntryUniversal)[],\n blockAxes: AxesVault,\n): AxesVault {\n const linkerMap = LinkerMap.fromColumns(linkerColumns.map(getColumnIdAndSpec));\n const availableAxes = linkerMap.getReachableByLinkersAxesFromAxesNormalized(\n [...blockAxes.values()],\n (linkerKeyId, sourceAxisId) => matchAxisId(sourceAxisId, linkerKeyId),\n );\n\n return new Map(availableAxes.map((axisSpec) => {\n const id = getAxisId(axisSpec);\n return [canonicalizeJson(id), axisSpec];\n }));\n}\n/** Add columns with fully compatible axes created from partial compatible ones */\nexport function enrichCompatible<T extends Omit<PColumn<PColumnDataUniversal>, 'data'>>(blockAxes: AxesVault, columns: T[]): T[] {\n return columns.flatMap((column) => getAdditionalColumnsForColumn(blockAxes, column));\n}\n\nfunction getAdditionalColumnsForColumn<T extends Omit<PColumn<PColumnDataUniversal>, 'data'>>(\n blockAxes: AxesVault,\n column: T,\n): T[] {\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 = readAnnotation(column.spec, Annotation.Label) ?? '';\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: Annotation = {\n ...column.spec.annotations,\n [Annotation.Graph.IsVirtual]: stringifyJson(true),\n };\n if (label || labelDomainPart) {\n annotations[Annotation.Label] = label && labelDomainPart ? label + ' / ' + labelDomainPart : label + labelDomainPart;\n }\n\n return {\n ...column,\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 };\n });\n\n return [column, ...additionalColumns];\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 const suitableSpec = (spec: PColumnSpec) => !isHiddenFromUIColumn(spec) && !isHiddenFromGraphColumn(spec);\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 const allColumns = columns.getUniversalEntries(suitableSpec, { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? [];\n\n const allAxes: AxesVault = new Map(allColumns\n .flatMap((column) => getNormalizedAxesList(column.spec.axesSpec))\n .map((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return [canonicalizeJson(axisId), axisSpec];\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 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: AxesVault = new Map();\n // axes from block columns and compatible result pool columns\n const allAxes: AxesVault = new Map();\n for (const c of blockColumns) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n blockAxes.set(canonicalizeJson(aid), spec);\n allAxes.set(canonicalizeJson(aid), spec);\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.getUniversalEntries((spec) => suitableSpec(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 const blockAxesArr = Array.from(blockAxes.values());\n // all compatible with block columns but without label columns\n let compatibleWithoutLabels = (columns.getUniversalEntries((spec) => suitableSpec(spec) && spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return blockAxesArr.some((selectorAxisSpec) => matchAxisId(getAxisId(selectorAxisSpec), axisId));\n }), { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? []).filter((column) => !isLabelColumn(column.spec));\n\n // extend axes set for label columns request\n for (const c of compatibleWithoutLabels) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n allAxes.set(canonicalizeJson(aid), spec);\n }\n }\n\n const allAxesArr = Array.from(allAxes.values());\n // extend allowed columns - add columns thad doesn't have axes from block, but have all axes in 'allAxes' list (that means all axes from linkers or from 'hanging' of other selected columns)\n compatibleWithoutLabels = (columns.getUniversalEntries((spec) => suitableSpec(spec) && spec.axesSpec.every((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) => matchAxisId(getAxisId(selectorAxisSpec), axisId));\n }), { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? []).filter((column) => !isLabelColumn(column.spec));\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.getUniversalEntries((spec) => suitableSpec(spec) && spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) => matchAxisId(getAxisId(selectorAxisSpec), axisId));\n }), { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? []).filter((column) => isLabelColumn(column.spec));\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"],"names":["readAnnotationJson","Annotation","LinkerMap","getColumnIdAndSpec","matchAxisId","getAxisId","canonicalizeJson","readAnnotation","stringifyJson","PColumnCollection","getNormalizedAxesList","isLinkerColumn","isLabelColumn"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PFrameForGraphs.d.ts","sourceRoot":"","sources":["../../src/components/PFrameForGraphs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,kBAAkB,EAClB,iBAAiB,EACjB,OAAO,EACP,WAAW,EACX,YAAY,EAEb,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"PFrameForGraphs.d.ts","sourceRoot":"","sources":["../../src/components/PFrameForGraphs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,kBAAkB,EAClB,iBAAiB,EACjB,OAAO,EACP,WAAW,EACX,YAAY,EAEb,MAAM,iCAAiC,CAAC;AAezC,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAiC/G,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAEpE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAEjE;AAED,KAAK,SAAS,GAAG,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC;AAEpE,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,CAAC,qBAAqB,GAAG,qBAAqB,CAAC,EAAE,EAChE,SAAS,EAAE,SAAS,GACnB,SAAS,CAWX;AACD,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAE/H;AAwFD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,CAAC,EACxC,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EACpB,YAAY,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,EAAE,GAC7C,YAAY,GAAG,SAAS,CAkF1B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { readAnnotationJson, Annotation, LinkerMap, getColumnIdAndSpec,
|
|
1
|
+
import { readAnnotationJson, Annotation, LinkerMap, getColumnIdAndSpec, matchAxisId, getAxisId, canonicalizeJson, getNormalizedAxesList, isLinkerColumn, isLabelColumn, readAnnotation, stringifyJson } from '@milaboratories/pl-model-common';
|
|
2
2
|
import 'canonicalize';
|
|
3
3
|
import { PColumnCollection } from '../render/util/column_collection.js';
|
|
4
4
|
import '../render/util/label.js';
|
|
@@ -39,16 +39,7 @@ function isHiddenFromUIColumn(column) {
|
|
|
39
39
|
}
|
|
40
40
|
function getAvailableWithLinkersAxes(linkerColumns, blockAxes) {
|
|
41
41
|
const linkerMap = LinkerMap.fromColumns(linkerColumns.map(getColumnIdAndSpec));
|
|
42
|
-
const
|
|
43
|
-
const blockAxesGrouped = [...blockAxes.values()].map((axis) => getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));
|
|
44
|
-
for (const axesGroupBlock of blockAxesGrouped) {
|
|
45
|
-
const matched = linkerMap.keyAxesIds.find((keyIds) => keyIds.every((keySourceAxis) => axesGroupBlock.find((axisSpecFromBlock) => matchAxisId(axisSpecFromBlock, keySourceAxis))));
|
|
46
|
-
if (matched) {
|
|
47
|
-
startKeys.push(canonicalizeJson(matched)); // linker column can contain fewer domains than in block's columns, it's fixed on next step in enrichCompatible
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
const availableKeys = linkerMap.searchAvailableAxesKeys(startKeys);
|
|
51
|
-
const availableAxes = linkerMap.getAxesListFromKeysList([...availableKeys]);
|
|
42
|
+
const availableAxes = linkerMap.getReachableByLinkersAxesFromAxesNormalized([...blockAxes.values()], (linkerKeyId, sourceAxisId) => matchAxisId(sourceAxisId, linkerKeyId));
|
|
52
43
|
return new Map(availableAxes.map((axisSpec) => {
|
|
53
44
|
const id = getAxisId(axisSpec);
|
|
54
45
|
return [canonicalizeJson(id), axisSpec];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PFrameForGraphs.js","sources":["../../src/components/PFrameForGraphs.ts"],"sourcesContent":["import type {\n AxisId,\n AxisSpecNormalized,\n CanonicalizedJson,\n PColumn,\n PColumnSpec,\n PFrameHandle,\n PObjectId,\n} from '@milaboratories/pl-model-common';\nimport {\n Annotation,\n canonicalizeJson,\n getArrayFromAxisTree,\n getAxesTree,\n getAxisId,\n getColumnIdAndSpec,\n getNormalizedAxesList,\n isLabelColumn,\n isLinkerColumn,\n LinkerMap,\n matchAxisId,\n readAnnotation,\n readAnnotationJson,\n stringifyJson,\n} from '@milaboratories/pl-model-common';\nimport type { PColumnDataUniversal, PColumnEntryUniversal, PColumnEntryWithLabel, RenderCtx } from '../render';\nimport { PColumnCollection } from '../render';\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\nexport function isHiddenFromGraphColumn(column: PColumnSpec): boolean {\n return !!readAnnotationJson(column, Annotation.HideDataFromGraphs);\n}\n\nexport function isHiddenFromUIColumn(column: PColumnSpec): boolean {\n return !!readAnnotationJson(column, Annotation.HideDataFromUi);\n}\n\ntype AxesVault = Map<CanonicalizedJson<AxisId>, AxisSpecNormalized>;\n\nexport function getAvailableWithLinkersAxes(\n linkerColumns: (PColumnEntryWithLabel | PColumnEntryUniversal)[],\n blockAxes: AxesVault,\n): AxesVault {\n const linkerMap = LinkerMap.fromColumns(linkerColumns.map(getColumnIdAndSpec));\n const startKeys: CanonicalizedJson<AxisId[]>[] = [];\n const blockAxesGrouped: AxisId[][] = [...blockAxes.values()].map((axis) => getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));\n\n for (const axesGroupBlock of blockAxesGrouped) {\n const matched = linkerMap.keyAxesIds.find(\n (keyIds: AxisId[]) => keyIds.every(\n (keySourceAxis) => axesGroupBlock.find((axisSpecFromBlock) => matchAxisId(axisSpecFromBlock, keySourceAxis)),\n ),\n );\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\n const availableKeys = linkerMap.searchAvailableAxesKeys(startKeys);\n const availableAxes = linkerMap.getAxesListFromKeysList([...availableKeys]);\n\n return new Map(availableAxes.map((axisSpec) => {\n const id = getAxisId(axisSpec);\n return [canonicalizeJson(id), axisSpec];\n }));\n}\n/** Add columns with fully compatible axes created from partial compatible ones */\nexport function enrichCompatible<T extends Omit<PColumn<PColumnDataUniversal>, 'data'>>(blockAxes: AxesVault, columns: T[]): T[] {\n return columns.flatMap((column) => getAdditionalColumnsForColumn(blockAxes, column));\n}\n\nfunction getAdditionalColumnsForColumn<T extends Omit<PColumn<PColumnDataUniversal>, 'data'>>(\n blockAxes: AxesVault,\n column: T,\n): T[] {\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 = readAnnotation(column.spec, Annotation.Label) ?? '';\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: Annotation = {\n ...column.spec.annotations,\n [Annotation.Graph.IsVirtual]: stringifyJson(true),\n };\n if (label || labelDomainPart) {\n annotations[Annotation.Label] = label && labelDomainPart ? label + ' / ' + labelDomainPart : label + labelDomainPart;\n }\n\n return {\n ...column,\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 };\n });\n\n return [column, ...additionalColumns];\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 const suitableSpec = (spec: PColumnSpec) => !isHiddenFromUIColumn(spec) && !isHiddenFromGraphColumn(spec);\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 const allColumns = columns.getUniversalEntries(suitableSpec, { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? [];\n\n const allAxes: AxesVault = new Map(allColumns\n .flatMap((column) => getNormalizedAxesList(column.spec.axesSpec))\n .map((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return [canonicalizeJson(axisId), axisSpec];\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 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: AxesVault = new Map();\n // axes from block columns and compatible result pool columns\n const allAxes: AxesVault = new Map();\n for (const c of blockColumns) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n blockAxes.set(canonicalizeJson(aid), spec);\n allAxes.set(canonicalizeJson(aid), spec);\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.getUniversalEntries((spec) => suitableSpec(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 const blockAxesArr = Array.from(blockAxes.values());\n // all compatible with block columns but without label columns\n let compatibleWithoutLabels = (columns.getUniversalEntries((spec) => suitableSpec(spec) && spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return blockAxesArr.some((selectorAxisSpec) => matchAxisId(getAxisId(selectorAxisSpec), axisId));\n }), { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? []).filter((column) => !isLabelColumn(column.spec));\n\n // extend axes set for label columns request\n for (const c of compatibleWithoutLabels) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n allAxes.set(canonicalizeJson(aid), spec);\n }\n }\n\n const allAxesArr = Array.from(allAxes.values());\n // extend allowed columns - add columns thad doesn't have axes from block, but have all axes in 'allAxes' list (that means all axes from linkers or from 'hanging' of other selected columns)\n compatibleWithoutLabels = (columns.getUniversalEntries((spec) => suitableSpec(spec) && spec.axesSpec.every((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) => matchAxisId(getAxisId(selectorAxisSpec), axisId));\n }), { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? []).filter((column) => !isLabelColumn(column.spec));\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.getUniversalEntries((spec) => suitableSpec(spec) && spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) => matchAxisId(getAxisId(selectorAxisSpec), axisId));\n }), { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? []).filter((column) => isLabelColumn(column.spec));\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"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PFrameForGraphs.js","sources":["../../src/components/PFrameForGraphs.ts"],"sourcesContent":["import type {\n AxisId,\n AxisSpecNormalized,\n CanonicalizedJson,\n PColumn,\n PColumnSpec,\n PFrameHandle,\n PObjectId,\n} from '@milaboratories/pl-model-common';\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n getNormalizedAxesList,\n isLabelColumn,\n isLinkerColumn,\n LinkerMap,\n matchAxisId,\n readAnnotation,\n readAnnotationJson,\n stringifyJson,\n} from '@milaboratories/pl-model-common';\nimport type { PColumnDataUniversal, PColumnEntryUniversal, PColumnEntryWithLabel, RenderCtx } from '../render';\nimport { PColumnCollection } from '../render';\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\nexport function isHiddenFromGraphColumn(column: PColumnSpec): boolean {\n return !!readAnnotationJson(column, Annotation.HideDataFromGraphs);\n}\n\nexport function isHiddenFromUIColumn(column: PColumnSpec): boolean {\n return !!readAnnotationJson(column, Annotation.HideDataFromUi);\n}\n\ntype AxesVault = Map<CanonicalizedJson<AxisId>, AxisSpecNormalized>;\n\nexport function getAvailableWithLinkersAxes(\n linkerColumns: (PColumnEntryWithLabel | PColumnEntryUniversal)[],\n blockAxes: AxesVault,\n): AxesVault {\n const linkerMap = LinkerMap.fromColumns(linkerColumns.map(getColumnIdAndSpec));\n const availableAxes = linkerMap.getReachableByLinkersAxesFromAxesNormalized(\n [...blockAxes.values()],\n (linkerKeyId, sourceAxisId) => matchAxisId(sourceAxisId, linkerKeyId),\n );\n\n return new Map(availableAxes.map((axisSpec) => {\n const id = getAxisId(axisSpec);\n return [canonicalizeJson(id), axisSpec];\n }));\n}\n/** Add columns with fully compatible axes created from partial compatible ones */\nexport function enrichCompatible<T extends Omit<PColumn<PColumnDataUniversal>, 'data'>>(blockAxes: AxesVault, columns: T[]): T[] {\n return columns.flatMap((column) => getAdditionalColumnsForColumn(blockAxes, column));\n}\n\nfunction getAdditionalColumnsForColumn<T extends Omit<PColumn<PColumnDataUniversal>, 'data'>>(\n blockAxes: AxesVault,\n column: T,\n): T[] {\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 = readAnnotation(column.spec, Annotation.Label) ?? '';\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: Annotation = {\n ...column.spec.annotations,\n [Annotation.Graph.IsVirtual]: stringifyJson(true),\n };\n if (label || labelDomainPart) {\n annotations[Annotation.Label] = label && labelDomainPart ? label + ' / ' + labelDomainPart : label + labelDomainPart;\n }\n\n return {\n ...column,\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 };\n });\n\n return [column, ...additionalColumns];\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 const suitableSpec = (spec: PColumnSpec) => !isHiddenFromUIColumn(spec) && !isHiddenFromGraphColumn(spec);\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 const allColumns = columns.getUniversalEntries(suitableSpec, { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? [];\n\n const allAxes: AxesVault = new Map(allColumns\n .flatMap((column) => getNormalizedAxesList(column.spec.axesSpec))\n .map((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return [canonicalizeJson(axisId), axisSpec];\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 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: AxesVault = new Map();\n // axes from block columns and compatible result pool columns\n const allAxes: AxesVault = new Map();\n for (const c of blockColumns) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n blockAxes.set(canonicalizeJson(aid), spec);\n allAxes.set(canonicalizeJson(aid), spec);\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.getUniversalEntries((spec) => suitableSpec(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 const blockAxesArr = Array.from(blockAxes.values());\n // all compatible with block columns but without label columns\n let compatibleWithoutLabels = (columns.getUniversalEntries((spec) => suitableSpec(spec) && spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return blockAxesArr.some((selectorAxisSpec) => matchAxisId(getAxisId(selectorAxisSpec), axisId));\n }), { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? []).filter((column) => !isLabelColumn(column.spec));\n\n // extend axes set for label columns request\n for (const c of compatibleWithoutLabels) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n allAxes.set(canonicalizeJson(aid), spec);\n }\n }\n\n const allAxesArr = Array.from(allAxes.values());\n // extend allowed columns - add columns thad doesn't have axes from block, but have all axes in 'allAxes' list (that means all axes from linkers or from 'hanging' of other selected columns)\n compatibleWithoutLabels = (columns.getUniversalEntries((spec) => suitableSpec(spec) && spec.axesSpec.every((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) => matchAxisId(getAxisId(selectorAxisSpec), axisId));\n }), { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? []).filter((column) => !isLabelColumn(column.spec));\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.getUniversalEntries((spec) => suitableSpec(spec) && spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) => matchAxisId(getAxisId(selectorAxisSpec), axisId));\n }), { dontWaitAllData: true, overrideLabelAnnotation: false }) ?? []).filter((column) => isLabelColumn(column.spec));\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"],"names":[],"mappings":"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"}
|
package/dist/package.json.cjs
CHANGED
package/dist/package.json.js
CHANGED
|
@@ -105,7 +105,7 @@ class PColumnCollection {
|
|
|
105
105
|
return undefined;
|
|
106
106
|
}
|
|
107
107
|
getUniversalEntries(predicateOrSelectors, opts) {
|
|
108
|
-
const { anchorCtx, labelOps: rawLabelOps, dontWaitAllData = false, overrideLabelAnnotation = false, exclude } = opts ?? {};
|
|
108
|
+
const { anchorCtx, labelOps: rawLabelOps, dontWaitAllData = false, overrideLabelAnnotation = false, exclude, enrichByLinkers = false } = opts ?? {};
|
|
109
109
|
const labelOps = {
|
|
110
110
|
...(overrideLabelAnnotation && rawLabelOps?.includeNativeLabel !== false ? { includeNativeLabel: true } : {}),
|
|
111
111
|
...(rawLabelOps ?? {}),
|
|
@@ -278,6 +278,29 @@ class PColumnCollection {
|
|
|
278
278
|
label: label,
|
|
279
279
|
});
|
|
280
280
|
}
|
|
281
|
+
const ids = new Set(result.map((entry) => entry.id));
|
|
282
|
+
if (enrichByLinkers && anchorCtx) {
|
|
283
|
+
const linkers = result.filter((entry) => plModelCommon.isLinkerColumn(entry.spec));
|
|
284
|
+
if (linkers.length === 0) {
|
|
285
|
+
return result;
|
|
286
|
+
}
|
|
287
|
+
const anchorAxes = Object.values(anchorCtx.anchors).flatMap((anchor) => anchor.axesSpec);
|
|
288
|
+
const linkerMap = plModelCommon.LinkerMap.fromColumns(linkers.map(plModelCommon.getColumnIdAndSpec));
|
|
289
|
+
// loose way of matching
|
|
290
|
+
function matchAxisIdFn(linkerKeyId, sourceAxisId) {
|
|
291
|
+
return plModelCommon.matchAxisId(linkerKeyId, sourceAxisId) || plModelCommon.matchAxisId(sourceAxisId, linkerKeyId);
|
|
292
|
+
}
|
|
293
|
+
// search all axes that can be reached by linkers from anchor axes; anchor axes are not in this list;
|
|
294
|
+
const availableByLinkersAxes = linkerMap.getReachableByLinkersAxesFromAxes(anchorAxes, matchAxisIdFn);
|
|
295
|
+
// search all columns that includes at least one of additional axes;
|
|
296
|
+
const availableByLinkersColumns = this.getUniversalEntries((spec) => !plModelCommon.isLinkerColumn(spec) && spec.axesSpec.some((columnAxisSpec) => {
|
|
297
|
+
const columnAxisId = plModelCommon.getAxisId(columnAxisSpec);
|
|
298
|
+
return availableByLinkersAxes.some((axis) => matchAxisIdFn(plModelCommon.getAxisId(axis), columnAxisId));
|
|
299
|
+
}), { anchorCtx, labelOps, dontWaitAllData, overrideLabelAnnotation, exclude });
|
|
300
|
+
if (availableByLinkersColumns) {
|
|
301
|
+
result.push(...availableByLinkersColumns.filter((entry) => !ids.has(entry.id)));
|
|
302
|
+
}
|
|
303
|
+
}
|
|
281
304
|
return result;
|
|
282
305
|
}
|
|
283
306
|
getColumns(predicateOrSelectors, opts) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"column_collection.cjs","sources":["../../../src/render/util/column_collection.ts"],"sourcesContent":["import type {\n AnchoredIdDeriver,\n AnchoredPColumnSelector,\n AxisFilterByIdx,\n AxisFilterValue,\n AxisId,\n NativePObjectId,\n PartitionedDataInfoEntries,\n PColumn,\n PColumnLazy,\n PColumnSelector,\n PColumnSpec,\n PColumnValues,\n PObjectId,\n ResolveAnchorsOptions,\n SUniversalPColumnId,\n} from '@milaboratories/pl-model-common';\nimport {\n Annotation,\n canonicalizeAxisId,\n deriveNativeId,\n entriesToDataInfo,\n getAxisId,\n isPartitionedDataInfoEntries,\n isPColumnSpec,\n resolveAnchors,\n selectorsToPredicate,\n} from '@milaboratories/pl-model-common';\nimport canonicalize from 'canonicalize';\nimport type { Optional } from 'utility-types';\nimport type { TreeNodeAccessor } from '../accessor';\nimport type { PColumnDataUniversal } from '../api';\nimport { filterDataInfoEntries } from './axis_filtering';\nimport type { LabelDerivationOps, TraceEntry } from './label';\nimport { deriveLabels } from './label';\nimport { convertOrParsePColumnData, getUniquePartitionKeys } from './pcolumn_data';\nimport type { APColumnSelectorWithSplit, PColumnSelectorWithSplit } from './split_selectors';\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\n/** Lazy calculates the data, returns undefined if data is not ready. */\nexport type PColumnLazyWithLabel<T> = PColumnLazy<T> & {\n label: string;\n};\n\n/** Universal column is a column that uses a universal column id, and always have label. */\nexport type PColumnLazyUniversal<T> = PColumnLazyWithLabel<T> & {\n id: SUniversalPColumnId;\n};\n\n/** @deprecated Use PColumnLazyWithLabel instead. */\nexport type PColumnEntryWithLabel = PColumnLazy<undefined | PColumnDataUniversal> & {\n label: string;\n};\n\n/** @deprecated Use PColumnLazyUniversal instead. */\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 [Annotation.Label]: label,\n } satisfies Annotation,\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"],"names":["selectorsToPredicate","canonicalizeAxisId","resolveAnchors","deriveNativeId","isPColumnSpec","convertOrParsePColumnData","isPartitionedDataInfoEntries","getUniquePartitionKeys","getAxisId","deriveLabels","Annotation","entriesToDataInfo","filterDataInfoEntries"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"column_collection.cjs","sources":["../../../src/render/util/column_collection.ts"],"sourcesContent":["import type {\n AnchoredIdDeriver,\n AnchoredPColumnSelector,\n AxisFilterByIdx,\n AxisFilterValue,\n AxisId,\n NativePObjectId,\n PartitionedDataInfoEntries,\n PColumn,\n PColumnLazy,\n PColumnSelector,\n PColumnSpec,\n PColumnValues,\n PObjectId,\n ResolveAnchorsOptions,\n SUniversalPColumnId,\n} from '@milaboratories/pl-model-common';\nimport {\n Annotation,\n canonicalizeAxisId,\n deriveNativeId,\n entriesToDataInfo,\n getAxisId,\n getColumnIdAndSpec,\n isLinkerColumn,\n isPartitionedDataInfoEntries,\n isPColumnSpec,\n LinkerMap,\n matchAxisId,\n resolveAnchors,\n selectorsToPredicate,\n} from '@milaboratories/pl-model-common';\nimport canonicalize from 'canonicalize';\nimport type { Optional } from 'utility-types';\nimport type { TreeNodeAccessor } from '../accessor';\nimport type { PColumnDataUniversal } from '../api';\nimport { filterDataInfoEntries } from './axis_filtering';\nimport type { LabelDerivationOps, TraceEntry } from './label';\nimport { deriveLabels } from './label';\nimport { convertOrParsePColumnData, getUniquePartitionKeys } from './pcolumn_data';\nimport type { APColumnSelectorWithSplit, PColumnSelectorWithSplit } from './split_selectors';\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\n/** Lazy calculates the data, returns undefined if data is not ready. */\nexport type PColumnLazyWithLabel<T> = PColumnLazy<T> & {\n label: string;\n};\n\n/** Universal column is a column that uses a universal column id, and always have label. */\nexport type PColumnLazyUniversal<T> = PColumnLazyWithLabel<T> & {\n id: SUniversalPColumnId;\n};\n\n/** @deprecated Use PColumnLazyWithLabel instead. */\nexport type PColumnEntryWithLabel = PColumnLazy<undefined | PColumnDataUniversal> & {\n label: string;\n};\n\n/** @deprecated Use PColumnLazyUniversal instead. */\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 /** If true, resulting columns will be enriched by other columns considering linker columns. Default is false. */\n enrichByLinkers?: 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, enrichByLinkers = false } = 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 [Annotation.Label]: label,\n } satisfies Annotation,\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 const ids = new Set(result.map((entry) => entry.id));\n\n if (enrichByLinkers && anchorCtx) {\n const linkers = result.filter((entry) => isLinkerColumn(entry.spec));\n if (linkers.length === 0) {\n return result;\n };\n\n const anchorAxes = Object.values(anchorCtx.anchors).flatMap((anchor) => anchor.axesSpec);\n const linkerMap = LinkerMap.fromColumns(linkers.map(getColumnIdAndSpec));\n\n // loose way of matching\n function matchAxisIdFn(linkerKeyId: AxisId, sourceAxisId: AxisId): boolean {\n return matchAxisId(linkerKeyId, sourceAxisId) || matchAxisId(sourceAxisId, linkerKeyId);\n }\n // search all axes that can be reached by linkers from anchor axes; anchor axes are not in this list;\n const availableByLinkersAxes = linkerMap.getReachableByLinkersAxesFromAxes(anchorAxes, matchAxisIdFn);\n\n // search all columns that includes at least one of additional axes;\n const availableByLinkersColumns = this.getUniversalEntries(\n (spec) => !isLinkerColumn(spec) && spec.axesSpec.some((columnAxisSpec) => {\n const columnAxisId = getAxisId(columnAxisSpec);\n return availableByLinkersAxes.some((axis) => matchAxisIdFn(getAxisId(axis), columnAxisId));\n }),\n { anchorCtx, labelOps, dontWaitAllData, overrideLabelAnnotation, exclude },\n );\n if (availableByLinkersColumns) {\n result.push(...availableByLinkersColumns.filter((entry) => !ids.has(entry.id)));\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"],"names":["selectorsToPredicate","canonicalizeAxisId","resolveAnchors","deriveNativeId","isPColumnSpec","convertOrParsePColumnData","isPartitionedDataInfoEntries","getUniquePartitionKeys","getAxisId","deriveLabels","Annotation","entriesToDataInfo","filterDataInfoEntries","isLinkerColumn","LinkerMap","getColumnIdAndSpec","matchAxisId"],"mappings":"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"}
|
|
@@ -37,6 +37,8 @@ type UniversalPColumnOptsNoDeriver = {
|
|
|
37
37
|
* Default value in getUniversalEntries is false, in getColumns it is true.
|
|
38
38
|
*/
|
|
39
39
|
overrideLabelAnnotation?: boolean;
|
|
40
|
+
/** If true, resulting columns will be enriched by other columns considering linker columns. Default is false. */
|
|
41
|
+
enrichByLinkers?: boolean;
|
|
40
42
|
};
|
|
41
43
|
type UniversalPColumnOpts = UniversalPColumnOptsNoDeriver & {
|
|
42
44
|
anchorCtx: AnchoredIdDeriver;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"column_collection.d.ts","sourceRoot":"","sources":["../../../src/render/util/column_collection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,uBAAuB,EAGvB,MAAM,EAGN,OAAO,EACP,WAAW,EACX,eAAe,EACf,WAAW,EAGX,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"column_collection.d.ts","sourceRoot":"","sources":["../../../src/render/util/column_collection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { selectorsToPredicate, resolveAnchors, deriveNativeId, isPColumnSpec, isPartitionedDataInfoEntries, getAxisId, Annotation, entriesToDataInfo, canonicalizeAxisId } from '@milaboratories/pl-model-common';
|
|
1
|
+
import { selectorsToPredicate, resolveAnchors, deriveNativeId, isPColumnSpec, isPartitionedDataInfoEntries, getAxisId, Annotation, entriesToDataInfo, isLinkerColumn, LinkerMap, getColumnIdAndSpec, matchAxisId, canonicalizeAxisId } from '@milaboratories/pl-model-common';
|
|
2
2
|
import canonicalize from 'canonicalize';
|
|
3
3
|
import { filterDataInfoEntries } from './axis_filtering.js';
|
|
4
4
|
import { deriveLabels } from './label.js';
|
|
@@ -103,7 +103,7 @@ class PColumnCollection {
|
|
|
103
103
|
return undefined;
|
|
104
104
|
}
|
|
105
105
|
getUniversalEntries(predicateOrSelectors, opts) {
|
|
106
|
-
const { anchorCtx, labelOps: rawLabelOps, dontWaitAllData = false, overrideLabelAnnotation = false, exclude } = opts ?? {};
|
|
106
|
+
const { anchorCtx, labelOps: rawLabelOps, dontWaitAllData = false, overrideLabelAnnotation = false, exclude, enrichByLinkers = false } = opts ?? {};
|
|
107
107
|
const labelOps = {
|
|
108
108
|
...(overrideLabelAnnotation && rawLabelOps?.includeNativeLabel !== false ? { includeNativeLabel: true } : {}),
|
|
109
109
|
...(rawLabelOps ?? {}),
|
|
@@ -276,6 +276,29 @@ class PColumnCollection {
|
|
|
276
276
|
label: label,
|
|
277
277
|
});
|
|
278
278
|
}
|
|
279
|
+
const ids = new Set(result.map((entry) => entry.id));
|
|
280
|
+
if (enrichByLinkers && anchorCtx) {
|
|
281
|
+
const linkers = result.filter((entry) => isLinkerColumn(entry.spec));
|
|
282
|
+
if (linkers.length === 0) {
|
|
283
|
+
return result;
|
|
284
|
+
}
|
|
285
|
+
const anchorAxes = Object.values(anchorCtx.anchors).flatMap((anchor) => anchor.axesSpec);
|
|
286
|
+
const linkerMap = LinkerMap.fromColumns(linkers.map(getColumnIdAndSpec));
|
|
287
|
+
// loose way of matching
|
|
288
|
+
function matchAxisIdFn(linkerKeyId, sourceAxisId) {
|
|
289
|
+
return matchAxisId(linkerKeyId, sourceAxisId) || matchAxisId(sourceAxisId, linkerKeyId);
|
|
290
|
+
}
|
|
291
|
+
// search all axes that can be reached by linkers from anchor axes; anchor axes are not in this list;
|
|
292
|
+
const availableByLinkersAxes = linkerMap.getReachableByLinkersAxesFromAxes(anchorAxes, matchAxisIdFn);
|
|
293
|
+
// search all columns that includes at least one of additional axes;
|
|
294
|
+
const availableByLinkersColumns = this.getUniversalEntries((spec) => !isLinkerColumn(spec) && spec.axesSpec.some((columnAxisSpec) => {
|
|
295
|
+
const columnAxisId = getAxisId(columnAxisSpec);
|
|
296
|
+
return availableByLinkersAxes.some((axis) => matchAxisIdFn(getAxisId(axis), columnAxisId));
|
|
297
|
+
}), { anchorCtx, labelOps, dontWaitAllData, overrideLabelAnnotation, exclude });
|
|
298
|
+
if (availableByLinkersColumns) {
|
|
299
|
+
result.push(...availableByLinkersColumns.filter((entry) => !ids.has(entry.id)));
|
|
300
|
+
}
|
|
301
|
+
}
|
|
279
302
|
return result;
|
|
280
303
|
}
|
|
281
304
|
getColumns(predicateOrSelectors, opts) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"column_collection.js","sources":["../../../src/render/util/column_collection.ts"],"sourcesContent":["import type {\n AnchoredIdDeriver,\n AnchoredPColumnSelector,\n AxisFilterByIdx,\n AxisFilterValue,\n AxisId,\n NativePObjectId,\n PartitionedDataInfoEntries,\n PColumn,\n PColumnLazy,\n PColumnSelector,\n PColumnSpec,\n PColumnValues,\n PObjectId,\n ResolveAnchorsOptions,\n SUniversalPColumnId,\n} from '@milaboratories/pl-model-common';\nimport {\n Annotation,\n canonicalizeAxisId,\n deriveNativeId,\n entriesToDataInfo,\n getAxisId,\n isPartitionedDataInfoEntries,\n isPColumnSpec,\n resolveAnchors,\n selectorsToPredicate,\n} from '@milaboratories/pl-model-common';\nimport canonicalize from 'canonicalize';\nimport type { Optional } from 'utility-types';\nimport type { TreeNodeAccessor } from '../accessor';\nimport type { PColumnDataUniversal } from '../api';\nimport { filterDataInfoEntries } from './axis_filtering';\nimport type { LabelDerivationOps, TraceEntry } from './label';\nimport { deriveLabels } from './label';\nimport { convertOrParsePColumnData, getUniquePartitionKeys } from './pcolumn_data';\nimport type { APColumnSelectorWithSplit, PColumnSelectorWithSplit } from './split_selectors';\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\n/** Lazy calculates the data, returns undefined if data is not ready. */\nexport type PColumnLazyWithLabel<T> = PColumnLazy<T> & {\n label: string;\n};\n\n/** Universal column is a column that uses a universal column id, and always have label. */\nexport type PColumnLazyUniversal<T> = PColumnLazyWithLabel<T> & {\n id: SUniversalPColumnId;\n};\n\n/** @deprecated Use PColumnLazyWithLabel instead. */\nexport type PColumnEntryWithLabel = PColumnLazy<undefined | PColumnDataUniversal> & {\n label: string;\n};\n\n/** @deprecated Use PColumnLazyUniversal instead. */\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 [Annotation.Label]: label,\n } satisfies Annotation,\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"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"column_collection.js","sources":["../../../src/render/util/column_collection.ts"],"sourcesContent":["import type {\n AnchoredIdDeriver,\n AnchoredPColumnSelector,\n AxisFilterByIdx,\n AxisFilterValue,\n AxisId,\n NativePObjectId,\n PartitionedDataInfoEntries,\n PColumn,\n PColumnLazy,\n PColumnSelector,\n PColumnSpec,\n PColumnValues,\n PObjectId,\n ResolveAnchorsOptions,\n SUniversalPColumnId,\n} from '@milaboratories/pl-model-common';\nimport {\n Annotation,\n canonicalizeAxisId,\n deriveNativeId,\n entriesToDataInfo,\n getAxisId,\n getColumnIdAndSpec,\n isLinkerColumn,\n isPartitionedDataInfoEntries,\n isPColumnSpec,\n LinkerMap,\n matchAxisId,\n resolveAnchors,\n selectorsToPredicate,\n} from '@milaboratories/pl-model-common';\nimport canonicalize from 'canonicalize';\nimport type { Optional } from 'utility-types';\nimport type { TreeNodeAccessor } from '../accessor';\nimport type { PColumnDataUniversal } from '../api';\nimport { filterDataInfoEntries } from './axis_filtering';\nimport type { LabelDerivationOps, TraceEntry } from './label';\nimport { deriveLabels } from './label';\nimport { convertOrParsePColumnData, getUniquePartitionKeys } from './pcolumn_data';\nimport type { APColumnSelectorWithSplit, PColumnSelectorWithSplit } from './split_selectors';\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\n/** Lazy calculates the data, returns undefined if data is not ready. */\nexport type PColumnLazyWithLabel<T> = PColumnLazy<T> & {\n label: string;\n};\n\n/** Universal column is a column that uses a universal column id, and always have label. */\nexport type PColumnLazyUniversal<T> = PColumnLazyWithLabel<T> & {\n id: SUniversalPColumnId;\n};\n\n/** @deprecated Use PColumnLazyWithLabel instead. */\nexport type PColumnEntryWithLabel = PColumnLazy<undefined | PColumnDataUniversal> & {\n label: string;\n};\n\n/** @deprecated Use PColumnLazyUniversal instead. */\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 /** If true, resulting columns will be enriched by other columns considering linker columns. Default is false. */\n enrichByLinkers?: 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, enrichByLinkers = false } = 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 [Annotation.Label]: label,\n } satisfies Annotation,\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 const ids = new Set(result.map((entry) => entry.id));\n\n if (enrichByLinkers && anchorCtx) {\n const linkers = result.filter((entry) => isLinkerColumn(entry.spec));\n if (linkers.length === 0) {\n return result;\n };\n\n const anchorAxes = Object.values(anchorCtx.anchors).flatMap((anchor) => anchor.axesSpec);\n const linkerMap = LinkerMap.fromColumns(linkers.map(getColumnIdAndSpec));\n\n // loose way of matching\n function matchAxisIdFn(linkerKeyId: AxisId, sourceAxisId: AxisId): boolean {\n return matchAxisId(linkerKeyId, sourceAxisId) || matchAxisId(sourceAxisId, linkerKeyId);\n }\n // search all axes that can be reached by linkers from anchor axes; anchor axes are not in this list;\n const availableByLinkersAxes = linkerMap.getReachableByLinkersAxesFromAxes(anchorAxes, matchAxisIdFn);\n\n // search all columns that includes at least one of additional axes;\n const availableByLinkersColumns = this.getUniversalEntries(\n (spec) => !isLinkerColumn(spec) && spec.axesSpec.some((columnAxisSpec) => {\n const columnAxisId = getAxisId(columnAxisSpec);\n return availableByLinkersAxes.some((axis) => matchAxisIdFn(getAxisId(axis), columnAxisId));\n }),\n { anchorCtx, labelOps, dontWaitAllData, overrideLabelAnnotation, exclude },\n );\n if (availableByLinkersColumns) {\n result.push(...availableByLinkersColumns.filter((entry) => !ids.has(entry.id)));\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"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@platforma-sdk/model",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.48.2",
|
|
4
4
|
"description": "Platforma.bio SDK / Block Model",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -23,19 +23,19 @@
|
|
|
23
23
|
"canonicalize": "~2.1.0",
|
|
24
24
|
"es-toolkit": "^1.39.10",
|
|
25
25
|
"zod": "~3.23.8",
|
|
26
|
-
"@milaboratories/ptabler-expression-js": "1.1.
|
|
26
|
+
"@milaboratories/ptabler-expression-js": "1.1.7",
|
|
27
27
|
"@milaboratories/pl-error-like": "1.12.5",
|
|
28
|
-
"@milaboratories/pl-model-common": "1.21.
|
|
28
|
+
"@milaboratories/pl-model-common": "1.21.10"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"typescript": "~5.6.3",
|
|
32
32
|
"vitest": "^4.0.7",
|
|
33
33
|
"fast-json-patch": "^3.1.1",
|
|
34
|
-
"@milaboratories/build-configs": "1.0
|
|
35
|
-
"@
|
|
34
|
+
"@milaboratories/build-configs": "1.2.0",
|
|
35
|
+
"@milaboratories/ts-configs": "1.2.0",
|
|
36
|
+
"@platforma-sdk/eslint-config": "1.2.0",
|
|
36
37
|
"@milaboratories/helpers": "1.12.0",
|
|
37
|
-
"@milaboratories/ts-builder": "1.0
|
|
38
|
-
"@milaboratories/ts-configs": "1.0.6"
|
|
38
|
+
"@milaboratories/ts-builder": "1.2.0"
|
|
39
39
|
},
|
|
40
40
|
"scripts": {
|
|
41
41
|
"type-check": "ts-builder types --target node",
|
|
@@ -10,8 +10,6 @@ import type {
|
|
|
10
10
|
import {
|
|
11
11
|
Annotation,
|
|
12
12
|
canonicalizeJson,
|
|
13
|
-
getArrayFromAxisTree,
|
|
14
|
-
getAxesTree,
|
|
15
13
|
getAxisId,
|
|
16
14
|
getColumnIdAndSpec,
|
|
17
15
|
getNormalizedAxesList,
|
|
@@ -71,22 +69,10 @@ export function getAvailableWithLinkersAxes(
|
|
|
71
69
|
blockAxes: AxesVault,
|
|
72
70
|
): AxesVault {
|
|
73
71
|
const linkerMap = LinkerMap.fromColumns(linkerColumns.map(getColumnIdAndSpec));
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
const matched = linkerMap.keyAxesIds.find(
|
|
79
|
-
(keyIds: AxisId[]) => keyIds.every(
|
|
80
|
-
(keySourceAxis) => axesGroupBlock.find((axisSpecFromBlock) => matchAxisId(axisSpecFromBlock, keySourceAxis)),
|
|
81
|
-
),
|
|
82
|
-
);
|
|
83
|
-
if (matched) {
|
|
84
|
-
startKeys.push(canonicalizeJson(matched)); // linker column can contain fewer domains than in block's columns, it's fixed on next step in enrichCompatible
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const availableKeys = linkerMap.searchAvailableAxesKeys(startKeys);
|
|
89
|
-
const availableAxes = linkerMap.getAxesListFromKeysList([...availableKeys]);
|
|
72
|
+
const availableAxes = linkerMap.getReachableByLinkersAxesFromAxesNormalized(
|
|
73
|
+
[...blockAxes.values()],
|
|
74
|
+
(linkerKeyId, sourceAxisId) => matchAxisId(sourceAxisId, linkerKeyId),
|
|
75
|
+
);
|
|
90
76
|
|
|
91
77
|
return new Map(availableAxes.map((axisSpec) => {
|
|
92
78
|
const id = getAxisId(axisSpec);
|
|
@@ -21,8 +21,12 @@ import {
|
|
|
21
21
|
deriveNativeId,
|
|
22
22
|
entriesToDataInfo,
|
|
23
23
|
getAxisId,
|
|
24
|
+
getColumnIdAndSpec,
|
|
25
|
+
isLinkerColumn,
|
|
24
26
|
isPartitionedDataInfoEntries,
|
|
25
27
|
isPColumnSpec,
|
|
28
|
+
LinkerMap,
|
|
29
|
+
matchAxisId,
|
|
26
30
|
resolveAnchors,
|
|
27
31
|
selectorsToPredicate,
|
|
28
32
|
} from '@milaboratories/pl-model-common';
|
|
@@ -179,6 +183,8 @@ type UniversalPColumnOptsNoDeriver = {
|
|
|
179
183
|
* Default value in getUniversalEntries is false, in getColumns it is true.
|
|
180
184
|
*/
|
|
181
185
|
overrideLabelAnnotation?: boolean;
|
|
186
|
+
/** If true, resulting columns will be enriched by other columns considering linker columns. Default is false. */
|
|
187
|
+
enrichByLinkers?: boolean;
|
|
182
188
|
};
|
|
183
189
|
|
|
184
190
|
type UniversalPColumnOpts = UniversalPColumnOptsNoDeriver & {
|
|
@@ -231,7 +237,7 @@ export class PColumnCollection {
|
|
|
231
237
|
public getUniversalEntries(
|
|
232
238
|
predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | APColumnSelectorWithSplit[],
|
|
233
239
|
opts?: Optional<UniversalPColumnOpts, 'anchorCtx'>): (PColumnEntryWithLabel | PColumnEntryUniversal)[] | undefined {
|
|
234
|
-
const { anchorCtx, labelOps: rawLabelOps, dontWaitAllData = false, overrideLabelAnnotation = false, exclude } = opts ?? {};
|
|
240
|
+
const { anchorCtx, labelOps: rawLabelOps, dontWaitAllData = false, overrideLabelAnnotation = false, exclude, enrichByLinkers = false } = opts ?? {};
|
|
235
241
|
|
|
236
242
|
const labelOps: LabelDerivationOps = {
|
|
237
243
|
...(overrideLabelAnnotation && rawLabelOps?.includeNativeLabel !== false ? { includeNativeLabel: true } : {}),
|
|
@@ -431,6 +437,37 @@ export class PColumnCollection {
|
|
|
431
437
|
});
|
|
432
438
|
}
|
|
433
439
|
|
|
440
|
+
const ids = new Set(result.map((entry) => entry.id));
|
|
441
|
+
|
|
442
|
+
if (enrichByLinkers && anchorCtx) {
|
|
443
|
+
const linkers = result.filter((entry) => isLinkerColumn(entry.spec));
|
|
444
|
+
if (linkers.length === 0) {
|
|
445
|
+
return result;
|
|
446
|
+
};
|
|
447
|
+
|
|
448
|
+
const anchorAxes = Object.values(anchorCtx.anchors).flatMap((anchor) => anchor.axesSpec);
|
|
449
|
+
const linkerMap = LinkerMap.fromColumns(linkers.map(getColumnIdAndSpec));
|
|
450
|
+
|
|
451
|
+
// loose way of matching
|
|
452
|
+
function matchAxisIdFn(linkerKeyId: AxisId, sourceAxisId: AxisId): boolean {
|
|
453
|
+
return matchAxisId(linkerKeyId, sourceAxisId) || matchAxisId(sourceAxisId, linkerKeyId);
|
|
454
|
+
}
|
|
455
|
+
// search all axes that can be reached by linkers from anchor axes; anchor axes are not in this list;
|
|
456
|
+
const availableByLinkersAxes = linkerMap.getReachableByLinkersAxesFromAxes(anchorAxes, matchAxisIdFn);
|
|
457
|
+
|
|
458
|
+
// search all columns that includes at least one of additional axes;
|
|
459
|
+
const availableByLinkersColumns = this.getUniversalEntries(
|
|
460
|
+
(spec) => !isLinkerColumn(spec) && spec.axesSpec.some((columnAxisSpec) => {
|
|
461
|
+
const columnAxisId = getAxisId(columnAxisSpec);
|
|
462
|
+
return availableByLinkersAxes.some((axis) => matchAxisIdFn(getAxisId(axis), columnAxisId));
|
|
463
|
+
}),
|
|
464
|
+
{ anchorCtx, labelOps, dontWaitAllData, overrideLabelAnnotation, exclude },
|
|
465
|
+
);
|
|
466
|
+
if (availableByLinkersColumns) {
|
|
467
|
+
result.push(...availableByLinkersColumns.filter((entry) => !ids.has(entry.id)));
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
434
471
|
return result;
|
|
435
472
|
}
|
|
436
473
|
|