@milaboratories/graph-maker 1.1.135 → 1.1.137
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/GraphMaker/constantsCommon.d.ts +2 -0
- package/dist/GraphMaker/constantsCommon.d.ts.map +1 -1
- package/dist/GraphMaker/constantsCommon.js +19 -17
- package/dist/GraphMaker/constantsCommon.js.map +1 -1
- package/dist/GraphMaker/forms/AxesSettingsForm/HeatmapAxesSettingsForm.vue.d.ts.map +1 -1
- package/dist/GraphMaker/forms/AxesSettingsForm/HeatmapAxesSettingsForm.vue.js +144 -122
- package/dist/GraphMaker/forms/AxesSettingsForm/HeatmapAxesSettingsForm.vue.js.map +1 -1
- package/dist/GraphMaker/index.vue.js +72 -72
- package/dist/GraphMaker/index.vue.js.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/getAxesDataFromForms.d.ts.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/getAxesDataFromForms.js +9 -9
- package/dist/GraphMaker/utils/createChartSettingsForRender/getAxesDataFromForms.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/ChartRenderer.js +246 -228
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/ChartRenderer.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/Captions/GroupCaptions.js +46 -37
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/Captions/GroupCaptions.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/Chart.js +63 -61
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/Chart.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/ChartsGroup.js +4 -4
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/Dendrograms.js +57 -51
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/Dendrograms.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/getDendrograms.js +33 -33
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/getDendrograms.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/index.js +20 -20
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/utils/calculateCaptionTails.js +89 -54
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/utils/calculateCaptionTails.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/utils/calculateChartSideElementSizes.js +19 -19
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/utils/calculateChartSideElementSizes.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/ChartRenderer.js +181 -168
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/ChartRenderer.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartsGroup.js +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartsGroup.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/index.js +5 -5
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/components/Lasso.js +144 -120
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/components/Lasso.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/components/LowerSVG.js +35 -35
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/components/LowerSVG.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/index.js +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/index.js.map +1 -1
- package/dist/node_modules/@milaboratories/pf-plots/dist/index.js +235 -242
- package/dist/node_modules/@milaboratories/pf-plots/dist/index.js.map +1 -1
- package/dist/node_modules/@milaboratories/pl-model-common/dist/index.js +218 -163
- package/dist/node_modules/@milaboratories/pl-model-common/dist/index.js.map +1 -1
- package/dist/node_modules/@platforma-sdk/model/dist/index.js +89 -80
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../node_modules/@milaboratories/pf-plots/src/constants.ts","../../../../../node_modules/@milaboratories/pf-plots/src/spec.ts","../../../../../node_modules/@milaboratories/pf-plots/src/compositeLinkers.ts","../../../../../node_modules/@milaboratories/pf-plots/src/utils.ts","../../../../../node_modules/@milaboratories/pf-plots/src/controllers/ControllerBase.ts","../../../../../node_modules/@milaboratories/pf-plots/src/controllers/ComponentController.ts","../../../../../node_modules/@milaboratories/pf-plots/src/controllers/controllersByChartType/bubble.ts","../../../../../node_modules/@milaboratories/pf-plots/src/controllers/controllersByChartType/histogram.ts","../../../../../node_modules/@milaboratories/pf-plots/src/controllers/controllersByChartType/discrete.ts","../../../../../node_modules/@milaboratories/pf-plots/src/controllers/controllersByChartType/heatmap.ts","../../../../../node_modules/@milaboratories/pf-plots/src/controllers/controllersByChartType/scatterplot.ts","../../../../../node_modules/@milaboratories/pf-plots/src/controllers/controllersByChartType/scatterplot-umap.ts","../../../../../node_modules/@milaboratories/pf-plots/src/controllers/controllersByChartType/dendro.ts","../../../../../node_modules/@milaboratories/pf-plots/src/pframe/ColumnsProvider.ts","../../../../../node_modules/@milaboratories/pf-plots/src/demoStore.ts","../../../../../node_modules/@milaboratories/pf-plots/src/index.ts"],"sourcesContent":["export const AXIS_NATURE_KEY = 'pl7.app/axisNature';\nexport const COLUMN_LABEL_KEY = 'pl7.app/label';\n\nexport const COLUMN_NAME_KEY = 'pl7.app/columnAsAxis/name';\nexport const COLUMN_DOMAIN_KEY = 'pl7.app/columnAsAxis/domain';\nexport const SUBSET_FILTER_KEY = 'pl7.app/isSubset';\nexport const DISCRETE_FILTER_KEY = 'pl7.app/isDiscreteFilter';\nexport const DISCRETE_VALUES_KEY = 'pl7.app/discreteValues';\nexport const MIN_VALUE_KEY = 'pl7.app/min';\nexport const MAX_VALUE_KEY = 'pl7.app/max';\n\nexport const HIGH_CARDINALITY = 'pl7.app/graph/axis/highCardinality';\nexport const IS_VIRTUAL_COLUMN = 'pl7.app/graph/isVirtual'; // duplicate of metadata-column enriched domain keys for compatibility with other column\nexport const IS_LINKER_COLUMN = 'pl7.app/isLinkerColumn';\n","import canonicalize from 'canonicalize';\nimport type {\n AxisSpec,\n AxisId as PFrameAxisId,\n ValueType,\n} from '@milaboratories/pl-model-common';\n\ninterface ToCanonicalString {\n toCanonicalString(): ColumnOrAxisIdString;\n}\n\ninterface AxisIdProps {\n type: ValueType;\n name: string;\n domain?: Record<string, string>;\n}\n\ninterface AxisIdPojo {\n kind: 'axis';\n type: ValueType;\n name: string;\n domain?: Record<string, string>;\n}\n\nexport class AxisId implements ToCanonicalString {\n kind = 'axis';\n type: ValueType;\n name: string;\n domain?: Record<string, string>;\n\n constructor({type, name, domain}: AxisIdProps) {\n this.type = type;\n this.name = name;\n this.domain = {...domain};\n }\n\n toCanonicalString(): ColumnOrAxisIdString {\n return canonicalize(this)!;\n }\n\n static fromAxisSpec(axisSpec: AxisSpec) {\n return new AxisId({name: axisSpec.name, type: axisSpec.type, domain: axisSpec.domain});\n }\n\n static fromAxesSpec(axesSpec: AxisSpec[]): AxisId[] {\n return axesSpec.map(axis => AxisId.fromAxisSpec(axis));\n }\n\n copy(): AxisId {\n return new AxisId({type: this.type, name: this.name, domain: this.domain});\n }\n\n toPFrameId():PFrameAxisId {\n return {\n type: this.type,\n name: this.name,\n domain: this.domain\n };\n }\n\n static fromPojo(values: AxisIdPojo) {\n return new AxisId(values);\n }\n}\n\ninterface ColumnIdProps {\n name: string;\n type: ValueType;\n}\n\ninterface ColumnIdPojo {\n kind: 'column';\n name: string;\n type: ValueType;\n}\n\nexport class ColumnId implements ToCanonicalString {\n kind = 'column';\n name: string;\n type: ValueType;\n\n constructor({name, type}: ColumnIdProps) {\n this.name = name;\n this.type = type;\n }\n\n toCanonicalString(): ColumnOrAxisIdString {\n return canonicalize(this)!;\n }\n\n static fromPojo(pojo: ColumnIdPojo) {\n return new ColumnId(pojo);\n }\n}\n\nexport function isColumnId(id: ColumnId | AxisId | null): id is ColumnId {\n return id !== null && id.kind === 'column';\n}\n\nexport function isAxisId(id: ColumnId | AxisId | null): id is AxisId {\n return id !== null && id.kind === 'axis';\n}\n\nexport type ColumnOrAxisIdString = string;\n\nexport function columnOrAxisIdFromString(str: ColumnOrAxisIdString) {\n const pojo: ColumnIdPojo | AxisIdPojo = JSON.parse(str);\n if (pojo.kind === 'column') {\n return ColumnId.fromPojo(pojo);\n }\n if (pojo.kind === 'axis') {\n return AxisId.fromPojo(pojo);\n }\n throw Error('wrong column or axis object');\n}\n","import { AxisSpec, CanonicalizedJson, canonicalizeJson, PColumnIdAndSpec } from \"@milaboratories/pl-model-common\";\nimport { ColumnId } from \"./spec\";\n\nexport const PARENTS_ANNOTATION = 'pl7.app/parents';\n\ntype AxisTree = {\n axis: AxisSpec;\n parents: AxisTree[];\n};\n\nfunction getAxisParents(axis: AxisSpec): AxisSpec[] {\n if (!axis.annotations || !axis.annotations[PARENTS_ANNOTATION]) {\n return [];\n }\n return JSON.parse(axis.annotations[PARENTS_ANNOTATION]);\n}\n\nfunction checkIfRoot(axes: AxisSpec[], idx: number): boolean {\n const maybeRoot = canonicalizeJson(axes[idx]);\n\n for (let axisIdx = 0; axisIdx < axes.length; axisIdx++) {\n const axis = axes[axisIdx];\n if (idx === axisIdx) {\n continue;\n }\n const parents: AxisSpec[] = getAxisParents(axis);\n if (parents.some((axis) => canonicalizeJson(axis) === maybeRoot)) {\n return false;\n }\n }\n return true;\n}\nfunction getRootAxis(axes: AxisSpec[]): AxisSpec | null {\n for (let axisIdx = 0; axisIdx < axes.length; axisIdx++) {\n if (checkIfRoot(axes, axisIdx)) {\n return axes[axisIdx];\n }\n }\n return null;\n}\n\nexport function getAxesTree(rootAxis: AxisSpec): AxisTree | null {\n const root: AxisTree = { axis: rootAxis, parents: [] };\n let nodesQ = [root];\n while (nodesQ.length) {\n const nextNodes = [];\n for (const node of nodesQ) {\n const parentNodes = getAxisParents(node.axis);\n node.parents = parentNodes.map((axis) => ({ axis, parents: [] }));\n nextNodes.push(...node.parents);\n }\n nodesQ = nextNodes;\n }\n return root;\n}\n\nexport function setFromAxisTree(tree: AxisTree): Set<CanonicalizedJson<AxisSpec>> {\n const set: Set<CanonicalizedJson<AxisSpec>> = new Set([canonicalizeJson(tree.axis)]);\n let nodesQ = [tree];\n while (nodesQ.length) {\n const nextNodes = [];\n for (const node of nodesQ) {\n for (const parent of node.parents) {\n set.add(canonicalizeJson(parent.axis));\n nextNodes.push(parent);\n }\n }\n nodesQ = nextNodes;\n }\n return set;\n}\nexport function arrayFromAxisTree(tree: AxisTree): AxisSpec[] {\n const res: AxisSpec[] = [tree.axis];\n let nodesQ = [tree];\n while (nodesQ.length) {\n const nextNodes = [];\n for (const node of nodesQ) {\n for (const parent of node.parents) {\n res.push(parent.axis);\n nextNodes.push(parent);\n }\n }\n nodesQ = nextNodes;\n }\n return res;\n}\n\nexport function getAxesGroups(axisSpecs:AxisSpec[]): AxisSpec[][] | null {\n if (!axisSpecs.length) {\n return [];\n }\n let freeAxes = axisSpecs;\n\n const groups:AxisSpec[][] = [];\n while (freeAxes.length) {\n const root = getRootAxis(freeAxes);\n if (root === null) {\n return null;\n }\n const tree = getAxesTree(root);\n if (tree === null) {\n return null;\n }\n const set = setFromAxisTree(tree);\n const arr = arrayFromAxisTree(tree);\n groups.push(arr);\n\n freeAxes = freeAxes.filter((axisSpec) => !set.has(canonicalizeJson(axisSpec)));\n }\n return groups;\n}\n\nexport type CompositeLinkerMap = Map<\n CanonicalizedJson<AxisSpec[]>,\n Map<CanonicalizedJson<AxisSpec[]>, ColumnId>\n>\nexport function getCompositeLinkersMap(compositeLinkers:PColumnIdAndSpec[]):CompositeLinkerMap {\n const result:CompositeLinkerMap = new Map();\n for (const linker of compositeLinkers) {\n const columnId = new ColumnId({name: linker.columnId, type: linker.spec.valueType});\n const groups = getAxesGroups(linker.spec.axesSpec);\n\n if (!groups || groups.length !== 2) {\n continue;\n }\n const [left, right] = groups;\n const keyLeft = canonicalizeJson(left);\n const keyRight = canonicalizeJson(right);\n if (!result.has(keyLeft)) {\n result.set(keyLeft, new Map());\n }\n if (!result.has(keyRight)) {\n result.set(keyRight, new Map());\n }\n result.get(keyLeft)?.set(keyRight, columnId);\n result.get(keyRight)?.set(keyLeft, columnId);\n }\n return result;\n}","import {SingleValuePredicateV2} from '@milaboratories/pl-model-common/src/drivers/pframe/table_calculate';\nimport {SelectorState} from './common';\nimport {TableOuterJoinResult} from './pframe/ColumnsProvider';\nimport type {DataStore, PValue} from './store';\nimport type {ColumnOrAxisIdString} from './spec';\nimport {isAxisId} from './spec';\nimport {AxisId, ColumnId, columnOrAxisIdFromString, isColumnId} from './spec';\nimport type {AxisData, ColumnData, InputState, SelectorStateFilter} from './common';\nimport {\n AXIS_NATURE_KEY,\n COLUMN_DOMAIN_KEY,\n COLUMN_LABEL_KEY,\n COLUMN_NAME_KEY, DISCRETE_FILTER_KEY, IS_LINKER_COLUMN,\n IS_VIRTUAL_COLUMN,\n SUBSET_FILTER_KEY,\n} from './constants';\nimport {\n canonicalizeJson,\n PColumnIdAndSpec,\n type AxisSpec,\n type PColumnSpec,\n type PObjectId,\n type PTableRecordSingleValueFilterV2,\n isPColumnSpec, PObjectSpec,\n} from '@milaboratories/pl-model-common';\nimport canonicalize from 'canonicalize';\nimport { CompositeLinkerMap, getAxesGroups, getCompositeLinkersMap } from './compositeLinkers';\nimport { DemoDataStore } from './demoStore';\n\nexport async function addSourceInfoToMap( // by column id / axis id, without qualifications\n store: DataStore,\n selectedIdStr: ColumnOrAxisIdString,\n label: string | undefined,\n dataMap: Map<string, ColumnData | AxisData>,\n dataAxesList: AxisSpec[],\n dataAxes: Set<ColumnOrAxisIdString>,\n linkerAxes: Set<ColumnOrAxisIdString>,\n fixedAxesAllowed = true,\n compositeLinkerMap: CompositeLinkerMap\n) {\n const sourceId = columnOrAxisIdFromString(selectedIdStr);\n if (isColumnId(sourceId)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(sourceId);\n if (!columnSpec) {\n return;\n }\n const extraAxesIds = getNotAllowedAxes(\n columnSpec,\n dataAxesList,\n dataAxes,\n linkerAxes,\n compositeLinkerMap\n ).map((axisSpec) => AxisId.fromAxisSpec(axisSpec).toCanonicalString());\n\n const extraAxesSet = new Set(extraAxesIds);\n const axesIds = columnSpec.axesSpec.map(axisSpec => AxisId.fromAxisSpec(axisSpec).toCanonicalString());\n const extraAxesIndexes: Record<string, number> = {};\n if (fixedAxesAllowed) {\n axesIds.forEach((id, idx) => {\n if (extraAxesSet.has(id)) {\n extraAxesIndexes[id] = idx;\n }\n });\n }\n const columnInfo: ColumnData = {\n kind: 'column',\n name: columnSpec.name,\n label: label ?? (await getColumnOrAxisLabel(store, selectedIdStr, [])),\n type: columnSpec.valueType,\n spec: columnSpec,\n annotations: columnSpec.annotations,\n isSubsetFilter: columnSpec.annotations?.[SUBSET_FILTER_KEY] === 'true',\n isDiscreteFilter: columnSpec.valueType === 'String' || columnSpec.annotations?.[DISCRETE_FILTER_KEY] === 'true',\n axesToBeFixed: extraAxesIds,\n axesToBeFixedIndexes: extraAxesIndexes,\n };\n dataMap.set(sourceId.toCanonicalString(), columnInfo);\n for (const axisSpec of columnSpec.axesSpec) {\n const axisId = AxisId.fromAxisSpec(axisSpec);\n const axisIdStr = axisId.toCanonicalString();\n if (dataMap.has(axisIdStr)) {\n continue;\n }\n const mustBeConsumed = axisMustBeConsumed(axisSpec);\n const axisInfo: AxisData = {\n kind: 'axis',\n name: axisSpec.name,\n label: await getColumnOrAxisLabel(store, axisIdStr, [selectedIdStr]),\n type: axisSpec.type,\n mustBeConsumed,\n dividable: false,\n spec: axisSpec,\n annotations: axisSpec.annotations,\n isSubsetFilter: axisSpec.annotations?.[SUBSET_FILTER_KEY] === 'true',\n isDiscreteFilter: axisSpec.type === 'String' || axisSpec.annotations?.[DISCRETE_FILTER_KEY] === 'true',\n parentSources: [selectedIdStr],\n };\n dataMap.set(axisIdStr, axisInfo);\n }\n }\n}\n\nexport function getDefaultInfo(sourceIdStr: ColumnOrAxisIdString): ColumnData | AxisData {\n const item = columnOrAxisIdFromString(sourceIdStr);\n const {name, type} = item;\n if (isColumnId(item)) {\n return {\n kind: 'column',\n name: '',\n label: ' ',\n type: item.type,\n spec: {axesSpec: [], kind: 'PColumn', valueType: item.type, name},\n annotations: undefined,\n isSubsetFilter: false,\n isDiscreteFilter: item.type === 'String',\n axesToBeFixed: [],\n axesToBeFixedIndexes: {}\n };\n }\n return {\n kind: 'axis',\n name: '',\n label: ' ',\n type: type,\n spec: {type, name},\n mustBeConsumed: false,\n dividable: false,\n annotations: undefined,\n isSubsetFilter: false,\n isDiscreteFilter: type === 'String',\n parentSources: [],\n };\n}\n\nexport function getStateCopy<State extends InputState>(state: State): State {\n return {\n type: state.type,\n components: {...state.components},\n dividedAxes: {...state.dividedAxes},\n } as State;\n}\n\nexport function getFilterFromState(state: SelectorStateFilter): PTableRecordSingleValueFilterV2[] {\n const {selectedSource, type, selectedFilterRange, selectedFilterValue} = state;\n const id = columnOrAxisIdFromString(selectedSource);\n if (!id) {\n throw Error('Empty source selected');\n }\n if (type === 'range') {\n const rangeFilters = [];\n if (selectedFilterRange?.max !== undefined) {\n rangeFilters.push({\n type: 'bySingleColumnV2' as const,\n column: isAxisId(id) ? {type: 'axis' as const, id: id.toPFrameId()} : {type: 'column' as const, id: id.name as PObjectId},\n predicate: {\n operator: 'LessOrEqual',\n reference: selectedFilterRange.max\n } as SingleValuePredicateV2,\n })\n }\n if (selectedFilterRange?.min !== undefined) {\n rangeFilters.push({\n type: 'bySingleColumnV2' as const,\n column: isAxisId(id) ? {type: 'axis' as const, id: id.toPFrameId()} : {type: 'column' as const, id: id.name as PObjectId},\n predicate: {\n operator: 'GreaterOrEqual',\n reference: selectedFilterRange?.min as number,\n } as SingleValuePredicateV2,\n })\n }\n return rangeFilters;\n } else if (type === 'subset') {\n return [\n {\n type: 'bySingleColumnV2' as const,\n column: isAxisId(id) ? {type: 'axis' as const, id: id.toPFrameId()} : {type: 'column' as const, id: id.name as PObjectId},\n predicate: {\n operator: 'Not',\n operand: { operator: 'IsNA' }\n } as SingleValuePredicateV2,\n },\n ]\n }\n if (typeof selectedFilterValue === 'undefined') {\n return [];\n }\n return [\n {\n type: 'bySingleColumnV2' as const,\n column: isAxisId(id) ? {type: 'axis' as const, id: id.toPFrameId()} : {\n type: 'column' as const,\n id: id.name as PObjectId,\n },\n predicate: {\n operator: 'Equal',\n reference:\n id.type === 'String'\n ? String(selectedFilterValue)\n : (Number(selectedFilterValue) as string | number),\n } as SingleValuePredicateV2,\n },\n ];\n}\n\nexport function getFiltersFromStates(states: SelectorStateFilter[]): PTableRecordSingleValueFilterV2[] {\n const result: PTableRecordSingleValueFilterV2[] = [];\n for (const state of states) {\n result.push(...getFilterFromState(state));\n }\n return result;\n}\n\nexport function getGlobalId(spec: PColumnSpec): string;\nexport function getGlobalId(spec: AxisSpec): string;\nexport function getGlobalId(spec: AxisSpec | PColumnSpec): string {\n if ('kind' in spec && spec.kind === 'PColumn') {\n const name = spec.name ?? spec.annotations?.[COLUMN_NAME_KEY];\n const domain = spec.domain ?? spec.annotations?.[COLUMN_DOMAIN_KEY];\n return canonicalize({name, domain})!;\n }\n const name = spec.name;\n const domain = spec.domain;\n return canonicalize({name, domain})!;\n}\n\nasync function getAxisSpecFromParents(store: DataStore, axisId: AxisId, parentSources: ColumnOrAxisIdString[]) {\n for (const parentSource of parentSources) {\n const parentId = columnOrAxisIdFromString(parentSource);\n if (isColumnId(parentId)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(parentId);\n const spec = (columnSpec?.axesSpec ?? []).find(\n s => AxisId.fromAxisSpec(s).toCanonicalString() === axisId.toCanonicalString(),\n );\n if (spec) {\n return spec;\n }\n }\n }\n return null;\n}\n\nconst LABEL_COLUMN_NAME = 'pl7.app/label';\n\nexport async function getColumnOrAxisValueLabelsId(\n store: DataStore,\n selectedSource: ColumnOrAxisIdString,\n parentSources: ColumnOrAxisIdString[],\n): Promise<ColumnId | undefined> {\n const id = columnOrAxisIdFromString(selectedSource);\n if (isColumnId(id)) {\n return undefined;\n }\n async function getAxisGlobalId(axisId: AxisId) {\n const spec = await getAxisSpecFromParents(store, axisId, parentSources);\n return spec ? getGlobalId(spec) : null;\n }\n const labelColumns = await store.pFrameProvider.getColumnsFull([], false, undefined, [LABEL_COLUMN_NAME]);\n const sourceGlobalId = await getAxisGlobalId(id);\n const labelColumn = labelColumns.find(({spec}) => {\n return spec && spec.axesSpec.length === 1 && getGlobalId(spec.axesSpec[0]) === sourceGlobalId;\n });\n return labelColumn ? new ColumnId({name: labelColumn.columnId, type: labelColumn.spec.valueType}) : undefined;\n}\n\nexport async function getColumnOrAxisLabel(\n store: DataStore,\n selectedSource: ColumnOrAxisIdString,\n parentSources: ColumnOrAxisIdString[],\n) {\n const selectedId = columnOrAxisIdFromString(selectedSource);\n const labelsColumn = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n\n let spec: AxisSpec | PColumnSpec | null;\n if (isColumnId(selectedId)) {\n spec = await store.pFrameProvider.getColumnSpecById(labelsColumn ?? selectedId);\n } else {\n spec = labelsColumn\n ? await store.pFrameProvider.getColumnSpecById(labelsColumn)\n : await getAxisSpecFromParents(store, selectedId, parentSources);\n }\n if (!spec) {\n return '';\n }\n const label = spec.annotations?.[COLUMN_LABEL_KEY] ?? spec.name;\n return store.labelsModifier(spec.name, label);\n}\n\nexport function axisMustBeConsumed(spec: AxisSpec) {\n const axisNature = spec.annotations?.[AXIS_NATURE_KEY]?.toLowerCase();\n return Boolean(axisNature) && axisNature !== 'homogenous' && axisNature !== 'homogeneous';\n}\n\nexport function checkSourceBySpecForFilters(spec: PColumnSpec | AxisSpec) {\n //const type = 'kind' in spec && spec.kind === 'PColumn' ? spec.valueType : spec.type;\n if (spec.annotations?.[SUBSET_FILTER_KEY] === 'true') {\n return true;\n }\n if (spec.annotations?.[DISCRETE_FILTER_KEY] === 'true') {\n return true;\n }\n //return type === 'Double' || type === 'Float' || type === 'Int' || type === 'Long'\n return true;\n}\n\nexport function dataColumnPredicateDefault(spec: PColumnSpec) {\n return !spec.name.includes('metadata') && !(spec.annotations?.[IS_VIRTUAL_COLUMN] === 'true') && !(spec.annotations?.[SUBSET_FILTER_KEY] === 'true');\n}\n\nexport type LinkerColumnsMap = Record<ColumnOrAxisIdString, Record<ColumnOrAxisIdString, {id: ColumnId, spec: PColumnSpec}>>;\n\nexport function getLinkerColumnsMap(linkerColumns:PColumnIdAndSpec[]): LinkerColumnsMap {\n const resultMap: LinkerColumnsMap = {};\n for (const item of linkerColumns.filter((item) => item.spec.axesSpec.length === 2)) {\n const columnId = new ColumnId({name: item.columnId, type: item.spec.valueType});\n const axesSpec = item.spec.axesSpec ?? [];\n if (axesSpec.length) {\n const [axisA, axisB] = axesSpec;\n const idA = AxisId.fromAxisSpec(axisA).toCanonicalString();\n const idB = AxisId.fromAxisSpec(axisB).toCanonicalString();\n if (!resultMap[idA]) {\n resultMap[idA] = {};\n }\n if (!resultMap[idB]) {\n resultMap[idB] = {};\n }\n resultMap[idA][idB] = {id: columnId, spec: item.spec};\n resultMap[idB][idA] = {id: columnId, spec: item.spec};\n }\n }\n return resultMap;\n}\n\nexport async function getAxesSpecsFromSources(store:DataStore, idStrs: ColumnOrAxisIdString[]):Promise<AxisSpec[]>{\n const set = new Set<ColumnOrAxisIdString>();\n const result:AxisSpec[] = [];\n for(const idStr of idStrs) {\n const id = columnOrAxisIdFromString(idStr);\n if (isColumnId(id)) {\n const spec = await store.pFrameProvider.getColumnSpecById(id);\n if (!spec) {\n continue;\n }\n spec.axesSpec.forEach(axisSpec => {\n const id = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n if (!set.has(id)) {\n set.add(id);\n result.push(axisSpec);\n }\n })\n }\n }\n return result;\n}\n\nexport function searchPath(\n linkerColumnsMap:LinkerColumnsMap,\n startId: ColumnOrAxisIdString,\n endId: ColumnOrAxisIdString\n):ColumnId[] | null {\n const previous:Record<string, string> = {};\n const visited = new Set([startId])\n let nextIds = [startId];\n while (nextIds.length) {\n const next = new Set<string>();\n for (const nextId of nextIds) {\n if (linkerColumnsMap[nextId]) {\n const availableIds = Object.keys(linkerColumnsMap[nextId]);\n for (const availableId of availableIds) {\n previous[availableId] = nextId;\n if (availableId === endId) {\n const ids:ColumnOrAxisIdString[] = [];\n let current = endId;\n while(previous[current] !== startId) {\n ids.push(current);\n current = previous[current];\n }\n ids.push(current);\n return ids.map(id => linkerColumnsMap[id][previous[id]].id as ColumnId);\n } else if (!visited.has(availableId)) {\n next.add(availableId);\n visited.add(availableId);\n }\n }\n }\n }\n nextIds = [...next];\n }\n return null;\n}\nfunction getLinkerColumnsFromGraph(\n linkerColumnsMap:LinkerColumnsMap,\n parentAxesIds: Set<ColumnOrAxisIdString>,\n targetAxisId:string\n):ColumnId[] {\n const paths = ([...parentAxesIds])\n .map((parentAxisId) => searchPath(linkerColumnsMap, parentAxisId, targetAxisId))\n .filter(p => p !== null) as ColumnId[][];\n if (paths.length === 0) {\n return [];\n }\n let resultPath = paths[0];\n for (const path of paths) {\n if (path.length < resultPath.length) {\n resultPath = path;\n }\n }\n return resultPath;\n}\n\nexport async function getAllLinkerMaps(store: DemoDataStore) {\n const allLinkerColumns = await store.pFrameProvider.getColumnsFull(\n [], false, undefined, undefined,\n {[IS_LINKER_COLUMN]: 'true'},\n );\n const linkerColumnsMap = getLinkerColumnsMap(allLinkerColumns.filter((item) => item.spec.axesSpec.length === 2));\n const compositeLinkerMap = getCompositeLinkersMap(allLinkerColumns.filter((item) => item.spec.axesSpec.length > 2));\n return {linkerColumnsMap, compositeLinkerMap};\n}\n\nexport async function getLinkerColumnsForSource(\n store: DataStore,\n linkerColumnsMap: LinkerColumnsMap,\n compositeLinkerMap: CompositeLinkerMap,\n dataInputAxes: AxisSpec[],\n secondarySource: ColumnOrAxisIdString,\n fixedAxesOfSecondaryColumn: SelectorState['fixedAxes']\n):Promise<ColumnId[]> {\n const columnOrAxisId = columnOrAxisIdFromString(secondarySource);\n if (!isColumnId(columnOrAxisId)) {\n return [];\n }\n const secondaryColumnSpec = await store.pFrameProvider.getColumnSpecById(columnOrAxisId);\n if (!secondaryColumnSpec) {\n return [];\n }\n const allColumnAxesWithoutFixed = secondaryColumnSpec.axesSpec.filter(\n (axisSpec) => {\n const axisId = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n return !fixedAxesOfSecondaryColumn?.some(el => el.axisSource === axisId);\n });\n\n const dataInputAxesSet = new Set(dataInputAxes.map(axisSpec => AxisId.fromAxisSpec(axisSpec).toCanonicalString()));\n const rightPartAxes = allColumnAxesWithoutFixed.filter((axisSpec) => { // right part from column minus 'fixedAxes'\n const axisId = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n return !dataInputAxesSet.has(axisId);\n });\n if (!rightPartAxes.length) {\n return []; // all axes are from data inputs or fixed\n }\n\n const leftGroups = getAxesGroups(dataInputAxes);\n const rightGroups = getAxesGroups(rightPartAxes);\n\n if (!leftGroups || !rightGroups) {\n throw Error(`Can't create axes tree for ${secondaryColumnSpec.name}`);\n }\n\n const leftCompositeKeysSet = new Set(leftGroups.map(canonicalizeJson));\n\n const linkerColumns = new Set<string>();\n rightGroups.forEach((axes:AxisSpec[]) => {\n const compositeLinkerKey = canonicalizeJson(axes);\n if (compositeLinkerMap.has(compositeLinkerKey)) {\n const node = compositeLinkerMap.get(compositeLinkerKey);\n const availableKeys = node ? [...node.keys()] : [];\n const columnKey = availableKeys.find((columnKey) => leftCompositeKeysSet.has(columnKey));\n if (!columnKey) {\n throw Error(`Can't find composite linker column for ${secondaryColumnSpec.name}, ${compositeLinkerKey}`);\n }\n const linkerColumn = compositeLinkerMap.get(compositeLinkerKey)?.get(columnKey)!;\n\n linkerColumns.add(linkerColumn.toCanonicalString());\n } else if (axes.length === 1) {\n const axisId = AxisId.fromAxisSpec(axes[0]).toCanonicalString();\n const columns = getLinkerColumnsFromGraph(linkerColumnsMap, dataInputAxesSet, axisId);\n columns.forEach((column) => {\n linkerColumns.add(column.toCanonicalString());\n });\n }\n });\n return [...linkerColumns].map(idStr => columnOrAxisIdFromString(idStr));\n}\n\nexport function getNotAllowedAxes(\n columnSpec: PColumnSpec,\n dataInputAxesList: AxisSpec[], // axes from data-input\n dataInputAxesSet: Set<ColumnOrAxisIdString>,\n linkerAxes: Set<ColumnOrAxisIdString>, // axes available with 2axes linkers with dataInputAxes\n compositeLinkerMap: CompositeLinkerMap, // composite linkers, without chains\n): AxisSpec[] {\n const allColumnAxes = columnSpec.axesSpec;\n // remove from the column axes - axes from data inputs\n const rightPartAxes = allColumnAxes.filter(\n (axisSpec:AxisSpec) => !dataInputAxesSet.has(AxisId.fromAxisSpec(axisSpec).toCanonicalString())\n );\n if (!rightPartAxes.length) {\n return []; // all axes are from data inputs\n }\n\n const leftGroups = getAxesGroups(dataInputAxesList);\n let rightGroups = getAxesGroups(rightPartAxes);\n\n if (!leftGroups || !rightGroups) {\n return rightPartAxes; // free axes\n }\n\n const leftCompositeKeysSet = new Set(leftGroups.map(canonicalizeJson));\n // remove groups linked with composite linker to left part\n rightGroups = rightGroups.filter(\n (group) => {\n const groupKey = canonicalizeJson(group);\n const node = compositeLinkerMap.get(groupKey);\n const availableKeys = node ? [...node.keys()] : [];\n return !availableKeys.some((key) => leftCompositeKeysSet.has(key));\n }\n );\n\n if (rightGroups.some(group => group.length > 1)) { // nothing to link with non-composite linkers\n return rightGroups.flatMap(a => a);\n }\n rightGroups = rightGroups.filter(([axisSpec]) => !linkerAxes.has(AxisId.fromAxisSpec(axisSpec).toCanonicalString()));\n return rightGroups.flatMap(a => a);\n}\n\nexport function createHighlightColumn(highlightSelectedStates:SelectorStateFilter[], data: TableOuterJoinResult) {\n const dataLength = data.columnsData[Object.keys(data.columnsData)[0]].length;\n const highlightColumn = new Int32Array(dataLength).fill(0);\n for (let rowIdx = 0; rowIdx < dataLength; rowIdx++) {\n let res = false;\n for (let i = 0; i < highlightSelectedStates.length; i++) {\n const {selectedSource, selectedFilterValue, selectedFilterRange, type} = highlightSelectedStates[i];\n const sourceId = columnOrAxisIdFromString(selectedSource);\n const value = (isColumnId(sourceId) ? data.columnsData[selectedSource] : data.axesData[selectedSource])[rowIdx];\n if (selectedFilterValue !== undefined) {\n res = res || value === selectedFilterValue;\n }\n if (selectedFilterRange !== undefined && (selectedFilterRange.min !== undefined || selectedFilterRange.max !== undefined) && typeof value === 'number') {\n let rangeResult = true;\n if (selectedFilterRange.min !== undefined) {\n rangeResult = rangeResult && value >= selectedFilterRange.min;\n }\n if (selectedFilterRange.max !== undefined) {\n rangeResult = rangeResult && value <= selectedFilterRange.max;\n }\n res = res || rangeResult;\n }\n if (type === 'subset') {\n res = res || (value !== null && value !== undefined);\n }\n }\n if (res) {\n highlightColumn[rowIdx] = 1;\n }\n }\n return highlightColumn as unknown as PValue[];\n}\n","import {\n AxisSpec,\n PColumnSpec,\n PObjectId,\n PTableRecordSingleValueFilterV2,\n} from '@milaboratories/pl-model-common';\nimport {deriveLabels} from '@platforma-sdk/model';\nimport {SelectorState} from '../common';\nimport type {\n AxisData,\n ColumnData,\n ComponentGuideFilter,\n ComponentGuideSimple,\n ComponentsGuide,\n DataByColumns,\n FilterComponentControllers,\n FilterComponents,\n InputGuide,\n InputState,\n SelectorStateFilter,\n SelectorStateSimple,\n SimpleComponentControllers,\n SimpleComponents,\n} from '../common';\nimport {CompositeLinkerMap} from '../compositeLinkers';\nimport {DISCRETE_VALUES_KEY, HIGH_CARDINALITY} from '../constants';\nimport {PValue} from '../store';\nimport type {DataStore} from '../store';\nimport type {ColumnOrAxisIdString} from '../spec';\nimport {AxisId, ColumnId, columnOrAxisIdFromString, isColumnId} from '../spec';\nimport {\n addSourceInfoToMap,\n dataColumnPredicateDefault,\n getAllLinkerMaps,\n getColumnOrAxisValueLabelsId,\n getDefaultInfo,\n getStateCopy,\n LinkerColumnsMap,\n} from '../utils';\nimport {ComponentController} from './ComponentController';\n\ntype InputOptionsUnion<State extends InputState> = Record<\n SimpleComponents<State> | FilterComponents<State>,\n ComponentGuideSimple | ComponentGuideFilter\n>;\nexport interface Controller<State extends InputState> {\n calculateOptions(\n store: DataStore,\n state: State,\n fixedIds?: string[],\n dataColumnPredicate?: (spec: PColumnSpec) => boolean\n ): Promise<InputGuide<State>>;\n\n getUniqueSourceValuesWithLabels(\n store: DataStore,\n inputGuide: InputGuide<State>,\n selectedSource: ColumnOrAxisIdString,\n limit?:number,\n searchQuery?: string,\n searchQueryByValue?: string,\n ): Promise<{\n values: {\n value: string;\n label: string;\n }[],\n overflow: boolean;\n }>;\n\n getEmptyInputGuide(state: State): InputGuide<State>;\n\n createDataForPlot(store: DataStore, state: State): Promise<PlotDataAndSettings>;\n\n changeSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n nextSelectorStates: SelectorStateFilter[] | SelectorStateSimple[]\n ): State;\n}\n\nexport interface PlotDataAndSettings {\n data: {\n byColumns: DataByColumns,\n axesData?: Record<string, PValue[]>\n };\n settings: Record<string, unknown>;\n}\n\nexport abstract class ControllerBase<State extends InputState> implements Controller<State> {\n readonly ignoredOptionIdNames: string[] = [];\n readonly dataInputs: string[] = [];\n readonly dontAllowUnfilteredHighCardinality: boolean = false;\n\n protected constructor(\n readonly simpleComponentControllers: SimpleComponentControllers<State>,\n readonly filterComponentControllers: FilterComponentControllers<State>\n ) {}\n\n get requiredComponents(): (keyof State['components'])[] {\n const components: (keyof State['components'])[] = [];\n for (const componentName of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n if (this.simpleComponentControllers[componentName].isRequired) {\n components.push(componentName);\n }\n }\n return components;\n }\n\n get dimensionsConsumerComponents(): (keyof State['components'])[] {\n const components: (keyof State['components'])[] = [];\n for (const componentName of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n if (this.simpleComponentControllers[componentName].isDimensionsConsumer) {\n components.push(componentName);\n }\n }\n for (const componentName of Object.keys(this.filterComponentControllers) as FilterComponents<State>[]) {\n if (this.filterComponentControllers[componentName].isDimensionsConsumer) {\n components.push(componentName);\n }\n }\n return components;\n }\n\n addSelected(\n inputName: keyof State['components'],\n state: State,\n selectorState: SelectorStateFilter | SelectorStateSimple\n ) {\n if (inputName in this.simpleComponentControllers) {\n return (\n this.simpleComponentControllers[\n inputName as keyof typeof this.simpleComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).addSelected(state, selectorState);\n }\n if (inputName in this.filterComponentControllers) {\n return (\n this.filterComponentControllers[\n inputName as keyof typeof this.filterComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).addSelected(state, selectorState);\n }\n throw Error(`Unknown input name: ${String(inputName)}`);\n }\n\n deleteSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n selectorState: SelectorStateFilter | SelectorStateSimple\n ) {\n if (inputName in this.simpleComponentControllers) {\n return (\n this.simpleComponentControllers[\n inputName as keyof typeof this.simpleComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).deleteSelected(state, selectorState.selectedSource);\n }\n if (inputName in this.filterComponentControllers) {\n return (\n this.filterComponentControllers[\n inputName as keyof typeof this.filterComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).deleteSelected(state, selectorState.selectedSource);\n }\n throw Error(`Unknown input name: ${String(inputName)}`);\n }\n\n changeSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n nextSelectorStates: SelectorState[]\n ) {\n const currentStates: SelectorState[] = state.components[inputName].selectorStates;\n const deletedStates = currentStates.filter(currentState => {\n return !nextSelectorStates.find(s => s.selectedSource === currentState.selectedSource);\n });\n const addedStates = nextSelectorStates.filter(nextState => {\n return !currentStates.find(s => s.selectedSource === nextState.selectedSource);\n });\n let nextState = getStateCopy(state);\n deletedStates.forEach(selectorState => {\n nextState = this.deleteSelected(inputName, store, nextState, selectorState);\n });\n addedStates.forEach(selectorState => {\n nextState = this.addSelected(inputName, nextState, selectorState);\n });\n // reorder\n state.components[inputName].selectorStates = nextSelectorStates\n .map(st =>\n (state.components[inputName].selectorStates as SelectorState[]).find(\n s => s.selectedSource === st.selectedSource\n )\n )\n .filter(Boolean) as SelectorStateFilter[] | SelectorStateSimple[];\n return nextState;\n }\n\n switchDividableAxis(state: State, axis: AxisId): State {\n // ***\n // logic for axis dividing/collapsing\n // ***\n return getStateCopy(state);\n }\n\n async getMustBeConsumedAxes(store: DataStore, state: State): Promise<Set<ColumnOrAxisIdString>> {\n return Promise.resolve(new Set());\n }\n\n private createEmptyComponentsGuide(state: State): InputOptionsUnion<State> {\n return Object.fromEntries(\n Object.entries(state.components).map(\n ([key, value]): [string, ComponentGuideSimple | ComponentGuideFilter] => {\n return [\n key,\n {\n options: [],\n optionsInfo: new Map(),\n stateConsistency: {},\n required: false,\n multipleSelectors: false,\n },\n ];\n }\n )\n ) as InputOptionsUnion<State>;\n }\n\n async getSelectedSourcesInfo(\n store: DataStore,\n state: State,\n labelsMap: Record<string, string>,\n linkerColumnsMap: LinkerColumnsMap,\n compositeLinkerMap: CompositeLinkerMap\n ): Promise<Map<ColumnOrAxisIdString, AxisData | ColumnData>> {\n const result: Map<ColumnOrAxisIdString, AxisData> = new Map();\n\n const dataAxes = new Set<string>();\n const dataAxesList: AxisSpec[] = [];\n for (const inputName of this.dataInputs) {\n for (const selectorState of state.components[inputName].selectorStates) {\n const id = columnOrAxisIdFromString(selectorState.selectedSource);\n if (isColumnId(id)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(id);\n if (columnSpec) {\n columnSpec.axesSpec.forEach(axisSpec => {\n const idStr = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n if (!dataAxes.has(idStr)) {\n dataAxes.add(idStr);\n dataAxesList.push(axisSpec);\n }\n });\n }\n }\n }\n }\n const linkerAxes = new Set<string>();\n let nextAxes = [...dataAxes];\n while(nextAxes.length) {\n const next:string[] = [];\n for (const addedAxis of nextAxes) {\n if (linkerColumnsMap[addedAxis]) {\n const availableAxes = Object.keys(linkerColumnsMap[addedAxis]);\n for (const availableAxis of availableAxes) {\n if (!linkerAxes.has(availableAxis) && !dataAxes.has(availableAxis)) {\n next.push(availableAxis);\n linkerAxes.add(availableAxis);\n }\n }\n }\n }\n nextAxes = next;\n }\n for (const [inputName , {selectorStates}] of Object.entries(state.components)) {\n const component = this.simpleComponentControllers[inputName as keyof typeof this.simpleComponentControllers]\n ?? this.filterComponentControllers[inputName as keyof typeof this.filterComponentControllers] as ComponentController<State, typeof inputName>;\n const fixedAxesAllowed = component.settings.columnsWithExtraAxesAllowed;\n for (const {selectedSource} of selectorStates) {\n await addSourceInfoToMap(\n store,\n selectedSource,\n labelsMap[selectedSource],\n result,\n dataAxesList,\n dataAxes,\n linkerAxes,\n fixedAxesAllowed,\n compositeLinkerMap\n );\n }\n }\n return result;\n }\n\n getEmptyInputGuide(state: State): InputGuide<State> {\n return {\n components: this.createEmptyComponentsGuide(state) as ComponentsGuide<State['components']>,\n getSourceInfo: (sourceIdStr: ColumnOrAxisIdString) => getDefaultInfo(sourceIdStr),\n freeOptionsSet: new Set(),\n axesToBeFixedSet: new Set(),\n readyData: false,\n ready: false,\n consistent: true,\n };\n }\n\n getConsumedOptionsSet(state: State) {\n const consumedSourcesSet: Set<ColumnOrAxisIdString> = new Set();\n for (const componentName of this.dimensionsConsumerComponents) {\n for (const {selectedSource} of state.components[componentName].selectorStates) {\n consumedSourcesSet.add(selectedSource);\n }\n }\n return consumedSourcesSet;\n }\n\n async getLabelsMap(store: DataStore, state: State) {\n const availableColumns = await store.pFrameProvider.getColumnsFull(\n this.dataInputs.reduce((res: (ColumnId | AxisId)[], inputName) => {\n const componentState = state.components[inputName];\n const sources = componentState.selectorStates.map(st => columnOrAxisIdFromString(st.selectedSource));\n return res.concat(sources);\n }, []),\n false\n );\n return deriveLabels(availableColumns, el => el.spec).reduce((res: Record<string, string>, el) => {\n const id = new ColumnId({name: el.value.columnId, type: el.value.spec.valueType}).toCanonicalString();\n res[id] = el.label;\n return res;\n }, {});\n }\n\n async calculateOptions(\n store: DataStore,\n state: State,\n fixedIds: string[] = [],\n dataColumnPredicate = dataColumnPredicateDefault\n ): Promise<InputGuide<State>> {\n // creating empty options object corresponding to the provided state\n const resultComponentsGuide: InputOptionsUnion<State> = this.createEmptyComponentsGuide(state);\n\n // set of columns and axes that selected in consumer-dimensions components\n const consumedSourcesSet = this.getConsumedOptionsSet(state);\n // for trees block - to ignore treeId and donorId in the interface\n const ignoredNamesSet = new Set<string>(this.ignoredOptionIdNames);\n const fixedSelectedSet = new Set<ColumnOrAxisIdString>(fixedIds);\n\n const {linkerColumnsMap, compositeLinkerMap} = await getAllLinkerMaps(store);\n\n const labelsMap = await this.getLabelsMap(store, state); // improved labels with name separation for different columns with the same name; for axes - name from spec or labels column\n const selectedColumnsOrAxesInfo = await this.getSelectedSourcesInfo(store, state, labelsMap, linkerColumnsMap, compositeLinkerMap);\n const optionsInfo: Map<ColumnOrAxisIdString, ColumnData | AxisData> = new Map();\n\n const allControllers = {...this.simpleComponentControllers, ...this.filterComponentControllers};\n const freeOptionsSet = new Set<ColumnOrAxisIdString>();\n for (const [name, componentController] of Object.entries(allControllers)) {\n const options = await (\n componentController as ComponentController<State, SimpleComponents<State> | FilterComponents<State>>\n ).getOptions(\n store,\n state,\n labelsMap,\n consumedSourcesSet,\n linkerColumnsMap,\n compositeLinkerMap,\n dataColumnPredicate,\n ignoredNamesSet,\n fixedSelectedSet\n );\n if (!this.dataInputs.includes(name as string)) {\n options.options.forEach(item => {\n freeOptionsSet.add(item.value);\n });\n }\n for (const [key, v] of options.optionsInfo) {\n optionsInfo.set(key, v);\n }\n resultComponentsGuide[name as keyof InputOptionsUnion<State>] =\n options as (typeof resultComponentsGuide)[keyof InputOptionsUnion<State>];\n }\n\n const markMustBeConsumed = (id: string) => {\n const option = optionsInfo.get(id);\n if (option && option.kind === 'axis') {\n option.mustBeConsumed = true;\n }\n const selected = selectedColumnsOrAxesInfo.get(id);\n if (selected && selected.kind === 'axis') {\n selected.mustBeConsumed = true;\n }\n };\n // axes from heatmap data column, to make visible what axes should be; hanging axes from scatterplot\n const mustBeConsumedAxes = await this.getMustBeConsumedAxes(store, state);\n for (const id of mustBeConsumedAxes) {\n markMustBeConsumed(id);\n }\n\n if (this.dontAllowUnfilteredHighCardinality) {\n // Axes marked 'high cardinality' should be in the filter. Or some column that has this axis should be in the filter.\n // If not - they are marked 'mustBeConsumed'.\n // But also they can be anywhere else.\n const isHighCardinality = (spec: AxisSpec) => spec?.annotations?.[HIGH_CARDINALITY] === 'true';\n const consumedHighCardinalityAxes =\n state.components['filters']?.selectorStates.reduce((consumed: Set<string>, s) => {\n const info = selectedColumnsOrAxesInfo.get(s.selectedSource);\n if (info?.kind === 'column') {\n const axes = info.spec.axesSpec.filter(isHighCardinality);\n axes.forEach(spec => consumed.add(AxisId.fromAxisSpec(spec).toCanonicalString()));\n }\n if (info?.kind === 'axis' && isHighCardinality(info.spec)) {\n consumed.add(AxisId.fromAxisSpec(info.spec).toCanonicalString());\n }\n return consumed;\n }, new Set<string>()) ?? new Set<string>();\n this.dataInputs.forEach(inputName => {\n for (const {selectedSource} of state.components[inputName].selectorStates) {\n const info = selectedColumnsOrAxesInfo.get(selectedSource);\n if (info?.kind === 'column') {\n const axes = info.spec.axesSpec.filter(isHighCardinality);\n axes.forEach(spec => {\n const idStr = AxisId.fromAxisSpec(spec).toCanonicalString();\n if (!freeOptionsSet.has(idStr) && !consumedHighCardinalityAxes.has(idStr)) {\n // return axis to the list of free axis if it is selected somewhere, but nothing with this axis is in the filters\n freeOptionsSet.add(idStr);\n }\n if (!consumedHighCardinalityAxes.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n });\n }\n if (info?.kind === 'axis' && isHighCardinality(info.spec)) {\n const idStr = AxisId.fromAxisSpec(info.spec).toCanonicalString();\n if (!freeOptionsSet.has(idStr)) {\n freeOptionsSet.add(idStr);\n }\n if (!consumedHighCardinalityAxes.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n }\n });\n }\n\n const axesToBeFixedSet = new Set<ColumnOrAxisIdString>();\n for (const {selectorStates} of Object.values(state.components)) {\n for (const {selectedSource} of selectorStates) {\n const info = selectedColumnsOrAxesInfo.get(selectedSource);\n if (info && info.kind === 'column') {\n info.axesToBeFixed.forEach(axisIdStr => {\n axesToBeFixedSet.add(axisIdStr);\n });\n }\n }\n }\n\n const consistent = await this.isConsistent(store, state, linkerColumnsMap, compositeLinkerMap);\n const getSourceInfo = (sourceIdStr: ColumnOrAxisIdString) => {\n const id = columnOrAxisIdFromString(sourceIdStr).toCanonicalString() ?? sourceIdStr;\n return optionsInfo.get(id) ?? selectedColumnsOrAxesInfo.get(id) ?? getDefaultInfo(sourceIdStr);\n };\n return {\n components: resultComponentsGuide as ComponentsGuide<State['components']>,\n getSourceInfo,\n freeOptionsSet,\n axesToBeFixedSet,\n readyData: this.readyDataInputs(state),\n ready: this.readyForPlotBuilding(store, state, consistent, freeOptionsSet, getSourceInfo),\n consistent,\n };\n }\n\n async getUniqueSourceValuesWithLabels(\n store: DataStore,\n inputGuide: InputGuide<State>,\n selectedSource: ColumnOrAxisIdString,\n limit?:number,\n searchQuery?: string, // search by labels if axis labels exist\n searchQueryValue?: string // search by value, not by label\n ): Promise<{\n values: {\n value: string;\n label: string;\n }[],\n overflow: boolean;\n }> {\n const sortValues = (values:{value:string, label:string}[]) => values.sort((a, b) => a.label.localeCompare(b.label, 'en', {numeric: true}))\n const info = inputGuide.getSourceInfo(selectedSource);\n const discreteValuesStr = info.annotations?.[DISCRETE_VALUES_KEY];\n\n // if column's annotation contains discrete values - take them from it\n try {\n const discreteValues: string[] | null = discreteValuesStr\n ? (JSON.parse(discreteValuesStr) as (string | number)[]).map(v => String(v))\n : null;\n if (discreteValues) {\n const values = discreteValues.map(v => ({value: v, label: v}));\n sortValues(values);\n return {values, overflow: false};\n }\n } catch (err) {\n console.error(`Parsing error: discrete values annotation ${discreteValuesStr} in ${selectedSource}`)\n }\n\n // consider label column for axis\n if (info.kind === 'axis') {\n const axisId = columnOrAxisIdFromString(selectedSource) as AxisId;\n const parentSources = info.parentSources.map(columnOrAxisIdFromString) as ColumnId[];\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, info.parentSources);\n let filters:PTableRecordSingleValueFilterV2[] = [];\n if (labelsColumnId) {\n if (searchQuery) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'column',\n id: labelsColumnId.name as PObjectId\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchQuery\n }\n }];\n }\n if (searchQueryValue) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'axis',\n id: axisId.toPFrameId()\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchQueryValue\n }\n }];\n }\n const {data: dataValues, axesData} = await store.pFrameProvider.getSingleColumnData(labelsColumnId, filters);\n const axisKeys = axesData[axisId.toCanonicalString()];\n const values:{value: string, label: string}[] = [];\n for (let i = 0; i < Math.min(axisKeys.length, limit ?? axisKeys.length); i++) {\n values.push({value: String(axisKeys[i]), label: String(dataValues[i])});\n }\n sortValues(values);\n return {values, overflow: !(limit === undefined || axisKeys.length < limit)};\n }\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n if (searchInLabelsOrValue) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'axis',\n id: axisId.toPFrameId()\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchInLabelsOrValue\n }\n }];\n }\n const response = await store.pFrameProvider.getAxisUniqueValues(axisId, [parentSources[0]], limit, filters);\n const values = response.values.map(v => ({value: String(v), label: String(v)}));\n sortValues(values);\n return {values, overflow: response.overflow};\n }\n if (info.kind === 'column') {\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n const columnId = columnOrAxisIdFromString(selectedSource) as ColumnId;\n const filters:PTableRecordSingleValueFilterV2[] = searchInLabelsOrValue ? [{\n type: 'bySingleColumnV2',\n column: {\n type: 'column',\n id: columnId.name as PObjectId\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchInLabelsOrValue\n }\n }] : [];\n const response = await store.pFrameProvider.getColumnUniqueValues(columnId, limit, filters);\n const values = response.values.map(v => ({value: String(v), label: String(v)}));\n sortValues(values);\n return {values, overflow: response.overflow};\n }\n return {values: [], overflow: false};\n }\n\n async checkStateConsistency(\n store: DataStore,\n state: State,\n linkerColumnsMap:LinkerColumnsMap,\n compositeLinkerMap: CompositeLinkerMap\n ): Promise<Map<keyof State['components'], Record<string, boolean>>> {\n const result: Map<keyof State['components'], Record<string, boolean>> = new Map();\n for (const component of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n result.set(\n component as keyof State['components'],\n await this.simpleComponentControllers[component].checkStateConsistency(store, state, linkerColumnsMap, compositeLinkerMap)\n );\n }\n for (const component of Object.keys(this.filterComponentControllers) as FilterComponents<State>[]) {\n result.set(\n component as keyof State['components'],\n await this.filterComponentControllers[component].checkStateConsistency(store, state, linkerColumnsMap, compositeLinkerMap)\n );\n }\n return result;\n }\n\n async isConsistent(store: DataStore, state: State, linkerColumnsMap:LinkerColumnsMap, compositeLinkerMap: CompositeLinkerMap): Promise<boolean> {\n const consistency = await this.checkStateConsistency(store, state, linkerColumnsMap, compositeLinkerMap);\n for (const value of consistency.values()) {\n if (Object.values(value).some(item => !item)) {\n return false;\n }\n }\n return true;\n }\n\n readyDataInputs(state: State): boolean {\n return this.dataInputs.every(name => state.components[name].selectorStates.length > 0);\n }\n\n readyForPlotBuilding(\n store: DataStore,\n state: State,\n consistent: boolean,\n freeOptionsSet: Set<ColumnOrAxisIdString>,\n getSourceInfo: (id: ColumnOrAxisIdString) => ColumnData | AxisData\n ): boolean {\n if (!consistent || !this.readyDataInputs(state)) {\n return false;\n }\n let hasFreeDimensions: boolean = false;\n for (const optionId of freeOptionsSet) {\n const info = getSourceInfo(optionId);\n if (info && info.kind === 'axis' && info.mustBeConsumed) {\n hasFreeDimensions = true;\n break;\n }\n }\n let hasNotSelectedAxisToBeFixed: boolean = false;\n for (const {selectorStates} of Object.values(state.components)) {\n for (const {selectedSource, fixedAxes} of selectorStates) {\n const info = getSourceInfo(selectedSource);\n if (\n info &&\n info.kind === 'column' &&\n info.axesToBeFixed.some(\n id => (fixedAxes ?? []).find(el => el.axisSource === id)?.axisValue === undefined\n )\n ) {\n hasNotSelectedAxisToBeFixed = true;\n break;\n }\n }\n if (hasNotSelectedAxisToBeFixed) {\n break;\n }\n }\n return (\n this.requiredComponents.every(name => state.components[name].selectorStates.length > 0) &&\n !hasFreeDimensions &&\n !hasNotSelectedAxisToBeFixed\n );\n }\n\n abstract createDataByColumns(store: DataStore, state: State): Promise<PlotDataAndSettings['data']>;\n\n abstract createChartSettings(store: DataStore, state: State): Promise<PlotDataAndSettings['settings']>;\n\n async createDataForPlot(store: DataStore, state: State): Promise<PlotDataAndSettings> {\n return {\n data: await this.createDataByColumns(store, state),\n settings: await this.createChartSettings(store, state),\n };\n }\n}\n","import {canonicalizeJson} from '@milaboratories/pl-model-common';\nimport {isLabelColumn} from '@platforma-sdk/model';\nimport type {\n AxisData,\n ColumnData,\n ComponentGuideSimple,\n ComponentState,\n InputState,\n SelectorState,\n SelectorStateFilter,\n SelectorStateSimple,\n SourceOption,\n} from '../common';\nimport {\n COLUMN_LABEL_KEY,\n DISCRETE_FILTER_KEY,\n IS_LINKER_COLUMN,\n SUBSET_FILTER_KEY,\n} from '../constants';\nimport type {DataStore} from '../store';\nimport type {ColumnId, ColumnOrAxisIdString} from '../spec';\nimport {AxisId, columnOrAxisIdFromString, isColumnId} from '../spec';\nimport type {AxisSpec, PColumnSpec, ValueType} from '@milaboratories/pl-model-common';\nimport {axisMustBeConsumed, getColumnOrAxisLabel, getNotAllowedAxes, getStateCopy, LinkerColumnsMap} from '../utils';\nimport {CompositeLinkerMap, getAxesGroups} from '../compositeLinkers';\n\nconst isLinkerColumn = (columnSpec:PColumnSpec) => columnSpec?.annotations?.[IS_LINKER_COLUMN] === 'true';\n\ninterface ComponentControllerSettings {\n isDataComponent: boolean; // X, Y, Data source etc.\n multipleSelectors: boolean; // more than 1 selected column in input\n required: boolean;\n homogeneous: boolean;\n axesAllowed: boolean;\n columnsAllowed: boolean;\n columnsWithExtraAxesAllowed: boolean; // can contain column with extra axes with fixed values\n dimensionConsumer: boolean; // remove extra dimension from data-mapping after selecting a heterogeneous axis\n}\n\ninterface FieldControllerOptions<State extends InputState, Field extends keyof State['components']> {\n componentName: Field;\n allowedTypes: ValueType[];\n checkSourceBySpec?: (spec: AxisSpec | PColumnSpec, state: State) => boolean; // for more complicated logic than type is in allowed types and annotation exists\n annotations?: Record<string, string>;\n parentComponents?: (keyof State['components'])[];\n dependsOn?: (keyof State['components'])[];\n strictlyDependsOnParents?: boolean;\n ignoredOptionIds?: string[];\n settings: Partial<ComponentControllerSettings>;\n}\n\nexport class ComponentController<State extends InputState, Field extends keyof State['components']> {\n private static DefaultSettings: ComponentControllerSettings = {\n isDataComponent: false,\n multipleSelectors: false,\n required: false,\n homogeneous: false,\n axesAllowed: false,\n columnsAllowed: true,\n columnsWithExtraAxesAllowed: true,\n dimensionConsumer: false,\n };\n\n readonly componentName: Field;\n readonly allowedTypes: ValueType[];\n readonly settings: ComponentControllerSettings;\n private readonly dependsOn: (keyof State['components'])[];\n private readonly parentComponents: (keyof State['components'])[];\n private readonly strictlyDependsOnParents: boolean;\n private readonly annotations: Record<string, string>;\n private readonly checkSourceBySpec?: (spec: AxisSpec | PColumnSpec, state: State) => boolean;\n\n constructor({\n componentName,\n allowedTypes,\n settings,\n strictlyDependsOnParents,\n dependsOn = [],\n parentComponents = [],\n annotations = {},\n checkSourceBySpec,\n }: FieldControllerOptions<State, Field>) {\n this.componentName = componentName;\n this.allowedTypes = [...allowedTypes];\n this.settings = {...ComponentController.DefaultSettings, ...settings};\n this.dependsOn = [...dependsOn];\n this.parentComponents = [...parentComponents]; // corresponding data components for meta or X for Y in scatterplot\n this.strictlyDependsOnParents = strictlyDependsOnParents ?? true; // meta-inputs are strictly-depending on parents, X by Y (Y by X) - don't\n this.annotations = {...annotations};\n if (checkSourceBySpec) {\n this.checkSourceBySpec = checkSourceBySpec;\n }\n }\n\n get isRequired(): boolean {\n return this.settings.required;\n }\n\n get isDimensionsConsumer(): boolean {\n return this.settings.dimensionConsumer;\n }\n\n addSelected(state: State, selectorState: SelectorStateSimple | SelectorStateFilter) {\n const nextState = getStateCopy(state);\n nextState.components[this.componentName].selectorStates.push(selectorState as SelectorStateFilter);\n\n // ***\n // here should be logic for possibly parent qualifications updating\n // ***\n\n return nextState;\n }\n\n deleteSelected(state: State, selectedSourceStr: ColumnOrAxisIdString) {\n const nextState = getStateCopy(state);\n // ***\n // here should be logic for removing unnecessary qualifications (it can appear when some sources are deleted)\n // ***\n nextState.components[this.componentName].selectorStates = (\n nextState.components[this.componentName].selectorStates as SelectorState[]\n ).filter(item => item.selectedSource !== selectedSourceStr);\n return nextState;\n }\n\n async checkStateConsistency(\n store: DataStore,\n state: State,\n linkerColumnsMap: LinkerColumnsMap,\n compositeLinkerMap: CompositeLinkerMap\n ): Promise<Record<string, boolean>> {\n const componentState = state.components[this.componentName as keyof InputState];\n const {parentAxes, linkerAxes} = await this.getAllowedAxes(store, state, linkerColumnsMap);\n function isAxisInSet(a: AxisSpec) {\n const id = AxisId.fromAxisSpec(a).toCanonicalString();\n return parentAxes.has(id) || linkerAxes.has(id);\n }\n\n const consistencyData = await Promise.all(\n componentState.selectorStates.map(async ({selectedSource}) => {\n const sourceId = columnOrAxisIdFromString(selectedSource);\n // if column selected - check all axes of column\n if (isColumnId(sourceId)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(sourceId);\n if (!columnSpec) {\n // if column is not in store - current store and selected column are not consistent\n return false;\n }\n\n const parents = this.parentComponents;\n if (parents.length === 0) {\n return true;\n }\n if ((this.strictlyDependsOnParents && !this.settings.columnsWithExtraAxesAllowed) && !this.settings.isDataComponent) {\n return columnSpec.axesSpec.every(a => isAxisInSet(a));\n } else if (this.settings.columnsWithExtraAxesAllowed && !this.settings.isDataComponent) {\n if (columnSpec.axesSpec.some(a => isAxisInSet(a))) {\n return true;\n }\n const groups = getAxesGroups(columnSpec.axesSpec);\n if (!groups) {\n return false;\n }\n return groups.some(group => compositeLinkerMap.has(canonicalizeJson(group)));\n } else {\n return parentAxes.size === 0 || columnSpec.axesSpec.some(a => isAxisInSet(a));\n }\n }\n return parentAxes.has(selectedSource);\n })\n );\n return (componentState.selectorStates as (SelectorStateSimple | SelectorStateFilter)[]).reduce(\n (res: Record<string, boolean>, item, idx) => {\n res[item.selectedSource] = consistencyData[idx];\n return res;\n },\n {}\n );\n }\n\n async getProducingAxes(store: DataStore, state: State) {\n const componentState = state.components[this.componentName as keyof InputState];\n const selectedHereIds = componentState.selectorStates.map(s => columnOrAxisIdFromString(s.selectedSource));\n const selectedHereColumnIds = selectedHereIds.filter(id => isColumnId(id));\n\n const axes = new Set<ColumnOrAxisIdString>();\n\n const infoList = await Promise.all(\n selectedHereColumnIds.map(id => {\n return store.pFrameProvider.getColumnSpecById(id);\n })\n );\n\n infoList.forEach(columnSpec => {\n if (columnSpec) {\n columnSpec.axesSpec.forEach(axisSpec => {\n axes.add(AxisId.fromAxisSpec(axisSpec).toCanonicalString());\n });\n }\n });\n return axes;\n }\n\n getParentSelectedSources(store: DataStore, state: State): (ColumnId | AxisId)[] {\n const selectedSources = this.parentComponents.reduce((res: (ColumnId | AxisId)[], item) => {\n const selectedHere = state.components[item].selectorStates.map(s =>\n columnOrAxisIdFromString(s.selectedSource)\n );\n res.push(...selectedHere);\n return res;\n }, []);\n\n // ***\n // consider parent qualifications without selected here\n // ***\n return selectedSources;\n }\n\n async getParentAxes(store: DataStore, state: State) {\n const parentSelectedSources = this.getParentSelectedSources(store, state);\n const axes = new Set<ColumnOrAxisIdString>();\n\n for (const source of parentSelectedSources) {\n if (isColumnId(source)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(source);\n columnSpec?.axesSpec?.forEach(spec => {\n const id = AxisId.fromAxisSpec(spec);\n axes.add(id.toCanonicalString());\n });\n }\n }\n return axes;\n }\n\n async getAllowedAxes(store: DataStore, state: State, linkerColumnsMap:LinkerColumnsMap) {\n const parentSelectedSources = this.getParentSelectedSources(store, state);\n const parentAxes = new Set<ColumnOrAxisIdString>();\n const parentAxesList:AxisSpec[] = [];\n const linkerAxes = new Set<ColumnOrAxisIdString>();\n const optionsInfo: Map<string, AxisData | ColumnData> = new Map();\n\n for (const source of parentSelectedSources) {\n if (isColumnId(source)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(source);\n for (const spec of columnSpec?.axesSpec ?? []) {\n const id = AxisId.fromAxisSpec(spec);\n const idStr = id.toCanonicalString();\n if (parentAxes.has(idStr)) {\n continue;\n }\n parentAxes.add(idStr);\n parentAxesList.push(spec);\n const mustBeConsumed = axisMustBeConsumed(spec); // request unique values only for non-homogenous axes\n optionsInfo.set(idStr, {\n kind: 'axis',\n name: spec.name,\n label: await getColumnOrAxisLabel(store, idStr, [\n source.toCanonicalString(),\n ]),\n type: spec.type,\n mustBeConsumed,\n dividable: false,\n spec,\n annotations: spec.annotations,\n isSubsetFilter: spec.annotations?.[SUBSET_FILTER_KEY] === 'true',\n isDiscreteFilter:\n spec.type === 'String' || spec.annotations?.[DISCRETE_FILTER_KEY] === 'true',\n parentSources: [source.toCanonicalString()],\n });\n }\n }\n }\n\n let nextAxes = [...parentAxes];\n while(nextAxes.length) {\n const next:string[] = [];\n for (const addedAxis of nextAxes) {\n if (linkerColumnsMap[addedAxis]) {\n const availableAxes = Object.keys(linkerColumnsMap[addedAxis]);\n for (const availableAxis of availableAxes) {\n if (!linkerAxes.has(availableAxis)) {\n next.push(availableAxis);\n //allowedAxes.add(availableAxis);\n linkerAxes.add(availableAxis);\n const {spec, id} = linkerColumnsMap[addedAxis][availableAxis];\n for (const axisSpec of spec.axesSpec) {\n const axisId = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n if (!optionsInfo.has(axisId)) {\n optionsInfo.set(axisId, {\n kind: 'axis',\n name: axisSpec.name,\n label: axisSpec.annotations?.[COLUMN_LABEL_KEY] ?? '',\n type: axisSpec.type,\n mustBeConsumed: false,\n dividable: false,\n spec: axisSpec,\n annotations: axisSpec.annotations,\n isSubsetFilter: axisSpec.annotations?.[SUBSET_FILTER_KEY] === 'true',\n isDiscreteFilter: axisSpec.type === 'String' || axisSpec.annotations?.[DISCRETE_FILTER_KEY] === 'true',\n parentSources: [id.toCanonicalString()],\n });\n }\n }\n }\n }\n }\n }\n nextAxes = next;\n }\n\n return {parentAxes, parentAxesList, linkerAxes, optionsInfo};\n }\n\n async getOptions(\n store: DataStore,\n state: State,\n labelsMap: Record<string, string>,\n consumedSourcesSet: Set<ColumnOrAxisIdString>,\n linkerColumnsMap: LinkerColumnsMap,\n compositeLinkerMap: CompositeLinkerMap,\n dataColumnPredicate: (spec: PColumnSpec) => boolean,\n ignoredNamesSet: Set<string> = new Set(),\n fixedSelectedSet: Set<ColumnOrAxisIdString> = new Set()\n ): Promise<ComponentGuideSimple> {\n const multipleSelectors = this.settings.multipleSelectors;\n const required = this.settings.required;\n const stateConsistency = await this.checkStateConsistency(store, state, linkerColumnsMap, compositeLinkerMap);\n\n if (this.dependsOn.length && this.dependsOn.some(dep => state.components[dep].selectorStates.length === 0)) {\n return {multipleSelectors, required, stateConsistency, options: [], optionsInfo: new Map()};\n }\n\n if (\n this.strictlyDependsOnParents &&\n !this.settings.isDataComponent &&\n this.parentComponents.some(name => state.components[name].selectorStates.length === 0)\n ) {\n return {multipleSelectors, required, stateConsistency, options: [], optionsInfo: new Map()};\n }\n\n const parentSelectedSources = this.getParentSelectedSources(store, state);\n const allowedColumns = (\n await store.pFrameProvider.getColumns([], false, this.allowedTypes, undefined, this.annotations)\n ).filter(item => !consumedSourcesSet.has(item.toCanonicalString()));\n\n const {parentAxes, linkerAxes, parentAxesList, optionsInfo} = await this.getAllowedAxes(store, state, linkerColumnsMap);\n\n const thisState: ComponentState = state.components[this.componentName];\n const options: SourceOption[] = [];\n if (this.settings.axesAllowed) {\n for (const idStr of parentAxes) {\n const id = columnOrAxisIdFromString(idStr) as AxisId;\n const axisData = optionsInfo.get(id.toCanonicalString()) as AxisData;\n\n const typeOK = this.allowedTypes.includes(axisData.spec.type);\n const annotationsOK = Object.entries(this.annotations).every(\n ([k, v]) => axisData.spec.annotations?.[k] === v\n );\n const checkBySpecOK = this.checkSourceBySpec ? this.checkSourceBySpec(axisData.spec, state) : true;\n const axisNatureOK = !this.settings.homogeneous || !axisData?.mustBeConsumed;\n const decreasingDimensionsOK = !consumedSourcesSet.has(idStr);\n const ignored = ignoredNamesSet.has(id.name) || fixedSelectedSet.has(id.toCanonicalString());\n const selectedHere = thisState.selectorStates.some(item => item.selectedSource === idStr);\n\n if (typeOK && annotationsOK && checkBySpecOK && axisNatureOK && decreasingDimensionsOK && !ignored && !selectedHere) {\n options.push({value: idStr});\n }\n }\n }\n\n if (this.settings.columnsAllowed) {\n const strictlyCompatible = !this.settings.columnsWithExtraAxesAllowed && this.strictlyDependsOnParents;\n for (const columnId of allowedColumns) {\n const columnIdString = columnId.toCanonicalString();\n const id = columnOrAxisIdFromString(columnIdString);\n\n const columnSpec = await store.pFrameProvider.getColumnSpecById(id);\n if (!columnSpec) {\n continue;\n }\n const extraAxesIds = getNotAllowedAxes(\n columnSpec,\n parentAxesList,\n parentAxes,\n linkerAxes,\n compositeLinkerMap\n ).map((axisSpec) => AxisId.fromAxisSpec(axisSpec).toCanonicalString());\n\n const extraAxesSet = new Set(extraAxesIds);\n if (\n // do not add to available options label columns, or columns that are not fit by custom spec condition, or columns that are not fit by condition for data inputs\n isLabelColumn(columnSpec) || isLinkerColumn(columnSpec) ||\n (this.checkSourceBySpec && !this.checkSourceBySpec(columnSpec, state)) ||\n (this.settings.isDataComponent && !dataColumnPredicate(columnSpec)) ||\n strictlyCompatible && extraAxesIds.length > 0 ||\n parentSelectedSources.length && extraAxesIds.length > 0 && !columnSpec.axesSpec.some((axisSpec) => {\n const axisIdStr = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n return parentAxes.has(axisIdStr) || linkerAxes.has(axisIdStr);\n })\n ) {\n continue;\n }\n const axesIds = columnSpec?.axesSpec?.map(axisSpec => AxisId.fromAxisSpec(axisSpec).toCanonicalString()) ?? [];\n const extraAxesIndexes:Record<string, number> = {};\n if (this.settings.columnsWithExtraAxesAllowed) {\n axesIds.forEach((id, idx) => {\n if (extraAxesSet.has(id)) {\n extraAxesIndexes[id] = idx;\n }\n });\n }\n if (columnSpec) {\n const label =\n labelsMap[columnIdString] ??\n (await getColumnOrAxisLabel(store, columnId.toCanonicalString(), []));\n const columnInfo: ColumnData = {\n kind: 'column',\n name: columnSpec.name,\n label,\n type: columnSpec.valueType,\n spec: columnSpec,\n annotations: columnSpec.annotations,\n isSubsetFilter: columnSpec.annotations?.[SUBSET_FILTER_KEY] === 'true',\n isDiscreteFilter:\n columnSpec.valueType === 'String' ||\n columnSpec.annotations?.[DISCRETE_FILTER_KEY] === 'true',\n axesToBeFixed: extraAxesIds,\n axesToBeFixedIndexes: extraAxesIndexes,\n };\n optionsInfo.set(id.toCanonicalString(), columnInfo);\n }\n\n const ignored = ignoredNamesSet.has(id.name) || fixedSelectedSet.has(id.toCanonicalString());\n const selectedHere = state.components[this.componentName].selectorStates.some(\n item => item.selectedSource === columnIdString\n );\n if (!ignored && !selectedHere) {\n options.push({value: columnIdString});\n }\n }\n }\n return {multipleSelectors, required, stateConsistency, options, optionsInfo};\n }\n}\n","import canonicalize from 'canonicalize';\nimport type {\n ComponentStateFilter,\n ComponentStateSimple,\n DataByColumns,\n InputStateParent,\n} from '../../common';\nimport {PValue} from '../../store';\nimport {ControllerBase, PlotDataAndSettings} from '../ControllerBase';\nimport {ComponentController} from '../ComponentController';\nimport {columnOrAxisIdFromString, isColumnId} from '../../spec';\nimport type {DataStore} from '../../store';\nimport {\n checkSourceBySpecForFilters, getAllLinkerMaps, getAxesSpecsFromSources,\n getColumnOrAxisLabel,\n getColumnOrAxisValueLabelsId,\n getFiltersFromStates, getLinkerColumnsForSource,\n} from '../../utils';\nimport {AxisId, ColumnId} from '../../spec';\nimport type {ColumnsProvider} from '../../pframe/ColumnsProvider';\n\nexport interface BubbleUIState extends InputStateParent<'bubble'> {\n type: 'bubble';\n components: {\n valueSize: ComponentStateSimple;\n valueColor: ComponentStateSimple;\n x: ComponentStateSimple;\n y: ComponentStateSimple;\n filters: ComponentStateFilter;\n tabBy: ComponentStateFilter;\n facetBy: ComponentStateSimple;\n tooltipContent: ComponentStateSimple;\n };\n}\n\nexport const InitialBubbleState: BubbleUIState = {\n type: 'bubble',\n components: {\n valueSize: {type: 'simple', selectorStates: []},\n valueColor: {type: 'simple', selectorStates: []},\n x: {type: 'simple', selectorStates: []},\n y: {type: 'simple', selectorStates: []},\n filters: {type: 'filter', selectorStates: []},\n tabBy: {type: 'filter', selectorStates: []},\n facetBy: {type: 'simple', selectorStates: []},\n tooltipContent: {type: 'simple', selectorStates: []},\n },\n dividedAxes: {},\n};\n\nfunction getMultiSourceColumn(data: Awaited<ReturnType<ColumnsProvider['getTableOuterJoin']>>, selectedSources: string[]) {\n if (!selectedSources.length) {\n return [];\n }\n const selectedIds = selectedSources.map(str => columnOrAxisIdFromString(str));\n const n = Object.values(data.columnsData)[0].length;\n const result: string[] = [];\n for (let i = 0; i < n; i++) {\n const value = selectedIds\n .map((id) => {\n const key = id.toCanonicalString();\n return isColumnId(id)\n ? data.columnsData[key][i]\n : data.axesData[key][i];\n })\n .join(', ');\n result.push(value);\n }\n return result;\n}\n\nexport class BubbleStateController extends ControllerBase<BubbleUIState> {\n dataInputs = ['valueSize', 'valueColor'];\n dontAllowUnfilteredHighCardinality = true;\n constructor() {\n super({\n valueSize: new ComponentController<BubbleUIState, 'valueSize'>({\n componentName: 'valueSize',\n allowedTypes: ['Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['valueColor'],\n settings: {\n isDataComponent: true,\n columnsAllowed: true,\n axesAllowed: false,\n required: true,\n }\n }),\n valueColor: new ComponentController<BubbleUIState, 'valueColor'>({\n componentName: 'valueColor',\n allowedTypes: ['Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['valueSize'],\n settings: {\n isDataComponent: true,\n columnsAllowed: true,\n axesAllowed: false,\n required: true,\n },\n }),\n x: new ComponentController<BubbleUIState, 'x'>({\n componentName: 'x',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['valueSize', 'valueColor'],\n settings: {\n required: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: false,\n },\n }),\n y: new ComponentController<BubbleUIState, 'y'>({\n componentName: 'y',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['valueSize', 'valueColor'],\n settings: {\n required: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: false,\n },\n }),\n tooltipContent: new ComponentController<BubbleUIState, 'tooltipContent'>({\n componentName: 'tooltipContent',\n allowedTypes: ['String', 'Int', 'Long', 'Float', 'Double'],\n strictlyDependsOnParents: true,\n parentComponents: ['valueSize', 'valueColor'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n multipleSelectors: true,\n },\n }),\n facetBy: new ComponentController<BubbleUIState, 'facetBy'>({\n componentName: 'facetBy',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['valueSize', 'valueColor'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n })\n }, {\n filters: new ComponentController<BubbleUIState, 'filters'>({\n componentName: 'filters',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['valueSize', 'valueColor'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n checkSourceBySpec: checkSourceBySpecForFilters\n }),\n tabBy: new ComponentController<BubbleUIState, 'tabBy'>({\n componentName: 'tabBy',\n allowedTypes: ['String', 'Int'],\n strictlyDependsOnParents: true,\n parentComponents: ['valueSize', 'valueColor'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n dimensionConsumer: true,\n },\n }),\n });\n }\n\n async getMustBeConsumedAxes(store: DataStore, state: BubbleUIState):Promise<Set<string>> {\n if (!state.components.valueColor.selectorStates.length) {\n return new Set<string>();\n }\n const sourceId = state.components.valueColor.selectorStates[0].selectedSource;\n const spec = await store.pFrameProvider.getColumnSpecById(columnOrAxisIdFromString(sourceId));\n if (!spec) {\n return new Set<string>();\n }\n return new Set(spec.axesSpec.map((s) => AxisId.fromAxisSpec(s).toCanonicalString()))\n }\n\n async createDataByColumns(store: DataStore, state: BubbleUIState): Promise<PlotDataAndSettings['data']> {\n const valueColorColumnIdString = state.components.valueColor.selectorStates[0]?.selectedSource;\n const valueSizeColumnIdString = state.components.valueSize.selectorStates[0]?.selectedSource;\n if (!valueColorColumnIdString || !valueSizeColumnIdString) {\n throw Error('Value column is not valid');\n }\n const valueColorColumnId = columnOrAxisIdFromString(valueColorColumnIdString);\n const valueSizeColumnId = columnOrAxisIdFromString(valueSizeColumnIdString);\n if ((!valueColorColumnId || !valueSizeColumnId) || !isColumnId(valueColorColumnId) && !isColumnId(valueSizeColumnId)) {\n throw Error('Value column is not valid');\n }\n const dataByColumns: DataByColumns = {\n type: 'columns',\n id: canonicalize(state.components) ?? '',\n values: {},\n };\n\n const {linkerColumnsMap, compositeLinkerMap} = await getAllLinkerMaps(store);\n\n const filterSelectedStates = [\n ...state.components.filters.selectorStates,\n ...state.components.tabBy.selectorStates\n ]\n // filters for column/axes data requests\n const filters = getFiltersFromStates(filterSelectedStates);\n const filterColumns = filterSelectedStates.map(s => columnOrAxisIdFromString(s.selectedSource)).filter(isColumnId);\n\n const primaryColumns = ([valueColorColumnId, valueSizeColumnId]).filter(isColumnId);\n const parentSources = primaryColumns.map((v) => v.toCanonicalString());\n const parentAxesList = await getAxesSpecsFromSources(store, parentSources);\n const inputs = [\n state.components.facetBy,\n state.components.x,\n state.components.y,\n state.components.tooltipContent\n ];\n const secondarySources: (ColumnId | AxisId)[] = []; // primary sources are the only value column\n const primarySourcesFixedAxes:{idx: number, value: PValue}[][] = primaryColumns.map(() => []);\n const secondarySourcesFixedAxes:{idx: number, value: PValue}[][] = [];\n const linkerColumns:ColumnId[] = [];\n\n for (const {selectedSource, fixedAxes} of filterSelectedStates) {\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n primarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n }\n\n for (const input of inputs) {\n for (const {selectedSource, fixedAxes} of input.selectorStates) {\n secondarySources.push(columnOrAxisIdFromString(selectedSource)!);\n secondarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n if (labelsColumnId) {\n secondarySources.push(labelsColumnId);\n }\n }\n }\n\n const data = await store.pFrameProvider.getTableOuterJoin(\n [...primaryColumns, ...linkerColumns, ...filterColumns],\n secondarySources,\n filters,\n true,\n primarySourcesFixedAxes,\n secondarySourcesFixedAxes\n );\n\n secondarySources.forEach(item => {\n const key = item.toCanonicalString();\n dataByColumns.values[key] = isColumnId(item)\n ? data.columnsData[key]\n : data.axesData[key];\n });\n dataByColumns.values[valueColorColumnIdString] = isColumnId(valueColorColumnId)\n ? data.columnsData[valueColorColumnIdString]\n : data.axesData[valueColorColumnIdString]\n dataByColumns.values[valueSizeColumnIdString] = isColumnId(valueSizeColumnId)\n ? data.columnsData[valueSizeColumnIdString]\n : data.axesData[valueSizeColumnIdString]\n\n const xAxes = state.components.x.selectorStates.map(state => state.selectedSource);\n const xKey = xAxes.join(', ');\n const xAxesLabeled = await Promise.all(xAxes.map(\n async id => (await getColumnOrAxisValueLabelsId(store, id, parentSources))?.toCanonicalString() ?? id,\n ));\n dataByColumns.values[xKey] = getMultiSourceColumn(data, xAxes);\n dataByColumns.values.xLabels = getMultiSourceColumn(data, xAxesLabeled);\n\n // y column should contain yGroup axes\n const yAxes = state.components.y.selectorStates.map(state => state.selectedSource);\n const yKey = yAxes.join(', ');\n const yAxesLabeled = await Promise.all(yAxes.map(\n async id => (await getColumnOrAxisValueLabelsId(store, id, parentSources))?.toCanonicalString() ?? id,\n ));\n dataByColumns.values[yKey] = getMultiSourceColumn(data, yAxes);\n dataByColumns.values.yLabels = getMultiSourceColumn(data, yAxesLabeled);\n\n return {byColumns: dataByColumns};\n }\n\n async createChartSettings(store: DataStore, state: BubbleUIState): Promise<Record<string, unknown>> {\n const valueColorColumnIdString = state.components.valueColor.selectorStates[0]?.selectedSource;\n const valueSizeColumnIdString = state.components.valueSize.selectorStates[0]?.selectedSource;\n if (!valueColorColumnIdString || !valueSizeColumnIdString) {\n throw Error('Value column is not valid');\n }\n const valueColorColumnId = columnOrAxisIdFromString(valueColorColumnIdString);\n const valueSizeColumnId = columnOrAxisIdFromString(valueSizeColumnIdString);\n if (!isColumnId(valueColorColumnId) && !isColumnId(valueSizeColumnId)) {\n throw Error('Value column is not valid');\n }\n\n const parentSources = ([valueColorColumnId, valueSizeColumnId]).filter(isColumnId).map((v) => v.toCanonicalString());\n const valueColor = {\n type: 'column',\n value: valueColorColumnIdString,\n label: await getColumnOrAxisLabel(store, valueColorColumnIdString, []),\n };\n const valueSize = {\n type: 'column',\n value: valueSizeColumnIdString,\n label: await getColumnOrAxisLabel(store, valueSizeColumnIdString, []),\n };\n const xAxes = state.components.x.selectorStates.map(({selectedSource}) => selectedSource)\n const xKey = xAxes.join(', ');\n\n const yAxes = state.components.y.selectorStates.map(({selectedSource}) => selectedSource)\n const yKey = yAxes.join(', ');\n\n const facetBy = await Promise.all(state.components.facetBy.selectorStates.map(async selectorState => ({\n type: 'column',\n value:\n (await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources))?.toCanonicalString() ??\n selectorState.selectedSource,\n })));\n\n const xAxisTitle = (await Promise.all(state.components.x.selectorStates\n .map(state => getColumnOrAxisLabel(store, state.selectedSource, parentSources))))\n .join(', ');\n const yAxisTitle = (await Promise.all(state.components.y.selectorStates\n .map(state => getColumnOrAxisLabel(store, state.selectedSource, parentSources))))\n .join(', ');\n\n const tooltipContent = await Promise.all(\n state.components.tooltipContent.selectorStates.map(async selectorState => {\n const idString = selectorState.selectedSource;\n return {\n type: 'column',\n label: (await getColumnOrAxisLabel(store, idString, parentSources)) || idString,\n value: idString,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, idString, parentSources))?.toCanonicalString() ??\n idString,\n };\n })\n );\n\n return {\n type: 'bubble',\n valueColor: valueColor,\n valueSize: valueSize,\n xColumn: {\n type: 'column',\n value: xKey,\n label: xAxisTitle,\n valueLabels: 'xLabels'\n },\n yColumn: {\n type: 'column',\n value: yKey,\n label: yAxisTitle,\n valueLabels: 'yLabels'\n },\n facetBy,\n tooltips: {\n show: true,\n content: tooltipContent\n }\n };\n }\n}\n","import canonicalize from 'canonicalize';\nimport type {ComponentStateFilter, ComponentStateSimple, DataByColumns, InputStateParent} from '../../common';\nimport {PValue} from '../../store';\nimport {ControllerBase, PlotDataAndSettings} from '../ControllerBase';\nimport {ComponentController} from '../ComponentController';\nimport {columnOrAxisIdFromString, isColumnId} from '../../spec';\nimport type {DataStore} from '../../store';\nimport {\n checkSourceBySpecForFilters,\n getAllLinkerMaps, getAxesSpecsFromSources,\n getColumnOrAxisLabel,\n getColumnOrAxisValueLabelsId,\n getFiltersFromStates,\n getLinkerColumnsForSource,\n getLinkerColumnsMap,\n} from '../../utils';\nimport {AxisId, ColumnId} from '../../spec';\n\nexport interface HistogramUIState extends InputStateParent<'histogram'> {\n type: 'histogram';\n components: {\n value: ComponentStateSimple;\n grouping: ComponentStateSimple;\n filters: ComponentStateFilter;\n tabBy: ComponentStateFilter;\n facetBy: ComponentStateSimple;\n };\n}\n\nexport const InitialHistogramState: HistogramUIState = {\n type: 'histogram',\n components: {\n value: {type: 'simple', selectorStates: []},\n grouping: {type: 'simple', selectorStates: []},\n filters: {type: 'filter', selectorStates: []},\n tabBy: {type: 'filter', selectorStates: []},\n facetBy: {type: 'simple', selectorStates: []},\n },\n dividedAxes: {},\n};\n\nexport class HistogramStateController extends ControllerBase<HistogramUIState> {\n dataInputs = ['value'];\n\n constructor() {\n super(\n {\n value: new ComponentController<HistogramUIState, 'value'>({\n componentName: 'value',\n allowedTypes: ['Int', 'Long', 'Double', 'Float'],\n settings: {\n isDataComponent: true,\n columnsAllowed: true,\n axesAllowed: false,\n required: true,\n },\n }),\n grouping: new ComponentController<HistogramUIState, 'grouping'>({\n componentName: 'grouping',\n allowedTypes: ['String', 'Int', 'Long'],\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n axesAllowed: true,\n multipleSelectors: false,\n },\n }),\n facetBy: new ComponentController<HistogramUIState, 'facetBy'>({\n componentName: 'facetBy',\n allowedTypes: ['String', 'Int', 'Long'],\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n }),\n },\n {\n filters: new ComponentController<HistogramUIState, 'filters'>({\n componentName: 'filters',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Float'],\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n checkSourceBySpec: checkSourceBySpecForFilters,\n }),\n tabBy: new ComponentController<HistogramUIState, 'tabBy'>({\n componentName: 'tabBy',\n allowedTypes: ['String', 'Int'],\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n dimensionConsumer: true,\n },\n }),\n }\n );\n }\n\n async createDataByColumns(store: DataStore, state: HistogramUIState): Promise<PlotDataAndSettings['data']> {\n const valueColumnIdString = state.components.value.selectorStates[0]?.selectedSource;\n if (!valueColumnIdString) {\n throw Error('Value column is not valid');\n }\n const valueColumnId = columnOrAxisIdFromString(valueColumnIdString);\n if (!isColumnId(valueColumnId)) {\n throw Error('Value column is not valid');\n }\n const dataByColumns: DataByColumns = {\n type: 'columns',\n id: canonicalize(state.components) ?? '',\n values: {},\n };\n\n const {linkerColumnsMap, compositeLinkerMap} = await getAllLinkerMaps(store);\n\n const filterSelectedStates = [\n ...state.components.filters.selectorStates,\n ...state.components.tabBy.selectorStates,\n ];\n // filters for column/axes data requests\n const filters = getFiltersFromStates(filterSelectedStates);\n const filterColumns = filterSelectedStates\n .map(s => columnOrAxisIdFromString(s.selectedSource))\n .filter(isColumnId);\n\n const parentSources = [valueColumnIdString];\n const parentAxesList = await getAxesSpecsFromSources(store, parentSources);\n\n const inputs = [state.components.facetBy, state.components.grouping];\n const secondarySources: (ColumnId | AxisId)[] = []; // primary sources are the only value column\n const primarySourcesFixedAxes: {idx: number; value: PValue}[][] = [[]];\n const secondarySourcesFixedAxes: {idx: number; value: PValue}[][] = [];\n const linkerColumns: ColumnId[] = [];\n\n for (const {selectedSource, fixedAxes} of filterSelectedStates) {\n linkerColumns.push(\n ...(await getLinkerColumnsForSource(store, linkerColumnsMap, compositeLinkerMap, parentAxesList, selectedSource, fixedAxes))\n );\n primarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n }\n\n for (const input of inputs) {\n for (const {selectedSource, fixedAxes} of input.selectorStates) {\n secondarySources.push(columnOrAxisIdFromString(selectedSource)!);\n secondarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n linkerColumns.push(\n ...(await getLinkerColumnsForSource(store, linkerColumnsMap, compositeLinkerMap, parentAxesList, selectedSource, fixedAxes))\n );\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n if (labelsColumnId) {\n secondarySources.push(labelsColumnId);\n }\n }\n }\n\n const data = await store.pFrameProvider.getTableOuterJoin(\n [valueColumnId, ...linkerColumns, ...filterColumns],\n secondarySources,\n filters,\n true,\n primarySourcesFixedAxes,\n secondarySourcesFixedAxes\n );\n\n secondarySources.forEach(item => {\n const key = item.toCanonicalString();\n dataByColumns.values[key] = isColumnId(item) ? data.columnsData[key] : data.axesData[key];\n });\n dataByColumns.values[valueColumnId.toCanonicalString()] = data.columnsData[valueColumnId.toCanonicalString()];\n\n return {byColumns: dataByColumns};\n }\n\n async createChartSettings(store: DataStore, state: HistogramUIState): Promise<Record<string, unknown>> {\n const valueColumnIdString = state.components.value.selectorStates[0]?.selectedSource;\n if (!valueColumnIdString) {\n throw Error('Value column is not valid');\n }\n const valueColumnId = columnOrAxisIdFromString(valueColumnIdString);\n if (!isColumnId(valueColumnId)) {\n throw Error('Value column is not valid');\n }\n\n const parentSources = [valueColumnIdString];\n const value = {\n type: 'column',\n value: valueColumnIdString,\n label: await getColumnOrAxisLabel(store, valueColumnIdString, []),\n };\n const facetBy = await Promise.all(\n state.components.facetBy.selectorStates.map(async selectorState => ({\n type: 'column',\n value:\n (\n await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources)\n )?.toCanonicalString() ?? selectorState.selectedSource,\n }))\n );\n let grouping;\n if (state.components.grouping.selectorStates.length) {\n const {selectedSource} = state.components.grouping.selectorStates[0];\n grouping = {\n type: 'column',\n value: selectedSource,\n label: await getColumnOrAxisLabel(store, selectedSource, parentSources),\n valueLabels: (\n await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources)\n )?.toCanonicalString(),\n };\n }\n return {\n type: 'histogram',\n valueColumn: value,\n facetBy,\n grouping,\n };\n }\n}\n","import canonicalize from 'canonicalize';\nimport type {\n ComponentStateFilter,\n ComponentStateSimple,\n DataByColumns,\n InputState,\n InputStateParent,\n} from '../../common';\nimport {ControllerBase, PlotDataAndSettings} from '../ControllerBase';\nimport {ComponentController} from '../ComponentController';\nimport type {AxisId, ColumnId} from '../../spec';\nimport {columnOrAxisIdFromString, isColumnId} from '../../spec';\nimport type {DataStore, PValue} from '../../store';\nimport {\n checkSourceBySpecForFilters, getAllLinkerMaps, getAxesSpecsFromSources,\n getColumnOrAxisLabel,\n getColumnOrAxisValueLabelsId,\n getFiltersFromStates, getLinkerColumnsForSource,\n} from '../../utils';\n\nexport interface DiscreteUIState extends InputStateParent<'discrete'> {\n type: 'discrete';\n components: {\n y: ComponentStateSimple;\n filters: ComponentStateFilter;\n tabBy: ComponentStateFilter;\n facetBy: ComponentStateSimple;\n primaryGrouping: ComponentStateSimple;\n secondaryGrouping: ComponentStateSimple;\n };\n}\n\nexport const InitialDiscreteState: DiscreteUIState = {\n type: 'discrete',\n components: {\n y: {type: 'simple', selectorStates: []},\n filters: {type: 'filter', selectorStates: []},\n tabBy: {type: 'filter', selectorStates: []},\n facetBy: {type: 'simple', selectorStates: []},\n primaryGrouping: {type: 'simple', selectorStates: []},\n secondaryGrouping: {type: 'simple', selectorStates: []},\n },\n dividedAxes: {},\n};\n\nexport function isDiscreteState(state: InputState): state is DiscreteUIState {\n return state.type == 'discrete';\n}\n\nexport class DiscreteStateController extends ControllerBase<DiscreteUIState> {\n dataInputs = ['y'];\n dontAllowUnfilteredHighCardinality = true;\n\n constructor() {\n super(\n {\n y: new ComponentController<DiscreteUIState, 'y'>({\n componentName: 'y',\n allowedTypes: ['Int', 'Double', 'Long', 'Float'],\n settings: { isDataComponent: true },\n }),\n primaryGrouping: new ComponentController<DiscreteUIState, 'primaryGrouping'>({\n componentName: 'primaryGrouping',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['y'],\n dependsOn: ['y'],\n settings: {\n axesAllowed: true,\n homogeneous: true,\n },\n }),\n secondaryGrouping: new ComponentController<DiscreteUIState, 'secondaryGrouping'>({\n componentName: 'secondaryGrouping',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['y'],\n dependsOn: ['primaryGrouping'],\n settings: {\n axesAllowed: true,\n homogeneous: true,\n },\n }),\n facetBy: new ComponentController<DiscreteUIState, 'facetBy'>({\n componentName: 'facetBy',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['y'],\n dependsOn: ['y'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n }),\n },\n {\n filters: new ComponentController<DiscreteUIState, 'filters'>({\n componentName: 'filters',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['y'],\n dependsOn: ['y'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n checkSourceBySpec: checkSourceBySpecForFilters\n }),\n tabBy: new ComponentController<DiscreteUIState, 'tabBy'>({\n componentName: 'tabBy',\n allowedTypes: ['String', 'Int'],\n strictlyDependsOnParents: true,\n parentComponents: ['y'],\n dependsOn: ['y'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n },\n }),\n },\n );\n }\n\n async createDataByColumns(store: DataStore, state: DiscreteUIState): Promise<PlotDataAndSettings['data']> {\n const yColumnIdString = state.components.y.selectorStates[0].selectedSource;\n const yColumnIdWithQ = columnOrAxisIdFromString(yColumnIdString);\n if (!yColumnIdString || !isColumnId(yColumnIdWithQ)) {\n throw Error('Y column is not valid');\n }\n const dataByColumns: DataByColumns = {\n type: 'columns',\n id: canonicalize(state.components) ?? '',\n values: {},\n };\n\n const {linkerColumnsMap, compositeLinkerMap} = await getAllLinkerMaps(store);\n\n const filterSelectedStates = [\n ...state.components.filters.selectorStates,\n ...state.components.tabBy.selectorStates\n ]\n // filters for column/axes data requests\n const filters = getFiltersFromStates(filterSelectedStates);\n const filterColumns = filterSelectedStates.map(s => columnOrAxisIdFromString(s.selectedSource)).filter(isColumnId);\n\n const parentSources = [yColumnIdString];\n const parentAxesList = await getAxesSpecsFromSources(store, parentSources);\n const inputs = [state.components.primaryGrouping, state.components.secondaryGrouping, state.components.facetBy];\n\n const secondarySources: (ColumnId | AxisId)[] = []; // primary sources are the only Y column\n const primarySourcesFixedAxes:{idx: number, value: PValue}[][] = [[]];\n const secondarySourcesFixedAxes:{idx: number, value: PValue}[][] = [];\n const linkerColumns:ColumnId[] = [];\n\n for (const {selectedSource, fixedAxes} of filterSelectedStates) {\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n primarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n }\n\n for (const input of inputs) {\n for (const {selectedSource, fixedAxes} of input.selectorStates) {\n secondarySources.push(columnOrAxisIdFromString(selectedSource)!);\n secondarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n if (labelsColumnId) {\n secondarySources.push(labelsColumnId);\n }\n }\n }\n const data = await store.pFrameProvider.getTableOuterJoin(\n [yColumnIdWithQ, ...linkerColumns, ...filterColumns],\n secondarySources,\n filters,\n true,\n primarySourcesFixedAxes,\n secondarySourcesFixedAxes\n );\n\n secondarySources.forEach(item => {\n const key = item.toCanonicalString();\n dataByColumns.values[key] = isColumnId(item)\n ? data.columnsData[key]\n : data.axesData[key];\n });\n dataByColumns.values[yColumnIdWithQ.toCanonicalString()] = data.columnsData[yColumnIdWithQ.toCanonicalString()];\n return {byColumns: dataByColumns};\n }\n\n async createChartSettings(store: DataStore, state: DiscreteUIState): Promise<Record<string, unknown>> {\n const yColumnIdString = state.components.y.selectorStates[0].selectedSource;\n const yColumnId = columnOrAxisIdFromString(yColumnIdString);\n if (!yColumnIdString || !isColumnId(yColumnId)) {\n throw Error('Y column is not valid');\n }\n const y = {\n type: 'column',\n value: yColumnIdString,\n label: await getColumnOrAxisLabel(store, yColumnIdString, []),\n };\n\n const parentSources = [yColumnIdString];\n\n let primaryGrouping;\n if (state.components.primaryGrouping.selectorStates.length) {\n const {selectedSource} = state.components.primaryGrouping.selectorStates[0];\n primaryGrouping = {\n columnName: {\n type: 'column',\n value: selectedSource,\n label: await getColumnOrAxisLabel(store, selectedSource, parentSources),\n valueLabels: (await getColumnOrAxisValueLabelsId(\n store,\n selectedSource,\n parentSources,\n ))?.toCanonicalString(),\n },\n };\n }\n let secondaryGrouping;\n if (state.components.secondaryGrouping.selectorStates.length) {\n const {selectedSource} = state.components.secondaryGrouping.selectorStates[0];\n secondaryGrouping = {\n columnName: {\n type: 'column',\n value: selectedSource,\n label: await getColumnOrAxisLabel(store, selectedSource, parentSources),\n valueLabels: (await getColumnOrAxisValueLabelsId(\n store,\n selectedSource,\n parentSources,\n ))?.toCanonicalString(),\n },\n };\n }\n const facetBy = await Promise.all(state.components.facetBy.selectorStates.map(async state => ({\n type: 'column',\n value:\n (await getColumnOrAxisValueLabelsId(store, state.selectedSource, parentSources))?.toCanonicalString() ??\n state.selectedSource,\n label: await getColumnOrAxisLabel(store, state.selectedSource, parentSources),\n })));\n\n return {\n type: 'discrete',\n y,\n primaryGrouping,\n secondaryGrouping,\n facetBy,\n };\n }\n}\n","import {AxisSpec, PColumnSpec} from '@milaboratories/pl-model-common';\nimport canonicalize from 'canonicalize';\nimport type {ComponentStateFilter, ComponentStateSimple, DataByColumns, InputStateParent} from '../../common';\nimport {PValue} from '../../store';\nimport {ControllerBase, PlotDataAndSettings} from '../ControllerBase';\nimport {ComponentController} from '../ComponentController';\nimport {columnOrAxisIdFromString, isColumnId} from '../../spec';\nimport type {DataStore} from '../../store';\nimport {\n checkSourceBySpecForFilters, getAllLinkerMaps, getAxesSpecsFromSources,\n getColumnOrAxisLabel,\n getColumnOrAxisValueLabelsId,\n getFiltersFromStates, getLinkerColumnsForSource,\n} from '../../utils';\nimport {AxisId, ColumnId} from '../../spec';\nimport type {ColumnsProvider} from '../../pframe/ColumnsProvider';\n\nexport interface HeatmapUIState extends InputStateParent<'heatmap'> {\n type: 'heatmap';\n components: {\n value: ComponentStateSimple;\n x: ComponentStateSimple;\n y: ComponentStateSimple;\n xGroupBy: ComponentStateSimple;\n yGroupBy: ComponentStateSimple;\n filters: ComponentStateFilter;\n tabBy: ComponentStateFilter;\n facetBy: ComponentStateSimple;\n annotationsX: ComponentStateSimple;\n annotationsY: ComponentStateSimple;\n tooltipContent: ComponentStateSimple;\n };\n}\n\nexport const InitialHeatmapState: HeatmapUIState = {\n type: 'heatmap',\n components: {\n value: {type: 'simple', selectorStates: []},\n x: {type: 'simple', selectorStates: []},\n y: {type: 'simple', selectorStates: []},\n xGroupBy: {type: 'simple', selectorStates: []},\n yGroupBy: {type: 'simple', selectorStates: []},\n filters: {type: 'filter', selectorStates: []},\n tabBy: {type: 'filter', selectorStates: []},\n facetBy: {type: 'simple', selectorStates: []},\n annotationsX: {type: 'simple', selectorStates: []},\n annotationsY: {type: 'simple', selectorStates: []},\n tooltipContent: {type: 'simple', selectorStates: []},\n },\n dividedAxes: {},\n};\n\nfunction isDiscreteData(spec: PColumnSpec | AxisSpec | null) {\n if (!spec) {\n return true;\n }\n if ('kind' in spec && spec.kind === 'PColumn') {\n return spec.valueType === 'String';\n }\n return (spec as AxisSpec).type === 'String';\n}\n\nfunction getMultiSourceColumn(\n data: Awaited<ReturnType<ColumnsProvider['getTableOuterJoin']>>,\n selectedSources: string[]\n) {\n if (!selectedSources.length) {\n return [];\n }\n const selectedIds = selectedSources.map(str => columnOrAxisIdFromString(str));\n const n = Object.values(data.columnsData)[0].length;\n const result: string[] = [];\n for (let i = 0; i < n; i++) {\n const value = selectedIds\n .map(id => {\n const key = id.toCanonicalString();\n return isColumnId(id) ? data.columnsData[key][i] : data.axesData[key][i];\n })\n .join(', ');\n result.push(value);\n }\n return result;\n}\n\nexport class HeatmapStateController extends ControllerBase<HeatmapUIState> {\n dataInputs = ['value'];\n dontAllowUnfilteredHighCardinality = true;\n\n constructor() {\n super(\n {\n value: new ComponentController<HeatmapUIState, 'value'>({\n componentName: 'value',\n allowedTypes: ['Int', 'Long', 'Double', 'Float', 'String'],\n settings: {\n isDataComponent: true,\n columnsAllowed: true,\n axesAllowed: false,\n required: true,\n },\n }),\n x: new ComponentController<HeatmapUIState, 'x'>({\n componentName: 'x',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n settings: {\n required: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: false,\n },\n }),\n xGroupBy: new ComponentController<HeatmapUIState, 'xGroupBy'>({\n componentName: 'xGroupBy',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n settings: {\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: true,\n },\n dependsOn: ['x'],\n checkSourceBySpec: (spec, state) => {\n const allowedAxes = new Set([\n ...state.components.x.selectorStates.map(s => s.selectedSource),\n ...state.components.xGroupBy.selectorStates.map(s => s.selectedSource),\n ]);\n\n if ('kind' in spec && spec.kind === 'PColumn') {\n return AxisId.fromAxesSpec(spec.axesSpec).every(id =>\n allowedAxes.has(id.toCanonicalString())\n );\n }\n return true;\n },\n }),\n y: new ComponentController<HeatmapUIState, 'y'>({\n componentName: 'y',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n settings: {\n required: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: true,\n },\n }),\n yGroupBy: new ComponentController<HeatmapUIState, 'yGroupBy'>({\n componentName: 'yGroupBy',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n settings: {\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: false,\n },\n dependsOn: ['y'],\n checkSourceBySpec: (spec, state) => {\n const allowedAxes = new Set([\n ...state.components.y.selectorStates.map(s => s.selectedSource),\n ...state.components.yGroupBy.selectorStates.map(s => s.selectedSource),\n ]);\n\n if ('kind' in spec && spec.kind === 'PColumn') {\n return AxisId.fromAxesSpec(spec.axesSpec).every(id =>\n allowedAxes.has(id.toCanonicalString())\n );\n }\n return true;\n },\n }),\n tooltipContent: new ComponentController<HeatmapUIState, 'tooltipContent'>({\n componentName: 'tooltipContent',\n allowedTypes: ['String', 'Int', 'Long', 'Float', 'Double'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n multipleSelectors: true,\n },\n }),\n facetBy: new ComponentController<HeatmapUIState, 'facetBy'>({\n componentName: 'facetBy',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n }),\n annotationsX: new ComponentController<HeatmapUIState, 'annotationsX'>({\n componentName: 'annotationsX',\n allowedTypes: ['Int', 'Long', 'Double', 'Float', 'String'],\n parentComponents: ['value'],\n settings: {\n axesAllowed: true,\n multipleSelectors: true,\n },\n dependsOn: ['x'],\n checkSourceBySpec: (spec, state) => {\n const allowedAxes = new Set([\n ...state.components.x.selectorStates.map(s => s.selectedSource),\n ...state.components.xGroupBy.selectorStates.map(s => s.selectedSource),\n ]);\n\n if ('kind' in spec && spec.kind === 'PColumn') {\n return AxisId.fromAxesSpec(spec.axesSpec).every(id =>\n allowedAxes.has(id.toCanonicalString())\n );\n }\n return allowedAxes.has(AxisId.fromAxisSpec(spec as AxisSpec).toCanonicalString());\n },\n }),\n annotationsY: new ComponentController<HeatmapUIState, 'annotationsY'>({\n componentName: 'annotationsY',\n allowedTypes: ['Int', 'Long', 'Double', 'Float', 'String'],\n parentComponents: ['value'],\n settings: {\n axesAllowed: true,\n multipleSelectors: true,\n },\n dependsOn: ['y'],\n checkSourceBySpec: (spec, state) => {\n const allowedAxes = new Set([\n ...state.components.y.selectorStates.map(s => s.selectedSource),\n ...state.components.yGroupBy.selectorStates.map(s => s.selectedSource),\n ]);\n\n if ('kind' in spec && spec.kind === 'PColumn') {\n return AxisId.fromAxesSpec(spec.axesSpec).every(id =>\n allowedAxes.has(id.toCanonicalString())\n );\n }\n return allowedAxes.has(AxisId.fromAxisSpec(spec as AxisSpec).toCanonicalString());\n },\n }),\n },\n {\n filters: new ComponentController<HeatmapUIState, 'filters'>({\n componentName: 'filters',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n checkSourceBySpec: checkSourceBySpecForFilters,\n }),\n tabBy: new ComponentController<HeatmapUIState, 'tabBy'>({\n componentName: 'tabBy',\n allowedTypes: ['String', 'Int'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n dimensionConsumer: true,\n },\n }),\n }\n );\n }\n\n async getMustBeConsumedAxes(store: DataStore, state: HeatmapUIState): Promise<Set<string>> {\n if (!state.components.value.selectorStates.length) {\n return new Set<string>();\n }\n const sourceId = state.components.value.selectorStates[0].selectedSource;\n const spec = await store.pFrameProvider.getColumnSpecById(columnOrAxisIdFromString(sourceId));\n if (!spec) {\n return new Set<string>();\n }\n return new Set(spec.axesSpec.map(s => AxisId.fromAxisSpec(s).toCanonicalString()));\n }\n\n async createDataByColumns(store: DataStore, state: HeatmapUIState): Promise<PlotDataAndSettings['data']> {\n const valueColumnIdString = state.components.value.selectorStates[0]?.selectedSource;\n if (!valueColumnIdString) {\n throw Error('Value column is not valid');\n }\n const valueColumnId = columnOrAxisIdFromString(valueColumnIdString);\n if (!isColumnId(valueColumnId)) {\n throw Error('Value column is not valid');\n }\n const dataByColumns: DataByColumns = {\n type: 'columns',\n id: canonicalize(state.components) ?? '',\n values: {},\n };\n\n const {linkerColumnsMap, compositeLinkerMap} = await getAllLinkerMaps(store);\n\n const filterSelectedStates = [\n ...state.components.filters.selectorStates,\n ...state.components.tabBy.selectorStates\n ]\n // filters for column/axes data requests\n const filters = getFiltersFromStates(filterSelectedStates);\n const filterColumns = filterSelectedStates.map(s => columnOrAxisIdFromString(s.selectedSource)).filter(isColumnId);\n\n const parentSources = [valueColumnIdString];\n const parentAxesList = await getAxesSpecsFromSources(store, parentSources);\n const inputs = [\n state.components.facetBy,\n state.components.annotationsX,\n state.components.annotationsY,\n state.components.x,\n state.components.y,\n state.components.xGroupBy,\n state.components.yGroupBy,\n state.components.tooltipContent,\n ];\n const secondarySources: (ColumnId | AxisId)[] = []; // primary sources are the only value column\n const primarySourcesFixedAxes:{idx: number, value: PValue}[][] = [[]];\n const secondarySourcesFixedAxes:{idx: number, value: PValue}[][] = [];\n const linkerColumns:ColumnId[] = [];\n\n for (const {selectedSource, fixedAxes} of filterSelectedStates) {\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n primarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n }\n\n for (const input of inputs) {\n for (const {selectedSource, fixedAxes} of input.selectorStates) {\n secondarySources.push(columnOrAxisIdFromString(selectedSource)!);\n secondarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n if (labelsColumnId) {\n secondarySources.push(labelsColumnId);\n }\n }\n }\n\n const data = await store.pFrameProvider.getTableOuterJoin(\n [valueColumnId, ...linkerColumns, ...filterColumns],\n secondarySources,\n filters,\n true,\n primarySourcesFixedAxes,\n secondarySourcesFixedAxes\n );\n\n secondarySources.forEach(item => {\n const key = item.toCanonicalString();\n dataByColumns.values[key] = isColumnId(item) ? data.columnsData[key] : data.axesData[key];\n });\n dataByColumns.values[valueColumnId.toCanonicalString()] = data.columnsData[valueColumnId.toCanonicalString()];\n\n // x column should contain xGroup axes\n const xAxes = state.components.x.selectorStates\n .concat(state.components.xGroupBy.selectorStates)\n .map(state => state.selectedSource);\n const xKey = xAxes.join(', ');\n dataByColumns.values[xKey] = getMultiSourceColumn(data, xAxes);\n\n // if grouping is not empty x keys will include grouping keys, but grouping keys should be excluded from x labels\n const xVisibleAxes = state.components.x.selectorStates.map(state => state.selectedSource);\n const xAxesLabeled = await Promise.all(\n xVisibleAxes.map(\n async id => (await getColumnOrAxisValueLabelsId(store, id, parentSources))?.toCanonicalString() ?? id\n )\n );\n dataByColumns.values.xLabelsKey = getMultiSourceColumn(data, xAxesLabeled);\n\n // y column should contain yGroup axes\n const yAxes = state.components.y.selectorStates\n .concat(state.components.yGroupBy.selectorStates)\n .map(state => state.selectedSource);\n const yKey = yAxes.join(', ');\n dataByColumns.values[yKey] = getMultiSourceColumn(data, yAxes);\n\n // column for labels - without grouping data in labels\n const yVisibleAxes = state.components.y.selectorStates.map(state => state.selectedSource);\n const yAxesLabeled = await Promise.all(\n yVisibleAxes.map(\n async id => (await getColumnOrAxisValueLabelsId(store, id, parentSources))?.toCanonicalString() ?? id\n )\n );\n dataByColumns.values.yLabelsKey = getMultiSourceColumn(data, yAxesLabeled);\n\n return {byColumns: dataByColumns};\n }\n\n async createChartSettings(store: DataStore, state: HeatmapUIState): Promise<Record<string, unknown>> {\n const valueColumnIdString = state.components.value.selectorStates[0]?.selectedSource;\n if (!valueColumnIdString) {\n throw Error('Value column is not valid');\n }\n const valueColumnId = columnOrAxisIdFromString(valueColumnIdString);\n if (!isColumnId(valueColumnId)) {\n throw Error('Value column is not valid');\n }\n\n const parentSources = [valueColumnIdString];\n const value = {\n type: 'column',\n value: valueColumnIdString,\n label: await getColumnOrAxisLabel(store, valueColumnIdString, []),\n };\n const xAxes = state.components.x.selectorStates\n .concat(state.components.xGroupBy.selectorStates)\n .map(({selectedSource}) => columnOrAxisIdFromString(selectedSource))\n .map(id => id.toCanonicalString());\n const xKey = xAxes.join(', ');\n\n const yAxes = state.components.y.selectorStates\n .concat(state.components.yGroupBy.selectorStates)\n .map(({selectedSource}) => columnOrAxisIdFromString(selectedSource))\n .map(id => id.toCanonicalString());\n const yKey = yAxes.join(', ');\n const facetBy = await Promise.all(\n state.components.facetBy.selectorStates.map(async selectorState => ({\n type: 'column',\n value:\n (\n await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources)\n )?.toCanonicalString() ?? selectorState.selectedSource,\n }))\n );\n const xGroupBy = await Promise.all(\n state.components.xGroupBy.selectorStates.map(async selectorState => ({\n type: 'column',\n label: await getColumnOrAxisLabel(store, selectorState.selectedSource, parentSources),\n value: selectorState.selectedSource,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources))?.toCanonicalString() ??\n selectorState.selectedSource,\n }))\n );\n const yGroupBy = await Promise.all(\n state.components.yGroupBy.selectorStates.map(async selectorState => ({\n type: 'column',\n label: await getColumnOrAxisLabel(store, selectorState.selectedSource, parentSources),\n value: selectorState.selectedSource,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources))?.toCanonicalString() ??\n selectorState.selectedSource,\n }))\n );\n const valueSpec = await store.pFrameProvider.getColumnSpecById(valueColumnId);\n const annotationsX = await Promise.all(\n state.components.annotationsX.selectorStates.map(async selectorState => {\n const idString = selectorState.selectedSource;\n const id = columnOrAxisIdFromString(idString);\n const spec: PColumnSpec | AxisSpec | null = isColumnId(id)\n ? await store.pFrameProvider.getColumnSpecById(id)\n : ((valueSpec?.axesSpec as AxisSpec[])?.find(\n (axisSpec: AxisSpec) => AxisId.fromAxisSpec(axisSpec).toCanonicalString() === idString\n ) ?? null);\n return {\n axis: 'x',\n valueColumn: {\n type: 'column',\n value: idString,\n label: await getColumnOrAxisLabel(store, idString, parentSources),\n },\n type: isDiscreteData(spec) ? 'discrete' : 'continuous',\n };\n })\n );\n const annotationsY = await Promise.all(\n state.components.annotationsY.selectorStates.map(async selectorState => {\n const idString = selectorState.selectedSource;\n const id = columnOrAxisIdFromString(idString);\n const spec: PColumnSpec | AxisSpec | null = isColumnId(id)\n ? await store.pFrameProvider.getColumnSpecById(id)\n : ((valueSpec?.axesSpec as AxisSpec[])?.find(\n (axisSpec: AxisSpec) => AxisId.fromAxisSpec(axisSpec).toCanonicalString() === idString\n ) ?? null);\n return {\n axis: 'y',\n valueColumn: {\n type: 'column',\n value: idString,\n label: await getColumnOrAxisLabel(store, idString, parentSources),\n },\n type: isDiscreteData(spec) ? 'discrete' : 'continuous',\n };\n })\n );\n\n const xAxisTitle = (\n await Promise.all(\n state.components.x.selectorStates.map(state =>\n getColumnOrAxisLabel(store, state.selectedSource, parentSources)\n )\n )\n ).join(', ');\n const yAxisTitle = (\n await Promise.all(\n state.components.y.selectorStates.map(state =>\n getColumnOrAxisLabel(store, state.selectedSource, parentSources)\n )\n )\n ).join(', ');\n\n const tooltipContent = await Promise.all(\n state.components.tooltipContent.selectorStates.map(async selectorState => {\n const idString = selectorState.selectedSource;\n return {\n type: 'column',\n label: (await getColumnOrAxisLabel(store, idString, parentSources)) || idString,\n value: idString,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, idString, parentSources))?.toCanonicalString() ??\n idString,\n };\n })\n );\n\n return {\n type: 'heatmap',\n valueColumn: value,\n valueType: isDiscreteData(valueSpec) ? 'discrete' : 'continuous',\n xColumn: {\n type: 'column',\n value: xKey,\n label: xAxisTitle,\n valueLabels: 'xLabelsKey',\n },\n yColumn: {\n type: 'column',\n value: yKey,\n label: yAxisTitle,\n valueLabels: 'yLabelsKey',\n },\n facetBy,\n xGroupBy,\n yGroupBy,\n annotations: [...annotationsX, ...annotationsY],\n tooltips: {\n show: true,\n content: tooltipContent,\n },\n };\n }\n}\n","import canonicalize from 'canonicalize';\nimport lodash from 'lodash';\nimport type {\n ComponentStateFilter,\n ComponentStateSimple,\n DataByColumns,\n InputStateParent,\n} from '../../common';\nimport {PValue} from '../../store';\nimport {ControllerBase, PlotDataAndSettings} from '../ControllerBase';\nimport {ComponentController} from '../ComponentController';\nimport {AxisId, ColumnId} from '../../spec';\nimport {columnOrAxisIdFromString, isColumnId} from '../../spec';\nimport type {DataStore} from '../../store';\nimport {\n checkSourceBySpecForFilters,\n createHighlightColumn,\n getAllLinkerMaps,\n getAxesSpecsFromSources,\n getColumnOrAxisLabel,\n getColumnOrAxisValueLabelsId,\n getFiltersFromStates,\n getLinkerColumnsForSource,\n} from '../../utils';\n\nexport interface ScatterplotUIState extends InputStateParent<'scatterplot'> {\n type: 'scatterplot';\n components: {\n x: ComponentStateSimple;\n y: ComponentStateSimple;\n filters: ComponentStateFilter;\n highlight: ComponentStateFilter;\n tabBy: ComponentStateFilter;\n facetBy: ComponentStateSimple;\n grouping: ComponentStateSimple;\n shape: ComponentStateSimple;\n size: ComponentStateSimple;\n label: ComponentStateSimple;\n tooltipContent: ComponentStateSimple;\n };\n}\n\nexport const InitialScatterplotState: ScatterplotUIState = {\n type: 'scatterplot',\n components: {\n x: {type: 'simple', selectorStates: []},\n y: {type: 'simple', selectorStates: []},\n filters: {type: 'filter', selectorStates: []},\n highlight: {type: 'filter', selectorStates: []},\n tabBy: {type: 'filter', selectorStates: []},\n facetBy: {type: 'simple', selectorStates: []},\n grouping: {type: 'simple', selectorStates: []},\n shape: {type: 'simple', selectorStates: []},\n size: {type: 'simple', selectorStates: []},\n label: {type: 'simple', selectorStates: []},\n tooltipContent: {type: 'simple', selectorStates: []}\n },\n dividedAxes: {},\n};\n\nexport class ScatterplotStateController extends ControllerBase<ScatterplotUIState> {\n dataInputs = ['x', 'y'];\n\n constructor() {\n super(\n {\n x: new ComponentController<ScatterplotUIState, 'x'>({\n componentName: 'x',\n allowedTypes: ['Int', 'Long', 'Double' , 'Float'],\n parentComponents: ['y'],\n strictlyDependsOnParents: false,\n settings: {\n isDataComponent: true,\n required: true,\n axesAllowed: true,\n columnsAllowed: true,\n },\n }),\n y: new ComponentController<ScatterplotUIState, 'y'>({\n componentName: 'y',\n allowedTypes: ['Int', 'Long', 'Double', 'Float'],\n parentComponents: ['x'],\n strictlyDependsOnParents: false,\n settings: {\n isDataComponent: true,\n required: true,\n axesAllowed: true,\n columnsAllowed: true,\n },\n }),\n facetBy: new ComponentController<ScatterplotUIState, 'facetBy'>({\n componentName: 'facetBy',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n }),\n grouping: new ComponentController<ScatterplotUIState, 'grouping'>({\n componentName: 'grouping',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n multipleSelectors: true,\n },\n }),\n shape: new ComponentController<ScatterplotUIState, 'shape'>({\n componentName: 'shape',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n },\n }),\n size: new ComponentController<ScatterplotUIState, 'size'>({\n componentName: 'size',\n allowedTypes: ['Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n },\n }),\n tooltipContent: new ComponentController<ScatterplotUIState, 'tooltipContent'>({\n componentName: 'tooltipContent',\n allowedTypes: ['String', 'Int', 'Long', 'Float', 'Double'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n multipleSelectors: true,\n },\n }),\n label: new ComponentController<ScatterplotUIState, 'label'>({\n componentName: 'label',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n columnsAllowed: true,\n multipleSelectors: false,\n },\n }),\n },\n {\n filters: new ComponentController<ScatterplotUIState, 'filters'>({\n componentName: 'filters',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n columnsAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n checkSourceBySpec: checkSourceBySpecForFilters\n }),\n tabBy: new ComponentController<ScatterplotUIState, 'tabBy'>({\n componentName: 'tabBy',\n allowedTypes: ['String', 'Int'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n },\n }),\n highlight: new ComponentController<ScatterplotUIState, 'highlight'>({\n componentName: 'highlight',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n columnsAllowed: true,\n multipleSelectors: true,\n },\n checkSourceBySpec: checkSourceBySpecForFilters\n }),\n }\n );\n }\n\n async getMustBeConsumedAxes(store: DataStore, state: ScatterplotUIState):Promise<Set<string>> {\n if (!state.components.x.selectorStates.length || !state.components.y.selectorStates.length) {\n return new Set<string>();\n }\n const sourceIdX = state.components.x.selectorStates[0].selectedSource;\n const sourceIdY = state.components.y.selectorStates[0].selectedSource;\n const specX = await store.pFrameProvider.getColumnSpecById(columnOrAxisIdFromString(sourceIdX));\n const specY = await store.pFrameProvider.getColumnSpecById(columnOrAxisIdFromString(sourceIdY));\n if (!specX || !specY) {\n return new Set<string>();\n }\n const axesX = specX.axesSpec.map((s) => AxisId.fromAxisSpec(s).toCanonicalString());\n const axesY = specY.axesSpec.map((s) => AxisId.fromAxisSpec(s).toCanonicalString());\n const hangingX = axesX.filter(axisKey => !axesY.some(id => id === axisKey));\n const hangingY = axesY.filter(axisKey => !axesX.some(id => id === axisKey));\n\n return new Set<string>([...hangingX, ...hangingY])\n }\n\n async createDataByColumns(store: DataStore, state: ScatterplotUIState): Promise<PlotDataAndSettings['data']> {\n const xColumnIdString = state.components.x.selectorStates[0]?.selectedSource;\n const yColumnIdString = state.components.y.selectorStates[0]?.selectedSource;\n if (!xColumnIdString || !yColumnIdString) {\n throw Error('X or Y column is not valid');\n }\n const xId = columnOrAxisIdFromString(xColumnIdString);\n const yId = columnOrAxisIdFromString(yColumnIdString);\n const dataByColumns: DataByColumns = {\n type: 'columns',\n id: canonicalize(state.components) ?? '',\n values: {},\n };\n\n const {linkerColumnsMap, compositeLinkerMap} = await getAllLinkerMaps(store);\n\n const filterSelectedStates = [\n ...state.components.filters.selectorStates,\n ...state.components.tabBy.selectorStates\n ]\n // filters for column/axes data requests\n const filters = getFiltersFromStates(filterSelectedStates);\n const filterColumns = filterSelectedStates.map(s => columnOrAxisIdFromString(s.selectedSource)).filter(isColumnId);\n\n const parentSources = [xId, yId].filter(isColumnId).map(item => item.toCanonicalString());\n\n if (parentSources.length === 0) {\n throw Error('One of X and Y should be a column');\n }\n const parentAxesList = await getAxesSpecsFromSources(store, parentSources);\n\n const primarySources = [xId, yId, ...filterColumns];\n const secondarySources: (ColumnId | AxisId)[] = [];\n const primarySourcesFixedAxes:{idx: number, value: PValue}[][] = [[], []];\n const secondarySourcesFixedAxes:{idx: number, value: PValue}[][] = [];\n const linkerColumns:ColumnId[] = [];\n\n for (const {selectedSource, fixedAxes} of filterSelectedStates) {\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n primarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n }\n\n const inputs = [\n state.components.grouping,\n state.components.size,\n state.components.shape,\n state.components.tooltipContent,\n state.components.facetBy,\n state.components.label,\n state.components.highlight,\n ];\n for (const input of inputs) {\n for (const {selectedSource, fixedAxes} of input.selectorStates) {\n secondarySources.push(columnOrAxisIdFromString(selectedSource)!);\n secondarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n if (labelsColumnId) {\n secondarySources.push(labelsColumnId);\n }\n }\n }\n\n const data = await store.pFrameProvider.getTableOuterJoin(\n [xId, yId, ...linkerColumns, ...filterColumns],\n secondarySources,\n filters,\n false,\n primarySourcesFixedAxes,\n secondarySourcesFixedAxes\n );\n\n [...primarySources, ...secondarySources].forEach(item => {\n const key = item.toCanonicalString();\n dataByColumns.values[key] = isColumnId(item) ? data.columnsData[key] : data.axesData[key];\n });\n\n dataByColumns.values['key'] = new Array(dataByColumns.values[Object.keys(dataByColumns.values)[0]].length).fill(0).map((_v, idx) => idx);\n\n if (state.components.highlight.selectorStates.length) {\n dataByColumns.values['highlight'] = createHighlightColumn(state.components.highlight.selectorStates, data) as PValue[];\n }\n\n return {byColumns: dataByColumns};\n }\n\n async createChartSettings(store: DataStore, state: ScatterplotUIState): Promise<Record<string, unknown>> {\n const xIdString = state.components.x.selectorStates[0]?.selectedSource;\n const yIdString = state.components.y.selectorStates[0]?.selectedSource;\n const xIdWithQ = xIdString ? columnOrAxisIdFromString(xIdString) : null;\n const yIdWithQ = yIdString ? columnOrAxisIdFromString(yIdString) : null;\n if (!xIdString || !yIdString || !xIdWithQ || !yIdWithQ || (!isColumnId(xIdWithQ) && !isColumnId(yIdWithQ))) {\n throw Error('Empty or invalid required data');\n }\n\n const parentSources = [xIdWithQ, yIdWithQ].filter(isColumnId).map(item => item.toCanonicalString());\n const x = {\n type: 'column',\n value: xIdString,\n label: await getColumnOrAxisLabel(store, xIdString, parentSources),\n };\n const y = {\n type: 'column',\n value: yIdString,\n label: await getColumnOrAxisLabel(store, yIdString, parentSources),\n };\n const keyColumn = {\n type: 'column',\n value: 'key',\n };\n const facetBy = await Promise.all(\n state.components.facetBy.selectorStates.map(async selectorState => ({\n type: 'column',\n value:\n (await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources))?.toCanonicalString() ??\n selectorState.selectedSource,\n }))\n );\n const allGroupingIds = lodash.uniq([\n ...state.components.grouping.selectorStates.map(s => s.selectedSource),\n ...state.components.size.selectorStates.map(s => s.selectedSource),\n ...state.components.shape.selectorStates.map(s => s.selectedSource),\n ]);\n const grouping = await Promise.all(\n allGroupingIds.map(async idString => {\n return {\n type: 'column',\n label: (await getColumnOrAxisLabel(store, idString, parentSources)) || idString,\n value: idString,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, idString, parentSources))?.toCanonicalString() ??\n idString,\n };\n })\n );\n\n const tooltipContent = await Promise.all(\n state.components.tooltipContent.selectorStates.map(async selectorState => {\n const idString = selectorState.selectedSource;\n return {\n type: 'column',\n label: (await getColumnOrAxisLabel(store, idString, parentSources)) || idString,\n value: idString,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, idString, parentSources))?.toCanonicalString() ??\n idString,\n };\n })\n );\n\n let label;\n if (state.components.label.selectorStates.length) {\n const source = state.components.label.selectorStates[0].selectedSource;\n label = {\n type: 'column',\n value: source,\n label: await getColumnOrAxisLabel(store, source, parentSources),\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, source, parentSources))?.toCanonicalString() ??\n source,\n };\n }\n let highlight;\n if (state.components.highlight.selectorStates.length) {\n highlight = {\n type: 'column',\n value: 'highlight'\n }\n }\n return {\n type: 'scatterplot',\n x,\n y,\n keyColumn,\n facetBy,\n grouping,\n label,\n highlight,\n tooltips: {\n show: true,\n content: tooltipContent\n }\n };\n }\n}\n","import canonicalize from 'canonicalize';\nimport lodash from 'lodash';\nimport type {\n ComponentStateFilter,\n ComponentStateSimple,\n DataByColumns,\n InputStateParent,\n} from '../../common';\nimport {PValue} from '../../store';\nimport {ControllerBase, PlotDataAndSettings} from '../ControllerBase';\nimport {ComponentController} from '../ComponentController';\nimport {AxisId, ColumnId} from '../../spec';\nimport {columnOrAxisIdFromString, isColumnId} from '../../spec';\nimport type {DataStore} from '../../store';\nimport {\n checkSourceBySpecForFilters,\n createHighlightColumn,\n getAllLinkerMaps,\n getAxesSpecsFromSources,\n getColumnOrAxisLabel,\n getColumnOrAxisValueLabelsId,\n getFiltersFromStates,\n getLinkerColumnsForSource,\n} from '../../utils';\n\nexport interface ScatterplotUmapUIState extends InputStateParent<'scatterplot-umap'> {\n type: 'scatterplot-umap';\n components: {\n x: ComponentStateSimple;\n y: ComponentStateSimple;\n filters: ComponentStateFilter;\n highlight: ComponentStateFilter;\n tabBy: ComponentStateFilter;\n facetBy: ComponentStateSimple;\n grouping: ComponentStateSimple;\n label: ComponentStateSimple;\n tooltipContent: ComponentStateSimple;\n size: ComponentStateSimple;\n };\n}\n\nexport const InitialScatterplotUmapState: ScatterplotUmapUIState = {\n type: 'scatterplot-umap',\n components: {\n x: {type: 'simple', selectorStates: []},\n y: {type: 'simple', selectorStates: []},\n filters: {type: 'filter', selectorStates: []},\n highlight: {type: 'filter', selectorStates: []},\n tabBy: {type: 'filter', selectorStates: []},\n facetBy: {type: 'simple', selectorStates: []},\n grouping: {type: 'simple', selectorStates: []},\n label: {type: 'simple', selectorStates: []},\n tooltipContent: {type: 'simple', selectorStates: []},\n size: {type: 'simple', selectorStates: []},\n },\n dividedAxes: {},\n};\n\nexport class ScatterplotUmapStateController extends ControllerBase<ScatterplotUmapUIState> {\n dataInputs = ['x', 'y'];\n\n constructor() {\n super(\n {\n x: new ComponentController<ScatterplotUmapUIState, 'x'>({\n componentName: 'x',\n allowedTypes: ['Int', 'Long', 'Double' , 'Float'],\n parentComponents: ['y'],\n strictlyDependsOnParents: false,\n settings: {\n isDataComponent: true,\n required: true,\n axesAllowed: true,\n columnsAllowed: true,\n },\n }),\n y: new ComponentController<ScatterplotUmapUIState, 'y'>({\n componentName: 'y',\n allowedTypes: ['Int', 'Long', 'Double', 'Float'],\n parentComponents: ['x'],\n strictlyDependsOnParents: false,\n settings: {\n isDataComponent: true,\n required: true,\n axesAllowed: true,\n columnsAllowed: true,\n },\n }),\n facetBy: new ComponentController<ScatterplotUmapUIState, 'facetBy'>({\n componentName: 'facetBy',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n }),\n grouping: new ComponentController<ScatterplotUmapUIState, 'grouping'>({\n componentName: 'grouping',\n allowedTypes: ['String', 'Int', 'Long', 'Float', 'Double'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n multipleSelectors: true,\n },\n }),\n tooltipContent: new ComponentController<ScatterplotUmapUIState, 'tooltipContent'>({\n componentName: 'tooltipContent',\n allowedTypes: ['String', 'Int', 'Long', 'Float', 'Double'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n multipleSelectors: true,\n },\n }),\n label: new ComponentController<ScatterplotUmapUIState, 'label'>({\n componentName: 'label',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n columnsAllowed: true,\n multipleSelectors: false,\n },\n }),\n size: new ComponentController<ScatterplotUmapUIState, 'size'>({\n componentName: 'size',\n allowedTypes: ['Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n },\n }),\n },\n {\n filters: new ComponentController<ScatterplotUmapUIState, 'filters'>({\n componentName: 'filters',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n checkSourceBySpec: checkSourceBySpecForFilters\n }),\n tabBy: new ComponentController<ScatterplotUmapUIState, 'tabBy'>({\n componentName: 'tabBy',\n allowedTypes: ['String', 'Int'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n },\n }),\n highlight: new ComponentController<ScatterplotUmapUIState, 'highlight'>({\n componentName: 'highlight',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n columnsAllowed: true,\n multipleSelectors: true,\n },\n checkSourceBySpec: checkSourceBySpecForFilters\n }),\n }\n );\n }\n\n async getMustBeConsumedAxes(store: DataStore, state: ScatterplotUmapUIState):Promise<Set<string>> {\n if (!state.components.x.selectorStates.length || !state.components.y.selectorStates.length) {\n return new Set<string>();\n }\n const sourceIdX = state.components.x.selectorStates[0].selectedSource;\n const sourceIdY = state.components.y.selectorStates[0].selectedSource;\n const specX = await store.pFrameProvider.getColumnSpecById(columnOrAxisIdFromString(sourceIdX));\n const specY = await store.pFrameProvider.getColumnSpecById(columnOrAxisIdFromString(sourceIdY));\n if (!specX || !specY) {\n return new Set<string>();\n }\n const axesX = specX.axesSpec.map((s) => AxisId.fromAxisSpec(s).toCanonicalString());\n const axesY = specY.axesSpec.map((s) => AxisId.fromAxisSpec(s).toCanonicalString());\n const hangingX = axesX.filter(axisKey => !axesY.some(id => id === axisKey));\n const hangingY = axesY.filter(axisKey => !axesX.some(id => id === axisKey));\n\n return new Set<string>([...hangingX, ...hangingY])\n }\n\n async createDataByColumns(store: DataStore, state: ScatterplotUmapUIState): Promise<PlotDataAndSettings['data']> {\n const xColumnIdString = state.components.x.selectorStates[0]?.selectedSource;\n const yColumnIdString = state.components.y.selectorStates[0]?.selectedSource;\n if (!xColumnIdString || !yColumnIdString) {\n throw Error('X or Y column is not valid');\n }\n const xId = columnOrAxisIdFromString(xColumnIdString);\n const yId = columnOrAxisIdFromString(yColumnIdString);\n if (!xId || !yId) {\n throw Error('X or Y column is not valid');\n }\n const dataByColumns: DataByColumns = {\n type: 'columns',\n id: canonicalize(state.components) ?? '',\n values: {},\n };\n\n const {linkerColumnsMap, compositeLinkerMap} = await getAllLinkerMaps(store);\n\n const filterSelectedStates = [\n ...state.components.filters.selectorStates,\n ...state.components.tabBy.selectorStates\n ]\n // filters for column/axes data requests\n const filters = getFiltersFromStates(filterSelectedStates);\n const filterColumns = filterSelectedStates.map(s => columnOrAxisIdFromString(s.selectedSource)).filter(isColumnId);\n\n const parentSources = [xId, yId].filter(isColumnId).map(item => item.toCanonicalString());\n if (parentSources.length === 0) {\n throw Error('One of X and Y should be a column');\n }\n const parentAxesList = await getAxesSpecsFromSources(store, parentSources);\n\n const primarySources = [xId, yId, ...filterColumns];\n const secondarySources: (ColumnId | AxisId)[] = [];\n const primarySourcesFixedAxes:{idx: number, value: PValue}[][] = [[], []];\n const secondarySourcesFixedAxes:{idx: number, value: PValue}[][] = [];\n const linkerColumns:ColumnId[] = [];\n\n for (const {selectedSource, fixedAxes} of filterSelectedStates) {\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n primarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n }\n\n const inputs = [\n state.components.grouping,\n state.components.facetBy,\n state.components.tooltipContent,\n state.components.label,\n state.components.highlight,\n state.components.size,\n ];\n for (const input of inputs) {\n for (const {selectedSource, fixedAxes} of input.selectorStates) {\n secondarySources.push(columnOrAxisIdFromString(selectedSource)!);\n secondarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n if (labelsColumnId) {\n secondarySources.push(labelsColumnId);\n }\n }\n }\n\n const data = await store.pFrameProvider.getTableOuterJoin(\n [xId, yId, ...linkerColumns, ...filterColumns],\n secondarySources,\n filters,\n false,\n primarySourcesFixedAxes,\n secondarySourcesFixedAxes\n );\n\n [...primarySources, ...secondarySources].forEach(item => {\n const key = item.toCanonicalString();\n dataByColumns.values[key] = isColumnId(item) ? data.columnsData[key] : data.axesData[key];\n });\n\n if (state.components.highlight.selectorStates.length) {\n dataByColumns.values['highlight'] = createHighlightColumn(state.components.highlight.selectorStates, data) as PValue[];\n }\n\n return {\n byColumns: dataByColumns,\n axesData: data.axesData\n };\n }\n\n async createChartSettings(store: DataStore, state: ScatterplotUmapUIState): Promise<Record<string, unknown>> {\n const xIdString = state.components.x.selectorStates[0]?.selectedSource;\n const yIdString = state.components.y.selectorStates[0]?.selectedSource;\n const xIdWithQ = xIdString ? columnOrAxisIdFromString(xIdString) : null;\n const yIdWithQ = yIdString ? columnOrAxisIdFromString(yIdString) : null;\n if (!xIdString || !yIdString || !xIdWithQ || !yIdWithQ || (!isColumnId(xIdWithQ) && !isColumnId(yIdWithQ))) {\n throw Error('Empty or invalid required data');\n }\n\n const parentSources = [xIdWithQ, yIdWithQ].filter(isColumnId).map(item => item.toCanonicalString());\n const x = {\n type: 'column',\n value: xIdString,\n label: await getColumnOrAxisLabel(store, xIdString, parentSources),\n };\n const y = {\n type: 'column',\n value: yIdString,\n label: await getColumnOrAxisLabel(store, yIdString, parentSources),\n };\n const keyColumn = {\n type: 'column',\n value: 'key',\n };\n const facetBy = await Promise.all(\n state.components.facetBy.selectorStates.map(async selectorState => ({\n type: 'column',\n value:\n (await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources))?.toCanonicalString() ??\n selectorState.selectedSource,\n }))\n );\n const allGroupingIds = lodash.uniq([\n ...state.components.grouping.selectorStates.map(s => s.selectedSource),\n ...state.components.size.selectorStates.map(s => s.selectedSource),\n ]);\n const grouping = await Promise.all(\n allGroupingIds.map(async idString => {\n return {\n type: 'column',\n label: (await getColumnOrAxisLabel(store, idString, parentSources)) || idString,\n value: idString,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, idString, parentSources))?.toCanonicalString() ??\n idString,\n };\n })\n );\n\n const tooltipContent = await Promise.all(\n state.components.tooltipContent.selectorStates.map(async selectorState => {\n const idString = selectorState.selectedSource;\n return {\n type: 'column',\n label: (await getColumnOrAxisLabel(store, idString, parentSources)) || idString,\n value: idString,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, idString, parentSources))?.toCanonicalString() ??\n idString,\n };\n })\n );\n\n let label;\n if (state.components.label.selectorStates.length) {\n const source = state.components.label.selectorStates[0].selectedSource;\n label = {\n type: 'column',\n value: source,\n label: await getColumnOrAxisLabel(store, source, parentSources),\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, source, parentSources))?.toCanonicalString() ??\n source,\n };\n }\n\n let highlight;\n if (state.components.highlight.selectorStates.length) {\n highlight = {\n type: 'column',\n value: 'highlight'\n }\n }\n return {\n type: 'scatterplot-umap',\n x,\n y,\n keyColumn,\n facetBy,\n grouping,\n label,\n highlight,\n tooltips: {\n show: true,\n content: tooltipContent\n }\n };\n }\n}\n","import {AxisSpec, PColumnSpec} from '@milaboratories/pl-model-common';\nimport canonicalize from 'canonicalize';\nimport type {\n ComponentStateFilter,\n ComponentStateSimple,\n DataByColumns,\n InputState,\n InputStateParent,\n} from '../../common';\nimport {ControllerBase, PlotDataAndSettings} from '../ControllerBase';\nimport {ComponentController} from '../ComponentController';\nimport type {AxisId, ColumnId} from '../../spec';\nimport {columnOrAxisIdFromString, isColumnId} from '../../spec';\nimport type {DataStore, PValue} from '../../store';\nimport {\n getAllLinkerMaps,\n getAxesSpecsFromSources,\n getColumnOrAxisLabel,\n getColumnOrAxisValueLabelsId,\n getFiltersFromStates, getLinkerColumnsForSource,\n} from '../../utils';\n\nconst TREE_ID_AXIS_NAME = 'pl7.app/dendrogram/treeId';\nconst NODE_ID_AXIS_NAME = 'pl7.app/dendrogram/nodeId';\nconst PATIENT_ID_AXIS_NAME = 'pl7.app/dendrogram/donorId';\n\nconst COLUMN_NODE_ID = 'id';\n\nexport interface DendroUIState extends InputStateParent<'dendro'> {\n components: {\n value: ComponentStateSimple;\n\n height: ComponentStateSimple;\n labels: ComponentStateSimple;\n\n tableContent: ComponentStateSimple;\n\n nodeColor: ComponentStateSimple;\n nodeShape: ComponentStateSimple;\n nodeSize: ComponentStateSimple;\n lineColor: ComponentStateSimple;\n\n heatmapForSequence: ComponentStateSimple;\n\n heatmapAnnotation: ComponentStateSimple;\n heatmapAxis: ComponentStateSimple;\n heatmapGroup: ComponentStateSimple;\n\n filters: ComponentStateFilter;\n tabBy: ComponentStateFilter;\n facetBy: ComponentStateSimple;\n };\n}\n\nexport const InitialDendroState: DendroUIState = {\n type: 'dendro',\n components: {\n value: {type: 'simple', selectorStates: []},\n\n height: {type: 'simple', selectorStates: []},\n labels: {type: 'simple', selectorStates: []},\n\n tableContent: {type: 'simple', selectorStates: []},\n\n nodeColor: {type: 'simple', selectorStates: []},\n nodeShape: {type: 'simple', selectorStates: []},\n nodeSize: {type: 'simple', selectorStates: []},\n lineColor: {type: 'simple', selectorStates: []},\n\n heatmapAnnotation: {type: 'simple', selectorStates: []},\n\n heatmapForSequence: {type: 'simple', selectorStates: []},\n filters: {type: 'filter', selectorStates: []},\n tabBy: {type: 'filter', selectorStates: []},\n facetBy: {type: 'simple', selectorStates: []},\n\n heatmapAxis: {type: 'simple', selectorStates: []},\n heatmapGroup: {type: 'simple', selectorStates: []},\n },\n dividedAxes: {},\n};\n\nexport function isDendroState(state: InputState): state is DendroUIState {\n return state.type == 'dendro';\n}\n\nexport class DendroStateController extends ControllerBase<DendroUIState> {\n readonly ignoredOptionIdNames = [NODE_ID_AXIS_NAME];\n\n constructor() {\n super(\n {\n value: new ComponentController<DendroUIState, 'value'>({\n componentName: 'value',\n allowedTypes: ['Int', 'Long'],\n annotations: {'pl7.app/dendrogram/isTopology': 'true'},\n settings: {\n isDataComponent: true,\n columnsAllowed: true,\n required: true,\n dimensionConsumer: true,\n columnsWithExtraAxesAllowed: false\n },\n }),\n height: new ComponentController<DendroUIState, 'height'>({\n componentName: 'height',\n allowedTypes: ['Int', 'Long', 'Double', 'Float'],\n annotations: {'pl7.app/dendrogram/isDistance': 'true'},\n parentComponents: ['value'],\n strictlyDependsOnParents: true,\n settings: {\n columnsAllowed: true,\n axesAllowed: false,\n dimensionConsumer: true,\n columnsWithExtraAxesAllowed: false\n },\n }),\n labels: new ComponentController<DendroUIState, 'labels'>({\n componentName: 'labels',\n allowedTypes: ['Int', 'String', 'Long'],\n parentComponents: ['value'],\n strictlyDependsOnParents: false,\n settings: {\n columnsAllowed: true,\n axesAllowed: false,\n columnsWithExtraAxesAllowed: false\n },\n }),\n tableContent: new ComponentController<DendroUIState, 'tableContent'>({\n componentName: 'tableContent',\n allowedTypes: ['Int', 'String', 'Long', 'Double', 'Float'],\n parentComponents: ['value'],\n strictlyDependsOnParents: false,\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n multipleSelectors: true,\n columnsWithExtraAxesAllowed: false\n },\n }),\n nodeShape: new ComponentController<DendroUIState, 'nodeShape'>({\n componentName: 'nodeShape',\n allowedTypes: ['Int', 'String', 'Long'],\n parentComponents: ['value'],\n strictlyDependsOnParents: false,\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n columnsWithExtraAxesAllowed: false\n },\n }),\n nodeSize: new ComponentController<DendroUIState, 'nodeSize'>({\n componentName: 'nodeSize',\n allowedTypes: ['Double', 'Int', 'String', 'Long'],\n parentComponents: ['value'],\n strictlyDependsOnParents: false,\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n columnsWithExtraAxesAllowed: false\n },\n }),\n nodeColor: new ComponentController<DendroUIState, 'nodeColor'>({\n componentName: 'nodeColor',\n allowedTypes: ['Double', 'Int', 'String', 'Long'],\n parentComponents: ['value'],\n strictlyDependsOnParents: false,\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n columnsWithExtraAxesAllowed: false\n },\n }),\n lineColor: new ComponentController<DendroUIState, 'lineColor'>({\n componentName: 'lineColor',\n allowedTypes: ['Double', 'Int', 'String', 'Long'],\n parentComponents: ['value'],\n strictlyDependsOnParents: false,\n settings: {\n columnsAllowed: true,\n axesAllowed: false,\n columnsWithExtraAxesAllowed: false\n },\n }),\n heatmapForSequence: new ComponentController<DendroUIState, 'heatmapForSequence'>({\n componentName: 'heatmapForSequence',\n allowedTypes: ['String'],\n annotations: {'pl7.app/type': 'sequence'},\n parentComponents: ['value'],\n strictlyDependsOnParents: false,\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n columnsWithExtraAxesAllowed: false\n },\n }),\n heatmapAnnotation: new ComponentController<DendroUIState, 'heatmapAnnotation'>({\n componentName: 'heatmapAnnotation',\n allowedTypes: ['Double', 'Int', 'Long', 'Float', 'String'],\n parentComponents: ['value'],\n strictlyDependsOnParents: false,\n settings: {\n isDataComponent: true,\n columnsAllowed: true,\n axesAllowed: false,\n columnsWithExtraAxesAllowed: false\n },\n }),\n facetBy: new ComponentController<DendroUIState, 'facetBy'>({\n componentName: 'facetBy',\n allowedTypes: ['String', 'Int', 'Long'],\n parentComponents: ['value'],\n strictlyDependsOnParents: true,\n settings: {\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: false,\n columnsWithExtraAxesAllowed: false\n },\n }),\n heatmapAxis: new ComponentController<DendroUIState, 'heatmapAxis'>({\n componentName: 'heatmapAxis',\n allowedTypes: ['String', 'Int', 'Long'],\n parentComponents: ['heatmapAnnotation'],\n settings: {\n dimensionConsumer: true,\n axesAllowed: true,\n columnsAllowed: false,\n columnsWithExtraAxesAllowed: false\n },\n }),\n heatmapGroup: new ComponentController<DendroUIState, 'heatmapGroup'>({\n componentName: 'heatmapGroup',\n allowedTypes: ['String', 'Int', 'Long'],\n parentComponents: ['heatmapAnnotation'],\n settings: {\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: false,\n columnsWithExtraAxesAllowed: false\n },\n }),\n },\n {\n filters: new ComponentController<DendroUIState, 'filters'>({\n componentName: 'filters',\n allowedTypes: ['String', 'Int', 'Long'],\n parentComponents: ['value', 'heatmapAnnotation'],\n strictlyDependsOnParents: false,\n settings: {\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: false,\n columnsWithExtraAxesAllowed: false\n },\n }),\n tabBy: new ComponentController<DendroUIState, 'tabBy'>({\n componentName: 'tabBy',\n allowedTypes: ['String', 'Int', 'Long'],\n parentComponents: ['value', 'heatmapAnnotation'],\n strictlyDependsOnParents: false,\n settings: {\n dimensionConsumer: true,\n axesAllowed: true,\n columnsAllowed: false,\n columnsWithExtraAxesAllowed: false\n },\n }),\n }\n );\n }\n\n readyDataInputs(state: DendroUIState): boolean {\n return state.components.value.selectorStates.length > 0;\n }\n\n async createTableData(\n store: DataStore,\n state: DendroUIState\n ): Promise<\n Record<\n string,\n {\n label: string;\n spec: PColumnSpec | AxisSpec;\n data: PValue[];\n }\n >\n > {\n const result: Record<string, {label: string; spec: PColumnSpec | AxisSpec; data: PValue[]}> = {};\n\n const valueColumnIdString = state.components.value.selectorStates[0]?.selectedSource;\n const valueColumnId = columnOrAxisIdFromString(valueColumnIdString);\n if (!valueColumnIdString || !isColumnId(valueColumnId)) {\n throw Error('Value column is not valid');\n }\n\n const {linkerColumnsMap, compositeLinkerMap} = await getAllLinkerMaps(store);\n\n // filters for column/axes data requests\n const filters = getFiltersFromStates([\n ...state.components.filters.selectorStates,\n ...state.components.tabBy.selectorStates\n ]);\n const filterColumns = [\n ...state.components.filters.selectorStates.map(s => columnOrAxisIdFromString(s.selectedSource)),\n ...state.components.tabBy.selectorStates.map(s => columnOrAxisIdFromString(s.selectedSource)),\n ].filter(isColumnId);\n\n const parentSources = [valueColumnIdString];\n const parentAxesList = await getAxesSpecsFromSources(store, parentSources);\n\n const primarySources: (ColumnId | AxisId)[] = [];\n const secondarySources: (ColumnId | AxisId)[] = [];\n const linkerColumns:ColumnId[] = [];\n\n const primaryInputs = [state.components.value];\n const secondaryInputs = [\n state.components.tableContent,\n // next components can content data mapped on tree\n state.components.labels,\n state.components.nodeColor,\n state.components.nodeSize,\n state.components.nodeShape,\n state.components.lineColor,\n ];\n\n const idMap: Record<string, string> = {};\n\n for (const primaryInput of primaryInputs) {\n for (const {selectedSource, fixedAxes} of primaryInput.selectorStates) {\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n const id = labelsColumnId ?? columnOrAxisIdFromString(selectedSource);\n idMap[id.toCanonicalString()] = selectedSource;\n primarySources.push(id);\n }\n }\n for (const secondaryInput of secondaryInputs) {\n for (const {selectedSource, fixedAxes} of secondaryInput.selectorStates) {\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n const id = labelsColumnId ?? columnOrAxisIdFromString(selectedSource);\n idMap[selectedSource] = id.toCanonicalString();\n secondarySources.push(id);\n }\n }\n\n // use outer join between primary columns - inner join can remove useful points in tree and annotations\n const data = await store.pFrameProvider.getTableOuterJoin(\n [...primarySources, ...filterColumns, ...linkerColumns],\n secondarySources,\n filters,\n false\n );\n\n for (const source of [...primarySources, ...secondarySources]) {\n const responseKey = source.toCanonicalString();\n const resultKey = idMap[source.toCanonicalString()];\n result[resultKey] = {\n data: isColumnId(source) ? data.columnsData[responseKey] : data.axesData[responseKey],\n spec: isColumnId(source) ? data.columnSpecs[responseKey] : data.axesSpecs[responseKey],\n label: await getColumnOrAxisLabel(store, resultKey, parentSources),\n };\n }\n\n const nodeIdAxis = Object.keys(data.axesData).find(\n axisIdStr => columnOrAxisIdFromString(axisIdStr)?.name === NODE_ID_AXIS_NAME\n );\n if (!nodeIdAxis) {\n console.warn('Missed node id axis in data column');\n } else {\n result[COLUMN_NODE_ID] = {\n data: data.axesData[nodeIdAxis],\n spec: {kind: 'PColumn', valueType: 'Int', name: 'Node id'} as PColumnSpec,\n label: 'Node id',\n };\n }\n return result;\n }\n\n async createDataByColumns(store: DataStore, state: DendroUIState): Promise<PlotDataAndSettings['data']> {\n const valueColumnIdString = state.components.value.selectorStates[0]?.selectedSource;\n const annotationColumnIdString = state.components.heatmapAnnotation.selectorStates[0]?.selectedSource;\n const valueColumnId = columnOrAxisIdFromString(valueColumnIdString);\n const annotationColumnId = annotationColumnIdString ? columnOrAxisIdFromString(annotationColumnIdString) : null;\n\n if (!valueColumnIdString || !isColumnId(valueColumnId)) {\n throw Error('Value column is not valid');\n }\n const dataByColumns: DataByColumns = {\n type: 'columns',\n id: canonicalize(state.components) ?? '',\n values: {},\n };\n\n const filterSelectedStates = [\n ...state.components.filters.selectorStates,\n ...state.components.tabBy.selectorStates\n ]\n // filters for column/axes data requests\n const filters = getFiltersFromStates(filterSelectedStates);\n const filterColumns = filterSelectedStates.map(s => columnOrAxisIdFromString(s.selectedSource)).filter(isColumnId);\n\n\n const parentSources = [valueColumnId, annotationColumnId]\n .filter(isColumnId)\n .map(item => item.toCanonicalString());\n\n const primarySources: (ColumnId | AxisId)[] = [];\n const secondarySources: (ColumnId | AxisId)[] = [];\n const primarySourcesFixedAxes:{idx: number, value: PValue}[][] = [];\n const secondarySourcesFixedAxes:{idx: number, value: PValue}[][] = [];\n\n const primaryInputs = [\n state.components.value,\n state.components.height,\n state.components.labels,\n state.components.nodeColor,\n state.components.nodeSize,\n state.components.nodeShape,\n state.components.lineColor,\n state.components.heatmapAnnotation,\n state.components.heatmapForSequence,\n ];\n const secondaryInputs = [\n state.components.facetBy,\n state.components.heatmapAxis,\n state.components.heatmapGroup,\n state.components.tableContent,\n ];\n for (const primaryInput of primaryInputs) {\n for (const {selectedSource, fixedAxes} of primaryInput.selectorStates) {\n primarySources.push(columnOrAxisIdFromString(selectedSource));\n primarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n if (labelsColumnId) {\n primarySources.push(labelsColumnId);\n }\n }\n }\n filterSelectedStates.forEach(({fixedAxes}) => {\n primarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n });\n for (const secondaryInput of secondaryInputs) {\n for (const {selectedSource, fixedAxes} of secondaryInput.selectorStates) {\n secondarySources.push(columnOrAxisIdFromString(selectedSource));\n secondarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n if (labelsColumnId) {\n secondarySources.push(labelsColumnId);\n }\n }\n }\n\n // use outer join between primary columns - inner join can remove useful points in tree and annotations\n const data = await store.pFrameProvider.getTableOuterJoin(\n [...primarySources, ...filterColumns],\n secondarySources,\n filters,\n false,\n primarySourcesFixedAxes,\n secondarySourcesFixedAxes\n );\n\n [...primarySources, ...secondarySources].forEach(item => {\n const key = item.toCanonicalString();\n const columnData = isColumnId(item) ? data.columnsData[key] : data.axesData[key];\n dataByColumns.values[key] = [];\n dataByColumns.values[key] = columnData;\n });\n\n const nodeIdAxis = Object.keys(data.axesData).find(\n axisIdStr => columnOrAxisIdFromString(axisIdStr)?.name === NODE_ID_AXIS_NAME\n );\n\n if (!nodeIdAxis) {\n console.warn('Missed node id axis in data column');\n } else {\n dataByColumns.values[COLUMN_NODE_ID] = data.axesData[nodeIdAxis];\n }\n\n return {byColumns: dataByColumns};\n }\n\n async createChartSettings(store: DataStore, state: DendroUIState): Promise<Record<string, unknown>> {\n const dataColumnIdString = state.components.value.selectorStates[0]?.selectedSource;\n const dataColumnId = columnOrAxisIdFromString(dataColumnIdString);\n if (!dataColumnIdString || !isColumnId(dataColumnId)) {\n throw Error('Data column is not valid');\n }\n\n const parentSourcesTree = [dataColumnIdString];\n\n const id = {type: 'column', value: COLUMN_NODE_ID};\n const parentId = {type: 'column', value: dataColumnIdString};\n const height = state.components.height.selectorStates.length\n ? {type: 'column', value: state.components.height.selectorStates[0].selectedSource}\n : undefined;\n const labels = state.components.labels.selectorStates.length\n ? {type: 'column', value: state.components.labels.selectorStates[0].selectedSource}\n : undefined;\n const aes: {\n nodeColor?: {columnName: {type: 'column'; value: string; label: string}};\n nodeShape?: {columnName: {type: 'column'; value: string; label: string}};\n nodeSize?: {columnName: {type: 'column'; value: string; label: string}};\n lineColor?: {columnName: {type: 'column'; value: string; label: string}};\n } = {};\n if (state.components.nodeColor.selectorStates.length) {\n const idString = state.components.nodeColor.selectorStates[0].selectedSource;\n aes.nodeColor = {\n columnName: {\n type: 'column',\n value: idString,\n label: await getColumnOrAxisLabel(store, idString, parentSourcesTree),\n },\n };\n }\n if (state.components.nodeShape.selectorStates.length) {\n const idString = state.components.nodeShape.selectorStates[0].selectedSource;\n aes.nodeShape = {\n columnName: {\n type: 'column',\n value: idString,\n label: await getColumnOrAxisLabel(store, idString, parentSourcesTree),\n },\n };\n }\n if (state.components.nodeSize.selectorStates.length) {\n const idString = state.components.nodeSize.selectorStates[0].selectedSource;\n aes.nodeSize = {\n columnName: {\n type: 'column',\n value: idString,\n label: await getColumnOrAxisLabel(store, idString, parentSourcesTree),\n },\n };\n }\n if (state.components.lineColor.selectorStates.length) {\n const idString = state.components.lineColor.selectorStates[0].selectedSource;\n aes.lineColor = {\n columnName: {\n type: 'column',\n value: idString,\n label: await getColumnOrAxisLabel(store, idString, parentSourcesTree),\n },\n };\n }\n\n let heatmapAnnotation;\n let heatmapAxis;\n let heatmapGroup;\n\n // heatmap with user axis, with not sequence as value\n if (\n state.components.heatmapAnnotation.selectorStates.length &&\n state.components.heatmapAxis.selectorStates.length\n ) {\n const annotationSource = state.components.heatmapAnnotation.selectorStates[0].selectedSource;\n heatmapAnnotation = {\n type: 'column',\n value: annotationSource,\n label: await getColumnOrAxisLabel(store, annotationSource, []),\n valueLabels: (await getColumnOrAxisValueLabelsId(store, annotationSource, []))?.toCanonicalString(),\n };\n const axisSource = state.components.heatmapAxis.selectorStates[0].selectedSource;\n heatmapAxis = {\n type: 'column',\n value: axisSource,\n label: await getColumnOrAxisLabel(store, axisSource, [annotationSource]),\n valueLabels: (\n await getColumnOrAxisValueLabelsId(store, axisSource, [annotationSource])\n )?.toCanonicalString(),\n };\n heatmapGroup = await Promise.all(\n state.components.heatmapGroup.selectorStates.map(async selectorState => {\n return {\n type: 'column',\n value: selectorState.selectedSource,\n label: await getColumnOrAxisLabel(store, selectorState.selectedSource, [annotationSource]),\n valueLabels: (\n await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, [annotationSource])\n )?.toCanonicalString(),\n };\n })\n );\n\n // heatmap containing sequence, as axis using order of sequence element\n } else if (state.components.heatmapForSequence.selectorStates.length) {\n const annotationSource = state.components.heatmapForSequence.selectorStates[0].selectedSource;\n heatmapAnnotation = {\n type: 'column',\n value: annotationSource,\n label: await getColumnOrAxisLabel(store, annotationSource, []),\n };\n }\n\n return {\n type: 'dendro',\n id,\n parentId,\n height,\n labels,\n aes,\n heatmapAnnotation,\n heatmapAxis,\n heatmapGroup,\n };\n }\n}\n","import {AxisId, ColumnId, isColumnId} from '../spec';\nimport type {PValue} from '../store';\nimport lodash from 'lodash';\nimport type {\n AxisSpec,\n CalculateTableDataRequest,\n FindColumnsRequest,\n FindColumnsResponse,\n PColumnSpec,\n AxisId as PFrameAxisId,\n PFrameDriver,\n PFrameHandle,\n PObjectId,\n PTableRecordSingleValueFilterV2,\n PTableVector,\n UniqueValuesRequest,\n ValueType,\n FullPTableColumnData,\n PColumnIdAndSpec,\n} from '@milaboratories/pl-model-common';\n\nexport type TableOuterJoinResult = {\n axesData: Record<string, PValue[]>;\n columnsData: Record<string, PValue[]>;\n columnSpecs: Record<string, PColumnSpec>;\n axesSpecs: Record<string, AxisSpec>;\n}\nconst UNIQUE_VALUES_LIMIT = 1000000;\n\n// In columns data instead null can be:\n// -2147483648 for Int\n// -9007199254740991 for Long\n// NaN for Float\n// NaN for Double\n\nfunction convertColumnData(type: ValueType, response: PTableVector): PValue[] {\n if (type === 'String') {\n return response.data as PValue[];\n }\n if (typeof response.data[0] === 'bigint') {\n const r = new Array(response.data.length);\n for (let i = 0; i < response.data.length; i++) {\n r[i] = response.data[i] === BigInt(-9007199254740991) ? null : Number(response.data[i]);\n }\n return r;\n }\n for (let i = 0; i < response.data.length; i++) {\n const v = response.data[i];\n if (\n (type === 'Int' && v === -2147483648) ||\n ((type === 'Double' || type === 'Float') && isNaN(v as number))\n ) {\n response.data[i] = null;\n } else {\n response.data[i] = Number(response.data[i]);\n }\n }\n return response.data as PValue[];\n}\n\nconst debug = false;\nconst LONG_REQUEST = 100;\n\nif (debug) {\n console.log('debug!');\n}\n\nexport class ColumnsProvider {\n pframeHandle: PFrameHandle;\n pframeDriver: PFrameDriver;\n\n constructor(pframeHandle: PFrameHandle, pframeDriver: PFrameDriver) {\n this.pframeHandle = pframeHandle;\n this.pframeDriver = pframeDriver;\n }\n\n async isColumnExisted(id: ColumnId) {\n const spec = await this.getColumnSpecById(id);\n return spec ? true : false;\n }\n\n async getSingleColumnData(id: ColumnId, filters: PTableRecordSingleValueFilterV2[] = []) {\n if (!(await this.isColumnExisted(id))) {\n return {\n axesData: {},\n data: [],\n };\n }\n try {\n const start = Date.now();\n const response: FullPTableColumnData[] = await this.pframeDriver.calculateTableData(this.pframeHandle, {\n src: {\n type: 'column',\n column: id.name as PObjectId,\n },\n filters,\n sorting: [],\n } as CalculateTableDataRequest<PObjectId>);\n if (debug) {\n const time = Date.now() - start;\n if (time > LONG_REQUEST) console.log('getSingleColumnData', time);\n }\n const axes = response.filter(item => item.spec.type === 'axis');\n const columns = response.filter(item => item.spec.type === 'column');\n return {\n axesData: axes.reduce((res: Record<string, PValue[]>, item) => {\n const id = AxisId.fromAxisSpec(item.spec.spec as AxisSpec);\n res[id.toCanonicalString()] = convertColumnData(id.type, item.data);\n return res;\n }, {}),\n data: columns.length ? convertColumnData(id.type, columns[0].data) : [],\n };\n } catch (err) {\n console.error('PFrame: calculateTableData error');\n throw err;\n }\n }\n\n async getColumnUniqueValues(\n id: ColumnId,\n limit = UNIQUE_VALUES_LIMIT,\n filters: PTableRecordSingleValueFilterV2[] = []\n ) {\n if (!(await this.isColumnExisted(id))) {\n return {values: [], overflow: false};\n }\n const request: UniqueValuesRequest = {\n columnId: id.name as PObjectId,\n filters,\n limit,\n };\n try {\n const start = Date.now();\n const response = await this.pframeDriver.getUniqueValues(this.pframeHandle, request);\n let overflow = false;\n if (response.overflow) {\n overflow = true;\n console.warn(`More than ${limit} values for ${id.name} column`);\n }\n if (debug) {\n const time = Date.now() - start;\n if (time > LONG_REQUEST)\n console.log('getColumnUniqueValues', time, id.type, `${response.values.data.length} items`);\n }\n return {\n values: Array.from(response.values.data as ArrayLike<unknown>).map(String),\n overflow\n };\n } catch (err) {\n console.error('PFrame: getUniqueValues for column error');\n throw err;\n }\n }\n\n async getAxisUniqueValues(\n axisId: AxisId,\n parents: ColumnId[],\n limit = UNIQUE_VALUES_LIMIT,\n filters: PTableRecordSingleValueFilterV2[] = []\n ) {\n const columnParents = parents.filter(isColumnId);\n\n const specs: (PColumnSpec | null)[] = await Promise.all(columnParents.map(c => this.getColumnSpecById(c)));\n const axisIdStr = axisId.toCanonicalString();\n // realParents - parent columns that has axisId in its spec\n const realParents = columnParents.filter((c, idx) => {\n const columnSpec = specs[idx];\n return (\n columnSpec !== null &&\n columnSpec.axesSpec.some(axisSpec => AxisId.fromAxisSpec(axisSpec).toCanonicalString() === axisIdStr)\n );\n });\n if (realParents.length === 0) {\n return {values: [], overflow: false};\n }\n try {\n const start = Date.now();\n const responses = await Promise.all(\n realParents.map(p =>\n this.pframeDriver.getUniqueValues(this.pframeHandle, {\n columnId: p.name as PObjectId,\n axis: axisId.toPFrameId(),\n filters,\n limit,\n })\n )\n );\n let overflow = false;\n responses.forEach((response, idx) => {\n if (response.overflow) {\n overflow = true;\n console.warn(`More than ${limit} values for ${realParents[idx].name} column`);\n }\n })\n if (debug) {\n const time = Date.now() - start;\n if (time > LONG_REQUEST) console.log('getAxisUniqueValues', time);\n }\n return {\n values: lodash.uniq(\n lodash.flatten(responses.map(r => {\n return Array.from(r.values.data as ArrayLike<unknown>).map(String);\n })) as string[]\n ),\n overflow\n };\n } catch (err) {\n console.error('PFrame: getUniqueValues for axis error', err);\n throw err;\n }\n }\n\n async getTableOuterJoin(\n primaryIds: (ColumnId | AxisId)[],\n secondaryIds: (ColumnId | AxisId)[],\n filters: PTableRecordSingleValueFilterV2[] = [],\n primaryInnerJoin = true,\n primarySourcesFixedAxes:{idx:number, value:PValue}[][] = [],\n secondarySourcesFixedAxes:{idx:number, value:PValue}[][] = []\n ): Promise<TableOuterJoinResult> {\n const primaryColumns = primaryIds.filter(isColumnId);\n const secondaryColumns = secondaryIds.filter(isColumnId);\n const request = {\n src: {\n type: 'outer',\n primary: {\n type: primaryInnerJoin ? 'inner' : 'full',\n entries: primaryColumns.map((item, idx) => {\n const axisFilters = primarySourcesFixedAxes[idx]?.map(v => ({\n type: 'constant',\n axisIndex: v.idx,\n constant: v.value\n })).filter((v) => v.constant !== undefined);\n return axisFilters?.length\n ? {\n type: 'slicedColumn',\n newId: item.name,\n column: item.name as PObjectId,\n axisFilters\n } : {\n type: 'column',\n column: item.name as PObjectId,\n }\n })\n },\n secondary: secondaryColumns.map((item, idx) => {\n const axisFilters = secondarySourcesFixedAxes[idx]?.map(v => ({\n type: 'constant',\n axisIndex: v.idx,\n constant: v.value\n })).filter((v) => v.constant !== undefined);\n return axisFilters?.length\n ? {\n type: 'slicedColumn',\n newId: item.name,\n column: item.name as PObjectId,\n axisFilters\n } : {\n type: 'column',\n column: item.name as PObjectId,\n }\n }),\n },\n filters,\n sorting: [],\n } as CalculateTableDataRequest<PObjectId>;\n try {\n const start = Date.now();\n const response = await this.pframeDriver.calculateTableData(this.pframeHandle, request);\n if (debug) {\n const time = Date.now() - start;\n if (time > LONG_REQUEST) console.log('getTableOuterJoin', time);\n }\n\n const axes = response.filter(item => item.spec.type === 'axis');\n const columns = response.filter(item => item.spec.type === 'column');\n if (debug) {\n console.log('getTableOuterJoin', `${response[0].data.data.length} items`);\n }\n\n return {\n axesData: axes.reduce((res: Record<string, PValue[]>, item) => {\n const id = AxisId.fromAxisSpec(item.spec.spec as AxisSpec);\n res[id.toCanonicalString()] = convertColumnData(id.type, item.data);\n return res;\n }, {}),\n columnsData: columns.reduce((res: Record<string, PValue[]>, item) => {\n const spec = item.spec.spec as PColumnSpec;\n const id = new ColumnId({\n name: item.spec.id as PObjectId,\n type: spec.valueType,\n });\n res[id.toCanonicalString()] = convertColumnData(id.type, item.data);\n return res;\n }, {}),\n columnSpecs: columns.reduce((res: Record<string, PColumnSpec>, item) => {\n const spec = item.spec.spec as PColumnSpec;\n const id = new ColumnId({\n name: item.spec.id as PObjectId,\n type: spec.valueType,\n });\n res[id.toCanonicalString()] = spec;\n return res;\n }, {}),\n axesSpecs: axes.reduce((res: Record<string, AxisSpec>, item) => {\n const spec = item.spec.spec as AxisSpec;\n const id = AxisId.fromAxisSpec(spec);\n res[id.toCanonicalString()] = spec;\n return res;\n }, {}),\n };\n } catch (err) {\n console.error('PFrame: table outer join error');\n console.info('error with request: ', request);\n throw err;\n }\n }\n\n async getColumnSpecById(id: ColumnId): Promise<PColumnSpec | null> {\n try {\n const start = Date.now();\n const response = await this.pframeDriver.getColumnSpec(this.pframeHandle, id.name as PObjectId);\n if (debug) {\n const time = Date.now() - start;\n if (time > LONG_REQUEST) console.log('getColumnSpecById', time, response);\n }\n return response ?? null;\n } catch (err) {\n console.error('PFrame: get single column error');\n return null;\n }\n }\n\n async getColumnAxesIds(id: ColumnId): Promise<AxisId[]> {\n return (await this.getColumnSpecById(id))?.axesSpec.map(axisSpec => AxisId.fromAxisSpec(axisSpec)) ?? [];\n }\n\n async getRequestColumnsFromSelectedSources(sources: (ColumnId | AxisId)[]): Promise<PFrameAxisId[]> {\n const result: PFrameAxisId[] = [];\n //NB: we don't need to add axes in request because axes are already in columns\n for (const item of sources) {\n if (isColumnId(item)) {\n const axesSpec = (await this.getColumnSpecById(item))?.axesSpec ?? [];\n result.push(...axesSpec.map(spec => AxisId.fromAxisSpec(spec).toPFrameId()));\n }\n }\n return result;\n }\n\n async getColumnsList() {\n return this.pframeDriver.listColumns(this.pframeHandle);\n }\n\n async getColumnsFull(\n selectedSources: (ColumnId | AxisId)[],\n strictlyCompatible: boolean,\n types?: ValueType[],\n names?: string[],\n annotations?: FindColumnsRequest['columnFilter']['annotationValue'],\n ): Promise<PColumnIdAndSpec[]> {\n try {\n const request: FindColumnsRequest = {\n columnFilter: {\n type: types,\n name: names,\n annotationValue: annotations,\n },\n compatibleWith: await this.getRequestColumnsFromSelectedSources(selectedSources),\n strictlyCompatible, // should be true if we want to get meta and false if X/Y\n };\n const start = Date.now();\n const response: FindColumnsResponse = await this.pframeDriver.findColumns(this.pframeHandle, request);\n if (debug) {\n const time = Date.now() - start;\n if (time > LONG_REQUEST) console.log('getColumnsFull', time);\n }\n const result: PColumnIdAndSpec[] = [];\n response.hits.forEach(item => {\n // ***\n // consider mapping variants in qualifications\n // ***\n\n result.push(item);\n });\n return result;\n } catch (err) {\n console.error('PFrame: findColumns error');\n throw err;\n }\n }\n\n async getColumns(\n selectedSources: (ColumnId | AxisId)[],\n strictlyCompatible: boolean,\n types?: ValueType[],\n names?: string[],\n annotations?: FindColumnsRequest['columnFilter']['annotationValue'],\n ): Promise<ColumnId[]> {\n return (await this.getColumnsFull(selectedSources, strictlyCompatible, types, names, annotations)).map(\n item =>\n new ColumnId({\n name: item.columnId,\n type: item.spec.valueType,\n })\n );\n }\n\n async findColumnBy(\n name: string,\n type?: ValueType,\n annotationValue?: FindColumnsRequest['columnFilter']['annotationValue'],\n domainValue?: FindColumnsRequest['columnFilter']['domainValue']\n ): Promise<ColumnId | null> {\n try {\n const request: FindColumnsRequest = {\n columnFilter: {\n name: [name],\n ...(type ? {type: [type]} : {}),\n ...(annotationValue ? {annotationValue} : {}),\n ...(domainValue ? {domainValue} : {}),\n },\n compatibleWith: [] as AxisId[],\n strictlyCompatible: false,\n };\n const start = Date.now();\n const response: FindColumnsResponse = await this.pframeDriver.findColumns(this.pframeHandle, request);\n if (debug) {\n const time = Date.now() - start;\n if (time > LONG_REQUEST) console.log('findColumnBy', time);\n }\n const result: ColumnId[] = [];\n response.hits.forEach(({columnId, spec}) => {\n // ***\n // consider mapping variants in qualifications\n // ***\n\n result.push(new ColumnId({name: columnId, type: spec.valueType}));\n });\n if (result.length > 1) {\n console.warn(`More than 1 column found for ${name}}`);\n }\n if (result.length === 0) {\n console.warn(`No columns found for ${name}}`);\n return null;\n }\n return result[0];\n } catch (err) {\n console.error('PFrame: findColumns error');\n throw err;\n }\n }\n}\n","import type {DataStore} from './store';\nimport {ColumnsProvider} from './pframe/ColumnsProvider';\nimport type {PFrameDriver, PFrameHandle} from '@milaboratories/pl-model-common';\n\nexport class DemoDataStore implements DataStore {\n readonly pFrameProvider: ColumnsProvider;\n readonly labelsModifier;\n constructor(pframeHandle: PFrameHandle, pframeDriver: PFrameDriver, labelsModifier: (id: string, label: string) => string = (id: string, label: string) => label ?? id) {\n this.labelsModifier = labelsModifier;\n this.pFrameProvider = new ColumnsProvider(pframeHandle, pframeDriver);\n }\n}\n","import {BubbleStateController, BubbleUIState, InitialBubbleState} from './controllers/controllersByChartType/bubble';\nimport type {DiscreteUIState} from './controllers/controllersByChartType/discrete';\nimport type {HeatmapUIState} from './controllers/controllersByChartType/heatmap';\nimport type {ScatterplotUIState} from './controllers/controllersByChartType/scatterplot';\nimport type {DendroUIState} from './controllers/controllersByChartType/dendro';\nimport {\n HistogramStateController,\n HistogramUIState,\n InitialHistogramState,\n} from './controllers/controllersByChartType/histogram';\nimport {DiscreteStateController, InitialDiscreteState} from './controllers/controllersByChartType/discrete';\nimport {HeatmapStateController, InitialHeatmapState} from './controllers/controllersByChartType/heatmap';\nimport {InitialScatterplotState, ScatterplotStateController} from './controllers/controllersByChartType/scatterplot';\nimport {\n InitialScatterplotUmapState,\n ScatterplotUmapStateController,\n ScatterplotUmapUIState,\n} from './controllers/controllersByChartType/scatterplot-umap';\nimport {DendroStateController, InitialDendroState} from './controllers/controllersByChartType/dendro';\nimport type {Controller, PlotDataAndSettings} from './controllers/ControllerBase';\nimport {DemoDataStore} from './demoStore';\nimport {PValue} from './store';\nimport {AxisId, ColumnId, columnOrAxisIdFromString} from './spec';\nimport type {\n AxisData,\n ChartType,\n ColumnData,\n ColumnOrAxisData,\n ComponentGuideFilter,\n ComponentGuideSimple,\n ComponentStateFilter,\n ComponentStateSimple,\n InputGuide,\n InputState,\n InputStateParent,\n SelectorStateFilter,\n SelectorStateSimple,\n SourceOption,\n} from './common';\nimport type {ColumnOrAxisIdString} from './spec';\nimport {isColumnId} from './spec';\nimport type {AxisSpec, PColumnSpec} from '@milaboratories/pl-model-common';\n\nconst PfPlots = {\n controllers: {\n discrete: new DiscreteStateController(),\n scatterplot: new ScatterplotStateController(),\n 'scatterplot-umap': new ScatterplotUmapStateController(),\n heatmap: new HeatmapStateController(),\n dendro: new DendroStateController(),\n histogram: new HistogramStateController(),\n bubble: new BubbleStateController(),\n },\n initialStates: {\n discrete: InitialDiscreteState,\n scatterplot: InitialScatterplotState,\n 'scatterplot-umap': InitialScatterplotUmapState,\n heatmap: InitialHeatmapState,\n dendro: InitialDendroState,\n histogram: InitialHistogramState,\n bubble: InitialBubbleState,\n },\n};\n\nexport function getControllerByType<C extends ChartType>(chartType: C): Controller<InputStateParent<C>> {\n return PfPlots.controllers[chartType] as unknown as Controller<InputStateParent<C>>;\n}\n\nexport function getInitialStateByType<C extends ChartType>(chartType: C): InputStateParent<C> {\n return PfPlots.initialStates[chartType] as unknown as InputStateParent<C>;\n}\n\ntype InputNamesByChartType = {\n [K in ChartType]: K extends 'discrete' ?\n keyof DiscreteUIState['components'] : K extends 'heatmap' ?\n keyof HeatmapUIState['components'] : K extends 'dendro' ?\n keyof DendroUIState['components'] : K extends 'scatterplot' ?\n keyof ScatterplotUIState['components'] : K extends 'scatterplot-umap' ?\n keyof ScatterplotUmapUIState['components'] : K extends 'histogram' ?\n keyof HistogramUIState['components'] : K extends 'bubble' ?\n keyof BubbleUIState['components'] : never\n}\n\nexport {AxisId, ColumnId, DemoDataStore, columnOrAxisIdFromString, isColumnId};\n\n// types\nexport {\n AxisSpec,\n ChartType,\n DiscreteUIState,\n DendroUIState,\n ScatterplotUIState,\n ScatterplotUmapUIState,\n HeatmapUIState,\n HistogramUIState,\n BubbleUIState,\n ColumnOrAxisIdString,\n ColumnOrAxisData,\n PColumnSpec,\n ComponentGuideFilter,\n ComponentGuideSimple,\n ComponentStateFilter,\n ComponentStateSimple,\n PlotDataAndSettings,\n InputGuide,\n InputState,\n InputStateParent,\n PValue,\n SelectorStateFilter,\n SelectorStateSimple,\n SourceOption,\n AxisData,\n ColumnData,\n Controller,\n DiscreteStateController,\n ScatterplotStateController,\n DendroStateController,\n HeatmapStateController,\n BubbleStateController,\n InputNamesByChartType,\n};\n"],"names":["AXIS_NATURE_KEY","COLUMN_LABEL_KEY","COLUMN_NAME_KEY","COLUMN_DOMAIN_KEY","SUBSET_FILTER_KEY","DISCRETE_FILTER_KEY","DISCRETE_VALUES_KEY","HIGH_CARDINALITY","IS_VIRTUAL_COLUMN","IS_LINKER_COLUMN","AxisId","_AxisId","type","name","domain","canonicalize","axisSpec","axesSpec","axis","values","ColumnId","_ColumnId","pojo","isColumnId","id","isAxisId","columnOrAxisIdFromString","str","PARENTS_ANNOTATION","getAxisParents","checkIfRoot","axes","idx","maybeRoot","canonicalizeJson","axisIdx","getRootAxis","getAxesTree","rootAxis","root","nodesQ","nextNodes","node","parentNodes","setFromAxisTree","tree","set","parent","arrayFromAxisTree","res","getAxesGroups","axisSpecs","freeAxes","groups","arr","getCompositeLinkersMap","compositeLinkers","_a","_b","result","linker","columnId","left","right","keyLeft","keyRight","addSourceInfoToMap","store","selectedIdStr","label","dataMap","dataAxesList","dataAxes","linkerAxes","fixedAxesAllowed","compositeLinkerMap","_c","_d","sourceId","columnSpec","extraAxesIds","getNotAllowedAxes","extraAxesSet","axesIds","extraAxesIndexes","columnInfo","getColumnOrAxisLabel","axisIdStr","mustBeConsumed","axisMustBeConsumed","axisInfo","getDefaultInfo","sourceIdStr","item","getStateCopy","state","getFilterFromState","selectedSource","selectedFilterRange","selectedFilterValue","rangeFilters","getFiltersFromStates","states","getGlobalId","spec","getAxisSpecFromParents","axisId","parentSources","parentSource","parentId","s","LABEL_COLUMN_NAME","getColumnOrAxisValueLabelsId","getAxisGlobalId","labelColumns","sourceGlobalId","labelColumn","selectedId","labelsColumn","axisNature","checkSourceBySpecForFilters","dataColumnPredicateDefault","getLinkerColumnsMap","linkerColumns","resultMap","axisA","axisB","idA","idB","getAxesSpecsFromSources","idStrs","idStr","searchPath","linkerColumnsMap","startId","endId","previous","visited","nextIds","next","nextId","availableIds","availableId","ids","current","getLinkerColumnsFromGraph","parentAxesIds","targetAxisId","paths","parentAxisId","p","resultPath","path","getAllLinkerMaps","allLinkerColumns","getLinkerColumnsForSource","dataInputAxes","secondarySource","fixedAxesOfSecondaryColumn","columnOrAxisId","secondaryColumnSpec","allColumnAxesWithoutFixed","el","dataInputAxesSet","rightPartAxes","leftGroups","rightGroups","leftCompositeKeysSet","compositeLinkerKey","columnKey","linkerColumn","column","dataInputAxesList","group","groupKey","key","a","createHighlightColumn","highlightSelectedStates","data","dataLength","highlightColumn","rowIdx","i","value","rangeResult","ControllerBase","simpleComponentControllers","filterComponentControllers","components","componentName","inputName","selectorState","nextSelectorStates","currentStates","deletedStates","currentState","addedStates","nextState","st","labelsMap","nextAxes","addedAxis","availableAxes","availableAxis","selectorStates","consumedSourcesSet","availableColumns","sources","deriveLabels","fixedIds","dataColumnPredicate","resultComponentsGuide","ignoredNamesSet","fixedSelectedSet","selectedColumnsOrAxesInfo","optionsInfo","allControllers","freeOptionsSet","componentController","options","v","markMustBeConsumed","option","selected","mustBeConsumedAxes","isHighCardinality","consumedHighCardinalityAxes","consumed","info","axesToBeFixedSet","consistent","getSourceInfo","inputGuide","limit","searchQuery","searchQueryValue","sortValues","b","discreteValuesStr","discreteValues","labelsColumnId","filters","dataValues","axesData","axisKeys","searchInLabelsOrValue","response","component","consistency","hasFreeDimensions","optionId","hasNotSelectedAxisToBeFixed","fixedAxes","isLinkerColumn","_ComponentController","allowedTypes","settings","strictlyDependsOnParents","dependsOn","parentComponents","annotations","checkSourceBySpec","selectedSourceStr","componentState","parentAxes","isAxisInSet","consistencyData","selectedHereColumnIds","selectedHere","parentSelectedSources","source","_e","_f","_g","parentAxesList","multipleSelectors","required","stateConsistency","dep","allowedColumns","thisState","axisData","typeOK","annotationsOK","k","checkBySpecOK","axisNatureOK","decreasingDimensionsOK","ignored","strictlyCompatible","columnIdString","isLabelColumn","ComponentController","InitialBubbleState","getMultiSourceColumn","selectedSources","selectedIds","BubbleStateController","valueColorColumnIdString","valueSizeColumnIdString","valueColorColumnId","valueSizeColumnId","dataByColumns","filterSelectedStates","filterColumns","primaryColumns","inputs","secondarySources","primarySourcesFixedAxes","secondarySourcesFixedAxes","axisValue","input","xAxes","xKey","xAxesLabeled","yAxes","yKey","yAxesLabeled","valueColor","valueSize","facetBy","xAxisTitle","yAxisTitle","tooltipContent","idString","InitialHistogramState","HistogramStateController","valueColumnIdString","valueColumnId","grouping","InitialDiscreteState","DiscreteStateController","yColumnIdString","yColumnIdWithQ","yColumnId","y","primaryGrouping","secondaryGrouping","InitialHeatmapState","isDiscreteData","HeatmapStateController","allowedAxes","xVisibleAxes","yVisibleAxes","xGroupBy","yGroupBy","valueSpec","annotationsX","annotationsY","InitialScatterplotState","ScatterplotStateController","sourceIdX","sourceIdY","specX","specY","axesX","axesY","hangingX","axisKey","hangingY","xColumnIdString","xId","yId","primarySources","_v","xIdString","yIdString","xIdWithQ","yIdWithQ","x","keyColumn","allGroupingIds","lodash","highlight","InitialScatterplotUmapState","ScatterplotUmapStateController","NODE_ID_AXIS_NAME","COLUMN_NODE_ID","InitialDendroState","DendroStateController","primaryInputs","secondaryInputs","idMap","primaryInput","secondaryInput","responseKey","resultKey","nodeIdAxis","annotationColumnIdString","annotationColumnId","columnData","dataColumnIdString","dataColumnId","parentSourcesTree","height","labels","aes","heatmapAnnotation","heatmapAxis","heatmapGroup","annotationSource","axisSource","UNIQUE_VALUES_LIMIT","convertColumnData","r","debug","ColumnsProvider","pframeHandle","pframeDriver","start","columns","err","request","overflow","parents","columnParents","specs","c","realParents","responses","primaryIds","secondaryIds","primaryInnerJoin","secondaryColumns","axisFilters","types","names","annotationValue","domainValue","DemoDataStore","labelsModifier","PfPlots","getControllerByType","chartType","getInitialStateByType"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../node_modules/@milaboratories/pf-plots/src/constants.ts","../../../../../node_modules/@milaboratories/pf-plots/src/spec.ts","../../../../../node_modules/@milaboratories/pf-plots/src/compositeLinkers.ts","../../../../../node_modules/@milaboratories/pf-plots/src/utils.ts","../../../../../node_modules/@milaboratories/pf-plots/src/controllers/ControllerBase.ts","../../../../../node_modules/@milaboratories/pf-plots/src/controllers/ComponentController.ts","../../../../../node_modules/@milaboratories/pf-plots/src/controllers/controllersByChartType/bubble.ts","../../../../../node_modules/@milaboratories/pf-plots/src/controllers/controllersByChartType/histogram.ts","../../../../../node_modules/@milaboratories/pf-plots/src/controllers/controllersByChartType/discrete.ts","../../../../../node_modules/@milaboratories/pf-plots/src/controllers/controllersByChartType/heatmap.ts","../../../../../node_modules/@milaboratories/pf-plots/src/controllers/controllersByChartType/scatterplot.ts","../../../../../node_modules/@milaboratories/pf-plots/src/controllers/controllersByChartType/scatterplot-umap.ts","../../../../../node_modules/@milaboratories/pf-plots/src/controllers/controllersByChartType/dendro.ts","../../../../../node_modules/@milaboratories/pf-plots/src/pframe/ColumnsProvider.ts","../../../../../node_modules/@milaboratories/pf-plots/src/demoStore.ts","../../../../../node_modules/@milaboratories/pf-plots/src/index.ts"],"sourcesContent":["export const AXIS_NATURE_KEY = 'pl7.app/axisNature';\nexport const COLUMN_LABEL_KEY = 'pl7.app/label';\n\nexport const COLUMN_NAME_KEY = 'pl7.app/columnAsAxis/name';\nexport const COLUMN_DOMAIN_KEY = 'pl7.app/columnAsAxis/domain';\nexport const SUBSET_FILTER_KEY = 'pl7.app/isSubset';\nexport const DISCRETE_FILTER_KEY = 'pl7.app/isDiscreteFilter';\nexport const DISCRETE_VALUES_KEY = 'pl7.app/discreteValues';\nexport const MIN_VALUE_KEY = 'pl7.app/min';\nexport const MAX_VALUE_KEY = 'pl7.app/max';\n\nexport const HIGH_CARDINALITY = 'pl7.app/graph/axis/highCardinality';\nexport const IS_VIRTUAL_COLUMN = 'pl7.app/graph/isVirtual'; // duplicate of metadata-column enriched domain keys for compatibility with other column\nexport const IS_LINKER_COLUMN = 'pl7.app/isLinkerColumn';\n","import canonicalize from 'canonicalize';\nimport type {\n AxisSpec,\n AxisId as PFrameAxisId,\n ValueType,\n} from '@milaboratories/pl-model-common';\n\ninterface ToCanonicalString {\n toCanonicalString(): ColumnOrAxisIdString;\n}\n\ninterface AxisIdProps {\n type: ValueType;\n name: string;\n domain?: Record<string, string>;\n}\n\ninterface AxisIdPojo {\n kind: 'axis';\n type: ValueType;\n name: string;\n domain?: Record<string, string>;\n}\n\nexport class AxisId implements ToCanonicalString {\n kind = 'axis';\n type: ValueType;\n name: string;\n domain?: Record<string, string>;\n\n constructor({type, name, domain}: AxisIdProps) {\n this.type = type;\n this.name = name;\n this.domain = {...domain};\n }\n\n toCanonicalString(): ColumnOrAxisIdString {\n return canonicalize(this)!;\n }\n\n static fromAxisSpec(axisSpec: AxisSpec) {\n return new AxisId({name: axisSpec.name, type: axisSpec.type, domain: axisSpec.domain});\n }\n\n static fromAxesSpec(axesSpec: AxisSpec[]): AxisId[] {\n return axesSpec.map(axis => AxisId.fromAxisSpec(axis));\n }\n\n copy(): AxisId {\n return new AxisId({type: this.type, name: this.name, domain: this.domain});\n }\n\n toPFrameId():PFrameAxisId {\n return {\n type: this.type,\n name: this.name,\n domain: this.domain\n };\n }\n\n static fromPojo(values: AxisIdPojo) {\n return new AxisId(values);\n }\n}\n\ninterface ColumnIdProps {\n name: string;\n type: ValueType;\n}\n\ninterface ColumnIdPojo {\n kind: 'column';\n name: string;\n type: ValueType;\n}\n\nexport class ColumnId implements ToCanonicalString {\n kind = 'column';\n name: string;\n type: ValueType;\n\n constructor({name, type}: ColumnIdProps) {\n this.name = name;\n this.type = type;\n }\n\n toCanonicalString(): ColumnOrAxisIdString {\n return canonicalize(this)!;\n }\n\n static fromPojo(pojo: ColumnIdPojo) {\n return new ColumnId(pojo);\n }\n}\n\nexport function isColumnId(id: ColumnId | AxisId | null): id is ColumnId {\n return id !== null && id.kind === 'column';\n}\n\nexport function isAxisId(id: ColumnId | AxisId | null): id is AxisId {\n return id !== null && id.kind === 'axis';\n}\n\nexport type ColumnOrAxisIdString = string;\n\nexport function columnOrAxisIdFromString(str: ColumnOrAxisIdString) {\n const pojo: ColumnIdPojo | AxisIdPojo = JSON.parse(str);\n if (pojo.kind === 'column') {\n return ColumnId.fromPojo(pojo);\n }\n if (pojo.kind === 'axis') {\n return AxisId.fromPojo(pojo);\n }\n throw Error('wrong column or axis object');\n}\n","import { AxisSpec, CanonicalizedJson, canonicalizeJson, PColumnIdAndSpec } from \"@milaboratories/pl-model-common\";\nimport { ColumnId } from \"./spec\";\n\nexport const PARENTS_ANNOTATION = 'pl7.app/parents';\n\ntype AxisTree = {\n axis: AxisSpec;\n parents: AxisTree[];\n};\n\nfunction getAxisParents(axis: AxisSpec): AxisSpec[] {\n if (!axis.annotations || !axis.annotations[PARENTS_ANNOTATION]) {\n return [];\n }\n return JSON.parse(axis.annotations[PARENTS_ANNOTATION]);\n}\n\nfunction checkIfRoot(axes: AxisSpec[], idx: number): boolean {\n const maybeRoot = canonicalizeJson(axes[idx]);\n\n for (let axisIdx = 0; axisIdx < axes.length; axisIdx++) {\n const axis = axes[axisIdx];\n if (idx === axisIdx) {\n continue;\n }\n const parents: AxisSpec[] = getAxisParents(axis);\n if (parents.some((axis) => canonicalizeJson(axis) === maybeRoot)) {\n return false;\n }\n }\n return true;\n}\nfunction getRootAxis(axes: AxisSpec[]): AxisSpec | null {\n for (let axisIdx = 0; axisIdx < axes.length; axisIdx++) {\n if (checkIfRoot(axes, axisIdx)) {\n return axes[axisIdx];\n }\n }\n return null;\n}\n\nexport function getAxesTree(rootAxis: AxisSpec): AxisTree | null {\n const root: AxisTree = { axis: rootAxis, parents: [] };\n let nodesQ = [root];\n while (nodesQ.length) {\n const nextNodes = [];\n for (const node of nodesQ) {\n const parentNodes = getAxisParents(node.axis);\n node.parents = parentNodes.map((axis) => ({ axis, parents: [] }));\n nextNodes.push(...node.parents);\n }\n nodesQ = nextNodes;\n }\n return root;\n}\n\nexport function setFromAxisTree(tree: AxisTree): Set<CanonicalizedJson<AxisSpec>> {\n const set: Set<CanonicalizedJson<AxisSpec>> = new Set([canonicalizeJson(tree.axis)]);\n let nodesQ = [tree];\n while (nodesQ.length) {\n const nextNodes = [];\n for (const node of nodesQ) {\n for (const parent of node.parents) {\n set.add(canonicalizeJson(parent.axis));\n nextNodes.push(parent);\n }\n }\n nodesQ = nextNodes;\n }\n return set;\n}\nexport function arrayFromAxisTree(tree: AxisTree): AxisSpec[] {\n const res: AxisSpec[] = [tree.axis];\n let nodesQ = [tree];\n while (nodesQ.length) {\n const nextNodes = [];\n for (const node of nodesQ) {\n for (const parent of node.parents) {\n res.push(parent.axis);\n nextNodes.push(parent);\n }\n }\n nodesQ = nextNodes;\n }\n return res;\n}\n\nexport function getAxesGroups(axisSpecs:AxisSpec[]): AxisSpec[][] | null {\n if (!axisSpecs.length) {\n return [];\n }\n let freeAxes = axisSpecs;\n\n const groups:AxisSpec[][] = [];\n while (freeAxes.length) {\n const root = getRootAxis(freeAxes);\n if (root === null) {\n return null;\n }\n const tree = getAxesTree(root);\n if (tree === null) {\n return null;\n }\n const set = setFromAxisTree(tree);\n const arr = arrayFromAxisTree(tree);\n groups.push(arr);\n\n freeAxes = freeAxes.filter((axisSpec) => !set.has(canonicalizeJson(axisSpec)));\n }\n return groups;\n}\n\nexport type CompositeLinkerMap = Map<\n CanonicalizedJson<AxisSpec[]>,\n Map<CanonicalizedJson<AxisSpec[]>, ColumnId>\n>\nexport function getCompositeLinkersMap(compositeLinkers:PColumnIdAndSpec[]):CompositeLinkerMap {\n const result:CompositeLinkerMap = new Map();\n for (const linker of compositeLinkers) {\n const columnId = new ColumnId({name: linker.columnId, type: linker.spec.valueType});\n const groups = getAxesGroups(linker.spec.axesSpec);\n\n if (!groups || groups.length !== 2) {\n continue;\n }\n const [left, right] = groups;\n const keyLeft = canonicalizeJson(left);\n const keyRight = canonicalizeJson(right);\n if (!result.has(keyLeft)) {\n result.set(keyLeft, new Map());\n }\n if (!result.has(keyRight)) {\n result.set(keyRight, new Map());\n }\n result.get(keyLeft)?.set(keyRight, columnId);\n result.get(keyRight)?.set(keyLeft, columnId);\n }\n return result;\n}","import {SingleValuePredicateV2} from '@milaboratories/pl-model-common/src/drivers/pframe/table_calculate';\nimport {SelectorState} from './common';\nimport {TableOuterJoinResult} from './pframe/ColumnsProvider';\nimport type {DataStore, PValue} from './store';\nimport type {ColumnOrAxisIdString} from './spec';\nimport {isAxisId} from './spec';\nimport {AxisId, ColumnId, columnOrAxisIdFromString, isColumnId} from './spec';\nimport type {AxisData, ColumnData, InputState, SelectorStateFilter} from './common';\nimport {\n AXIS_NATURE_KEY,\n COLUMN_DOMAIN_KEY,\n COLUMN_LABEL_KEY,\n COLUMN_NAME_KEY, DISCRETE_FILTER_KEY, IS_LINKER_COLUMN,\n IS_VIRTUAL_COLUMN,\n SUBSET_FILTER_KEY,\n} from './constants';\nimport {\n canonicalizeJson,\n PColumnIdAndSpec,\n type AxisSpec,\n type PColumnSpec,\n type PObjectId,\n type PTableRecordSingleValueFilterV2,\n isPColumnSpec, PObjectSpec,\n} from '@milaboratories/pl-model-common';\nimport canonicalize from 'canonicalize';\nimport { CompositeLinkerMap, getAxesGroups, getCompositeLinkersMap } from './compositeLinkers';\nimport { DemoDataStore } from './demoStore';\n\nexport async function addSourceInfoToMap( // by column id / axis id, without qualifications\n store: DataStore,\n selectedIdStr: ColumnOrAxisIdString,\n label: string | undefined,\n dataMap: Map<string, ColumnData | AxisData>,\n dataAxesList: AxisSpec[],\n dataAxes: Set<ColumnOrAxisIdString>,\n linkerAxes: Set<ColumnOrAxisIdString>,\n fixedAxesAllowed = true,\n compositeLinkerMap: CompositeLinkerMap\n) {\n const sourceId = columnOrAxisIdFromString(selectedIdStr);\n if (isColumnId(sourceId)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(sourceId);\n if (!columnSpec) {\n return;\n }\n const extraAxesIds = getNotAllowedAxes(\n columnSpec,\n dataAxesList,\n dataAxes,\n linkerAxes,\n compositeLinkerMap\n ).map((axisSpec) => AxisId.fromAxisSpec(axisSpec).toCanonicalString());\n\n const extraAxesSet = new Set(extraAxesIds);\n const axesIds = columnSpec.axesSpec.map(axisSpec => AxisId.fromAxisSpec(axisSpec).toCanonicalString());\n const extraAxesIndexes: Record<string, number> = {};\n if (fixedAxesAllowed) {\n axesIds.forEach((id, idx) => {\n if (extraAxesSet.has(id)) {\n extraAxesIndexes[id] = idx;\n }\n });\n }\n const columnInfo: ColumnData = {\n kind: 'column',\n name: columnSpec.name,\n label: label ?? (await getColumnOrAxisLabel(store, selectedIdStr, [])),\n type: columnSpec.valueType,\n spec: columnSpec,\n annotations: columnSpec.annotations,\n isSubsetFilter: columnSpec.annotations?.[SUBSET_FILTER_KEY] === 'true',\n isDiscreteFilter: columnSpec.valueType === 'String' || columnSpec.annotations?.[DISCRETE_FILTER_KEY] === 'true',\n axesToBeFixed: extraAxesIds,\n axesToBeFixedIndexes: extraAxesIndexes,\n };\n dataMap.set(sourceId.toCanonicalString(), columnInfo);\n for (const axisSpec of columnSpec.axesSpec) {\n const axisId = AxisId.fromAxisSpec(axisSpec);\n const axisIdStr = axisId.toCanonicalString();\n if (dataMap.has(axisIdStr)) {\n continue;\n }\n const mustBeConsumed = axisMustBeConsumed(axisSpec);\n const axisInfo: AxisData = {\n kind: 'axis',\n name: axisSpec.name,\n label: await getColumnOrAxisLabel(store, axisIdStr, [selectedIdStr]),\n type: axisSpec.type,\n mustBeConsumed,\n dividable: false,\n spec: axisSpec,\n annotations: axisSpec.annotations,\n isSubsetFilter: axisSpec.annotations?.[SUBSET_FILTER_KEY] === 'true',\n isDiscreteFilter: axisSpec.type === 'String' || axisSpec.annotations?.[DISCRETE_FILTER_KEY] === 'true',\n parentSources: [selectedIdStr],\n };\n dataMap.set(axisIdStr, axisInfo);\n }\n }\n}\n\nexport function getDefaultInfo(sourceIdStr: ColumnOrAxisIdString): ColumnData | AxisData {\n const item = columnOrAxisIdFromString(sourceIdStr);\n const {name, type} = item;\n if (isColumnId(item)) {\n return {\n kind: 'column',\n name: '',\n label: ' ',\n type: item.type,\n spec: {axesSpec: [], kind: 'PColumn', valueType: item.type, name},\n annotations: undefined,\n isSubsetFilter: false,\n isDiscreteFilter: item.type === 'String',\n axesToBeFixed: [],\n axesToBeFixedIndexes: {}\n };\n }\n return {\n kind: 'axis',\n name: '',\n label: ' ',\n type: type,\n spec: {type, name},\n mustBeConsumed: false,\n dividable: false,\n annotations: undefined,\n isSubsetFilter: false,\n isDiscreteFilter: type === 'String',\n parentSources: [],\n };\n}\n\nexport function getStateCopy<State extends InputState>(state: State): State {\n return {\n type: state.type,\n components: {...state.components},\n dividedAxes: {...state.dividedAxes},\n } as State;\n}\n\nexport function getFilterFromState(state: SelectorStateFilter): PTableRecordSingleValueFilterV2[] {\n const {selectedSource, type, selectedFilterRange, selectedFilterValue} = state;\n const id = columnOrAxisIdFromString(selectedSource);\n if (!id) {\n throw Error('Empty source selected');\n }\n if (type === 'range') {\n const rangeFilters = [];\n if (selectedFilterRange?.max !== undefined) {\n rangeFilters.push({\n type: 'bySingleColumnV2' as const,\n column: isAxisId(id) ? {type: 'axis' as const, id: id.toPFrameId()} : {type: 'column' as const, id: id.name as PObjectId},\n predicate: {\n operator: 'LessOrEqual',\n reference: selectedFilterRange.max\n } as SingleValuePredicateV2,\n })\n }\n if (selectedFilterRange?.min !== undefined) {\n rangeFilters.push({\n type: 'bySingleColumnV2' as const,\n column: isAxisId(id) ? {type: 'axis' as const, id: id.toPFrameId()} : {type: 'column' as const, id: id.name as PObjectId},\n predicate: {\n operator: 'GreaterOrEqual',\n reference: selectedFilterRange?.min as number,\n } as SingleValuePredicateV2,\n })\n }\n return rangeFilters;\n } else if (type === 'subset') {\n return [\n {\n type: 'bySingleColumnV2' as const,\n column: isAxisId(id) ? {type: 'axis' as const, id: id.toPFrameId()} : {type: 'column' as const, id: id.name as PObjectId},\n predicate: {\n operator: 'Not',\n operand: { operator: 'IsNA' }\n } as SingleValuePredicateV2,\n },\n ]\n }\n if (typeof selectedFilterValue === 'undefined') {\n return [];\n }\n return [\n {\n type: 'bySingleColumnV2' as const,\n column: isAxisId(id) ? {type: 'axis' as const, id: id.toPFrameId()} : {\n type: 'column' as const,\n id: id.name as PObjectId,\n },\n predicate: {\n operator: 'Equal',\n reference:\n id.type === 'String'\n ? String(selectedFilterValue)\n : (Number(selectedFilterValue) as string | number),\n } as SingleValuePredicateV2,\n },\n ];\n}\n\nexport function getFiltersFromStates(states: SelectorStateFilter[]): PTableRecordSingleValueFilterV2[] {\n const result: PTableRecordSingleValueFilterV2[] = [];\n for (const state of states) {\n result.push(...getFilterFromState(state));\n }\n return result;\n}\n\nexport function getGlobalId(spec: PColumnSpec): string;\nexport function getGlobalId(spec: AxisSpec): string;\nexport function getGlobalId(spec: AxisSpec | PColumnSpec): string {\n if ('kind' in spec && spec.kind === 'PColumn') {\n const name = spec.name ?? spec.annotations?.[COLUMN_NAME_KEY];\n const domain = spec.domain ?? spec.annotations?.[COLUMN_DOMAIN_KEY];\n return canonicalize({name, domain})!;\n }\n const name = spec.name;\n const domain = spec.domain;\n return canonicalize({name, domain})!;\n}\n\nasync function getAxisSpecFromParents(store: DataStore, axisId: AxisId, parentSources: ColumnOrAxisIdString[]) {\n for (const parentSource of parentSources) {\n const parentId = columnOrAxisIdFromString(parentSource);\n if (isColumnId(parentId)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(parentId);\n const spec = (columnSpec?.axesSpec ?? []).find(\n s => AxisId.fromAxisSpec(s).toCanonicalString() === axisId.toCanonicalString(),\n );\n if (spec) {\n return spec;\n }\n }\n }\n return null;\n}\n\nconst LABEL_COLUMN_NAME = 'pl7.app/label';\n\nexport async function getColumnOrAxisValueLabelsId(\n store: DataStore,\n selectedSource: ColumnOrAxisIdString,\n parentSources: ColumnOrAxisIdString[],\n): Promise<ColumnId | undefined> {\n const id = columnOrAxisIdFromString(selectedSource);\n if (isColumnId(id)) {\n return undefined;\n }\n async function getAxisGlobalId(axisId: AxisId) {\n const spec = await getAxisSpecFromParents(store, axisId, parentSources);\n return spec ? getGlobalId(spec) : null;\n }\n const labelColumns = await store.pFrameProvider.getColumnsFull([], false, undefined, [LABEL_COLUMN_NAME]);\n const sourceGlobalId = await getAxisGlobalId(id);\n const labelColumn = labelColumns.find(({spec}) => {\n return spec && spec.axesSpec.length === 1 && getGlobalId(spec.axesSpec[0]) === sourceGlobalId;\n });\n return labelColumn ? new ColumnId({name: labelColumn.columnId, type: labelColumn.spec.valueType}) : undefined;\n}\n\nexport async function getColumnOrAxisLabel(\n store: DataStore,\n selectedSource: ColumnOrAxisIdString,\n parentSources: ColumnOrAxisIdString[],\n) {\n const selectedId = columnOrAxisIdFromString(selectedSource);\n const labelsColumn = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n\n let spec: AxisSpec | PColumnSpec | null;\n if (isColumnId(selectedId)) {\n spec = await store.pFrameProvider.getColumnSpecById(labelsColumn ?? selectedId);\n } else {\n spec = labelsColumn\n ? await store.pFrameProvider.getColumnSpecById(labelsColumn)\n : await getAxisSpecFromParents(store, selectedId, parentSources);\n }\n if (!spec) {\n return '';\n }\n const label = spec.annotations?.[COLUMN_LABEL_KEY] ?? spec.name;\n return store.labelsModifier(spec.name, label);\n}\n\nexport function axisMustBeConsumed(spec: AxisSpec) {\n const axisNature = spec.annotations?.[AXIS_NATURE_KEY]?.toLowerCase();\n return Boolean(axisNature) && axisNature !== 'homogenous' && axisNature !== 'homogeneous';\n}\n\nexport function checkSourceBySpecForFilters(spec: PColumnSpec | AxisSpec) {\n //const type = 'kind' in spec && spec.kind === 'PColumn' ? spec.valueType : spec.type;\n if (spec.annotations?.[SUBSET_FILTER_KEY] === 'true') {\n return true;\n }\n if (spec.annotations?.[DISCRETE_FILTER_KEY] === 'true') {\n return true;\n }\n //return type === 'Double' || type === 'Float' || type === 'Int' || type === 'Long'\n return true;\n}\n\nexport function dataColumnPredicateDefault(spec: PColumnSpec) {\n return !spec.name.includes('metadata') && !(spec.annotations?.[IS_VIRTUAL_COLUMN] === 'true') && !(spec.annotations?.[SUBSET_FILTER_KEY] === 'true');\n}\n\nexport type LinkerColumnsMap = Record<ColumnOrAxisIdString, Record<ColumnOrAxisIdString, {id: ColumnId, spec: PColumnSpec}>>;\n\nexport function getLinkerColumnsMap(linkerColumns:PColumnIdAndSpec[]): LinkerColumnsMap {\n const resultMap: LinkerColumnsMap = {};\n for (const item of linkerColumns.filter((item) => item.spec.axesSpec.length === 2)) {\n const columnId = new ColumnId({name: item.columnId, type: item.spec.valueType});\n const axesSpec = item.spec.axesSpec ?? [];\n if (axesSpec.length) {\n const [axisA, axisB] = axesSpec;\n const idA = AxisId.fromAxisSpec(axisA).toCanonicalString();\n const idB = AxisId.fromAxisSpec(axisB).toCanonicalString();\n if (!resultMap[idA]) {\n resultMap[idA] = {};\n }\n if (!resultMap[idB]) {\n resultMap[idB] = {};\n }\n resultMap[idA][idB] = {id: columnId, spec: item.spec};\n resultMap[idB][idA] = {id: columnId, spec: item.spec};\n }\n }\n return resultMap;\n}\n\nexport async function getAxesSpecsFromSources(store:DataStore, idStrs: ColumnOrAxisIdString[]):Promise<AxisSpec[]>{\n const set = new Set<ColumnOrAxisIdString>();\n const result:AxisSpec[] = [];\n for(const idStr of idStrs) {\n const id = columnOrAxisIdFromString(idStr);\n if (isColumnId(id)) {\n const spec = await store.pFrameProvider.getColumnSpecById(id);\n if (!spec) {\n continue;\n }\n spec.axesSpec.forEach(axisSpec => {\n const id = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n if (!set.has(id)) {\n set.add(id);\n result.push(axisSpec);\n }\n })\n }\n }\n return result;\n}\n\nexport function searchPath(\n linkerColumnsMap:LinkerColumnsMap,\n startId: ColumnOrAxisIdString,\n endId: ColumnOrAxisIdString\n):ColumnId[] | null {\n const previous:Record<string, string> = {};\n const visited = new Set([startId])\n let nextIds = [startId];\n while (nextIds.length) {\n const next = new Set<string>();\n for (const nextId of nextIds) {\n if (linkerColumnsMap[nextId]) {\n const availableIds = Object.keys(linkerColumnsMap[nextId]);\n for (const availableId of availableIds) {\n previous[availableId] = nextId;\n if (availableId === endId) {\n const ids:ColumnOrAxisIdString[] = [];\n let current = endId;\n while(previous[current] !== startId) {\n ids.push(current);\n current = previous[current];\n }\n ids.push(current);\n return ids.map(id => linkerColumnsMap[id][previous[id]].id as ColumnId);\n } else if (!visited.has(availableId)) {\n next.add(availableId);\n visited.add(availableId);\n }\n }\n }\n }\n nextIds = [...next];\n }\n return null;\n}\nfunction getLinkerColumnsFromGraph(\n linkerColumnsMap:LinkerColumnsMap,\n parentAxesIds: Set<ColumnOrAxisIdString>,\n targetAxisId:string\n):ColumnId[] {\n const paths = ([...parentAxesIds])\n .map((parentAxisId) => searchPath(linkerColumnsMap, parentAxisId, targetAxisId))\n .filter(p => p !== null) as ColumnId[][];\n if (paths.length === 0) {\n return [];\n }\n let resultPath = paths[0];\n for (const path of paths) {\n if (path.length < resultPath.length) {\n resultPath = path;\n }\n }\n return resultPath;\n}\n\nexport async function getAllLinkerMaps(store: DemoDataStore) {\n const allLinkerColumns = await store.pFrameProvider.getColumnsFull(\n [], false, undefined, undefined,\n {[IS_LINKER_COLUMN]: 'true'},\n );\n const linkerColumnsMap = getLinkerColumnsMap(allLinkerColumns.filter((item) => item.spec.axesSpec.length === 2));\n const compositeLinkerMap = getCompositeLinkersMap(allLinkerColumns.filter((item) => item.spec.axesSpec.length > 2));\n return {linkerColumnsMap, compositeLinkerMap};\n}\n\nexport async function getLinkerColumnsForSource(\n store: DataStore,\n linkerColumnsMap: LinkerColumnsMap,\n compositeLinkerMap: CompositeLinkerMap,\n dataInputAxes: AxisSpec[],\n secondarySource: ColumnOrAxisIdString,\n fixedAxesOfSecondaryColumn: SelectorState['fixedAxes']\n):Promise<ColumnId[]> {\n const columnOrAxisId = columnOrAxisIdFromString(secondarySource);\n if (!isColumnId(columnOrAxisId)) {\n return [];\n }\n const secondaryColumnSpec = await store.pFrameProvider.getColumnSpecById(columnOrAxisId);\n if (!secondaryColumnSpec) {\n return [];\n }\n const allColumnAxesWithoutFixed = secondaryColumnSpec.axesSpec.filter(\n (axisSpec) => {\n const axisId = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n return !fixedAxesOfSecondaryColumn?.some(el => el.axisSource === axisId);\n });\n\n const dataInputAxesSet = new Set(dataInputAxes.map(axisSpec => AxisId.fromAxisSpec(axisSpec).toCanonicalString()));\n const rightPartAxes = allColumnAxesWithoutFixed.filter((axisSpec) => { // right part from column minus 'fixedAxes'\n const axisId = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n return !dataInputAxesSet.has(axisId);\n });\n if (!rightPartAxes.length) {\n return []; // all axes are from data inputs or fixed\n }\n\n const leftGroups = getAxesGroups(dataInputAxes);\n const rightGroups = getAxesGroups(rightPartAxes);\n\n if (!leftGroups || !rightGroups) {\n throw Error(`Can't create axes tree for ${secondaryColumnSpec.name}`);\n }\n\n const leftCompositeKeysSet = new Set(leftGroups.map(canonicalizeJson));\n\n const linkerColumns = new Set<string>();\n rightGroups.forEach((axes:AxisSpec[]) => {\n const compositeLinkerKey = canonicalizeJson(axes);\n if (compositeLinkerMap.has(compositeLinkerKey)) {\n const node = compositeLinkerMap.get(compositeLinkerKey);\n const availableKeys = node ? [...node.keys()] : [];\n const columnKey = availableKeys.find((columnKey) => leftCompositeKeysSet.has(columnKey));\n if (!columnKey) {\n throw Error(`Can't find composite linker column for ${secondaryColumnSpec.name}, ${compositeLinkerKey}`);\n }\n const linkerColumn = compositeLinkerMap.get(compositeLinkerKey)?.get(columnKey)!;\n\n linkerColumns.add(linkerColumn.toCanonicalString());\n } else if (axes.length === 1) {\n const axisId = AxisId.fromAxisSpec(axes[0]).toCanonicalString();\n const columns = getLinkerColumnsFromGraph(linkerColumnsMap, dataInputAxesSet, axisId);\n columns.forEach((column) => {\n linkerColumns.add(column.toCanonicalString());\n });\n }\n });\n return [...linkerColumns].map(idStr => columnOrAxisIdFromString(idStr));\n}\n\nexport function getNotAllowedAxes(\n columnSpec: PColumnSpec,\n dataInputAxesList: AxisSpec[], // axes from data-input\n dataInputAxesSet: Set<ColumnOrAxisIdString>,\n linkerAxes: Set<ColumnOrAxisIdString>, // axes available with 2axes linkers with dataInputAxes\n compositeLinkerMap: CompositeLinkerMap, // composite linkers, without chains\n): AxisSpec[] {\n const allColumnAxes = columnSpec.axesSpec;\n // remove from the column axes - axes from data inputs\n const rightPartAxes = allColumnAxes.filter(\n (axisSpec:AxisSpec) => !dataInputAxesSet.has(AxisId.fromAxisSpec(axisSpec).toCanonicalString())\n );\n if (!rightPartAxes.length) {\n return []; // all axes are from data inputs\n }\n\n const leftGroups = getAxesGroups(dataInputAxesList);\n let rightGroups = getAxesGroups(rightPartAxes);\n\n if (!leftGroups || !rightGroups) {\n return rightPartAxes; // free axes\n }\n\n const leftCompositeKeysSet = new Set(leftGroups.map(canonicalizeJson));\n // remove groups linked with composite linker to left part\n rightGroups = rightGroups.filter(\n (group) => {\n const groupKey = canonicalizeJson(group);\n const node = compositeLinkerMap.get(groupKey);\n const availableKeys = node ? [...node.keys()] : [];\n return !availableKeys.some((key) => leftCompositeKeysSet.has(key));\n }\n );\n\n if (rightGroups.some(group => group.length > 1)) { // nothing to link with non-composite linkers\n return rightGroups.flatMap(a => a);\n }\n rightGroups = rightGroups.filter(([axisSpec]) => !linkerAxes.has(AxisId.fromAxisSpec(axisSpec).toCanonicalString()));\n return rightGroups.flatMap(a => a);\n}\n\nexport function createHighlightColumn(highlightSelectedStates:SelectorStateFilter[], data: TableOuterJoinResult) {\n const dataLength = data.columnsData[Object.keys(data.columnsData)[0]].length;\n const highlightColumn = new Int32Array(dataLength).fill(0);\n for (let rowIdx = 0; rowIdx < dataLength; rowIdx++) {\n let res = false;\n for (let i = 0; i < highlightSelectedStates.length; i++) {\n const {selectedSource, selectedFilterValue, selectedFilterRange, type} = highlightSelectedStates[i];\n const sourceId = columnOrAxisIdFromString(selectedSource);\n const value = (isColumnId(sourceId) ? data.columnsData[selectedSource] : data.axesData[selectedSource])[rowIdx];\n if (selectedFilterValue !== undefined) {\n res = res || value === selectedFilterValue;\n }\n if (selectedFilterRange !== undefined && (selectedFilterRange.min !== undefined || selectedFilterRange.max !== undefined) && typeof value === 'number') {\n let rangeResult = true;\n if (selectedFilterRange.min !== undefined) {\n rangeResult = rangeResult && value >= selectedFilterRange.min;\n }\n if (selectedFilterRange.max !== undefined) {\n rangeResult = rangeResult && value <= selectedFilterRange.max;\n }\n res = res || rangeResult;\n }\n if (type === 'subset') {\n res = res || (value !== null && value !== undefined);\n }\n }\n if (res) {\n highlightColumn[rowIdx] = 1;\n }\n }\n return highlightColumn as unknown as PValue[];\n}\n","import {\n AxisSpec,\n PColumnSpec,\n PObjectId,\n PTableRecordSingleValueFilterV2,\n} from '@milaboratories/pl-model-common';\nimport {deriveLabels} from '@platforma-sdk/model';\nimport {SelectorState} from '../common';\nimport type {\n AxisData,\n ColumnData,\n ComponentGuideFilter,\n ComponentGuideSimple,\n ComponentsGuide,\n DataByColumns,\n FilterComponentControllers,\n FilterComponents,\n InputGuide,\n InputState,\n SelectorStateFilter,\n SelectorStateSimple,\n SimpleComponentControllers,\n SimpleComponents,\n} from '../common';\nimport {CompositeLinkerMap} from '../compositeLinkers';\nimport {DISCRETE_VALUES_KEY, HIGH_CARDINALITY} from '../constants';\nimport {PValue} from '../store';\nimport type {DataStore} from '../store';\nimport type {ColumnOrAxisIdString} from '../spec';\nimport {AxisId, ColumnId, columnOrAxisIdFromString, isColumnId} from '../spec';\nimport {\n addSourceInfoToMap,\n dataColumnPredicateDefault,\n getAllLinkerMaps,\n getColumnOrAxisValueLabelsId,\n getDefaultInfo,\n getStateCopy,\n LinkerColumnsMap,\n} from '../utils';\nimport {ComponentController} from './ComponentController';\n\ntype InputOptionsUnion<State extends InputState> = Record<\n SimpleComponents<State> | FilterComponents<State>,\n ComponentGuideSimple | ComponentGuideFilter\n>;\nexport interface Controller<State extends InputState> {\n calculateOptions(\n store: DataStore,\n state: State,\n fixedIds?: string[],\n dataColumnPredicate?: (spec: PColumnSpec) => boolean\n ): Promise<InputGuide<State>>;\n\n getUniqueSourceValuesWithLabels(\n store: DataStore,\n inputGuide: InputGuide<State>,\n selectedSource: ColumnOrAxisIdString,\n limit?:number,\n searchQuery?: string,\n searchQueryByValue?: string,\n ): Promise<{\n values: {\n value: string;\n label: string;\n }[],\n overflow: boolean;\n }>;\n\n getEmptyInputGuide(state: State): InputGuide<State>;\n\n createDataForPlot(store: DataStore, state: State): Promise<PlotDataAndSettings>;\n\n changeSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n nextSelectorStates: SelectorStateFilter[] | SelectorStateSimple[]\n ): State;\n}\n\nexport interface PlotDataAndSettings {\n data: {\n byColumns: DataByColumns,\n axesData?: Record<string, PValue[]>\n };\n settings: Record<string, unknown>;\n}\n\nexport abstract class ControllerBase<State extends InputState> implements Controller<State> {\n readonly ignoredOptionIdNames: string[] = [];\n readonly dataInputs: string[] = [];\n readonly dontAllowUnfilteredHighCardinality: boolean = false;\n\n protected constructor(\n readonly simpleComponentControllers: SimpleComponentControllers<State>,\n readonly filterComponentControllers: FilterComponentControllers<State>\n ) {}\n\n get requiredComponents(): (keyof State['components'])[] {\n const components: (keyof State['components'])[] = [];\n for (const componentName of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n if (this.simpleComponentControllers[componentName].isRequired) {\n components.push(componentName);\n }\n }\n return components;\n }\n\n get dimensionsConsumerComponents(): (keyof State['components'])[] {\n const components: (keyof State['components'])[] = [];\n for (const componentName of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n if (this.simpleComponentControllers[componentName].isDimensionsConsumer) {\n components.push(componentName);\n }\n }\n for (const componentName of Object.keys(this.filterComponentControllers) as FilterComponents<State>[]) {\n if (this.filterComponentControllers[componentName].isDimensionsConsumer) {\n components.push(componentName);\n }\n }\n return components;\n }\n\n addSelected(\n inputName: keyof State['components'],\n state: State,\n selectorState: SelectorStateFilter | SelectorStateSimple\n ) {\n if (inputName in this.simpleComponentControllers) {\n return (\n this.simpleComponentControllers[\n inputName as keyof typeof this.simpleComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).addSelected(state, selectorState);\n }\n if (inputName in this.filterComponentControllers) {\n return (\n this.filterComponentControllers[\n inputName as keyof typeof this.filterComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).addSelected(state, selectorState);\n }\n throw Error(`Unknown input name: ${String(inputName)}`);\n }\n\n deleteSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n selectorState: SelectorStateFilter | SelectorStateSimple\n ) {\n if (inputName in this.simpleComponentControllers) {\n return (\n this.simpleComponentControllers[\n inputName as keyof typeof this.simpleComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).deleteSelected(state, selectorState.selectedSource);\n }\n if (inputName in this.filterComponentControllers) {\n return (\n this.filterComponentControllers[\n inputName as keyof typeof this.filterComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).deleteSelected(state, selectorState.selectedSource);\n }\n throw Error(`Unknown input name: ${String(inputName)}`);\n }\n\n changeSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n nextSelectorStates: SelectorState[]\n ) {\n const currentStates: SelectorState[] = state.components[inputName].selectorStates;\n const deletedStates = currentStates.filter(currentState => {\n return !nextSelectorStates.find(s => s.selectedSource === currentState.selectedSource);\n });\n const addedStates = nextSelectorStates.filter(nextState => {\n return !currentStates.find(s => s.selectedSource === nextState.selectedSource);\n });\n let nextState = getStateCopy(state);\n deletedStates.forEach(selectorState => {\n nextState = this.deleteSelected(inputName, store, nextState, selectorState);\n });\n addedStates.forEach(selectorState => {\n nextState = this.addSelected(inputName, nextState, selectorState);\n });\n // reorder\n state.components[inputName].selectorStates = nextSelectorStates\n .map(st =>\n (state.components[inputName].selectorStates as SelectorState[]).find(\n s => s.selectedSource === st.selectedSource\n )\n )\n .filter(Boolean) as SelectorStateFilter[] | SelectorStateSimple[];\n return nextState;\n }\n\n switchDividableAxis(state: State, axis: AxisId): State {\n // ***\n // logic for axis dividing/collapsing\n // ***\n return getStateCopy(state);\n }\n\n async getMustBeConsumedAxes(store: DataStore, state: State): Promise<Set<ColumnOrAxisIdString>> {\n return Promise.resolve(new Set());\n }\n\n private createEmptyComponentsGuide(state: State): InputOptionsUnion<State> {\n return Object.fromEntries(\n Object.entries(state.components).map(\n ([key, value]): [string, ComponentGuideSimple | ComponentGuideFilter] => {\n return [\n key,\n {\n options: [],\n optionsInfo: new Map(),\n stateConsistency: {},\n required: false,\n multipleSelectors: false,\n },\n ];\n }\n )\n ) as InputOptionsUnion<State>;\n }\n\n async getSelectedSourcesInfo(\n store: DataStore,\n state: State,\n labelsMap: Record<string, string>,\n linkerColumnsMap: LinkerColumnsMap,\n compositeLinkerMap: CompositeLinkerMap\n ): Promise<Map<ColumnOrAxisIdString, AxisData | ColumnData>> {\n const result: Map<ColumnOrAxisIdString, AxisData> = new Map();\n\n const dataAxes = new Set<string>();\n const dataAxesList: AxisSpec[] = [];\n for (const inputName of this.dataInputs) {\n for (const selectorState of state.components[inputName].selectorStates) {\n const id = columnOrAxisIdFromString(selectorState.selectedSource);\n if (isColumnId(id)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(id);\n if (columnSpec) {\n columnSpec.axesSpec.forEach(axisSpec => {\n const idStr = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n if (!dataAxes.has(idStr)) {\n dataAxes.add(idStr);\n dataAxesList.push(axisSpec);\n }\n });\n }\n }\n }\n }\n const linkerAxes = new Set<string>();\n let nextAxes = [...dataAxes];\n while(nextAxes.length) {\n const next:string[] = [];\n for (const addedAxis of nextAxes) {\n if (linkerColumnsMap[addedAxis]) {\n const availableAxes = Object.keys(linkerColumnsMap[addedAxis]);\n for (const availableAxis of availableAxes) {\n if (!linkerAxes.has(availableAxis) && !dataAxes.has(availableAxis)) {\n next.push(availableAxis);\n linkerAxes.add(availableAxis);\n }\n }\n }\n }\n nextAxes = next;\n }\n for (const [inputName , {selectorStates}] of Object.entries(state.components)) {\n const component = this.simpleComponentControllers[inputName as keyof typeof this.simpleComponentControllers]\n ?? this.filterComponentControllers[inputName as keyof typeof this.filterComponentControllers] as ComponentController<State, typeof inputName>;\n const fixedAxesAllowed = component.settings.columnsWithExtraAxesAllowed;\n for (const {selectedSource} of selectorStates) {\n await addSourceInfoToMap(\n store,\n selectedSource,\n labelsMap[selectedSource],\n result,\n dataAxesList,\n dataAxes,\n linkerAxes,\n fixedAxesAllowed,\n compositeLinkerMap\n );\n }\n }\n return result;\n }\n\n getEmptyInputGuide(state: State): InputGuide<State> {\n return {\n components: this.createEmptyComponentsGuide(state) as ComponentsGuide<State['components']>,\n getSourceInfo: (sourceIdStr: ColumnOrAxisIdString) => getDefaultInfo(sourceIdStr),\n freeOptionsSet: new Set(),\n axesToBeFixedSet: new Set(),\n readyData: false,\n ready: false,\n consistent: true,\n };\n }\n\n getConsumedOptionsSet(state: State) {\n const consumedSourcesSet: Set<ColumnOrAxisIdString> = new Set();\n for (const componentName of this.dimensionsConsumerComponents) {\n for (const {selectedSource} of state.components[componentName].selectorStates) {\n consumedSourcesSet.add(selectedSource);\n }\n }\n return consumedSourcesSet;\n }\n\n async getLabelsMap(store: DataStore, state: State) {\n const availableColumns = await store.pFrameProvider.getColumnsFull(\n this.dataInputs.reduce((res: (ColumnId | AxisId)[], inputName) => {\n const componentState = state.components[inputName];\n const sources = componentState.selectorStates.map(st => columnOrAxisIdFromString(st.selectedSource));\n return res.concat(sources);\n }, []),\n false\n );\n return deriveLabels(availableColumns, el => el.spec).reduce((res: Record<string, string>, el) => {\n const id = new ColumnId({name: el.value.columnId, type: el.value.spec.valueType}).toCanonicalString();\n res[id] = el.label;\n return res;\n }, {});\n }\n\n async calculateOptions(\n store: DataStore,\n state: State,\n fixedIds: string[] = [],\n dataColumnPredicate = dataColumnPredicateDefault\n ): Promise<InputGuide<State>> {\n // creating empty options object corresponding to the provided state\n const resultComponentsGuide: InputOptionsUnion<State> = this.createEmptyComponentsGuide(state);\n\n // set of columns and axes that selected in consumer-dimensions components\n const consumedSourcesSet = this.getConsumedOptionsSet(state);\n // for trees block - to ignore treeId and donorId in the interface\n const ignoredNamesSet = new Set<string>(this.ignoredOptionIdNames);\n const fixedSelectedSet = new Set<ColumnOrAxisIdString>(fixedIds);\n\n const {linkerColumnsMap, compositeLinkerMap} = await getAllLinkerMaps(store);\n\n const labelsMap = await this.getLabelsMap(store, state); // improved labels with name separation for different columns with the same name; for axes - name from spec or labels column\n const selectedColumnsOrAxesInfo = await this.getSelectedSourcesInfo(store, state, labelsMap, linkerColumnsMap, compositeLinkerMap);\n const optionsInfo: Map<ColumnOrAxisIdString, ColumnData | AxisData> = new Map();\n\n const allControllers = {...this.simpleComponentControllers, ...this.filterComponentControllers};\n const freeOptionsSet = new Set<ColumnOrAxisIdString>();\n for (const [name, componentController] of Object.entries(allControllers)) {\n const options = await (\n componentController as ComponentController<State, SimpleComponents<State> | FilterComponents<State>>\n ).getOptions(\n store,\n state,\n labelsMap,\n consumedSourcesSet,\n linkerColumnsMap,\n compositeLinkerMap,\n dataColumnPredicate,\n ignoredNamesSet,\n fixedSelectedSet\n );\n if (!this.dataInputs.includes(name as string)) {\n options.options.forEach(item => {\n freeOptionsSet.add(item.value);\n });\n }\n for (const [key, v] of options.optionsInfo) {\n optionsInfo.set(key, v);\n }\n resultComponentsGuide[name as keyof InputOptionsUnion<State>] =\n options as (typeof resultComponentsGuide)[keyof InputOptionsUnion<State>];\n }\n\n const markMustBeConsumed = (id: string) => {\n const option = optionsInfo.get(id);\n if (option && option.kind === 'axis') {\n option.mustBeConsumed = true;\n }\n const selected = selectedColumnsOrAxesInfo.get(id);\n if (selected && selected.kind === 'axis') {\n selected.mustBeConsumed = true;\n }\n };\n // axes from heatmap data column, to make visible what axes should be; hanging axes from scatterplot\n const mustBeConsumedAxes = await this.getMustBeConsumedAxes(store, state);\n for (const id of mustBeConsumedAxes) {\n markMustBeConsumed(id);\n }\n\n if (this.dontAllowUnfilteredHighCardinality) {\n // Axes marked 'high cardinality' should be in the filter. Or some column that has this axis should be in the filter.\n // If not - they are marked 'mustBeConsumed'.\n // But also they can be anywhere else.\n const isHighCardinality = (spec: AxisSpec) => spec?.annotations?.[HIGH_CARDINALITY] === 'true';\n const consumedHighCardinalityAxes =\n state.components['filters']?.selectorStates.reduce((consumed: Set<string>, s) => {\n const info = selectedColumnsOrAxesInfo.get(s.selectedSource);\n if (info?.kind === 'column') {\n const axes = info.spec.axesSpec.filter(isHighCardinality);\n axes.forEach(spec => consumed.add(AxisId.fromAxisSpec(spec).toCanonicalString()));\n }\n if (info?.kind === 'axis' && isHighCardinality(info.spec)) {\n consumed.add(AxisId.fromAxisSpec(info.spec).toCanonicalString());\n }\n return consumed;\n }, new Set<string>()) ?? new Set<string>();\n this.dataInputs.forEach(inputName => {\n for (const {selectedSource} of state.components[inputName].selectorStates) {\n const info = selectedColumnsOrAxesInfo.get(selectedSource);\n if (info?.kind === 'column') {\n const axes = info.spec.axesSpec.filter(isHighCardinality);\n axes.forEach(spec => {\n const idStr = AxisId.fromAxisSpec(spec).toCanonicalString();\n if (!freeOptionsSet.has(idStr) && !consumedHighCardinalityAxes.has(idStr)) {\n // return axis to the list of free axis if it is selected somewhere, but nothing with this axis is in the filters\n freeOptionsSet.add(idStr);\n }\n if (!consumedHighCardinalityAxes.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n });\n }\n if (info?.kind === 'axis' && isHighCardinality(info.spec)) {\n const idStr = AxisId.fromAxisSpec(info.spec).toCanonicalString();\n if (!freeOptionsSet.has(idStr)) {\n freeOptionsSet.add(idStr);\n }\n if (!consumedHighCardinalityAxes.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n }\n });\n }\n\n const axesToBeFixedSet = new Set<ColumnOrAxisIdString>();\n for (const {selectorStates} of Object.values(state.components)) {\n for (const {selectedSource} of selectorStates) {\n const info = selectedColumnsOrAxesInfo.get(selectedSource);\n if (info && info.kind === 'column') {\n info.axesToBeFixed.forEach(axisIdStr => {\n axesToBeFixedSet.add(axisIdStr);\n });\n }\n }\n }\n\n const consistent = await this.isConsistent(store, state, linkerColumnsMap, compositeLinkerMap);\n const getSourceInfo = (sourceIdStr: ColumnOrAxisIdString) => {\n const id = columnOrAxisIdFromString(sourceIdStr).toCanonicalString() ?? sourceIdStr;\n return optionsInfo.get(id) ?? selectedColumnsOrAxesInfo.get(id) ?? getDefaultInfo(sourceIdStr);\n };\n return {\n components: resultComponentsGuide as ComponentsGuide<State['components']>,\n getSourceInfo,\n freeOptionsSet,\n axesToBeFixedSet,\n readyData: this.readyDataInputs(state),\n ready: this.readyForPlotBuilding(store, state, consistent, freeOptionsSet, getSourceInfo),\n consistent,\n };\n }\n\n async getUniqueSourceValuesWithLabels(\n store: DataStore,\n inputGuide: InputGuide<State>,\n selectedSource: ColumnOrAxisIdString,\n limit?:number,\n searchQuery?: string, // search by labels if axis labels exist\n searchQueryValue?: string // search by value, not by label\n ): Promise<{\n values: {\n value: string;\n label: string;\n }[],\n overflow: boolean;\n }> {\n const sortValues = (values:{value:string, label:string}[]) => values.sort((a, b) => a.label.localeCompare(b.label, 'en', {numeric: true}))\n const info = inputGuide.getSourceInfo(selectedSource);\n const discreteValuesStr = info.annotations?.[DISCRETE_VALUES_KEY];\n\n // if column's annotation contains discrete values - take them from it\n try {\n const discreteValues: string[] | null = discreteValuesStr\n ? (JSON.parse(discreteValuesStr) as (string | number)[]).map(v => String(v))\n : null;\n if (discreteValues) {\n const values = discreteValues.map(v => ({value: v, label: v}));\n sortValues(values);\n return {values, overflow: false};\n }\n } catch (err) {\n console.error(`Parsing error: discrete values annotation ${discreteValuesStr} in ${selectedSource}`)\n }\n\n // consider label column for axis\n if (info.kind === 'axis') {\n const axisId = columnOrAxisIdFromString(selectedSource) as AxisId;\n const parentSources = info.parentSources.map(columnOrAxisIdFromString) as ColumnId[];\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, info.parentSources);\n let filters:PTableRecordSingleValueFilterV2[] = [];\n if (labelsColumnId) {\n if (searchQuery) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'column',\n id: labelsColumnId.name as PObjectId\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchQuery\n }\n }];\n }\n if (searchQueryValue) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'axis',\n id: axisId.toPFrameId()\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchQueryValue\n }\n }];\n }\n const {data: dataValues, axesData} = await store.pFrameProvider.getSingleColumnData(labelsColumnId, filters);\n const axisKeys = axesData[axisId.toCanonicalString()];\n const values:{value: string, label: string}[] = [];\n for (let i = 0; i < Math.min(axisKeys.length, limit ?? axisKeys.length); i++) {\n values.push({value: String(axisKeys[i]), label: String(dataValues[i])});\n }\n sortValues(values);\n return {values, overflow: !(limit === undefined || axisKeys.length < limit)};\n }\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n if (searchInLabelsOrValue) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'axis',\n id: axisId.toPFrameId()\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchInLabelsOrValue\n }\n }];\n }\n const response = await store.pFrameProvider.getAxisUniqueValues(axisId, [parentSources[0]], limit, filters);\n const values = response.values.map(v => ({value: String(v), label: String(v)}));\n sortValues(values);\n return {values, overflow: response.overflow};\n }\n if (info.kind === 'column') {\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n const columnId = columnOrAxisIdFromString(selectedSource) as ColumnId;\n const filters:PTableRecordSingleValueFilterV2[] = searchInLabelsOrValue ? [{\n type: 'bySingleColumnV2',\n column: {\n type: 'column',\n id: columnId.name as PObjectId\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchInLabelsOrValue\n }\n }] : [];\n const response = await store.pFrameProvider.getColumnUniqueValues(columnId, limit, filters);\n const values = response.values.map(v => ({value: String(v), label: String(v)}));\n sortValues(values);\n return {values, overflow: response.overflow};\n }\n return {values: [], overflow: false};\n }\n\n async checkStateConsistency(\n store: DataStore,\n state: State,\n linkerColumnsMap:LinkerColumnsMap,\n compositeLinkerMap: CompositeLinkerMap\n ): Promise<Map<keyof State['components'], Record<string, boolean>>> {\n const result: Map<keyof State['components'], Record<string, boolean>> = new Map();\n for (const component of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n result.set(\n component as keyof State['components'],\n await this.simpleComponentControllers[component].checkStateConsistency(store, state, linkerColumnsMap, compositeLinkerMap)\n );\n }\n for (const component of Object.keys(this.filterComponentControllers) as FilterComponents<State>[]) {\n result.set(\n component as keyof State['components'],\n await this.filterComponentControllers[component].checkStateConsistency(store, state, linkerColumnsMap, compositeLinkerMap)\n );\n }\n return result;\n }\n\n async isConsistent(store: DataStore, state: State, linkerColumnsMap:LinkerColumnsMap, compositeLinkerMap: CompositeLinkerMap): Promise<boolean> {\n const consistency = await this.checkStateConsistency(store, state, linkerColumnsMap, compositeLinkerMap);\n for (const value of consistency.values()) {\n if (Object.values(value).some(item => !item)) {\n return false;\n }\n }\n return true;\n }\n\n readyDataInputs(state: State): boolean {\n return this.dataInputs.every(name => state.components[name].selectorStates.length > 0);\n }\n\n readyForPlotBuilding(\n store: DataStore,\n state: State,\n consistent: boolean,\n freeOptionsSet: Set<ColumnOrAxisIdString>,\n getSourceInfo: (id: ColumnOrAxisIdString) => ColumnData | AxisData\n ): boolean {\n if (!consistent || !this.readyDataInputs(state)) {\n return false;\n }\n let hasFreeDimensions: boolean = false;\n for (const optionId of freeOptionsSet) {\n const info = getSourceInfo(optionId);\n if (info && info.kind === 'axis' && info.mustBeConsumed) {\n hasFreeDimensions = true;\n break;\n }\n }\n let hasNotSelectedAxisToBeFixed: boolean = false;\n for (const {selectorStates} of Object.values(state.components)) {\n for (const {selectedSource, fixedAxes} of selectorStates) {\n const info = getSourceInfo(selectedSource);\n if (\n info &&\n info.kind === 'column' &&\n info.axesToBeFixed.some(\n id => (fixedAxes ?? []).find(el => el.axisSource === id)?.axisValue === undefined\n )\n ) {\n hasNotSelectedAxisToBeFixed = true;\n break;\n }\n }\n if (hasNotSelectedAxisToBeFixed) {\n break;\n }\n }\n return (\n this.requiredComponents.every(name => state.components[name].selectorStates.length > 0) &&\n !hasFreeDimensions &&\n !hasNotSelectedAxisToBeFixed\n );\n }\n\n abstract createDataByColumns(store: DataStore, state: State): Promise<PlotDataAndSettings['data']>;\n\n abstract createChartSettings(store: DataStore, state: State): Promise<PlotDataAndSettings['settings']>;\n\n async createDataForPlot(store: DataStore, state: State): Promise<PlotDataAndSettings> {\n return {\n data: await this.createDataByColumns(store, state),\n settings: await this.createChartSettings(store, state),\n };\n }\n}\n","import {canonicalizeJson} from '@milaboratories/pl-model-common';\nimport {isLabelColumn} from '@platforma-sdk/model';\nimport type {\n AxisData,\n ColumnData,\n ComponentGuideSimple,\n ComponentState,\n InputState,\n SelectorState,\n SelectorStateFilter,\n SelectorStateSimple,\n SourceOption,\n} from '../common';\nimport {\n COLUMN_LABEL_KEY,\n DISCRETE_FILTER_KEY,\n IS_LINKER_COLUMN,\n SUBSET_FILTER_KEY,\n} from '../constants';\nimport type {DataStore} from '../store';\nimport type {ColumnId, ColumnOrAxisIdString} from '../spec';\nimport {AxisId, columnOrAxisIdFromString, isColumnId} from '../spec';\nimport type {AxisSpec, PColumnSpec, ValueType} from '@milaboratories/pl-model-common';\nimport {axisMustBeConsumed, getColumnOrAxisLabel, getNotAllowedAxes, getStateCopy, LinkerColumnsMap} from '../utils';\nimport {CompositeLinkerMap, getAxesGroups} from '../compositeLinkers';\n\nconst isLinkerColumn = (columnSpec:PColumnSpec) => columnSpec?.annotations?.[IS_LINKER_COLUMN] === 'true';\n\ninterface ComponentControllerSettings {\n isDataComponent: boolean; // X, Y, Data source etc.\n multipleSelectors: boolean; // more than 1 selected column in input\n required: boolean;\n homogeneous: boolean;\n axesAllowed: boolean;\n columnsAllowed: boolean;\n columnsWithExtraAxesAllowed: boolean; // can contain column with extra axes with fixed values\n dimensionConsumer: boolean; // remove extra dimension from data-mapping after selecting a heterogeneous axis\n}\n\ninterface FieldControllerOptions<State extends InputState, Field extends keyof State['components']> {\n componentName: Field;\n allowedTypes: ValueType[];\n checkSourceBySpec?: (spec: AxisSpec | PColumnSpec, state: State) => boolean; // for more complicated logic than type is in allowed types and annotation exists\n annotations?: Record<string, string>;\n parentComponents?: (keyof State['components'])[];\n dependsOn?: (keyof State['components'])[];\n strictlyDependsOnParents?: boolean;\n ignoredOptionIds?: string[];\n settings: Partial<ComponentControllerSettings>;\n}\n\nexport class ComponentController<State extends InputState, Field extends keyof State['components']> {\n private static DefaultSettings: ComponentControllerSettings = {\n isDataComponent: false,\n multipleSelectors: false,\n required: false,\n homogeneous: false,\n axesAllowed: false,\n columnsAllowed: true,\n columnsWithExtraAxesAllowed: true,\n dimensionConsumer: false,\n };\n\n readonly componentName: Field;\n readonly allowedTypes: ValueType[];\n readonly settings: ComponentControllerSettings;\n private readonly dependsOn: (keyof State['components'])[];\n private readonly parentComponents: (keyof State['components'])[];\n private readonly strictlyDependsOnParents: boolean;\n private readonly annotations: Record<string, string>;\n private readonly checkSourceBySpec?: (spec: AxisSpec | PColumnSpec, state: State) => boolean;\n\n constructor({\n componentName,\n allowedTypes,\n settings,\n strictlyDependsOnParents,\n dependsOn = [],\n parentComponents = [],\n annotations = {},\n checkSourceBySpec,\n }: FieldControllerOptions<State, Field>) {\n this.componentName = componentName;\n this.allowedTypes = [...allowedTypes];\n this.settings = {...ComponentController.DefaultSettings, ...settings};\n this.dependsOn = [...dependsOn];\n this.parentComponents = [...parentComponents]; // corresponding data components for meta or X for Y in scatterplot\n this.strictlyDependsOnParents = strictlyDependsOnParents ?? true; // meta-inputs are strictly-depending on parents, X by Y (Y by X) - don't\n this.annotations = {...annotations};\n if (checkSourceBySpec) {\n this.checkSourceBySpec = checkSourceBySpec;\n }\n }\n\n get isRequired(): boolean {\n return this.settings.required;\n }\n\n get isDimensionsConsumer(): boolean {\n return this.settings.dimensionConsumer;\n }\n\n addSelected(state: State, selectorState: SelectorStateSimple | SelectorStateFilter) {\n const nextState = getStateCopy(state);\n nextState.components[this.componentName].selectorStates.push(selectorState as SelectorStateFilter);\n\n // ***\n // here should be logic for possibly parent qualifications updating\n // ***\n\n return nextState;\n }\n\n deleteSelected(state: State, selectedSourceStr: ColumnOrAxisIdString) {\n const nextState = getStateCopy(state);\n // ***\n // here should be logic for removing unnecessary qualifications (it can appear when some sources are deleted)\n // ***\n nextState.components[this.componentName].selectorStates = (\n nextState.components[this.componentName].selectorStates as SelectorState[]\n ).filter(item => item.selectedSource !== selectedSourceStr);\n return nextState;\n }\n\n async checkStateConsistency(\n store: DataStore,\n state: State,\n linkerColumnsMap: LinkerColumnsMap,\n compositeLinkerMap: CompositeLinkerMap\n ): Promise<Record<string, boolean>> {\n const componentState = state.components[this.componentName as keyof InputState];\n const {parentAxes, linkerAxes} = await this.getAllowedAxes(store, state, linkerColumnsMap);\n function isAxisInSet(a: AxisSpec) {\n const id = AxisId.fromAxisSpec(a).toCanonicalString();\n return parentAxes.has(id) || linkerAxes.has(id);\n }\n\n const consistencyData = await Promise.all(\n componentState.selectorStates.map(async ({selectedSource}) => {\n const sourceId = columnOrAxisIdFromString(selectedSource);\n // if column selected - check all axes of column\n if (isColumnId(sourceId)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(sourceId);\n if (!columnSpec) {\n // if column is not in store - current store and selected column are not consistent\n return false;\n }\n\n const parents = this.parentComponents;\n if (parents.length === 0) {\n return true;\n }\n if ((this.strictlyDependsOnParents && !this.settings.columnsWithExtraAxesAllowed) && !this.settings.isDataComponent) {\n return columnSpec.axesSpec.every(a => isAxisInSet(a));\n } else if (this.settings.columnsWithExtraAxesAllowed && !this.settings.isDataComponent) {\n if (columnSpec.axesSpec.some(a => isAxisInSet(a))) {\n return true;\n }\n const groups = getAxesGroups(columnSpec.axesSpec);\n if (!groups) {\n return false;\n }\n return groups.some(group => compositeLinkerMap.has(canonicalizeJson(group)));\n } else {\n return parentAxes.size === 0 || columnSpec.axesSpec.some(a => isAxisInSet(a));\n }\n }\n return parentAxes.has(selectedSource);\n })\n );\n return (componentState.selectorStates as (SelectorStateSimple | SelectorStateFilter)[]).reduce(\n (res: Record<string, boolean>, item, idx) => {\n res[item.selectedSource] = consistencyData[idx];\n return res;\n },\n {}\n );\n }\n\n async getProducingAxes(store: DataStore, state: State) {\n const componentState = state.components[this.componentName as keyof InputState];\n const selectedHereIds = componentState.selectorStates.map(s => columnOrAxisIdFromString(s.selectedSource));\n const selectedHereColumnIds = selectedHereIds.filter(id => isColumnId(id));\n\n const axes = new Set<ColumnOrAxisIdString>();\n\n const infoList = await Promise.all(\n selectedHereColumnIds.map(id => {\n return store.pFrameProvider.getColumnSpecById(id);\n })\n );\n\n infoList.forEach(columnSpec => {\n if (columnSpec) {\n columnSpec.axesSpec.forEach(axisSpec => {\n axes.add(AxisId.fromAxisSpec(axisSpec).toCanonicalString());\n });\n }\n });\n return axes;\n }\n\n getParentSelectedSources(store: DataStore, state: State): (ColumnId | AxisId)[] {\n const selectedSources = this.parentComponents.reduce((res: (ColumnId | AxisId)[], item) => {\n const selectedHere = state.components[item].selectorStates.map(s =>\n columnOrAxisIdFromString(s.selectedSource)\n );\n res.push(...selectedHere);\n return res;\n }, []);\n\n // ***\n // consider parent qualifications without selected here\n // ***\n return selectedSources;\n }\n\n async getParentAxes(store: DataStore, state: State) {\n const parentSelectedSources = this.getParentSelectedSources(store, state);\n const axes = new Set<ColumnOrAxisIdString>();\n\n for (const source of parentSelectedSources) {\n if (isColumnId(source)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(source);\n columnSpec?.axesSpec?.forEach(spec => {\n const id = AxisId.fromAxisSpec(spec);\n axes.add(id.toCanonicalString());\n });\n }\n }\n return axes;\n }\n\n async getAllowedAxes(store: DataStore, state: State, linkerColumnsMap:LinkerColumnsMap) {\n const parentSelectedSources = this.getParentSelectedSources(store, state);\n const parentAxes = new Set<ColumnOrAxisIdString>();\n const parentAxesList:AxisSpec[] = [];\n const linkerAxes = new Set<ColumnOrAxisIdString>();\n const optionsInfo: Map<string, AxisData | ColumnData> = new Map();\n\n for (const source of parentSelectedSources) {\n if (isColumnId(source)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(source);\n for (const spec of columnSpec?.axesSpec ?? []) {\n const id = AxisId.fromAxisSpec(spec);\n const idStr = id.toCanonicalString();\n if (parentAxes.has(idStr)) {\n continue;\n }\n parentAxes.add(idStr);\n parentAxesList.push(spec);\n const mustBeConsumed = axisMustBeConsumed(spec); // request unique values only for non-homogenous axes\n optionsInfo.set(idStr, {\n kind: 'axis',\n name: spec.name,\n label: await getColumnOrAxisLabel(store, idStr, [\n source.toCanonicalString(),\n ]),\n type: spec.type,\n mustBeConsumed,\n dividable: false,\n spec,\n annotations: spec.annotations,\n isSubsetFilter: spec.annotations?.[SUBSET_FILTER_KEY] === 'true',\n isDiscreteFilter:\n spec.type === 'String' || spec.annotations?.[DISCRETE_FILTER_KEY] === 'true',\n parentSources: [source.toCanonicalString()],\n });\n }\n }\n }\n\n let nextAxes = [...parentAxes];\n while(nextAxes.length) {\n const next:string[] = [];\n for (const addedAxis of nextAxes) {\n if (linkerColumnsMap[addedAxis]) {\n const availableAxes = Object.keys(linkerColumnsMap[addedAxis]);\n for (const availableAxis of availableAxes) {\n if (!linkerAxes.has(availableAxis)) {\n next.push(availableAxis);\n //allowedAxes.add(availableAxis);\n linkerAxes.add(availableAxis);\n const {spec, id} = linkerColumnsMap[addedAxis][availableAxis];\n for (const axisSpec of spec.axesSpec) {\n const axisId = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n if (!optionsInfo.has(axisId)) {\n optionsInfo.set(axisId, {\n kind: 'axis',\n name: axisSpec.name,\n label: axisSpec.annotations?.[COLUMN_LABEL_KEY] ?? '',\n type: axisSpec.type,\n mustBeConsumed: false,\n dividable: false,\n spec: axisSpec,\n annotations: axisSpec.annotations,\n isSubsetFilter: axisSpec.annotations?.[SUBSET_FILTER_KEY] === 'true',\n isDiscreteFilter: axisSpec.type === 'String' || axisSpec.annotations?.[DISCRETE_FILTER_KEY] === 'true',\n parentSources: [id.toCanonicalString()],\n });\n }\n }\n }\n }\n }\n }\n nextAxes = next;\n }\n\n return {parentAxes, parentAxesList, linkerAxes, optionsInfo};\n }\n\n async getOptions(\n store: DataStore,\n state: State,\n labelsMap: Record<string, string>,\n consumedSourcesSet: Set<ColumnOrAxisIdString>,\n linkerColumnsMap: LinkerColumnsMap,\n compositeLinkerMap: CompositeLinkerMap,\n dataColumnPredicate: (spec: PColumnSpec) => boolean,\n ignoredNamesSet: Set<string> = new Set(),\n fixedSelectedSet: Set<ColumnOrAxisIdString> = new Set()\n ): Promise<ComponentGuideSimple> {\n const multipleSelectors = this.settings.multipleSelectors;\n const required = this.settings.required;\n const stateConsistency = await this.checkStateConsistency(store, state, linkerColumnsMap, compositeLinkerMap);\n\n if (this.dependsOn.length && this.dependsOn.some(dep => state.components[dep].selectorStates.length === 0)) {\n return {multipleSelectors, required, stateConsistency, options: [], optionsInfo: new Map()};\n }\n\n if (\n this.strictlyDependsOnParents &&\n !this.settings.isDataComponent &&\n this.parentComponents.some(name => state.components[name].selectorStates.length === 0)\n ) {\n return {multipleSelectors, required, stateConsistency, options: [], optionsInfo: new Map()};\n }\n\n const parentSelectedSources = this.getParentSelectedSources(store, state);\n const allowedColumns = (\n await store.pFrameProvider.getColumns([], false, this.allowedTypes, undefined, this.annotations)\n ).filter(item => !consumedSourcesSet.has(item.toCanonicalString()));\n\n const {parentAxes, linkerAxes, parentAxesList, optionsInfo} = await this.getAllowedAxes(store, state, linkerColumnsMap);\n\n const thisState: ComponentState = state.components[this.componentName];\n const options: SourceOption[] = [];\n if (this.settings.axesAllowed) {\n for (const idStr of parentAxes) {\n const id = columnOrAxisIdFromString(idStr) as AxisId;\n const axisData = optionsInfo.get(id.toCanonicalString()) as AxisData;\n\n const typeOK = this.allowedTypes.includes(axisData.spec.type);\n const annotationsOK = Object.entries(this.annotations).every(\n ([k, v]) => axisData.spec.annotations?.[k] === v\n );\n const checkBySpecOK = this.checkSourceBySpec ? this.checkSourceBySpec(axisData.spec, state) : true;\n const axisNatureOK = !this.settings.homogeneous || !axisData?.mustBeConsumed;\n const decreasingDimensionsOK = !consumedSourcesSet.has(idStr);\n const ignored = ignoredNamesSet.has(id.name) || fixedSelectedSet.has(id.toCanonicalString());\n const selectedHere = thisState.selectorStates.some(item => item.selectedSource === idStr);\n\n if (typeOK && annotationsOK && checkBySpecOK && axisNatureOK && decreasingDimensionsOK && !ignored && !selectedHere) {\n options.push({value: idStr});\n }\n }\n }\n\n if (this.settings.columnsAllowed) {\n const strictlyCompatible = !this.settings.columnsWithExtraAxesAllowed && this.strictlyDependsOnParents;\n for (const columnId of allowedColumns) {\n const columnIdString = columnId.toCanonicalString();\n const id = columnOrAxisIdFromString(columnIdString);\n\n const columnSpec = await store.pFrameProvider.getColumnSpecById(id);\n if (!columnSpec) {\n continue;\n }\n const extraAxesIds = getNotAllowedAxes(\n columnSpec,\n parentAxesList,\n parentAxes,\n linkerAxes,\n compositeLinkerMap\n ).map((axisSpec) => AxisId.fromAxisSpec(axisSpec).toCanonicalString());\n\n const extraAxesSet = new Set(extraAxesIds);\n if (\n // do not add to available options label columns, or columns that are not fit by custom spec condition, or columns that are not fit by condition for data inputs\n isLabelColumn(columnSpec) || isLinkerColumn(columnSpec) ||\n (this.checkSourceBySpec && !this.checkSourceBySpec(columnSpec, state)) ||\n (this.settings.isDataComponent && !dataColumnPredicate(columnSpec)) ||\n strictlyCompatible && extraAxesIds.length > 0 ||\n parentSelectedSources.length && extraAxesIds.length > 0 && !columnSpec.axesSpec.some((axisSpec) => {\n const axisIdStr = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n return parentAxes.has(axisIdStr) || linkerAxes.has(axisIdStr);\n })\n ) {\n continue;\n }\n const axesIds = columnSpec?.axesSpec?.map(axisSpec => AxisId.fromAxisSpec(axisSpec).toCanonicalString()) ?? [];\n const extraAxesIndexes:Record<string, number> = {};\n if (this.settings.columnsWithExtraAxesAllowed) {\n axesIds.forEach((id, idx) => {\n if (extraAxesSet.has(id)) {\n extraAxesIndexes[id] = idx;\n }\n });\n }\n if (columnSpec) {\n const label =\n labelsMap[columnIdString] ??\n (await getColumnOrAxisLabel(store, columnId.toCanonicalString(), []));\n const columnInfo: ColumnData = {\n kind: 'column',\n name: columnSpec.name,\n label,\n type: columnSpec.valueType,\n spec: columnSpec,\n annotations: columnSpec.annotations,\n isSubsetFilter: columnSpec.annotations?.[SUBSET_FILTER_KEY] === 'true',\n isDiscreteFilter:\n columnSpec.valueType === 'String' ||\n columnSpec.annotations?.[DISCRETE_FILTER_KEY] === 'true',\n axesToBeFixed: extraAxesIds,\n axesToBeFixedIndexes: extraAxesIndexes,\n };\n optionsInfo.set(id.toCanonicalString(), columnInfo);\n }\n\n const ignored = ignoredNamesSet.has(id.name) || fixedSelectedSet.has(id.toCanonicalString());\n const selectedHere = state.components[this.componentName].selectorStates.some(\n item => item.selectedSource === columnIdString\n );\n if (!ignored && !selectedHere) {\n options.push({value: columnIdString});\n }\n }\n }\n return {multipleSelectors, required, stateConsistency, options, optionsInfo};\n }\n}\n","import canonicalize from 'canonicalize';\nimport type {\n ComponentStateFilter,\n ComponentStateSimple,\n DataByColumns,\n InputStateParent,\n} from '../../common';\nimport {PValue} from '../../store';\nimport {ControllerBase, PlotDataAndSettings} from '../ControllerBase';\nimport {ComponentController} from '../ComponentController';\nimport {columnOrAxisIdFromString, isColumnId} from '../../spec';\nimport type {DataStore} from '../../store';\nimport {\n checkSourceBySpecForFilters, getAllLinkerMaps, getAxesSpecsFromSources,\n getColumnOrAxisLabel,\n getColumnOrAxisValueLabelsId,\n getFiltersFromStates, getLinkerColumnsForSource,\n} from '../../utils';\nimport {AxisId, ColumnId} from '../../spec';\nimport type {ColumnsProvider} from '../../pframe/ColumnsProvider';\n\nexport interface BubbleUIState extends InputStateParent<'bubble'> {\n type: 'bubble';\n components: {\n valueSize: ComponentStateSimple;\n valueColor: ComponentStateSimple;\n x: ComponentStateSimple;\n y: ComponentStateSimple;\n filters: ComponentStateFilter;\n tabBy: ComponentStateFilter;\n facetBy: ComponentStateSimple;\n tooltipContent: ComponentStateSimple;\n };\n}\n\nexport const InitialBubbleState: BubbleUIState = {\n type: 'bubble',\n components: {\n valueSize: {type: 'simple', selectorStates: []},\n valueColor: {type: 'simple', selectorStates: []},\n x: {type: 'simple', selectorStates: []},\n y: {type: 'simple', selectorStates: []},\n filters: {type: 'filter', selectorStates: []},\n tabBy: {type: 'filter', selectorStates: []},\n facetBy: {type: 'simple', selectorStates: []},\n tooltipContent: {type: 'simple', selectorStates: []},\n },\n dividedAxes: {},\n};\n\nfunction getMultiSourceColumn(data: Awaited<ReturnType<ColumnsProvider['getTableOuterJoin']>>, selectedSources: string[]) {\n if (!selectedSources.length) {\n return [];\n }\n const selectedIds = selectedSources.map(str => columnOrAxisIdFromString(str));\n const n = Object.values(data.columnsData)[0].length;\n const result: string[] = [];\n for (let i = 0; i < n; i++) {\n const value = selectedIds\n .map((id) => {\n const key = id.toCanonicalString();\n return isColumnId(id)\n ? data.columnsData[key][i]\n : data.axesData[key][i];\n })\n .join(', ');\n result.push(value);\n }\n return result;\n}\n\nexport class BubbleStateController extends ControllerBase<BubbleUIState> {\n dataInputs = ['valueSize', 'valueColor'];\n dontAllowUnfilteredHighCardinality = true;\n constructor() {\n super({\n valueSize: new ComponentController<BubbleUIState, 'valueSize'>({\n componentName: 'valueSize',\n allowedTypes: ['Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['valueColor'],\n settings: {\n isDataComponent: true,\n columnsAllowed: true,\n axesAllowed: false,\n required: true,\n }\n }),\n valueColor: new ComponentController<BubbleUIState, 'valueColor'>({\n componentName: 'valueColor',\n allowedTypes: ['Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['valueSize'],\n settings: {\n isDataComponent: true,\n columnsAllowed: true,\n axesAllowed: false,\n required: true,\n },\n }),\n x: new ComponentController<BubbleUIState, 'x'>({\n componentName: 'x',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['valueSize', 'valueColor'],\n settings: {\n required: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: false,\n },\n }),\n y: new ComponentController<BubbleUIState, 'y'>({\n componentName: 'y',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['valueSize', 'valueColor'],\n settings: {\n required: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: false,\n },\n }),\n tooltipContent: new ComponentController<BubbleUIState, 'tooltipContent'>({\n componentName: 'tooltipContent',\n allowedTypes: ['String', 'Int', 'Long', 'Float', 'Double'],\n strictlyDependsOnParents: true,\n parentComponents: ['valueSize', 'valueColor'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n multipleSelectors: true,\n },\n }),\n facetBy: new ComponentController<BubbleUIState, 'facetBy'>({\n componentName: 'facetBy',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['valueSize', 'valueColor'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n })\n }, {\n filters: new ComponentController<BubbleUIState, 'filters'>({\n componentName: 'filters',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['valueSize', 'valueColor'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n checkSourceBySpec: checkSourceBySpecForFilters\n }),\n tabBy: new ComponentController<BubbleUIState, 'tabBy'>({\n componentName: 'tabBy',\n allowedTypes: ['String', 'Int'],\n strictlyDependsOnParents: true,\n parentComponents: ['valueSize', 'valueColor'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n dimensionConsumer: true,\n },\n }),\n });\n }\n\n async getMustBeConsumedAxes(store: DataStore, state: BubbleUIState):Promise<Set<string>> {\n if (!state.components.valueColor.selectorStates.length) {\n return new Set<string>();\n }\n const sourceId = state.components.valueColor.selectorStates[0].selectedSource;\n const spec = await store.pFrameProvider.getColumnSpecById(columnOrAxisIdFromString(sourceId));\n if (!spec) {\n return new Set<string>();\n }\n return new Set(spec.axesSpec.map((s) => AxisId.fromAxisSpec(s).toCanonicalString()))\n }\n\n async createDataByColumns(store: DataStore, state: BubbleUIState): Promise<PlotDataAndSettings['data']> {\n const valueColorColumnIdString = state.components.valueColor.selectorStates[0]?.selectedSource;\n const valueSizeColumnIdString = state.components.valueSize.selectorStates[0]?.selectedSource;\n if (!valueColorColumnIdString || !valueSizeColumnIdString) {\n throw Error('Value column is not valid');\n }\n const valueColorColumnId = columnOrAxisIdFromString(valueColorColumnIdString);\n const valueSizeColumnId = columnOrAxisIdFromString(valueSizeColumnIdString);\n if ((!valueColorColumnId || !valueSizeColumnId) || !isColumnId(valueColorColumnId) && !isColumnId(valueSizeColumnId)) {\n throw Error('Value column is not valid');\n }\n const dataByColumns: DataByColumns = {\n type: 'columns',\n id: canonicalize(state.components) ?? '',\n values: {},\n };\n\n const {linkerColumnsMap, compositeLinkerMap} = await getAllLinkerMaps(store);\n\n const filterSelectedStates = [\n ...state.components.filters.selectorStates,\n ...state.components.tabBy.selectorStates\n ]\n // filters for column/axes data requests\n const filters = getFiltersFromStates(filterSelectedStates);\n const filterColumns = filterSelectedStates.map(s => columnOrAxisIdFromString(s.selectedSource)).filter(isColumnId);\n\n const primaryColumns = ([valueColorColumnId, valueSizeColumnId]).filter(isColumnId);\n const parentSources = primaryColumns.map((v) => v.toCanonicalString());\n const parentAxesList = await getAxesSpecsFromSources(store, parentSources);\n const inputs = [\n state.components.facetBy,\n state.components.x,\n state.components.y,\n state.components.tooltipContent\n ];\n const secondarySources: (ColumnId | AxisId)[] = []; // primary sources are the only value column\n const primarySourcesFixedAxes:{idx: number, value: PValue}[][] = primaryColumns.map(() => []);\n const secondarySourcesFixedAxes:{idx: number, value: PValue}[][] = [];\n const linkerColumns:ColumnId[] = [];\n\n for (const {selectedSource, fixedAxes} of filterSelectedStates) {\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n primarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n }\n\n for (const input of inputs) {\n for (const {selectedSource, fixedAxes} of input.selectorStates) {\n secondarySources.push(columnOrAxisIdFromString(selectedSource)!);\n secondarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n if (labelsColumnId) {\n secondarySources.push(labelsColumnId);\n }\n }\n }\n\n const data = await store.pFrameProvider.getTableOuterJoin(\n [...primaryColumns, ...linkerColumns, ...filterColumns],\n secondarySources,\n filters,\n true,\n primarySourcesFixedAxes,\n secondarySourcesFixedAxes\n );\n\n secondarySources.forEach(item => {\n const key = item.toCanonicalString();\n dataByColumns.values[key] = isColumnId(item)\n ? data.columnsData[key]\n : data.axesData[key];\n });\n dataByColumns.values[valueColorColumnIdString] = isColumnId(valueColorColumnId)\n ? data.columnsData[valueColorColumnIdString]\n : data.axesData[valueColorColumnIdString]\n dataByColumns.values[valueSizeColumnIdString] = isColumnId(valueSizeColumnId)\n ? data.columnsData[valueSizeColumnIdString]\n : data.axesData[valueSizeColumnIdString]\n\n const xAxes = state.components.x.selectorStates.map(state => state.selectedSource);\n const xKey = xAxes.join(', ');\n const xAxesLabeled = await Promise.all(xAxes.map(\n async id => (await getColumnOrAxisValueLabelsId(store, id, parentSources))?.toCanonicalString() ?? id,\n ));\n dataByColumns.values[xKey] = getMultiSourceColumn(data, xAxes);\n dataByColumns.values.xLabels = getMultiSourceColumn(data, xAxesLabeled);\n\n // y column should contain yGroup axes\n const yAxes = state.components.y.selectorStates.map(state => state.selectedSource);\n const yKey = yAxes.join(', ');\n const yAxesLabeled = await Promise.all(yAxes.map(\n async id => (await getColumnOrAxisValueLabelsId(store, id, parentSources))?.toCanonicalString() ?? id,\n ));\n dataByColumns.values[yKey] = getMultiSourceColumn(data, yAxes);\n dataByColumns.values.yLabels = getMultiSourceColumn(data, yAxesLabeled);\n\n return {byColumns: dataByColumns};\n }\n\n async createChartSettings(store: DataStore, state: BubbleUIState): Promise<Record<string, unknown>> {\n const valueColorColumnIdString = state.components.valueColor.selectorStates[0]?.selectedSource;\n const valueSizeColumnIdString = state.components.valueSize.selectorStates[0]?.selectedSource;\n if (!valueColorColumnIdString || !valueSizeColumnIdString) {\n throw Error('Value column is not valid');\n }\n const valueColorColumnId = columnOrAxisIdFromString(valueColorColumnIdString);\n const valueSizeColumnId = columnOrAxisIdFromString(valueSizeColumnIdString);\n if (!isColumnId(valueColorColumnId) && !isColumnId(valueSizeColumnId)) {\n throw Error('Value column is not valid');\n }\n\n const parentSources = ([valueColorColumnId, valueSizeColumnId]).filter(isColumnId).map((v) => v.toCanonicalString());\n const valueColor = {\n type: 'column',\n value: valueColorColumnIdString,\n label: await getColumnOrAxisLabel(store, valueColorColumnIdString, []),\n };\n const valueSize = {\n type: 'column',\n value: valueSizeColumnIdString,\n label: await getColumnOrAxisLabel(store, valueSizeColumnIdString, []),\n };\n const xAxes = state.components.x.selectorStates.map(({selectedSource}) => selectedSource)\n const xKey = xAxes.join(', ');\n\n const yAxes = state.components.y.selectorStates.map(({selectedSource}) => selectedSource)\n const yKey = yAxes.join(', ');\n\n const facetBy = await Promise.all(state.components.facetBy.selectorStates.map(async selectorState => ({\n type: 'column',\n value:\n (await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources))?.toCanonicalString() ??\n selectorState.selectedSource,\n })));\n\n const xAxisTitle = (await Promise.all(state.components.x.selectorStates\n .map(state => getColumnOrAxisLabel(store, state.selectedSource, parentSources))))\n .join(', ');\n const yAxisTitle = (await Promise.all(state.components.y.selectorStates\n .map(state => getColumnOrAxisLabel(store, state.selectedSource, parentSources))))\n .join(', ');\n\n const tooltipContent = await Promise.all(\n state.components.tooltipContent.selectorStates.map(async selectorState => {\n const idString = selectorState.selectedSource;\n return {\n type: 'column',\n label: (await getColumnOrAxisLabel(store, idString, parentSources)) || idString,\n value: idString,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, idString, parentSources))?.toCanonicalString() ??\n idString,\n };\n })\n );\n\n return {\n type: 'bubble',\n valueColor: valueColor,\n valueSize: valueSize,\n xColumn: {\n type: 'column',\n value: xKey,\n label: xAxisTitle,\n valueLabels: 'xLabels'\n },\n yColumn: {\n type: 'column',\n value: yKey,\n label: yAxisTitle,\n valueLabels: 'yLabels'\n },\n facetBy,\n tooltips: {\n show: true,\n content: tooltipContent\n }\n };\n }\n}\n","import canonicalize from 'canonicalize';\nimport type {ComponentStateFilter, ComponentStateSimple, DataByColumns, InputStateParent} from '../../common';\nimport {PValue} from '../../store';\nimport {ControllerBase, PlotDataAndSettings} from '../ControllerBase';\nimport {ComponentController} from '../ComponentController';\nimport {columnOrAxisIdFromString, isColumnId} from '../../spec';\nimport type {DataStore} from '../../store';\nimport {\n checkSourceBySpecForFilters,\n getAllLinkerMaps, getAxesSpecsFromSources,\n getColumnOrAxisLabel,\n getColumnOrAxisValueLabelsId,\n getFiltersFromStates,\n getLinkerColumnsForSource,\n getLinkerColumnsMap,\n} from '../../utils';\nimport {AxisId, ColumnId} from '../../spec';\n\nexport interface HistogramUIState extends InputStateParent<'histogram'> {\n type: 'histogram';\n components: {\n value: ComponentStateSimple;\n grouping: ComponentStateSimple;\n filters: ComponentStateFilter;\n tabBy: ComponentStateFilter;\n facetBy: ComponentStateSimple;\n };\n}\n\nexport const InitialHistogramState: HistogramUIState = {\n type: 'histogram',\n components: {\n value: {type: 'simple', selectorStates: []},\n grouping: {type: 'simple', selectorStates: []},\n filters: {type: 'filter', selectorStates: []},\n tabBy: {type: 'filter', selectorStates: []},\n facetBy: {type: 'simple', selectorStates: []},\n },\n dividedAxes: {},\n};\n\nexport class HistogramStateController extends ControllerBase<HistogramUIState> {\n dataInputs = ['value'];\n\n constructor() {\n super(\n {\n value: new ComponentController<HistogramUIState, 'value'>({\n componentName: 'value',\n allowedTypes: ['Int', 'Long', 'Double', 'Float'],\n settings: {\n isDataComponent: true,\n columnsAllowed: true,\n axesAllowed: false,\n required: true,\n },\n }),\n grouping: new ComponentController<HistogramUIState, 'grouping'>({\n componentName: 'grouping',\n allowedTypes: ['String', 'Int', 'Long'],\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n axesAllowed: true,\n multipleSelectors: false,\n },\n }),\n facetBy: new ComponentController<HistogramUIState, 'facetBy'>({\n componentName: 'facetBy',\n allowedTypes: ['String', 'Int', 'Long'],\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n }),\n },\n {\n filters: new ComponentController<HistogramUIState, 'filters'>({\n componentName: 'filters',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Float'],\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n checkSourceBySpec: checkSourceBySpecForFilters,\n }),\n tabBy: new ComponentController<HistogramUIState, 'tabBy'>({\n componentName: 'tabBy',\n allowedTypes: ['String', 'Int'],\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n dimensionConsumer: true,\n },\n }),\n }\n );\n }\n\n async createDataByColumns(store: DataStore, state: HistogramUIState): Promise<PlotDataAndSettings['data']> {\n const valueColumnIdString = state.components.value.selectorStates[0]?.selectedSource;\n if (!valueColumnIdString) {\n throw Error('Value column is not valid');\n }\n const valueColumnId = columnOrAxisIdFromString(valueColumnIdString);\n if (!isColumnId(valueColumnId)) {\n throw Error('Value column is not valid');\n }\n const dataByColumns: DataByColumns = {\n type: 'columns',\n id: canonicalize(state.components) ?? '',\n values: {},\n };\n\n const {linkerColumnsMap, compositeLinkerMap} = await getAllLinkerMaps(store);\n\n const filterSelectedStates = [\n ...state.components.filters.selectorStates,\n ...state.components.tabBy.selectorStates,\n ];\n // filters for column/axes data requests\n const filters = getFiltersFromStates(filterSelectedStates);\n const filterColumns = filterSelectedStates\n .map(s => columnOrAxisIdFromString(s.selectedSource))\n .filter(isColumnId);\n\n const parentSources = [valueColumnIdString];\n const parentAxesList = await getAxesSpecsFromSources(store, parentSources);\n\n const inputs = [state.components.facetBy, state.components.grouping];\n const secondarySources: (ColumnId | AxisId)[] = []; // primary sources are the only value column\n const primarySourcesFixedAxes: {idx: number; value: PValue}[][] = [[]];\n const secondarySourcesFixedAxes: {idx: number; value: PValue}[][] = [];\n const linkerColumns: ColumnId[] = [];\n\n for (const {selectedSource, fixedAxes} of filterSelectedStates) {\n linkerColumns.push(\n ...(await getLinkerColumnsForSource(store, linkerColumnsMap, compositeLinkerMap, parentAxesList, selectedSource, fixedAxes))\n );\n primarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n }\n\n for (const input of inputs) {\n for (const {selectedSource, fixedAxes} of input.selectorStates) {\n secondarySources.push(columnOrAxisIdFromString(selectedSource)!);\n secondarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n linkerColumns.push(\n ...(await getLinkerColumnsForSource(store, linkerColumnsMap, compositeLinkerMap, parentAxesList, selectedSource, fixedAxes))\n );\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n if (labelsColumnId) {\n secondarySources.push(labelsColumnId);\n }\n }\n }\n\n const data = await store.pFrameProvider.getTableOuterJoin(\n [valueColumnId, ...linkerColumns, ...filterColumns],\n secondarySources,\n filters,\n true,\n primarySourcesFixedAxes,\n secondarySourcesFixedAxes\n );\n\n secondarySources.forEach(item => {\n const key = item.toCanonicalString();\n dataByColumns.values[key] = isColumnId(item) ? data.columnsData[key] : data.axesData[key];\n });\n dataByColumns.values[valueColumnId.toCanonicalString()] = data.columnsData[valueColumnId.toCanonicalString()];\n\n return {byColumns: dataByColumns};\n }\n\n async createChartSettings(store: DataStore, state: HistogramUIState): Promise<Record<string, unknown>> {\n const valueColumnIdString = state.components.value.selectorStates[0]?.selectedSource;\n if (!valueColumnIdString) {\n throw Error('Value column is not valid');\n }\n const valueColumnId = columnOrAxisIdFromString(valueColumnIdString);\n if (!isColumnId(valueColumnId)) {\n throw Error('Value column is not valid');\n }\n\n const parentSources = [valueColumnIdString];\n const value = {\n type: 'column',\n value: valueColumnIdString,\n label: await getColumnOrAxisLabel(store, valueColumnIdString, []),\n };\n const facetBy = await Promise.all(\n state.components.facetBy.selectorStates.map(async selectorState => ({\n type: 'column',\n value:\n (\n await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources)\n )?.toCanonicalString() ?? selectorState.selectedSource,\n }))\n );\n let grouping;\n if (state.components.grouping.selectorStates.length) {\n const {selectedSource} = state.components.grouping.selectorStates[0];\n grouping = {\n type: 'column',\n value: selectedSource,\n label: await getColumnOrAxisLabel(store, selectedSource, parentSources),\n valueLabels: (\n await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources)\n )?.toCanonicalString(),\n };\n }\n return {\n type: 'histogram',\n valueColumn: value,\n facetBy,\n grouping,\n };\n }\n}\n","import canonicalize from 'canonicalize';\nimport type {\n ComponentStateFilter,\n ComponentStateSimple,\n DataByColumns,\n InputState,\n InputStateParent,\n} from '../../common';\nimport {ControllerBase, PlotDataAndSettings} from '../ControllerBase';\nimport {ComponentController} from '../ComponentController';\nimport type {AxisId, ColumnId} from '../../spec';\nimport {columnOrAxisIdFromString, isColumnId} from '../../spec';\nimport type {DataStore, PValue} from '../../store';\nimport {\n checkSourceBySpecForFilters, getAllLinkerMaps, getAxesSpecsFromSources,\n getColumnOrAxisLabel,\n getColumnOrAxisValueLabelsId,\n getFiltersFromStates, getLinkerColumnsForSource,\n} from '../../utils';\n\nexport interface DiscreteUIState extends InputStateParent<'discrete'> {\n type: 'discrete';\n components: {\n y: ComponentStateSimple;\n filters: ComponentStateFilter;\n tabBy: ComponentStateFilter;\n facetBy: ComponentStateSimple;\n primaryGrouping: ComponentStateSimple;\n secondaryGrouping: ComponentStateSimple;\n };\n}\n\nexport const InitialDiscreteState: DiscreteUIState = {\n type: 'discrete',\n components: {\n y: {type: 'simple', selectorStates: []},\n filters: {type: 'filter', selectorStates: []},\n tabBy: {type: 'filter', selectorStates: []},\n facetBy: {type: 'simple', selectorStates: []},\n primaryGrouping: {type: 'simple', selectorStates: []},\n secondaryGrouping: {type: 'simple', selectorStates: []},\n },\n dividedAxes: {},\n};\n\nexport function isDiscreteState(state: InputState): state is DiscreteUIState {\n return state.type == 'discrete';\n}\n\nexport class DiscreteStateController extends ControllerBase<DiscreteUIState> {\n dataInputs = ['y'];\n dontAllowUnfilteredHighCardinality = true;\n\n constructor() {\n super(\n {\n y: new ComponentController<DiscreteUIState, 'y'>({\n componentName: 'y',\n allowedTypes: ['Int', 'Double', 'Long', 'Float'],\n settings: { isDataComponent: true },\n }),\n primaryGrouping: new ComponentController<DiscreteUIState, 'primaryGrouping'>({\n componentName: 'primaryGrouping',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['y'],\n dependsOn: ['y'],\n settings: {\n axesAllowed: true,\n homogeneous: true,\n },\n }),\n secondaryGrouping: new ComponentController<DiscreteUIState, 'secondaryGrouping'>({\n componentName: 'secondaryGrouping',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['y'],\n dependsOn: ['primaryGrouping'],\n settings: {\n axesAllowed: true,\n homogeneous: true,\n },\n }),\n facetBy: new ComponentController<DiscreteUIState, 'facetBy'>({\n componentName: 'facetBy',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['y'],\n dependsOn: ['y'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n }),\n },\n {\n filters: new ComponentController<DiscreteUIState, 'filters'>({\n componentName: 'filters',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['y'],\n dependsOn: ['y'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n checkSourceBySpec: checkSourceBySpecForFilters\n }),\n tabBy: new ComponentController<DiscreteUIState, 'tabBy'>({\n componentName: 'tabBy',\n allowedTypes: ['String', 'Int'],\n strictlyDependsOnParents: true,\n parentComponents: ['y'],\n dependsOn: ['y'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n },\n }),\n },\n );\n }\n\n async createDataByColumns(store: DataStore, state: DiscreteUIState): Promise<PlotDataAndSettings['data']> {\n const yColumnIdString = state.components.y.selectorStates[0].selectedSource;\n const yColumnIdWithQ = columnOrAxisIdFromString(yColumnIdString);\n if (!yColumnIdString || !isColumnId(yColumnIdWithQ)) {\n throw Error('Y column is not valid');\n }\n const dataByColumns: DataByColumns = {\n type: 'columns',\n id: canonicalize(state.components) ?? '',\n values: {},\n };\n\n const {linkerColumnsMap, compositeLinkerMap} = await getAllLinkerMaps(store);\n\n const filterSelectedStates = [\n ...state.components.filters.selectorStates,\n ...state.components.tabBy.selectorStates\n ]\n // filters for column/axes data requests\n const filters = getFiltersFromStates(filterSelectedStates);\n const filterColumns = filterSelectedStates.map(s => columnOrAxisIdFromString(s.selectedSource)).filter(isColumnId);\n\n const parentSources = [yColumnIdString];\n const parentAxesList = await getAxesSpecsFromSources(store, parentSources);\n const inputs = [state.components.primaryGrouping, state.components.secondaryGrouping, state.components.facetBy];\n\n const secondarySources: (ColumnId | AxisId)[] = []; // primary sources are the only Y column\n const primarySourcesFixedAxes:{idx: number, value: PValue}[][] = [[]];\n const secondarySourcesFixedAxes:{idx: number, value: PValue}[][] = [];\n const linkerColumns:ColumnId[] = [];\n\n for (const {selectedSource, fixedAxes} of filterSelectedStates) {\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n primarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n }\n\n for (const input of inputs) {\n for (const {selectedSource, fixedAxes} of input.selectorStates) {\n secondarySources.push(columnOrAxisIdFromString(selectedSource)!);\n secondarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n if (labelsColumnId) {\n secondarySources.push(labelsColumnId);\n }\n }\n }\n const data = await store.pFrameProvider.getTableOuterJoin(\n [yColumnIdWithQ, ...linkerColumns, ...filterColumns],\n secondarySources,\n filters,\n true,\n primarySourcesFixedAxes,\n secondarySourcesFixedAxes\n );\n\n secondarySources.forEach(item => {\n const key = item.toCanonicalString();\n dataByColumns.values[key] = isColumnId(item)\n ? data.columnsData[key]\n : data.axesData[key];\n });\n dataByColumns.values[yColumnIdWithQ.toCanonicalString()] = data.columnsData[yColumnIdWithQ.toCanonicalString()];\n return {byColumns: dataByColumns};\n }\n\n async createChartSettings(store: DataStore, state: DiscreteUIState): Promise<Record<string, unknown>> {\n const yColumnIdString = state.components.y.selectorStates[0].selectedSource;\n const yColumnId = columnOrAxisIdFromString(yColumnIdString);\n if (!yColumnIdString || !isColumnId(yColumnId)) {\n throw Error('Y column is not valid');\n }\n const y = {\n type: 'column',\n value: yColumnIdString,\n label: await getColumnOrAxisLabel(store, yColumnIdString, []),\n };\n\n const parentSources = [yColumnIdString];\n\n let primaryGrouping;\n if (state.components.primaryGrouping.selectorStates.length) {\n const {selectedSource} = state.components.primaryGrouping.selectorStates[0];\n primaryGrouping = {\n columnName: {\n type: 'column',\n value: selectedSource,\n label: await getColumnOrAxisLabel(store, selectedSource, parentSources),\n valueLabels: (await getColumnOrAxisValueLabelsId(\n store,\n selectedSource,\n parentSources,\n ))?.toCanonicalString(),\n },\n };\n }\n let secondaryGrouping;\n if (state.components.secondaryGrouping.selectorStates.length) {\n const {selectedSource} = state.components.secondaryGrouping.selectorStates[0];\n secondaryGrouping = {\n columnName: {\n type: 'column',\n value: selectedSource,\n label: await getColumnOrAxisLabel(store, selectedSource, parentSources),\n valueLabels: (await getColumnOrAxisValueLabelsId(\n store,\n selectedSource,\n parentSources,\n ))?.toCanonicalString(),\n },\n };\n }\n const facetBy = await Promise.all(state.components.facetBy.selectorStates.map(async state => ({\n type: 'column',\n value:\n (await getColumnOrAxisValueLabelsId(store, state.selectedSource, parentSources))?.toCanonicalString() ??\n state.selectedSource,\n label: await getColumnOrAxisLabel(store, state.selectedSource, parentSources),\n })));\n\n return {\n type: 'discrete',\n y,\n primaryGrouping,\n secondaryGrouping,\n facetBy,\n };\n }\n}\n","import {AxisSpec, PColumnSpec} from '@milaboratories/pl-model-common';\nimport canonicalize from 'canonicalize';\nimport type {ComponentStateFilter, ComponentStateSimple, DataByColumns, InputStateParent} from '../../common';\nimport {PValue} from '../../store';\nimport {ControllerBase, PlotDataAndSettings} from '../ControllerBase';\nimport {ComponentController} from '../ComponentController';\nimport {columnOrAxisIdFromString, isColumnId} from '../../spec';\nimport type {DataStore} from '../../store';\nimport {\n checkSourceBySpecForFilters, getAllLinkerMaps, getAxesSpecsFromSources,\n getColumnOrAxisLabel,\n getColumnOrAxisValueLabelsId,\n getFiltersFromStates, getLinkerColumnsForSource,\n} from '../../utils';\nimport {AxisId, ColumnId} from '../../spec';\nimport type {ColumnsProvider} from '../../pframe/ColumnsProvider';\n\nexport interface HeatmapUIState extends InputStateParent<'heatmap'> {\n type: 'heatmap';\n components: {\n value: ComponentStateSimple;\n x: ComponentStateSimple;\n y: ComponentStateSimple;\n xGroupBy: ComponentStateSimple;\n yGroupBy: ComponentStateSimple;\n filters: ComponentStateFilter;\n tabBy: ComponentStateFilter;\n facetBy: ComponentStateSimple;\n annotationsX: ComponentStateSimple;\n annotationsY: ComponentStateSimple;\n tooltipContent: ComponentStateSimple;\n };\n}\n\nexport const InitialHeatmapState: HeatmapUIState = {\n type: 'heatmap',\n components: {\n value: {type: 'simple', selectorStates: []},\n x: {type: 'simple', selectorStates: []},\n y: {type: 'simple', selectorStates: []},\n xGroupBy: {type: 'simple', selectorStates: []},\n yGroupBy: {type: 'simple', selectorStates: []},\n filters: {type: 'filter', selectorStates: []},\n tabBy: {type: 'filter', selectorStates: []},\n facetBy: {type: 'simple', selectorStates: []},\n annotationsX: {type: 'simple', selectorStates: []},\n annotationsY: {type: 'simple', selectorStates: []},\n tooltipContent: {type: 'simple', selectorStates: []},\n },\n dividedAxes: {},\n};\n\nfunction isDiscreteData(spec: PColumnSpec | AxisSpec | null) {\n if (!spec) {\n return true;\n }\n if ('kind' in spec && spec.kind === 'PColumn') {\n return spec.valueType === 'String';\n }\n return (spec as AxisSpec).type === 'String';\n}\n\nfunction getMultiSourceColumn(\n data: Awaited<ReturnType<ColumnsProvider['getTableOuterJoin']>>,\n selectedSources: string[]\n) {\n if (!selectedSources.length) {\n return [];\n }\n const selectedIds = selectedSources.map(str => columnOrAxisIdFromString(str));\n const n = Object.values(data.columnsData)[0].length;\n const result: string[] = [];\n for (let i = 0; i < n; i++) {\n const value = selectedIds\n .map(id => {\n const key = id.toCanonicalString();\n return isColumnId(id) ? data.columnsData[key][i] : data.axesData[key][i];\n })\n .join(', ');\n result.push(value);\n }\n return result;\n}\n\nexport class HeatmapStateController extends ControllerBase<HeatmapUIState> {\n dataInputs = ['value'];\n dontAllowUnfilteredHighCardinality = true;\n\n constructor() {\n super(\n {\n value: new ComponentController<HeatmapUIState, 'value'>({\n componentName: 'value',\n allowedTypes: ['Int', 'Long', 'Double', 'Float', 'String'],\n settings: {\n isDataComponent: true,\n columnsAllowed: true,\n axesAllowed: false,\n required: true,\n },\n }),\n x: new ComponentController<HeatmapUIState, 'x'>({\n componentName: 'x',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n settings: {\n required: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: false,\n },\n }),\n xGroupBy: new ComponentController<HeatmapUIState, 'xGroupBy'>({\n componentName: 'xGroupBy',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n settings: {\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: true,\n },\n dependsOn: ['x'],\n checkSourceBySpec: (spec, state) => {\n const allowedAxes = new Set([\n ...state.components.x.selectorStates.map(s => s.selectedSource),\n ...state.components.xGroupBy.selectorStates.map(s => s.selectedSource),\n ]);\n\n if ('kind' in spec && spec.kind === 'PColumn') {\n return AxisId.fromAxesSpec(spec.axesSpec).every(id =>\n allowedAxes.has(id.toCanonicalString())\n );\n }\n return true;\n },\n }),\n y: new ComponentController<HeatmapUIState, 'y'>({\n componentName: 'y',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n settings: {\n required: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: true,\n },\n }),\n yGroupBy: new ComponentController<HeatmapUIState, 'yGroupBy'>({\n componentName: 'yGroupBy',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n settings: {\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: false,\n },\n dependsOn: ['y'],\n checkSourceBySpec: (spec, state) => {\n const allowedAxes = new Set([\n ...state.components.y.selectorStates.map(s => s.selectedSource),\n ...state.components.yGroupBy.selectorStates.map(s => s.selectedSource),\n ]);\n\n if ('kind' in spec && spec.kind === 'PColumn') {\n return AxisId.fromAxesSpec(spec.axesSpec).every(id =>\n allowedAxes.has(id.toCanonicalString())\n );\n }\n return true;\n },\n }),\n tooltipContent: new ComponentController<HeatmapUIState, 'tooltipContent'>({\n componentName: 'tooltipContent',\n allowedTypes: ['String', 'Int', 'Long', 'Float', 'Double'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n multipleSelectors: true,\n },\n }),\n facetBy: new ComponentController<HeatmapUIState, 'facetBy'>({\n componentName: 'facetBy',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n }),\n annotationsX: new ComponentController<HeatmapUIState, 'annotationsX'>({\n componentName: 'annotationsX',\n allowedTypes: ['Int', 'Long', 'Double', 'Float', 'String'],\n parentComponents: ['value'],\n settings: {\n axesAllowed: true,\n multipleSelectors: true,\n },\n dependsOn: ['x'],\n checkSourceBySpec: (spec, state) => {\n const allowedAxes = new Set([\n ...state.components.x.selectorStates.map(s => s.selectedSource),\n ...state.components.xGroupBy.selectorStates.map(s => s.selectedSource),\n ]);\n\n if ('kind' in spec && spec.kind === 'PColumn') {\n return AxisId.fromAxesSpec(spec.axesSpec).every(id =>\n allowedAxes.has(id.toCanonicalString())\n );\n }\n return allowedAxes.has(AxisId.fromAxisSpec(spec as AxisSpec).toCanonicalString());\n },\n }),\n annotationsY: new ComponentController<HeatmapUIState, 'annotationsY'>({\n componentName: 'annotationsY',\n allowedTypes: ['Int', 'Long', 'Double', 'Float', 'String'],\n parentComponents: ['value'],\n settings: {\n axesAllowed: true,\n multipleSelectors: true,\n },\n dependsOn: ['y'],\n checkSourceBySpec: (spec, state) => {\n const allowedAxes = new Set([\n ...state.components.y.selectorStates.map(s => s.selectedSource),\n ...state.components.yGroupBy.selectorStates.map(s => s.selectedSource),\n ]);\n\n if ('kind' in spec && spec.kind === 'PColumn') {\n return AxisId.fromAxesSpec(spec.axesSpec).every(id =>\n allowedAxes.has(id.toCanonicalString())\n );\n }\n return allowedAxes.has(AxisId.fromAxisSpec(spec as AxisSpec).toCanonicalString());\n },\n }),\n },\n {\n filters: new ComponentController<HeatmapUIState, 'filters'>({\n componentName: 'filters',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n checkSourceBySpec: checkSourceBySpecForFilters,\n }),\n tabBy: new ComponentController<HeatmapUIState, 'tabBy'>({\n componentName: 'tabBy',\n allowedTypes: ['String', 'Int'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n dimensionConsumer: true,\n },\n }),\n }\n );\n }\n\n async getMustBeConsumedAxes(store: DataStore, state: HeatmapUIState): Promise<Set<string>> {\n if (!state.components.value.selectorStates.length) {\n return new Set<string>();\n }\n const sourceId = state.components.value.selectorStates[0].selectedSource;\n const spec = await store.pFrameProvider.getColumnSpecById(columnOrAxisIdFromString(sourceId));\n if (!spec) {\n return new Set<string>();\n }\n return new Set(spec.axesSpec.map(s => AxisId.fromAxisSpec(s).toCanonicalString()));\n }\n\n async createDataByColumns(store: DataStore, state: HeatmapUIState): Promise<PlotDataAndSettings['data']> {\n const valueColumnIdString = state.components.value.selectorStates[0]?.selectedSource;\n if (!valueColumnIdString) {\n throw Error('Value column is not valid');\n }\n const valueColumnId = columnOrAxisIdFromString(valueColumnIdString);\n if (!isColumnId(valueColumnId)) {\n throw Error('Value column is not valid');\n }\n const dataByColumns: DataByColumns = {\n type: 'columns',\n id: canonicalize(state.components) ?? '',\n values: {},\n };\n\n const {linkerColumnsMap, compositeLinkerMap} = await getAllLinkerMaps(store);\n\n const filterSelectedStates = [\n ...state.components.filters.selectorStates,\n ...state.components.tabBy.selectorStates\n ]\n // filters for column/axes data requests\n const filters = getFiltersFromStates(filterSelectedStates);\n const filterColumns = filterSelectedStates.map(s => columnOrAxisIdFromString(s.selectedSource)).filter(isColumnId);\n\n const parentSources = [valueColumnIdString];\n const parentAxesList = await getAxesSpecsFromSources(store, parentSources);\n const inputs = [\n state.components.facetBy,\n state.components.annotationsX,\n state.components.annotationsY,\n state.components.x,\n state.components.y,\n state.components.xGroupBy,\n state.components.yGroupBy,\n state.components.tooltipContent,\n ];\n const secondarySources: (ColumnId | AxisId)[] = []; // primary sources are the only value column\n const primarySourcesFixedAxes:{idx: number, value: PValue}[][] = [[]];\n const secondarySourcesFixedAxes:{idx: number, value: PValue}[][] = [];\n const linkerColumns:ColumnId[] = [];\n\n for (const {selectedSource, fixedAxes} of filterSelectedStates) {\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n primarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n }\n\n for (const input of inputs) {\n for (const {selectedSource, fixedAxes} of input.selectorStates) {\n secondarySources.push(columnOrAxisIdFromString(selectedSource)!);\n secondarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n if (labelsColumnId) {\n secondarySources.push(labelsColumnId);\n }\n }\n }\n\n const data = await store.pFrameProvider.getTableOuterJoin(\n [valueColumnId, ...linkerColumns, ...filterColumns],\n secondarySources,\n filters,\n true,\n primarySourcesFixedAxes,\n secondarySourcesFixedAxes\n );\n\n secondarySources.forEach(item => {\n const key = item.toCanonicalString();\n dataByColumns.values[key] = isColumnId(item) ? data.columnsData[key] : data.axesData[key];\n });\n dataByColumns.values[valueColumnId.toCanonicalString()] = data.columnsData[valueColumnId.toCanonicalString()];\n\n // x column should contain xGroup axes\n const xAxes = state.components.x.selectorStates\n .concat(state.components.xGroupBy.selectorStates)\n .map(state => state.selectedSource);\n const xKey = xAxes.join(', ');\n dataByColumns.values[xKey] = getMultiSourceColumn(data, xAxes);\n\n // if grouping is not empty x keys will include grouping keys, but grouping keys should be excluded from x labels\n const xVisibleAxes = state.components.x.selectorStates.map(state => state.selectedSource);\n const xAxesLabeled = await Promise.all(\n xVisibleAxes.map(\n async id => (await getColumnOrAxisValueLabelsId(store, id, parentSources))?.toCanonicalString() ?? id\n )\n );\n dataByColumns.values.xLabelsKey = getMultiSourceColumn(data, xAxesLabeled);\n\n // y column should contain yGroup axes\n const yAxes = state.components.y.selectorStates\n .concat(state.components.yGroupBy.selectorStates)\n .map(state => state.selectedSource);\n const yKey = yAxes.join(', ');\n dataByColumns.values[yKey] = getMultiSourceColumn(data, yAxes);\n\n // column for labels - without grouping data in labels\n const yVisibleAxes = state.components.y.selectorStates.map(state => state.selectedSource);\n const yAxesLabeled = await Promise.all(\n yVisibleAxes.map(\n async id => (await getColumnOrAxisValueLabelsId(store, id, parentSources))?.toCanonicalString() ?? id\n )\n );\n dataByColumns.values.yLabelsKey = getMultiSourceColumn(data, yAxesLabeled);\n\n return {byColumns: dataByColumns};\n }\n\n async createChartSettings(store: DataStore, state: HeatmapUIState): Promise<Record<string, unknown>> {\n const valueColumnIdString = state.components.value.selectorStates[0]?.selectedSource;\n if (!valueColumnIdString) {\n throw Error('Value column is not valid');\n }\n const valueColumnId = columnOrAxisIdFromString(valueColumnIdString);\n if (!isColumnId(valueColumnId)) {\n throw Error('Value column is not valid');\n }\n\n const parentSources = [valueColumnIdString];\n const value = {\n type: 'column',\n value: valueColumnIdString,\n label: await getColumnOrAxisLabel(store, valueColumnIdString, []),\n };\n const xAxes = state.components.x.selectorStates\n .concat(state.components.xGroupBy.selectorStates)\n .map(({selectedSource}) => columnOrAxisIdFromString(selectedSource))\n .map(id => id.toCanonicalString());\n const xKey = xAxes.join(', ');\n\n const yAxes = state.components.y.selectorStates\n .concat(state.components.yGroupBy.selectorStates)\n .map(({selectedSource}) => columnOrAxisIdFromString(selectedSource))\n .map(id => id.toCanonicalString());\n const yKey = yAxes.join(', ');\n const facetBy = await Promise.all(\n state.components.facetBy.selectorStates.map(async selectorState => ({\n type: 'column',\n value:\n (\n await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources)\n )?.toCanonicalString() ?? selectorState.selectedSource,\n }))\n );\n const xGroupBy = await Promise.all(\n state.components.xGroupBy.selectorStates.map(async selectorState => ({\n type: 'column',\n label: await getColumnOrAxisLabel(store, selectorState.selectedSource, parentSources),\n value: selectorState.selectedSource,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources))?.toCanonicalString() ??\n selectorState.selectedSource,\n }))\n );\n const yGroupBy = await Promise.all(\n state.components.yGroupBy.selectorStates.map(async selectorState => ({\n type: 'column',\n label: await getColumnOrAxisLabel(store, selectorState.selectedSource, parentSources),\n value: selectorState.selectedSource,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources))?.toCanonicalString() ??\n selectorState.selectedSource,\n }))\n );\n const valueSpec = await store.pFrameProvider.getColumnSpecById(valueColumnId);\n const annotationsX = await Promise.all(\n state.components.annotationsX.selectorStates.map(async selectorState => {\n const idString = selectorState.selectedSource;\n const id = columnOrAxisIdFromString(idString);\n const spec: PColumnSpec | AxisSpec | null = isColumnId(id)\n ? await store.pFrameProvider.getColumnSpecById(id)\n : ((valueSpec?.axesSpec as AxisSpec[])?.find(\n (axisSpec: AxisSpec) => AxisId.fromAxisSpec(axisSpec).toCanonicalString() === idString\n ) ?? null);\n return {\n axis: 'x',\n valueColumn: {\n type: 'column',\n value: idString,\n label: await getColumnOrAxisLabel(store, idString, parentSources),\n },\n type: isDiscreteData(spec) ? 'discrete' : 'continuous',\n };\n })\n );\n const annotationsY = await Promise.all(\n state.components.annotationsY.selectorStates.map(async selectorState => {\n const idString = selectorState.selectedSource;\n const id = columnOrAxisIdFromString(idString);\n const spec: PColumnSpec | AxisSpec | null = isColumnId(id)\n ? await store.pFrameProvider.getColumnSpecById(id)\n : ((valueSpec?.axesSpec as AxisSpec[])?.find(\n (axisSpec: AxisSpec) => AxisId.fromAxisSpec(axisSpec).toCanonicalString() === idString\n ) ?? null);\n return {\n axis: 'y',\n valueColumn: {\n type: 'column',\n value: idString,\n label: await getColumnOrAxisLabel(store, idString, parentSources),\n },\n type: isDiscreteData(spec) ? 'discrete' : 'continuous',\n };\n })\n );\n\n const xAxisTitle = (\n await Promise.all(\n state.components.x.selectorStates.map(state =>\n getColumnOrAxisLabel(store, state.selectedSource, parentSources)\n )\n )\n ).join(', ');\n const yAxisTitle = (\n await Promise.all(\n state.components.y.selectorStates.map(state =>\n getColumnOrAxisLabel(store, state.selectedSource, parentSources)\n )\n )\n ).join(', ');\n\n const tooltipContent = await Promise.all(\n state.components.tooltipContent.selectorStates.map(async selectorState => {\n const idString = selectorState.selectedSource;\n return {\n type: 'column',\n label: (await getColumnOrAxisLabel(store, idString, parentSources)) || idString,\n value: idString,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, idString, parentSources))?.toCanonicalString() ??\n idString,\n };\n })\n );\n\n return {\n type: 'heatmap',\n valueColumn: value,\n valueType: isDiscreteData(valueSpec) ? 'discrete' : 'continuous',\n xColumn: {\n type: 'column',\n value: xKey,\n label: xAxisTitle,\n valueLabels: 'xLabelsKey',\n },\n yColumn: {\n type: 'column',\n value: yKey,\n label: yAxisTitle,\n valueLabels: 'yLabelsKey',\n },\n facetBy,\n xGroupBy,\n yGroupBy,\n annotations: [...annotationsX, ...annotationsY],\n tooltips: {\n show: true,\n content: tooltipContent,\n },\n };\n }\n}\n","import canonicalize from 'canonicalize';\nimport lodash from 'lodash';\nimport type {\n ComponentStateFilter,\n ComponentStateSimple,\n DataByColumns,\n InputStateParent,\n} from '../../common';\nimport {PValue} from '../../store';\nimport {ControllerBase, PlotDataAndSettings} from '../ControllerBase';\nimport {ComponentController} from '../ComponentController';\nimport {AxisId, ColumnId} from '../../spec';\nimport {columnOrAxisIdFromString, isColumnId} from '../../spec';\nimport type {DataStore} from '../../store';\nimport {\n checkSourceBySpecForFilters,\n createHighlightColumn,\n getAllLinkerMaps,\n getAxesSpecsFromSources,\n getColumnOrAxisLabel,\n getColumnOrAxisValueLabelsId,\n getFiltersFromStates,\n getLinkerColumnsForSource,\n} from '../../utils';\n\nexport interface ScatterplotUIState extends InputStateParent<'scatterplot'> {\n type: 'scatterplot';\n components: {\n x: ComponentStateSimple;\n y: ComponentStateSimple;\n filters: ComponentStateFilter;\n highlight: ComponentStateFilter;\n tabBy: ComponentStateFilter;\n facetBy: ComponentStateSimple;\n grouping: ComponentStateSimple;\n shape: ComponentStateSimple;\n size: ComponentStateSimple;\n label: ComponentStateSimple;\n tooltipContent: ComponentStateSimple;\n };\n}\n\nexport const InitialScatterplotState: ScatterplotUIState = {\n type: 'scatterplot',\n components: {\n x: {type: 'simple', selectorStates: []},\n y: {type: 'simple', selectorStates: []},\n filters: {type: 'filter', selectorStates: []},\n highlight: {type: 'filter', selectorStates: []},\n tabBy: {type: 'filter', selectorStates: []},\n facetBy: {type: 'simple', selectorStates: []},\n grouping: {type: 'simple', selectorStates: []},\n shape: {type: 'simple', selectorStates: []},\n size: {type: 'simple', selectorStates: []},\n label: {type: 'simple', selectorStates: []},\n tooltipContent: {type: 'simple', selectorStates: []}\n },\n dividedAxes: {},\n};\n\nexport class ScatterplotStateController extends ControllerBase<ScatterplotUIState> {\n dataInputs = ['x', 'y'];\n\n constructor() {\n super(\n {\n x: new ComponentController<ScatterplotUIState, 'x'>({\n componentName: 'x',\n allowedTypes: ['Int', 'Long', 'Double' , 'Float'],\n parentComponents: ['y'],\n strictlyDependsOnParents: false,\n settings: {\n isDataComponent: true,\n required: true,\n axesAllowed: true,\n columnsAllowed: true,\n },\n }),\n y: new ComponentController<ScatterplotUIState, 'y'>({\n componentName: 'y',\n allowedTypes: ['Int', 'Long', 'Double', 'Float'],\n parentComponents: ['x'],\n strictlyDependsOnParents: false,\n settings: {\n isDataComponent: true,\n required: true,\n axesAllowed: true,\n columnsAllowed: true,\n },\n }),\n facetBy: new ComponentController<ScatterplotUIState, 'facetBy'>({\n componentName: 'facetBy',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n }),\n grouping: new ComponentController<ScatterplotUIState, 'grouping'>({\n componentName: 'grouping',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n multipleSelectors: true,\n },\n }),\n shape: new ComponentController<ScatterplotUIState, 'shape'>({\n componentName: 'shape',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n },\n }),\n size: new ComponentController<ScatterplotUIState, 'size'>({\n componentName: 'size',\n allowedTypes: ['Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n },\n }),\n tooltipContent: new ComponentController<ScatterplotUIState, 'tooltipContent'>({\n componentName: 'tooltipContent',\n allowedTypes: ['String', 'Int', 'Long', 'Float', 'Double'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n multipleSelectors: true,\n },\n }),\n label: new ComponentController<ScatterplotUIState, 'label'>({\n componentName: 'label',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n columnsAllowed: true,\n multipleSelectors: false,\n },\n }),\n },\n {\n filters: new ComponentController<ScatterplotUIState, 'filters'>({\n componentName: 'filters',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n columnsAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n checkSourceBySpec: checkSourceBySpecForFilters\n }),\n tabBy: new ComponentController<ScatterplotUIState, 'tabBy'>({\n componentName: 'tabBy',\n allowedTypes: ['String', 'Int'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n },\n }),\n highlight: new ComponentController<ScatterplotUIState, 'highlight'>({\n componentName: 'highlight',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n columnsAllowed: true,\n multipleSelectors: true,\n },\n checkSourceBySpec: checkSourceBySpecForFilters\n }),\n }\n );\n }\n\n async getMustBeConsumedAxes(store: DataStore, state: ScatterplotUIState):Promise<Set<string>> {\n if (!state.components.x.selectorStates.length || !state.components.y.selectorStates.length) {\n return new Set<string>();\n }\n const sourceIdX = state.components.x.selectorStates[0].selectedSource;\n const sourceIdY = state.components.y.selectorStates[0].selectedSource;\n const specX = await store.pFrameProvider.getColumnSpecById(columnOrAxisIdFromString(sourceIdX));\n const specY = await store.pFrameProvider.getColumnSpecById(columnOrAxisIdFromString(sourceIdY));\n if (!specX || !specY) {\n return new Set<string>();\n }\n const axesX = specX.axesSpec.map((s) => AxisId.fromAxisSpec(s).toCanonicalString());\n const axesY = specY.axesSpec.map((s) => AxisId.fromAxisSpec(s).toCanonicalString());\n const hangingX = axesX.filter(axisKey => !axesY.some(id => id === axisKey));\n const hangingY = axesY.filter(axisKey => !axesX.some(id => id === axisKey));\n\n return new Set<string>([...hangingX, ...hangingY])\n }\n\n async createDataByColumns(store: DataStore, state: ScatterplotUIState): Promise<PlotDataAndSettings['data']> {\n const xColumnIdString = state.components.x.selectorStates[0]?.selectedSource;\n const yColumnIdString = state.components.y.selectorStates[0]?.selectedSource;\n if (!xColumnIdString || !yColumnIdString) {\n throw Error('X or Y column is not valid');\n }\n const xId = columnOrAxisIdFromString(xColumnIdString);\n const yId = columnOrAxisIdFromString(yColumnIdString);\n const dataByColumns: DataByColumns = {\n type: 'columns',\n id: canonicalize(state.components) ?? '',\n values: {},\n };\n\n const {linkerColumnsMap, compositeLinkerMap} = await getAllLinkerMaps(store);\n\n const filterSelectedStates = [\n ...state.components.filters.selectorStates,\n ...state.components.tabBy.selectorStates\n ]\n // filters for column/axes data requests\n const filters = getFiltersFromStates(filterSelectedStates);\n const filterColumns = filterSelectedStates.map(s => columnOrAxisIdFromString(s.selectedSource)).filter(isColumnId);\n\n const parentSources = [xId, yId].filter(isColumnId).map(item => item.toCanonicalString());\n\n if (parentSources.length === 0) {\n throw Error('One of X and Y should be a column');\n }\n const parentAxesList = await getAxesSpecsFromSources(store, parentSources);\n\n const primarySources = [xId, yId, ...filterColumns];\n const secondarySources: (ColumnId | AxisId)[] = [];\n const primarySourcesFixedAxes:{idx: number, value: PValue}[][] = [[], []];\n const secondarySourcesFixedAxes:{idx: number, value: PValue}[][] = [];\n const linkerColumns:ColumnId[] = [];\n\n for (const {selectedSource, fixedAxes} of filterSelectedStates) {\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n primarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n }\n\n const inputs = [\n state.components.grouping,\n state.components.size,\n state.components.shape,\n state.components.tooltipContent,\n state.components.facetBy,\n state.components.label,\n state.components.highlight,\n ];\n for (const input of inputs) {\n for (const {selectedSource, fixedAxes} of input.selectorStates) {\n secondarySources.push(columnOrAxisIdFromString(selectedSource)!);\n secondarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n if (labelsColumnId) {\n secondarySources.push(labelsColumnId);\n }\n }\n }\n\n const data = await store.pFrameProvider.getTableOuterJoin(\n [xId, yId, ...linkerColumns, ...filterColumns],\n secondarySources,\n filters,\n false,\n primarySourcesFixedAxes,\n secondarySourcesFixedAxes\n );\n\n [...primarySources, ...secondarySources].forEach(item => {\n const key = item.toCanonicalString();\n dataByColumns.values[key] = isColumnId(item) ? data.columnsData[key] : data.axesData[key];\n });\n\n dataByColumns.values['key'] = new Array(dataByColumns.values[Object.keys(dataByColumns.values)[0]].length).fill(0).map((_v, idx) => idx);\n\n if (state.components.highlight.selectorStates.length) {\n dataByColumns.values['highlight'] = createHighlightColumn(state.components.highlight.selectorStates, data) as PValue[];\n }\n\n return {byColumns: dataByColumns};\n }\n\n async createChartSettings(store: DataStore, state: ScatterplotUIState): Promise<Record<string, unknown>> {\n const xIdString = state.components.x.selectorStates[0]?.selectedSource;\n const yIdString = state.components.y.selectorStates[0]?.selectedSource;\n const xIdWithQ = xIdString ? columnOrAxisIdFromString(xIdString) : null;\n const yIdWithQ = yIdString ? columnOrAxisIdFromString(yIdString) : null;\n if (!xIdString || !yIdString || !xIdWithQ || !yIdWithQ || (!isColumnId(xIdWithQ) && !isColumnId(yIdWithQ))) {\n throw Error('Empty or invalid required data');\n }\n\n const parentSources = [xIdWithQ, yIdWithQ].filter(isColumnId).map(item => item.toCanonicalString());\n const x = {\n type: 'column',\n value: xIdString,\n label: await getColumnOrAxisLabel(store, xIdString, parentSources),\n };\n const y = {\n type: 'column',\n value: yIdString,\n label: await getColumnOrAxisLabel(store, yIdString, parentSources),\n };\n const keyColumn = {\n type: 'column',\n value: 'key',\n };\n const facetBy = await Promise.all(\n state.components.facetBy.selectorStates.map(async selectorState => ({\n type: 'column',\n value:\n (await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources))?.toCanonicalString() ??\n selectorState.selectedSource,\n }))\n );\n const allGroupingIds = lodash.uniq([\n ...state.components.grouping.selectorStates.map(s => s.selectedSource),\n ...state.components.size.selectorStates.map(s => s.selectedSource),\n ...state.components.shape.selectorStates.map(s => s.selectedSource),\n ]);\n const grouping = await Promise.all(\n allGroupingIds.map(async idString => {\n return {\n type: 'column',\n label: (await getColumnOrAxisLabel(store, idString, parentSources)) || idString,\n value: idString,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, idString, parentSources))?.toCanonicalString() ??\n idString,\n };\n })\n );\n\n const tooltipContent = await Promise.all(\n state.components.tooltipContent.selectorStates.map(async selectorState => {\n const idString = selectorState.selectedSource;\n return {\n type: 'column',\n label: (await getColumnOrAxisLabel(store, idString, parentSources)) || idString,\n value: idString,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, idString, parentSources))?.toCanonicalString() ??\n idString,\n };\n })\n );\n\n let label;\n if (state.components.label.selectorStates.length) {\n const source = state.components.label.selectorStates[0].selectedSource;\n label = {\n type: 'column',\n value: source,\n label: await getColumnOrAxisLabel(store, source, parentSources),\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, source, parentSources))?.toCanonicalString() ??\n source,\n };\n }\n let highlight;\n if (state.components.highlight.selectorStates.length) {\n highlight = {\n type: 'column',\n value: 'highlight'\n }\n }\n return {\n type: 'scatterplot',\n x,\n y,\n keyColumn,\n facetBy,\n grouping,\n label,\n highlight,\n tooltips: {\n show: true,\n content: tooltipContent\n }\n };\n }\n}\n","import canonicalize from 'canonicalize';\nimport lodash from 'lodash';\nimport type {\n ComponentStateFilter,\n ComponentStateSimple,\n DataByColumns,\n InputStateParent,\n} from '../../common';\nimport {PValue} from '../../store';\nimport {ControllerBase, PlotDataAndSettings} from '../ControllerBase';\nimport {ComponentController} from '../ComponentController';\nimport {AxisId, ColumnId} from '../../spec';\nimport {columnOrAxisIdFromString, isColumnId} from '../../spec';\nimport type {DataStore} from '../../store';\nimport {\n checkSourceBySpecForFilters,\n createHighlightColumn,\n getAllLinkerMaps,\n getAxesSpecsFromSources,\n getColumnOrAxisLabel,\n getColumnOrAxisValueLabelsId,\n getFiltersFromStates,\n getLinkerColumnsForSource,\n} from '../../utils';\n\nexport interface ScatterplotUmapUIState extends InputStateParent<'scatterplot-umap'> {\n type: 'scatterplot-umap';\n components: {\n x: ComponentStateSimple;\n y: ComponentStateSimple;\n filters: ComponentStateFilter;\n highlight: ComponentStateFilter;\n tabBy: ComponentStateFilter;\n facetBy: ComponentStateSimple;\n grouping: ComponentStateSimple;\n label: ComponentStateSimple;\n tooltipContent: ComponentStateSimple;\n size: ComponentStateSimple;\n };\n}\n\nexport const InitialScatterplotUmapState: ScatterplotUmapUIState = {\n type: 'scatterplot-umap',\n components: {\n x: {type: 'simple', selectorStates: []},\n y: {type: 'simple', selectorStates: []},\n filters: {type: 'filter', selectorStates: []},\n highlight: {type: 'filter', selectorStates: []},\n tabBy: {type: 'filter', selectorStates: []},\n facetBy: {type: 'simple', selectorStates: []},\n grouping: {type: 'simple', selectorStates: []},\n label: {type: 'simple', selectorStates: []},\n tooltipContent: {type: 'simple', selectorStates: []},\n size: {type: 'simple', selectorStates: []},\n },\n dividedAxes: {},\n};\n\nexport class ScatterplotUmapStateController extends ControllerBase<ScatterplotUmapUIState> {\n dataInputs = ['x', 'y'];\n\n constructor() {\n super(\n {\n x: new ComponentController<ScatterplotUmapUIState, 'x'>({\n componentName: 'x',\n allowedTypes: ['Int', 'Long', 'Double' , 'Float'],\n parentComponents: ['y'],\n strictlyDependsOnParents: false,\n settings: {\n isDataComponent: true,\n required: true,\n axesAllowed: true,\n columnsAllowed: true,\n },\n }),\n y: new ComponentController<ScatterplotUmapUIState, 'y'>({\n componentName: 'y',\n allowedTypes: ['Int', 'Long', 'Double', 'Float'],\n parentComponents: ['x'],\n strictlyDependsOnParents: false,\n settings: {\n isDataComponent: true,\n required: true,\n axesAllowed: true,\n columnsAllowed: true,\n },\n }),\n facetBy: new ComponentController<ScatterplotUmapUIState, 'facetBy'>({\n componentName: 'facetBy',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n }),\n grouping: new ComponentController<ScatterplotUmapUIState, 'grouping'>({\n componentName: 'grouping',\n allowedTypes: ['String', 'Int', 'Long', 'Float', 'Double'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n multipleSelectors: true,\n },\n }),\n tooltipContent: new ComponentController<ScatterplotUmapUIState, 'tooltipContent'>({\n componentName: 'tooltipContent',\n allowedTypes: ['String', 'Int', 'Long', 'Float', 'Double'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n multipleSelectors: true,\n },\n }),\n label: new ComponentController<ScatterplotUmapUIState, 'label'>({\n componentName: 'label',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n columnsAllowed: true,\n multipleSelectors: false,\n },\n }),\n size: new ComponentController<ScatterplotUmapUIState, 'size'>({\n componentName: 'size',\n allowedTypes: ['Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n },\n }),\n },\n {\n filters: new ComponentController<ScatterplotUmapUIState, 'filters'>({\n componentName: 'filters',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n checkSourceBySpec: checkSourceBySpecForFilters\n }),\n tabBy: new ComponentController<ScatterplotUmapUIState, 'tabBy'>({\n componentName: 'tabBy',\n allowedTypes: ['String', 'Int'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n },\n }),\n highlight: new ComponentController<ScatterplotUmapUIState, 'highlight'>({\n componentName: 'highlight',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Float'],\n strictlyDependsOnParents: true,\n parentComponents: ['x', 'y'],\n dependsOn: ['x', 'y'],\n settings: {\n axesAllowed: true,\n columnsAllowed: true,\n multipleSelectors: true,\n },\n checkSourceBySpec: checkSourceBySpecForFilters\n }),\n }\n );\n }\n\n async getMustBeConsumedAxes(store: DataStore, state: ScatterplotUmapUIState):Promise<Set<string>> {\n if (!state.components.x.selectorStates.length || !state.components.y.selectorStates.length) {\n return new Set<string>();\n }\n const sourceIdX = state.components.x.selectorStates[0].selectedSource;\n const sourceIdY = state.components.y.selectorStates[0].selectedSource;\n const specX = await store.pFrameProvider.getColumnSpecById(columnOrAxisIdFromString(sourceIdX));\n const specY = await store.pFrameProvider.getColumnSpecById(columnOrAxisIdFromString(sourceIdY));\n if (!specX || !specY) {\n return new Set<string>();\n }\n const axesX = specX.axesSpec.map((s) => AxisId.fromAxisSpec(s).toCanonicalString());\n const axesY = specY.axesSpec.map((s) => AxisId.fromAxisSpec(s).toCanonicalString());\n const hangingX = axesX.filter(axisKey => !axesY.some(id => id === axisKey));\n const hangingY = axesY.filter(axisKey => !axesX.some(id => id === axisKey));\n\n return new Set<string>([...hangingX, ...hangingY])\n }\n\n async createDataByColumns(store: DataStore, state: ScatterplotUmapUIState): Promise<PlotDataAndSettings['data']> {\n const xColumnIdString = state.components.x.selectorStates[0]?.selectedSource;\n const yColumnIdString = state.components.y.selectorStates[0]?.selectedSource;\n if (!xColumnIdString || !yColumnIdString) {\n throw Error('X or Y column is not valid');\n }\n const xId = columnOrAxisIdFromString(xColumnIdString);\n const yId = columnOrAxisIdFromString(yColumnIdString);\n if (!xId || !yId) {\n throw Error('X or Y column is not valid');\n }\n const dataByColumns: DataByColumns = {\n type: 'columns',\n id: canonicalize(state.components) ?? '',\n values: {},\n };\n\n const {linkerColumnsMap, compositeLinkerMap} = await getAllLinkerMaps(store);\n\n const filterSelectedStates = [\n ...state.components.filters.selectorStates,\n ...state.components.tabBy.selectorStates\n ]\n // filters for column/axes data requests\n const filters = getFiltersFromStates(filterSelectedStates);\n const filterColumns = filterSelectedStates.map(s => columnOrAxisIdFromString(s.selectedSource)).filter(isColumnId);\n\n const parentSources = [xId, yId].filter(isColumnId).map(item => item.toCanonicalString());\n if (parentSources.length === 0) {\n throw Error('One of X and Y should be a column');\n }\n const parentAxesList = await getAxesSpecsFromSources(store, parentSources);\n\n const primarySources = [xId, yId, ...filterColumns];\n const secondarySources: (ColumnId | AxisId)[] = [];\n const primarySourcesFixedAxes:{idx: number, value: PValue}[][] = [[], []];\n const secondarySourcesFixedAxes:{idx: number, value: PValue}[][] = [];\n const linkerColumns:ColumnId[] = [];\n\n for (const {selectedSource, fixedAxes} of filterSelectedStates) {\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n primarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n }\n\n const inputs = [\n state.components.grouping,\n state.components.facetBy,\n state.components.tooltipContent,\n state.components.label,\n state.components.highlight,\n state.components.size,\n ];\n for (const input of inputs) {\n for (const {selectedSource, fixedAxes} of input.selectorStates) {\n secondarySources.push(columnOrAxisIdFromString(selectedSource)!);\n secondarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n if (labelsColumnId) {\n secondarySources.push(labelsColumnId);\n }\n }\n }\n\n const data = await store.pFrameProvider.getTableOuterJoin(\n [xId, yId, ...linkerColumns, ...filterColumns],\n secondarySources,\n filters,\n false,\n primarySourcesFixedAxes,\n secondarySourcesFixedAxes\n );\n\n [...primarySources, ...secondarySources].forEach(item => {\n const key = item.toCanonicalString();\n dataByColumns.values[key] = isColumnId(item) ? data.columnsData[key] : data.axesData[key];\n });\n\n if (state.components.highlight.selectorStates.length) {\n dataByColumns.values['highlight'] = createHighlightColumn(state.components.highlight.selectorStates, data) as PValue[];\n }\n\n return {\n byColumns: dataByColumns,\n axesData: data.axesData\n };\n }\n\n async createChartSettings(store: DataStore, state: ScatterplotUmapUIState): Promise<Record<string, unknown>> {\n const xIdString = state.components.x.selectorStates[0]?.selectedSource;\n const yIdString = state.components.y.selectorStates[0]?.selectedSource;\n const xIdWithQ = xIdString ? columnOrAxisIdFromString(xIdString) : null;\n const yIdWithQ = yIdString ? columnOrAxisIdFromString(yIdString) : null;\n if (!xIdString || !yIdString || !xIdWithQ || !yIdWithQ || (!isColumnId(xIdWithQ) && !isColumnId(yIdWithQ))) {\n throw Error('Empty or invalid required data');\n }\n\n const parentSources = [xIdWithQ, yIdWithQ].filter(isColumnId).map(item => item.toCanonicalString());\n const x = {\n type: 'column',\n value: xIdString,\n label: await getColumnOrAxisLabel(store, xIdString, parentSources),\n };\n const y = {\n type: 'column',\n value: yIdString,\n label: await getColumnOrAxisLabel(store, yIdString, parentSources),\n };\n const keyColumn = {\n type: 'column',\n value: 'key',\n };\n const facetBy = await Promise.all(\n state.components.facetBy.selectorStates.map(async selectorState => ({\n type: 'column',\n value:\n (await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources))?.toCanonicalString() ??\n selectorState.selectedSource,\n }))\n );\n const allGroupingIds = lodash.uniq([\n ...state.components.grouping.selectorStates.map(s => s.selectedSource),\n ...state.components.size.selectorStates.map(s => s.selectedSource),\n ]);\n const grouping = await Promise.all(\n allGroupingIds.map(async idString => {\n return {\n type: 'column',\n label: (await getColumnOrAxisLabel(store, idString, parentSources)) || idString,\n value: idString,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, idString, parentSources))?.toCanonicalString() ??\n idString,\n };\n })\n );\n\n const tooltipContent = await Promise.all(\n state.components.tooltipContent.selectorStates.map(async selectorState => {\n const idString = selectorState.selectedSource;\n return {\n type: 'column',\n label: (await getColumnOrAxisLabel(store, idString, parentSources)) || idString,\n value: idString,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, idString, parentSources))?.toCanonicalString() ??\n idString,\n };\n })\n );\n\n let label;\n if (state.components.label.selectorStates.length) {\n const source = state.components.label.selectorStates[0].selectedSource;\n label = {\n type: 'column',\n value: source,\n label: await getColumnOrAxisLabel(store, source, parentSources),\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, source, parentSources))?.toCanonicalString() ??\n source,\n };\n }\n\n let highlight;\n if (state.components.highlight.selectorStates.length) {\n highlight = {\n type: 'column',\n value: 'highlight'\n }\n }\n return {\n type: 'scatterplot-umap',\n x,\n y,\n keyColumn,\n facetBy,\n grouping,\n label,\n highlight,\n tooltips: {\n show: true,\n content: tooltipContent\n }\n };\n }\n}\n","import {AxisSpec, PColumnSpec} from '@milaboratories/pl-model-common';\nimport canonicalize from 'canonicalize';\nimport type {\n ComponentStateFilter,\n ComponentStateSimple,\n DataByColumns,\n InputState,\n InputStateParent,\n} from '../../common';\nimport {ControllerBase, PlotDataAndSettings} from '../ControllerBase';\nimport {ComponentController} from '../ComponentController';\nimport type {AxisId, ColumnId} from '../../spec';\nimport {columnOrAxisIdFromString, isColumnId} from '../../spec';\nimport type {DataStore, PValue} from '../../store';\nimport {\n getAllLinkerMaps,\n getAxesSpecsFromSources,\n getColumnOrAxisLabel,\n getColumnOrAxisValueLabelsId,\n getFiltersFromStates, getLinkerColumnsForSource,\n} from '../../utils';\n\nconst TREE_ID_AXIS_NAME = 'pl7.app/dendrogram/treeId';\nconst NODE_ID_AXIS_NAME = 'pl7.app/dendrogram/nodeId';\nconst PATIENT_ID_AXIS_NAME = 'pl7.app/dendrogram/donorId';\n\nconst COLUMN_NODE_ID = 'id';\n\nexport interface DendroUIState extends InputStateParent<'dendro'> {\n components: {\n value: ComponentStateSimple;\n\n height: ComponentStateSimple;\n labels: ComponentStateSimple;\n\n tableContent: ComponentStateSimple;\n\n nodeColor: ComponentStateSimple;\n nodeShape: ComponentStateSimple;\n nodeSize: ComponentStateSimple;\n lineColor: ComponentStateSimple;\n\n heatmapForSequence: ComponentStateSimple;\n\n heatmapAnnotation: ComponentStateSimple;\n heatmapAxis: ComponentStateSimple;\n heatmapGroup: ComponentStateSimple;\n\n filters: ComponentStateFilter;\n tabBy: ComponentStateFilter;\n facetBy: ComponentStateSimple;\n };\n}\n\nexport const InitialDendroState: DendroUIState = {\n type: 'dendro',\n components: {\n value: {type: 'simple', selectorStates: []},\n\n height: {type: 'simple', selectorStates: []},\n labels: {type: 'simple', selectorStates: []},\n\n tableContent: {type: 'simple', selectorStates: []},\n\n nodeColor: {type: 'simple', selectorStates: []},\n nodeShape: {type: 'simple', selectorStates: []},\n nodeSize: {type: 'simple', selectorStates: []},\n lineColor: {type: 'simple', selectorStates: []},\n\n heatmapAnnotation: {type: 'simple', selectorStates: []},\n\n heatmapForSequence: {type: 'simple', selectorStates: []},\n filters: {type: 'filter', selectorStates: []},\n tabBy: {type: 'filter', selectorStates: []},\n facetBy: {type: 'simple', selectorStates: []},\n\n heatmapAxis: {type: 'simple', selectorStates: []},\n heatmapGroup: {type: 'simple', selectorStates: []},\n },\n dividedAxes: {},\n};\n\nexport function isDendroState(state: InputState): state is DendroUIState {\n return state.type == 'dendro';\n}\n\nexport class DendroStateController extends ControllerBase<DendroUIState> {\n readonly ignoredOptionIdNames = [NODE_ID_AXIS_NAME];\n\n constructor() {\n super(\n {\n value: new ComponentController<DendroUIState, 'value'>({\n componentName: 'value',\n allowedTypes: ['Int', 'Long'],\n annotations: {'pl7.app/dendrogram/isTopology': 'true'},\n settings: {\n isDataComponent: true,\n columnsAllowed: true,\n required: true,\n dimensionConsumer: true,\n columnsWithExtraAxesAllowed: false\n },\n }),\n height: new ComponentController<DendroUIState, 'height'>({\n componentName: 'height',\n allowedTypes: ['Int', 'Long', 'Double', 'Float'],\n annotations: {'pl7.app/dendrogram/isDistance': 'true'},\n parentComponents: ['value'],\n strictlyDependsOnParents: true,\n settings: {\n columnsAllowed: true,\n axesAllowed: false,\n dimensionConsumer: true,\n columnsWithExtraAxesAllowed: false\n },\n }),\n labels: new ComponentController<DendroUIState, 'labels'>({\n componentName: 'labels',\n allowedTypes: ['Int', 'String', 'Long'],\n parentComponents: ['value'],\n strictlyDependsOnParents: false,\n settings: {\n columnsAllowed: true,\n axesAllowed: false,\n columnsWithExtraAxesAllowed: false\n },\n }),\n tableContent: new ComponentController<DendroUIState, 'tableContent'>({\n componentName: 'tableContent',\n allowedTypes: ['Int', 'String', 'Long', 'Double', 'Float'],\n parentComponents: ['value'],\n strictlyDependsOnParents: false,\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n multipleSelectors: true,\n columnsWithExtraAxesAllowed: false\n },\n }),\n nodeShape: new ComponentController<DendroUIState, 'nodeShape'>({\n componentName: 'nodeShape',\n allowedTypes: ['Int', 'String', 'Long'],\n parentComponents: ['value'],\n strictlyDependsOnParents: false,\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n columnsWithExtraAxesAllowed: false\n },\n }),\n nodeSize: new ComponentController<DendroUIState, 'nodeSize'>({\n componentName: 'nodeSize',\n allowedTypes: ['Double', 'Int', 'String', 'Long'],\n parentComponents: ['value'],\n strictlyDependsOnParents: false,\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n columnsWithExtraAxesAllowed: false\n },\n }),\n nodeColor: new ComponentController<DendroUIState, 'nodeColor'>({\n componentName: 'nodeColor',\n allowedTypes: ['Double', 'Int', 'String', 'Long'],\n parentComponents: ['value'],\n strictlyDependsOnParents: false,\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n columnsWithExtraAxesAllowed: false\n },\n }),\n lineColor: new ComponentController<DendroUIState, 'lineColor'>({\n componentName: 'lineColor',\n allowedTypes: ['Double', 'Int', 'String', 'Long'],\n parentComponents: ['value'],\n strictlyDependsOnParents: false,\n settings: {\n columnsAllowed: true,\n axesAllowed: false,\n columnsWithExtraAxesAllowed: false\n },\n }),\n heatmapForSequence: new ComponentController<DendroUIState, 'heatmapForSequence'>({\n componentName: 'heatmapForSequence',\n allowedTypes: ['String'],\n annotations: {'pl7.app/type': 'sequence'},\n parentComponents: ['value'],\n strictlyDependsOnParents: false,\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n columnsWithExtraAxesAllowed: false\n },\n }),\n heatmapAnnotation: new ComponentController<DendroUIState, 'heatmapAnnotation'>({\n componentName: 'heatmapAnnotation',\n allowedTypes: ['Double', 'Int', 'Long', 'Float', 'String'],\n parentComponents: ['value'],\n strictlyDependsOnParents: false,\n settings: {\n isDataComponent: true,\n columnsAllowed: true,\n axesAllowed: false,\n columnsWithExtraAxesAllowed: false\n },\n }),\n facetBy: new ComponentController<DendroUIState, 'facetBy'>({\n componentName: 'facetBy',\n allowedTypes: ['String', 'Int', 'Long'],\n parentComponents: ['value'],\n strictlyDependsOnParents: true,\n settings: {\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: false,\n columnsWithExtraAxesAllowed: false\n },\n }),\n heatmapAxis: new ComponentController<DendroUIState, 'heatmapAxis'>({\n componentName: 'heatmapAxis',\n allowedTypes: ['String', 'Int', 'Long'],\n parentComponents: ['heatmapAnnotation'],\n settings: {\n dimensionConsumer: true,\n axesAllowed: true,\n columnsAllowed: false,\n columnsWithExtraAxesAllowed: false\n },\n }),\n heatmapGroup: new ComponentController<DendroUIState, 'heatmapGroup'>({\n componentName: 'heatmapGroup',\n allowedTypes: ['String', 'Int', 'Long'],\n parentComponents: ['heatmapAnnotation'],\n settings: {\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: false,\n columnsWithExtraAxesAllowed: false\n },\n }),\n },\n {\n filters: new ComponentController<DendroUIState, 'filters'>({\n componentName: 'filters',\n allowedTypes: ['String', 'Int', 'Long'],\n parentComponents: ['value', 'heatmapAnnotation'],\n strictlyDependsOnParents: false,\n settings: {\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: false,\n columnsWithExtraAxesAllowed: false\n },\n }),\n tabBy: new ComponentController<DendroUIState, 'tabBy'>({\n componentName: 'tabBy',\n allowedTypes: ['String', 'Int', 'Long'],\n parentComponents: ['value', 'heatmapAnnotation'],\n strictlyDependsOnParents: false,\n settings: {\n dimensionConsumer: true,\n axesAllowed: true,\n columnsAllowed: false,\n columnsWithExtraAxesAllowed: false\n },\n }),\n }\n );\n }\n\n readyDataInputs(state: DendroUIState): boolean {\n return state.components.value.selectorStates.length > 0;\n }\n\n async createTableData(\n store: DataStore,\n state: DendroUIState\n ): Promise<\n Record<\n string,\n {\n label: string;\n spec: PColumnSpec | AxisSpec;\n data: PValue[];\n }\n >\n > {\n const result: Record<string, {label: string; spec: PColumnSpec | AxisSpec; data: PValue[]}> = {};\n\n const valueColumnIdString = state.components.value.selectorStates[0]?.selectedSource;\n const valueColumnId = columnOrAxisIdFromString(valueColumnIdString);\n if (!valueColumnIdString || !isColumnId(valueColumnId)) {\n throw Error('Value column is not valid');\n }\n\n const {linkerColumnsMap, compositeLinkerMap} = await getAllLinkerMaps(store);\n\n // filters for column/axes data requests\n const filters = getFiltersFromStates([\n ...state.components.filters.selectorStates,\n ...state.components.tabBy.selectorStates\n ]);\n const filterColumns = [\n ...state.components.filters.selectorStates.map(s => columnOrAxisIdFromString(s.selectedSource)),\n ...state.components.tabBy.selectorStates.map(s => columnOrAxisIdFromString(s.selectedSource)),\n ].filter(isColumnId);\n\n const parentSources = [valueColumnIdString];\n const parentAxesList = await getAxesSpecsFromSources(store, parentSources);\n\n const primarySources: (ColumnId | AxisId)[] = [];\n const secondarySources: (ColumnId | AxisId)[] = [];\n const linkerColumns:ColumnId[] = [];\n\n const primaryInputs = [state.components.value];\n const secondaryInputs = [\n state.components.tableContent,\n // next components can content data mapped on tree\n state.components.labels,\n state.components.nodeColor,\n state.components.nodeSize,\n state.components.nodeShape,\n state.components.lineColor,\n ];\n\n const idMap: Record<string, string> = {};\n\n for (const primaryInput of primaryInputs) {\n for (const {selectedSource, fixedAxes} of primaryInput.selectorStates) {\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n const id = labelsColumnId ?? columnOrAxisIdFromString(selectedSource);\n idMap[id.toCanonicalString()] = selectedSource;\n primarySources.push(id);\n }\n }\n for (const secondaryInput of secondaryInputs) {\n for (const {selectedSource, fixedAxes} of secondaryInput.selectorStates) {\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerColumnsMap,\n compositeLinkerMap,\n parentAxesList,\n selectedSource,\n fixedAxes\n ));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n const id = labelsColumnId ?? columnOrAxisIdFromString(selectedSource);\n idMap[selectedSource] = id.toCanonicalString();\n secondarySources.push(id);\n }\n }\n\n // use outer join between primary columns - inner join can remove useful points in tree and annotations\n const data = await store.pFrameProvider.getTableOuterJoin(\n [...primarySources, ...filterColumns, ...linkerColumns],\n secondarySources,\n filters,\n false\n );\n\n for (const source of [...primarySources, ...secondarySources]) {\n const responseKey = source.toCanonicalString();\n const resultKey = idMap[source.toCanonicalString()];\n result[resultKey] = {\n data: isColumnId(source) ? data.columnsData[responseKey] : data.axesData[responseKey],\n spec: isColumnId(source) ? data.columnSpecs[responseKey] : data.axesSpecs[responseKey],\n label: await getColumnOrAxisLabel(store, resultKey, parentSources),\n };\n }\n\n const nodeIdAxis = Object.keys(data.axesData).find(\n axisIdStr => columnOrAxisIdFromString(axisIdStr)?.name === NODE_ID_AXIS_NAME\n );\n if (!nodeIdAxis) {\n console.warn('Missed node id axis in data column');\n } else {\n result[COLUMN_NODE_ID] = {\n data: data.axesData[nodeIdAxis],\n spec: {kind: 'PColumn', valueType: 'Int', name: 'Node id'} as PColumnSpec,\n label: 'Node id',\n };\n }\n return result;\n }\n\n async createDataByColumns(store: DataStore, state: DendroUIState): Promise<PlotDataAndSettings['data']> {\n const valueColumnIdString = state.components.value.selectorStates[0]?.selectedSource;\n const annotationColumnIdString = state.components.heatmapAnnotation.selectorStates[0]?.selectedSource;\n const valueColumnId = columnOrAxisIdFromString(valueColumnIdString);\n const annotationColumnId = annotationColumnIdString ? columnOrAxisIdFromString(annotationColumnIdString) : null;\n\n if (!valueColumnIdString || !isColumnId(valueColumnId)) {\n throw Error('Value column is not valid');\n }\n const dataByColumns: DataByColumns = {\n type: 'columns',\n id: canonicalize(state.components) ?? '',\n values: {},\n };\n\n const filterSelectedStates = [\n ...state.components.filters.selectorStates,\n ...state.components.tabBy.selectorStates\n ]\n // filters for column/axes data requests\n const filters = getFiltersFromStates(filterSelectedStates);\n const filterColumns = filterSelectedStates.map(s => columnOrAxisIdFromString(s.selectedSource)).filter(isColumnId);\n\n\n const parentSources = [valueColumnId, annotationColumnId]\n .filter(isColumnId)\n .map(item => item.toCanonicalString());\n\n const primarySources: (ColumnId | AxisId)[] = [];\n const secondarySources: (ColumnId | AxisId)[] = [];\n const primarySourcesFixedAxes:{idx: number, value: PValue}[][] = [];\n const secondarySourcesFixedAxes:{idx: number, value: PValue}[][] = [];\n\n const primaryInputs = [\n state.components.value,\n state.components.height,\n state.components.labels,\n state.components.nodeColor,\n state.components.nodeSize,\n state.components.nodeShape,\n state.components.lineColor,\n state.components.heatmapAnnotation,\n state.components.heatmapForSequence,\n ];\n const secondaryInputs = [\n state.components.facetBy,\n state.components.heatmapAxis,\n state.components.heatmapGroup,\n state.components.tableContent,\n ];\n for (const primaryInput of primaryInputs) {\n for (const {selectedSource, fixedAxes} of primaryInput.selectorStates) {\n primarySources.push(columnOrAxisIdFromString(selectedSource));\n primarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n if (labelsColumnId) {\n primarySources.push(labelsColumnId);\n }\n }\n }\n filterSelectedStates.forEach(({fixedAxes}) => {\n primarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n });\n for (const secondaryInput of secondaryInputs) {\n for (const {selectedSource, fixedAxes} of secondaryInput.selectorStates) {\n secondarySources.push(columnOrAxisIdFromString(selectedSource));\n secondarySourcesFixedAxes.push(\n (fixedAxes ?? []).map(({axisIdx, axisValue}) => ({idx: axisIdx, value: axisValue as PValue}))\n );\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n if (labelsColumnId) {\n secondarySources.push(labelsColumnId);\n }\n }\n }\n\n // use outer join between primary columns - inner join can remove useful points in tree and annotations\n const data = await store.pFrameProvider.getTableOuterJoin(\n [...primarySources, ...filterColumns],\n secondarySources,\n filters,\n false,\n primarySourcesFixedAxes,\n secondarySourcesFixedAxes\n );\n\n [...primarySources, ...secondarySources].forEach(item => {\n const key = item.toCanonicalString();\n const columnData = isColumnId(item) ? data.columnsData[key] : data.axesData[key];\n dataByColumns.values[key] = [];\n dataByColumns.values[key] = columnData;\n });\n\n const nodeIdAxis = Object.keys(data.axesData).find(\n axisIdStr => columnOrAxisIdFromString(axisIdStr)?.name === NODE_ID_AXIS_NAME\n );\n\n if (!nodeIdAxis) {\n console.warn('Missed node id axis in data column');\n } else {\n dataByColumns.values[COLUMN_NODE_ID] = data.axesData[nodeIdAxis];\n }\n\n return {byColumns: dataByColumns};\n }\n\n async createChartSettings(store: DataStore, state: DendroUIState): Promise<Record<string, unknown>> {\n const dataColumnIdString = state.components.value.selectorStates[0]?.selectedSource;\n const dataColumnId = columnOrAxisIdFromString(dataColumnIdString);\n if (!dataColumnIdString || !isColumnId(dataColumnId)) {\n throw Error('Data column is not valid');\n }\n\n const parentSourcesTree = [dataColumnIdString];\n\n const id = {type: 'column', value: COLUMN_NODE_ID};\n const parentId = {type: 'column', value: dataColumnIdString};\n const height = state.components.height.selectorStates.length\n ? {type: 'column', value: state.components.height.selectorStates[0].selectedSource}\n : undefined;\n const labels = state.components.labels.selectorStates.length\n ? {type: 'column', value: state.components.labels.selectorStates[0].selectedSource}\n : undefined;\n const aes: {\n nodeColor?: {columnName: {type: 'column'; value: string; label: string}};\n nodeShape?: {columnName: {type: 'column'; value: string; label: string}};\n nodeSize?: {columnName: {type: 'column'; value: string; label: string}};\n lineColor?: {columnName: {type: 'column'; value: string; label: string}};\n } = {};\n if (state.components.nodeColor.selectorStates.length) {\n const idString = state.components.nodeColor.selectorStates[0].selectedSource;\n aes.nodeColor = {\n columnName: {\n type: 'column',\n value: idString,\n label: await getColumnOrAxisLabel(store, idString, parentSourcesTree),\n },\n };\n }\n if (state.components.nodeShape.selectorStates.length) {\n const idString = state.components.nodeShape.selectorStates[0].selectedSource;\n aes.nodeShape = {\n columnName: {\n type: 'column',\n value: idString,\n label: await getColumnOrAxisLabel(store, idString, parentSourcesTree),\n },\n };\n }\n if (state.components.nodeSize.selectorStates.length) {\n const idString = state.components.nodeSize.selectorStates[0].selectedSource;\n aes.nodeSize = {\n columnName: {\n type: 'column',\n value: idString,\n label: await getColumnOrAxisLabel(store, idString, parentSourcesTree),\n },\n };\n }\n if (state.components.lineColor.selectorStates.length) {\n const idString = state.components.lineColor.selectorStates[0].selectedSource;\n aes.lineColor = {\n columnName: {\n type: 'column',\n value: idString,\n label: await getColumnOrAxisLabel(store, idString, parentSourcesTree),\n },\n };\n }\n\n let heatmapAnnotation;\n let heatmapAxis;\n let heatmapGroup;\n\n // heatmap with user axis, with not sequence as value\n if (\n state.components.heatmapAnnotation.selectorStates.length &&\n state.components.heatmapAxis.selectorStates.length\n ) {\n const annotationSource = state.components.heatmapAnnotation.selectorStates[0].selectedSource;\n heatmapAnnotation = {\n type: 'column',\n value: annotationSource,\n label: await getColumnOrAxisLabel(store, annotationSource, []),\n valueLabels: (await getColumnOrAxisValueLabelsId(store, annotationSource, []))?.toCanonicalString(),\n };\n const axisSource = state.components.heatmapAxis.selectorStates[0].selectedSource;\n heatmapAxis = {\n type: 'column',\n value: axisSource,\n label: await getColumnOrAxisLabel(store, axisSource, [annotationSource]),\n valueLabels: (\n await getColumnOrAxisValueLabelsId(store, axisSource, [annotationSource])\n )?.toCanonicalString(),\n };\n heatmapGroup = await Promise.all(\n state.components.heatmapGroup.selectorStates.map(async selectorState => {\n return {\n type: 'column',\n value: selectorState.selectedSource,\n label: await getColumnOrAxisLabel(store, selectorState.selectedSource, [annotationSource]),\n valueLabels: (\n await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, [annotationSource])\n )?.toCanonicalString(),\n };\n })\n );\n\n // heatmap containing sequence, as axis using order of sequence element\n } else if (state.components.heatmapForSequence.selectorStates.length) {\n const annotationSource = state.components.heatmapForSequence.selectorStates[0].selectedSource;\n heatmapAnnotation = {\n type: 'column',\n value: annotationSource,\n label: await getColumnOrAxisLabel(store, annotationSource, []),\n };\n }\n\n return {\n type: 'dendro',\n id,\n parentId,\n height,\n labels,\n aes,\n heatmapAnnotation,\n heatmapAxis,\n heatmapGroup,\n };\n }\n}\n","import {AxisId, ColumnId, isColumnId} from '../spec';\nimport type {PValue} from '../store';\nimport lodash from 'lodash';\nimport type {\n AxisSpec,\n CalculateTableDataRequest,\n FindColumnsRequest,\n FindColumnsResponse,\n PColumnSpec,\n AxisId as PFrameAxisId,\n PFrameDriver,\n PFrameHandle,\n PObjectId,\n PTableRecordSingleValueFilterV2,\n PTableVector,\n UniqueValuesRequest,\n ValueType,\n FullPTableColumnData,\n PColumnIdAndSpec,\n} from '@milaboratories/pl-model-common';\nimport {pTableValue} from '@milaboratories/pl-model-common';\n\nexport type TableOuterJoinResult = {\n axesData: Record<string, PValue[]>;\n columnsData: Record<string, PValue[]>;\n columnSpecs: Record<string, PColumnSpec>;\n axesSpecs: Record<string, AxisSpec>;\n}\nconst UNIQUE_VALUES_LIMIT = 1000000;\n\nfunction convertColumnData(type: ValueType, response: PTableVector): PValue[] {\n if (type === 'String') {\n return response.data as PValue[];\n }\n const res:PValue[] = new Array(response.data.length);\n for (let i = 0; i < response.data.length; i++) {\n res[i] = pTableValue(response, i, {absent: null, na: null}) as PValue;\n }\n return res;\n}\n\nconst debug = false;\nconst LONG_REQUEST = 100;\n\nif (debug) {\n console.log('debug!');\n}\n\nexport class ColumnsProvider {\n pframeHandle: PFrameHandle;\n pframeDriver: PFrameDriver;\n\n constructor(pframeHandle: PFrameHandle, pframeDriver: PFrameDriver) {\n this.pframeHandle = pframeHandle;\n this.pframeDriver = pframeDriver;\n }\n\n async isColumnExisted(id: ColumnId) {\n const spec = await this.getColumnSpecById(id);\n return spec ? true : false;\n }\n\n async getSingleColumnData(id: ColumnId, filters: PTableRecordSingleValueFilterV2[] = []) {\n if (!(await this.isColumnExisted(id))) {\n return {\n axesData: {},\n data: [],\n };\n }\n try {\n const start = Date.now();\n const response: FullPTableColumnData[] = await this.pframeDriver.calculateTableData(this.pframeHandle, {\n src: {\n type: 'column',\n column: id.name as PObjectId,\n },\n filters,\n sorting: [],\n } as CalculateTableDataRequest<PObjectId>);\n if (debug) {\n const time = Date.now() - start;\n if (time > LONG_REQUEST) console.log('getSingleColumnData', time);\n }\n const axes = response.filter(item => item.spec.type === 'axis');\n const columns = response.filter(item => item.spec.type === 'column');\n return {\n axesData: axes.reduce((res: Record<string, PValue[]>, item) => {\n const id = AxisId.fromAxisSpec(item.spec.spec as AxisSpec);\n res[id.toCanonicalString()] = convertColumnData(id.type, item.data);\n return res;\n }, {}),\n data: columns.length ? convertColumnData(id.type, columns[0].data) : [],\n };\n } catch (err) {\n console.error('PFrame: calculateTableData error');\n throw err;\n }\n }\n\n async getColumnUniqueValues(\n id: ColumnId,\n limit = UNIQUE_VALUES_LIMIT,\n filters: PTableRecordSingleValueFilterV2[] = []\n ) {\n if (!(await this.isColumnExisted(id))) {\n return {values: [], overflow: false};\n }\n const request: UniqueValuesRequest = {\n columnId: id.name as PObjectId,\n filters,\n limit,\n };\n try {\n const start = Date.now();\n const response = await this.pframeDriver.getUniqueValues(this.pframeHandle, request);\n let overflow = false;\n if (response.overflow) {\n overflow = true;\n console.warn(`More than ${limit} values for ${id.name} column`);\n }\n if (debug) {\n const time = Date.now() - start;\n if (time > LONG_REQUEST)\n console.log('getColumnUniqueValues', time, id.type, `${response.values.data.length} items`);\n }\n return {\n values: Array.from(response.values.data as ArrayLike<unknown>).map(String),\n overflow\n };\n } catch (err) {\n console.error('PFrame: getUniqueValues for column error');\n throw err;\n }\n }\n\n async getAxisUniqueValues(\n axisId: AxisId,\n parents: ColumnId[],\n limit = UNIQUE_VALUES_LIMIT,\n filters: PTableRecordSingleValueFilterV2[] = []\n ) {\n const columnParents = parents.filter(isColumnId);\n\n const specs: (PColumnSpec | null)[] = await Promise.all(columnParents.map(c => this.getColumnSpecById(c)));\n const axisIdStr = axisId.toCanonicalString();\n // realParents - parent columns that has axisId in its spec\n const realParents = columnParents.filter((c, idx) => {\n const columnSpec = specs[idx];\n return (\n columnSpec !== null &&\n columnSpec.axesSpec.some(axisSpec => AxisId.fromAxisSpec(axisSpec).toCanonicalString() === axisIdStr)\n );\n });\n if (realParents.length === 0) {\n return {values: [], overflow: false};\n }\n try {\n const start = Date.now();\n const responses = await Promise.all(\n realParents.map(p =>\n this.pframeDriver.getUniqueValues(this.pframeHandle, {\n columnId: p.name as PObjectId,\n axis: axisId.toPFrameId(),\n filters,\n limit,\n })\n )\n );\n let overflow = false;\n responses.forEach((response, idx) => {\n if (response.overflow) {\n overflow = true;\n console.warn(`More than ${limit} values for ${realParents[idx].name} column`);\n }\n })\n if (debug) {\n const time = Date.now() - start;\n if (time > LONG_REQUEST) console.log('getAxisUniqueValues', time);\n }\n return {\n values: lodash.uniq(\n lodash.flatten(responses.map(r => {\n return Array.from(r.values.data as ArrayLike<unknown>).map(String);\n })) as string[]\n ),\n overflow\n };\n } catch (err) {\n console.error('PFrame: getUniqueValues for axis error', err);\n throw err;\n }\n }\n\n async getTableOuterJoin(\n primaryIds: (ColumnId | AxisId)[],\n secondaryIds: (ColumnId | AxisId)[],\n filters: PTableRecordSingleValueFilterV2[] = [],\n primaryInnerJoin = true,\n primarySourcesFixedAxes:{idx:number, value:PValue}[][] = [],\n secondarySourcesFixedAxes:{idx:number, value:PValue}[][] = []\n ): Promise<TableOuterJoinResult> {\n const primaryColumns = primaryIds.filter(isColumnId);\n const secondaryColumns = secondaryIds.filter(isColumnId);\n const request = {\n src: {\n type: 'outer',\n primary: {\n type: primaryInnerJoin ? 'inner' : 'full',\n entries: primaryColumns.map((item, idx) => {\n const axisFilters = primarySourcesFixedAxes[idx]?.map(v => ({\n type: 'constant',\n axisIndex: v.idx,\n constant: v.value\n })).filter((v) => v.constant !== undefined);\n return axisFilters?.length\n ? {\n type: 'slicedColumn',\n newId: item.name,\n column: item.name as PObjectId,\n axisFilters\n } : {\n type: 'column',\n column: item.name as PObjectId,\n }\n })\n },\n secondary: secondaryColumns.map((item, idx) => {\n const axisFilters = secondarySourcesFixedAxes[idx]?.map(v => ({\n type: 'constant',\n axisIndex: v.idx,\n constant: v.value\n })).filter((v) => v.constant !== undefined);\n return axisFilters?.length\n ? {\n type: 'slicedColumn',\n newId: item.name,\n column: item.name as PObjectId,\n axisFilters\n } : {\n type: 'column',\n column: item.name as PObjectId,\n }\n }),\n },\n filters,\n sorting: [],\n } as CalculateTableDataRequest<PObjectId>;\n try {\n const start = Date.now();\n const response = await this.pframeDriver.calculateTableData(this.pframeHandle, request);\n if (debug) {\n const time = Date.now() - start;\n if (time > LONG_REQUEST) console.log('getTableOuterJoin', time);\n }\n\n const axes = response.filter(item => item.spec.type === 'axis');\n const columns = response.filter(item => item.spec.type === 'column');\n if (debug) {\n console.log('getTableOuterJoin', `${response[0].data.data.length} items`);\n }\n\n return {\n axesData: axes.reduce((res: Record<string, PValue[]>, item) => {\n const id = AxisId.fromAxisSpec(item.spec.spec as AxisSpec);\n res[id.toCanonicalString()] = convertColumnData(id.type, item.data);\n return res;\n }, {}),\n columnsData: columns.reduce((res: Record<string, PValue[]>, item) => {\n const spec = item.spec.spec as PColumnSpec;\n const id = new ColumnId({\n name: item.spec.id as PObjectId,\n type: spec.valueType,\n });\n res[id.toCanonicalString()] = convertColumnData(id.type, item.data);\n return res;\n }, {}),\n columnSpecs: columns.reduce((res: Record<string, PColumnSpec>, item) => {\n const spec = item.spec.spec as PColumnSpec;\n const id = new ColumnId({\n name: item.spec.id as PObjectId,\n type: spec.valueType,\n });\n res[id.toCanonicalString()] = spec;\n return res;\n }, {}),\n axesSpecs: axes.reduce((res: Record<string, AxisSpec>, item) => {\n const spec = item.spec.spec as AxisSpec;\n const id = AxisId.fromAxisSpec(spec);\n res[id.toCanonicalString()] = spec;\n return res;\n }, {}),\n };\n } catch (err) {\n console.error('PFrame: table outer join error');\n console.info('error with request: ', request);\n throw err;\n }\n }\n\n async getColumnSpecById(id: ColumnId): Promise<PColumnSpec | null> {\n try {\n const start = Date.now();\n const response = await this.pframeDriver.getColumnSpec(this.pframeHandle, id.name as PObjectId);\n if (debug) {\n const time = Date.now() - start;\n if (time > LONG_REQUEST) console.log('getColumnSpecById', time, response);\n }\n return response ?? null;\n } catch (err) {\n console.error('PFrame: get single column error');\n return null;\n }\n }\n\n async getColumnAxesIds(id: ColumnId): Promise<AxisId[]> {\n return (await this.getColumnSpecById(id))?.axesSpec.map(axisSpec => AxisId.fromAxisSpec(axisSpec)) ?? [];\n }\n\n async getRequestColumnsFromSelectedSources(sources: (ColumnId | AxisId)[]): Promise<PFrameAxisId[]> {\n const result: PFrameAxisId[] = [];\n //NB: we don't need to add axes in request because axes are already in columns\n for (const item of sources) {\n if (isColumnId(item)) {\n const axesSpec = (await this.getColumnSpecById(item))?.axesSpec ?? [];\n result.push(...axesSpec.map(spec => AxisId.fromAxisSpec(spec).toPFrameId()));\n }\n }\n return result;\n }\n\n async getColumnsList() {\n return this.pframeDriver.listColumns(this.pframeHandle);\n }\n\n async getColumnsFull(\n selectedSources: (ColumnId | AxisId)[],\n strictlyCompatible: boolean,\n types?: ValueType[],\n names?: string[],\n annotations?: FindColumnsRequest['columnFilter']['annotationValue'],\n ): Promise<PColumnIdAndSpec[]> {\n try {\n const request: FindColumnsRequest = {\n columnFilter: {\n type: types,\n name: names,\n annotationValue: annotations,\n },\n compatibleWith: await this.getRequestColumnsFromSelectedSources(selectedSources),\n strictlyCompatible, // should be true if we want to get meta and false if X/Y\n };\n const start = Date.now();\n const response: FindColumnsResponse = await this.pframeDriver.findColumns(this.pframeHandle, request);\n if (debug) {\n const time = Date.now() - start;\n if (time > LONG_REQUEST) console.log('getColumnsFull', time);\n }\n const result: PColumnIdAndSpec[] = [];\n response.hits.forEach(item => {\n // ***\n // consider mapping variants in qualifications\n // ***\n\n result.push(item);\n });\n return result;\n } catch (err) {\n console.error('PFrame: findColumns error');\n throw err;\n }\n }\n\n async getColumns(\n selectedSources: (ColumnId | AxisId)[],\n strictlyCompatible: boolean,\n types?: ValueType[],\n names?: string[],\n annotations?: FindColumnsRequest['columnFilter']['annotationValue'],\n ): Promise<ColumnId[]> {\n return (await this.getColumnsFull(selectedSources, strictlyCompatible, types, names, annotations)).map(\n item =>\n new ColumnId({\n name: item.columnId,\n type: item.spec.valueType,\n })\n );\n }\n\n async findColumnBy(\n name: string,\n type?: ValueType,\n annotationValue?: FindColumnsRequest['columnFilter']['annotationValue'],\n domainValue?: FindColumnsRequest['columnFilter']['domainValue']\n ): Promise<ColumnId | null> {\n try {\n const request: FindColumnsRequest = {\n columnFilter: {\n name: [name],\n ...(type ? {type: [type]} : {}),\n ...(annotationValue ? {annotationValue} : {}),\n ...(domainValue ? {domainValue} : {}),\n },\n compatibleWith: [] as AxisId[],\n strictlyCompatible: false,\n };\n const start = Date.now();\n const response: FindColumnsResponse = await this.pframeDriver.findColumns(this.pframeHandle, request);\n if (debug) {\n const time = Date.now() - start;\n if (time > LONG_REQUEST) console.log('findColumnBy', time);\n }\n const result: ColumnId[] = [];\n response.hits.forEach(({columnId, spec}) => {\n // ***\n // consider mapping variants in qualifications\n // ***\n\n result.push(new ColumnId({name: columnId, type: spec.valueType}));\n });\n if (result.length > 1) {\n console.warn(`More than 1 column found for ${name}}`);\n }\n if (result.length === 0) {\n console.warn(`No columns found for ${name}}`);\n return null;\n }\n return result[0];\n } catch (err) {\n console.error('PFrame: findColumns error');\n throw err;\n }\n }\n}\n","import type {DataStore} from './store';\nimport {ColumnsProvider} from './pframe/ColumnsProvider';\nimport type {PFrameDriver, PFrameHandle} from '@milaboratories/pl-model-common';\n\nexport class DemoDataStore implements DataStore {\n readonly pFrameProvider: ColumnsProvider;\n readonly labelsModifier;\n constructor(pframeHandle: PFrameHandle, pframeDriver: PFrameDriver, labelsModifier: (id: string, label: string) => string = (id: string, label: string) => label ?? id) {\n this.labelsModifier = labelsModifier;\n this.pFrameProvider = new ColumnsProvider(pframeHandle, pframeDriver);\n }\n}\n","import {BubbleStateController, BubbleUIState, InitialBubbleState} from './controllers/controllersByChartType/bubble';\nimport type {DiscreteUIState} from './controllers/controllersByChartType/discrete';\nimport type {HeatmapUIState} from './controllers/controllersByChartType/heatmap';\nimport type {ScatterplotUIState} from './controllers/controllersByChartType/scatterplot';\nimport type {DendroUIState} from './controllers/controllersByChartType/dendro';\nimport {\n HistogramStateController,\n HistogramUIState,\n InitialHistogramState,\n} from './controllers/controllersByChartType/histogram';\nimport {DiscreteStateController, InitialDiscreteState} from './controllers/controllersByChartType/discrete';\nimport {HeatmapStateController, InitialHeatmapState} from './controllers/controllersByChartType/heatmap';\nimport {InitialScatterplotState, ScatterplotStateController} from './controllers/controllersByChartType/scatterplot';\nimport {\n InitialScatterplotUmapState,\n ScatterplotUmapStateController,\n ScatterplotUmapUIState,\n} from './controllers/controllersByChartType/scatterplot-umap';\nimport {DendroStateController, InitialDendroState} from './controllers/controllersByChartType/dendro';\nimport type {Controller, PlotDataAndSettings} from './controllers/ControllerBase';\nimport {DemoDataStore} from './demoStore';\nimport {PValue} from './store';\nimport {AxisId, ColumnId, columnOrAxisIdFromString} from './spec';\nimport type {\n AxisData,\n ChartType,\n ColumnData,\n ColumnOrAxisData,\n ComponentGuideFilter,\n ComponentGuideSimple,\n ComponentStateFilter,\n ComponentStateSimple,\n InputGuide,\n InputState,\n InputStateParent,\n SelectorStateFilter,\n SelectorStateSimple,\n SourceOption,\n} from './common';\nimport type {ColumnOrAxisIdString} from './spec';\nimport {isColumnId} from './spec';\nimport type {AxisSpec, PColumnSpec} from '@milaboratories/pl-model-common';\n\nconst PfPlots = {\n controllers: {\n discrete: new DiscreteStateController(),\n scatterplot: new ScatterplotStateController(),\n 'scatterplot-umap': new ScatterplotUmapStateController(),\n heatmap: new HeatmapStateController(),\n dendro: new DendroStateController(),\n histogram: new HistogramStateController(),\n bubble: new BubbleStateController(),\n },\n initialStates: {\n discrete: InitialDiscreteState,\n scatterplot: InitialScatterplotState,\n 'scatterplot-umap': InitialScatterplotUmapState,\n heatmap: InitialHeatmapState,\n dendro: InitialDendroState,\n histogram: InitialHistogramState,\n bubble: InitialBubbleState,\n },\n};\n\nexport function getControllerByType<C extends ChartType>(chartType: C): Controller<InputStateParent<C>> {\n return PfPlots.controllers[chartType] as unknown as Controller<InputStateParent<C>>;\n}\n\nexport function getInitialStateByType<C extends ChartType>(chartType: C): InputStateParent<C> {\n return PfPlots.initialStates[chartType] as unknown as InputStateParent<C>;\n}\n\ntype InputNamesByChartType = {\n [K in ChartType]: K extends 'discrete' ?\n keyof DiscreteUIState['components'] : K extends 'heatmap' ?\n keyof HeatmapUIState['components'] : K extends 'dendro' ?\n keyof DendroUIState['components'] : K extends 'scatterplot' ?\n keyof ScatterplotUIState['components'] : K extends 'scatterplot-umap' ?\n keyof ScatterplotUmapUIState['components'] : K extends 'histogram' ?\n keyof HistogramUIState['components'] : K extends 'bubble' ?\n keyof BubbleUIState['components'] : never\n}\n\nexport {AxisId, ColumnId, DemoDataStore, columnOrAxisIdFromString, isColumnId};\n\n// types\nexport {\n AxisSpec,\n ChartType,\n DiscreteUIState,\n DendroUIState,\n ScatterplotUIState,\n ScatterplotUmapUIState,\n HeatmapUIState,\n HistogramUIState,\n BubbleUIState,\n ColumnOrAxisIdString,\n ColumnOrAxisData,\n PColumnSpec,\n ComponentGuideFilter,\n ComponentGuideSimple,\n ComponentStateFilter,\n ComponentStateSimple,\n PlotDataAndSettings,\n InputGuide,\n InputState,\n InputStateParent,\n PValue,\n SelectorStateFilter,\n SelectorStateSimple,\n SourceOption,\n AxisData,\n ColumnData,\n Controller,\n DiscreteStateController,\n ScatterplotStateController,\n DendroStateController,\n HeatmapStateController,\n BubbleStateController,\n InputNamesByChartType,\n};\n"],"names":["AXIS_NATURE_KEY","COLUMN_LABEL_KEY","COLUMN_NAME_KEY","COLUMN_DOMAIN_KEY","SUBSET_FILTER_KEY","DISCRETE_FILTER_KEY","DISCRETE_VALUES_KEY","HIGH_CARDINALITY","IS_VIRTUAL_COLUMN","IS_LINKER_COLUMN","AxisId","_AxisId","type","name","domain","canonicalize","axisSpec","axesSpec","axis","values","ColumnId","_ColumnId","pojo","isColumnId","id","isAxisId","columnOrAxisIdFromString","str","PARENTS_ANNOTATION","getAxisParents","checkIfRoot","axes","idx","maybeRoot","canonicalizeJson","axisIdx","getRootAxis","getAxesTree","rootAxis","root","nodesQ","nextNodes","node","parentNodes","setFromAxisTree","tree","set","parent","arrayFromAxisTree","res","getAxesGroups","axisSpecs","freeAxes","groups","arr","getCompositeLinkersMap","compositeLinkers","_a","_b","result","linker","columnId","left","right","keyLeft","keyRight","addSourceInfoToMap","store","selectedIdStr","label","dataMap","dataAxesList","dataAxes","linkerAxes","fixedAxesAllowed","compositeLinkerMap","_c","_d","sourceId","columnSpec","extraAxesIds","getNotAllowedAxes","extraAxesSet","axesIds","extraAxesIndexes","columnInfo","getColumnOrAxisLabel","axisIdStr","mustBeConsumed","axisMustBeConsumed","axisInfo","getDefaultInfo","sourceIdStr","item","getStateCopy","state","getFilterFromState","selectedSource","selectedFilterRange","selectedFilterValue","rangeFilters","getFiltersFromStates","states","getGlobalId","spec","getAxisSpecFromParents","axisId","parentSources","parentSource","parentId","s","LABEL_COLUMN_NAME","getColumnOrAxisValueLabelsId","getAxisGlobalId","labelColumns","sourceGlobalId","labelColumn","selectedId","labelsColumn","axisNature","checkSourceBySpecForFilters","dataColumnPredicateDefault","getLinkerColumnsMap","linkerColumns","resultMap","axisA","axisB","idA","idB","getAxesSpecsFromSources","idStrs","idStr","searchPath","linkerColumnsMap","startId","endId","previous","visited","nextIds","next","nextId","availableIds","availableId","ids","current","getLinkerColumnsFromGraph","parentAxesIds","targetAxisId","paths","parentAxisId","p","resultPath","path","getAllLinkerMaps","allLinkerColumns","getLinkerColumnsForSource","dataInputAxes","secondarySource","fixedAxesOfSecondaryColumn","columnOrAxisId","secondaryColumnSpec","allColumnAxesWithoutFixed","el","dataInputAxesSet","rightPartAxes","leftGroups","rightGroups","leftCompositeKeysSet","compositeLinkerKey","columnKey","linkerColumn","column","dataInputAxesList","group","groupKey","key","a","createHighlightColumn","highlightSelectedStates","data","dataLength","highlightColumn","rowIdx","i","value","rangeResult","ControllerBase","simpleComponentControllers","filterComponentControllers","components","componentName","inputName","selectorState","nextSelectorStates","currentStates","deletedStates","currentState","addedStates","nextState","st","labelsMap","nextAxes","addedAxis","availableAxes","availableAxis","selectorStates","consumedSourcesSet","availableColumns","sources","deriveLabels","fixedIds","dataColumnPredicate","resultComponentsGuide","ignoredNamesSet","fixedSelectedSet","selectedColumnsOrAxesInfo","optionsInfo","allControllers","freeOptionsSet","componentController","options","v","markMustBeConsumed","option","selected","mustBeConsumedAxes","isHighCardinality","consumedHighCardinalityAxes","consumed","info","axesToBeFixedSet","consistent","getSourceInfo","inputGuide","limit","searchQuery","searchQueryValue","sortValues","b","discreteValuesStr","discreteValues","labelsColumnId","filters","dataValues","axesData","axisKeys","searchInLabelsOrValue","response","component","consistency","hasFreeDimensions","optionId","hasNotSelectedAxisToBeFixed","fixedAxes","isLinkerColumn","_ComponentController","allowedTypes","settings","strictlyDependsOnParents","dependsOn","parentComponents","annotations","checkSourceBySpec","selectedSourceStr","componentState","parentAxes","isAxisInSet","consistencyData","selectedHereColumnIds","selectedHere","parentSelectedSources","source","_e","_f","_g","parentAxesList","multipleSelectors","required","stateConsistency","dep","allowedColumns","thisState","axisData","typeOK","annotationsOK","k","checkBySpecOK","axisNatureOK","decreasingDimensionsOK","ignored","strictlyCompatible","columnIdString","isLabelColumn","ComponentController","InitialBubbleState","getMultiSourceColumn","selectedSources","selectedIds","BubbleStateController","valueColorColumnIdString","valueSizeColumnIdString","valueColorColumnId","valueSizeColumnId","dataByColumns","filterSelectedStates","filterColumns","primaryColumns","inputs","secondarySources","primarySourcesFixedAxes","secondarySourcesFixedAxes","axisValue","input","xAxes","xKey","xAxesLabeled","yAxes","yKey","yAxesLabeled","valueColor","valueSize","facetBy","xAxisTitle","yAxisTitle","tooltipContent","idString","InitialHistogramState","HistogramStateController","valueColumnIdString","valueColumnId","grouping","InitialDiscreteState","DiscreteStateController","yColumnIdString","yColumnIdWithQ","yColumnId","y","primaryGrouping","secondaryGrouping","InitialHeatmapState","isDiscreteData","HeatmapStateController","allowedAxes","xVisibleAxes","yVisibleAxes","xGroupBy","yGroupBy","valueSpec","annotationsX","annotationsY","InitialScatterplotState","ScatterplotStateController","sourceIdX","sourceIdY","specX","specY","axesX","axesY","hangingX","axisKey","hangingY","xColumnIdString","xId","yId","primarySources","_v","xIdString","yIdString","xIdWithQ","yIdWithQ","x","keyColumn","allGroupingIds","lodash","highlight","InitialScatterplotUmapState","ScatterplotUmapStateController","NODE_ID_AXIS_NAME","COLUMN_NODE_ID","InitialDendroState","DendroStateController","primaryInputs","secondaryInputs","idMap","primaryInput","secondaryInput","responseKey","resultKey","nodeIdAxis","annotationColumnIdString","annotationColumnId","columnData","dataColumnIdString","dataColumnId","parentSourcesTree","height","labels","aes","heatmapAnnotation","heatmapAxis","heatmapGroup","annotationSource","axisSource","UNIQUE_VALUES_LIMIT","convertColumnData","pTableValue","debug","ColumnsProvider","pframeHandle","pframeDriver","start","columns","err","request","overflow","parents","columnParents","specs","c","realParents","responses","r","primaryIds","secondaryIds","primaryInnerJoin","secondaryColumns","axisFilters","types","names","annotationValue","domainValue","DemoDataStore","labelsModifier","PfPlots","getControllerByType","chartType","getInitialStateByType"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]}
|