@platforma-sdk/model 1.79.3 → 1.79.14

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.
@@ -2,8 +2,8 @@ require("../_virtual/_rolldown/runtime.cjs");
2
2
  const require_accessor = require("../render/accessor.cjs");
3
3
  const require_get_services = require("../services/get_services.cjs");
4
4
  require("../services/index.cjs");
5
- const require_column_selector = require("./column_selector.cjs");
6
5
  const require_column_snapshot_provider = require("./column_snapshot_provider.cjs");
6
+ const require_column_selector = require("./column_selector.cjs");
7
7
  let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
8
8
  let _milaboratories_helpers = require("@milaboratories/helpers");
9
9
  //#region src/columns/column_collection_builder.ts
@@ -1,8 +1,8 @@
1
1
  import { TreeNodeAccessor } from "../render/accessor.js";
2
2
  import { getService } from "../services/get_services.js";
3
3
  import "../services/index.js";
4
- import { convertColumnSelectorToMultiColumnSelector } from "./column_selector.js";
5
4
  import { ArrayColumnProvider, toColumnSnapshotProvider } from "./column_snapshot_provider.js";
5
+ import { convertColumnSelectorToMultiColumnSelector } from "./column_selector.js";
6
6
  import { deriveNativeId, isPColumnSpec } from "@milaboratories/pl-model-common";
7
7
  import { throwError } from "@milaboratories/helpers";
8
8
  //#region src/columns/column_collection_builder.ts
@@ -1,6 +1,6 @@
1
- require("./column_selector.cjs");
1
+ require("./column_snapshot.cjs");
2
2
  require("./column_snapshot_provider.cjs");
3
+ require("./column_selector.cjs");
3
4
  require("./column_collection_builder.cjs");
4
5
  require("./ctx_column_sources.cjs");
5
- require("./column_snapshot.cjs");
6
6
  require("./expand_by_partition.cjs");
@@ -1,6 +1,6 @@
1
- import "./column_selector.js";
1
+ import "./column_snapshot.js";
2
2
  import "./column_snapshot_provider.js";
3
+ import "./column_selector.js";
3
4
  import "./column_collection_builder.js";
4
5
  import "./ctx_column_sources.js";
5
- import "./column_snapshot.js";
6
6
  import "./expand_by_partition.js";
@@ -1,7 +1,7 @@
1
1
  require("../../_virtual/_rolldown/runtime.cjs");
2
- const require_filter_discovery = require("./filter_discovery.cjs");
3
2
  const require_column_collection_builder = require("../../columns/column_collection_builder.cjs");
4
3
  const require_ctx_column_sources = require("../../columns/ctx_column_sources.cjs");
4
+ const require_filter_discovery = require("./filter_discovery.cjs");
5
5
  const require_enrichment_discovery = require("./enrichment_discovery.cjs");
6
6
  let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
7
7
  //#region src/components/PlDatasetSelector/build_dataset_options.ts
@@ -1,6 +1,6 @@
1
- import { buildRefMap, filterMatchesToOptions, findFilterColumns } from "./filter_discovery.js";
2
1
  import { ColumnCollectionBuilder } from "../../columns/column_collection_builder.js";
3
2
  import { ResultPoolColumnSnapshotProvider, collectCtxColumnSnapshotProviders } from "../../columns/ctx_column_sources.js";
3
+ import { buildRefMap, filterMatchesToOptions, findFilterColumns } from "./filter_discovery.js";
4
4
  import { enrichmentVariantsToRefs, findEnrichmentColumns } from "./enrichment_discovery.js";
5
5
  import { multiColumnSelectorsToPredicate } from "@milaboratories/pl-model-common";
6
6
  //#region src/components/PlDatasetSelector/build_dataset_options.ts
package/dist/index.cjs CHANGED
@@ -28,15 +28,18 @@ const require_block_model_legacy = require("./block_model_legacy.cjs");
28
28
  const require_plugin_model = require("./plugin_model.cjs");
29
29
  const require_block_model = require("./block_model.cjs");
30
30
  const require_axes = require("./pframe_utils/axes.cjs");
31
+ const require_column_snapshot = require("./columns/column_snapshot.cjs");
32
+ const require_column_snapshot_provider = require("./columns/column_snapshot_provider.cjs");
33
+ const require_column_selector = require("./columns/column_selector.cjs");
34
+ const require_column_collection_builder = require("./columns/column_collection_builder.cjs");
35
+ const require_ctx_column_sources = require("./columns/ctx_column_sources.cjs");
36
+ const require_expand_by_partition = require("./columns/expand_by_partition.cjs");
37
+ require("./columns/index.cjs");
31
38
  const require_columns = require("./pframe_utils/columns.cjs");
32
39
  const require_PFrameForGraphs = require("./components/PFrameForGraphs.cjs");
33
40
  const require_filters_ui = require("./components/PlAnnotations/filters_ui.cjs");
34
41
  const require_dataset_selection = require("./components/PlDatasetSelector/dataset_selection.cjs");
35
42
  const require_filter_discovery = require("./components/PlDatasetSelector/filter_discovery.cjs");
36
- const require_column_selector = require("./columns/column_selector.cjs");
37
- const require_column_snapshot_provider = require("./columns/column_snapshot_provider.cjs");
38
- const require_column_collection_builder = require("./columns/column_collection_builder.cjs");
39
- const require_ctx_column_sources = require("./columns/ctx_column_sources.cjs");
40
43
  const require_build_dataset_options = require("./components/PlDatasetSelector/build_dataset_options.cjs");
41
44
  const require_filterToQuery = require("./filters/converters/filterToQuery.cjs");
42
45
  const require_filterUiToExpressionImpl = require("./filters/converters/filterUiToExpressionImpl.cjs");
@@ -44,9 +47,6 @@ const require_distill = require("./filters/distill.cjs");
44
47
  require("./filters/index.cjs");
45
48
  const require_state_migration = require("./components/PlDataTable/state-migration.cjs");
46
49
  const require_createPlDataTableSheet = require("./components/PlDataTable/createPlDataTableSheet.cjs");
47
- const require_column_snapshot = require("./columns/column_snapshot.cjs");
48
- const require_expand_by_partition = require("./columns/expand_by_partition.cjs");
49
- require("./columns/index.cjs");
50
50
  const require_derive_distinct_tooltips = require("./labels/derive_distinct_tooltips.cjs");
51
51
  const require_utils = require("./components/PlDataTable/createPlDataTable/utils.cjs");
52
52
  const require_createPlDataTableV2 = require("./components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs");
package/dist/index.js CHANGED
@@ -27,15 +27,18 @@ import { BlockModel } from "./block_model_legacy.js";
27
27
  import { PluginDataModel, PluginDataModelBuilder, PluginInstance, PluginModel } from "./plugin_model.js";
28
28
  import { BlockModelV3 } from "./block_model.js";
29
29
  import { enrichCompatible, getAvailableWithLinkersAxes } from "./pframe_utils/axes.js";
30
+ import { createColumnSnapshot, createReadyColumnData } from "./columns/column_snapshot.js";
31
+ import { ArrayColumnProvider, OutputColumnProvider, SnapshotColumnProvider, isColumnSnapshotProvider, toColumnSnapshotProvider } from "./columns/column_snapshot_provider.js";
32
+ import { convertColumnSelectorToMultiColumnSelector, convertRelaxedAxisSelectorToMultiAxisSelector, convertRelaxedColumnSelectorToMultiColumnSelector } from "./columns/column_selector.js";
33
+ import { ColumnCollectionBuilder } from "./columns/column_collection_builder.js";
34
+ import { ResultPoolColumnSnapshotProvider, collectCtxColumnSnapshotProviders } from "./columns/ctx_column_sources.js";
35
+ import { expandByPartition } from "./columns/expand_by_partition.js";
36
+ import "./columns/index.js";
30
37
  import { getAllRelatedColumns, getRelatedColumns } from "./pframe_utils/columns.js";
31
38
  import { createPFrameForGraphs, isHiddenFromGraphColumn, isHiddenFromUIColumn } from "./components/PFrameForGraphs.js";
32
39
  import { compileAnnotationScript, compileFilter, compileFilters, unreachable } from "./components/PlAnnotations/filters_ui.js";
33
40
  import { createDatasetSelection, isDatasetSelection } from "./components/PlDatasetSelector/dataset_selection.js";
34
41
  import { buildRefMap, filterMatchesToOptions, findFilterColumns } from "./components/PlDatasetSelector/filter_discovery.js";
35
- import { convertColumnSelectorToMultiColumnSelector, convertRelaxedAxisSelectorToMultiAxisSelector, convertRelaxedColumnSelectorToMultiColumnSelector } from "./columns/column_selector.js";
36
- import { ArrayColumnProvider, OutputColumnProvider, SnapshotColumnProvider, isColumnSnapshotProvider, toColumnSnapshotProvider } from "./columns/column_snapshot_provider.js";
37
- import { ColumnCollectionBuilder } from "./columns/column_collection_builder.js";
38
- import { ResultPoolColumnSnapshotProvider, collectCtxColumnSnapshotProviders } from "./columns/ctx_column_sources.js";
39
42
  import { buildDatasetOptions } from "./components/PlDatasetSelector/build_dataset_options.js";
40
43
  import { filterSpecToSpecQueryExpr } from "./filters/converters/filterToQuery.js";
41
44
  import { convertFilterUiToExpressionImpl, convertFilterUiToExpressions } from "./filters/converters/filterUiToExpressionImpl.js";
@@ -43,9 +46,6 @@ import { distillFilterSpec } from "./filters/distill.js";
43
46
  import "./filters/index.js";
44
47
  import { createDefaultPTableParams, createPlDataTableStateV2, upgradePlDataTableStateV2 } from "./components/PlDataTable/state-migration.js";
45
48
  import { createPlDataTableSheet } from "./components/PlDataTable/createPlDataTableSheet.js";
46
- import { createColumnSnapshot, createReadyColumnData } from "./columns/column_snapshot.js";
47
- import { expandByPartition } from "./columns/expand_by_partition.js";
48
- import "./columns/index.js";
49
49
  import { deriveDistinctTooltips } from "./labels/derive_distinct_tooltips.js";
50
50
  import { getEffectiveVisibility, getOrderPriority, isColumnHidden, isColumnOptional } from "./components/PlDataTable/createPlDataTable/utils.js";
51
51
  import { createPlDataTableV2 } from "./components/PlDataTable/createPlDataTable/createPlDataTableV2.js";
package/dist/package.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "1.79.3";
2
+ var version = "1.79.14";
3
3
  //#endregion
4
4
  Object.defineProperty(exports, "version", {
5
5
  enumerable: true,
package/dist/package.js CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "1.79.3";
2
+ var version = "1.79.14";
3
3
  //#endregion
4
4
  export { version };
5
5
 
@@ -2,6 +2,9 @@ require("../_virtual/_rolldown/runtime.cjs");
2
2
  const require_column_collection = require("../render/util/column_collection.cjs");
3
3
  require("../render/index.cjs");
4
4
  const require_axes = require("./axes.cjs");
5
+ const require_column_collection_builder = require("../columns/column_collection_builder.cjs");
6
+ const require_ctx_column_sources = require("../columns/ctx_column_sources.cjs");
7
+ require("../columns/index.cjs");
5
8
  let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
6
9
  //#region src/pframe_utils/columns.ts
7
10
  function getAllRelatedColumns(ctx, predicate) {
@@ -58,7 +61,28 @@ function getRelatedColumns(ctx, { columns: rootColumns, predicate }) {
58
61
  dontWaitAllData: true,
59
62
  overrideLabelAnnotation: false
60
63
  }) ?? []).filter((column) => (0, _milaboratories_pl_model_common.isLabelColumn)(column.spec));
61
- return require_axes.enrichCompatible(blockAxes, [...compatibleWithoutLabels, ...compatibleLabels]);
64
+ const compatible = [...compatibleWithoutLabels, ...compatibleLabels];
65
+ const integrableIds = discoverIntegrableColumnIds(ctx, rootColumns);
66
+ const rootIds = new Set(rootColumns.map((c) => c.id));
67
+ return require_axes.enrichCompatible(blockAxes, compatible.filter((c) => rootIds.has(c.id) || (0, _milaboratories_pl_model_common.isLinkerColumn)(c.spec) || (integrableIds?.has(c.id) ?? true)));
68
+ }
69
+ /** Column ids that discovery confirms integrate with the block, or `undefined` when it can't decide. */
70
+ function discoverIntegrableColumnIds(ctx, rootColumns) {
71
+ const anchorSpecs = Array.from(new Map(rootColumns.map((c) => [(0, _milaboratories_pl_model_common.canonicalizeJson)(c.spec), c.spec])).values());
72
+ if (anchorSpecs.length === 0) return void 0;
73
+ try {
74
+ const collection = new require_column_collection_builder.ColumnCollectionBuilder().addSources(require_ctx_column_sources.collectCtxColumnSnapshotProviders(ctx)).build({
75
+ allowPartialColumnList: true,
76
+ anchors: Object.fromEntries(anchorSpecs.map((spec, i) => [`anchor_${i}`, spec]))
77
+ });
78
+ try {
79
+ return new Set(collection.findColumns({ mode: "enrichment" }).map((m) => m.column.id));
80
+ } finally {
81
+ collection.dispose();
82
+ }
83
+ } catch {
84
+ return;
85
+ }
62
86
  }
63
87
  //#endregion
64
88
  exports.getAllRelatedColumns = getAllRelatedColumns;
@@ -1 +1 @@
1
- {"version":3,"file":"columns.cjs","names":["PColumnCollection","enrichCompatible","getAvailableWithLinkersAxes"],"sources":["../../src/pframe_utils/columns.ts"],"sourcesContent":["import type { PColumn, PColumnSpec, PColumnLazy, PFrameDef } from \"@milaboratories/pl-model-common\";\nimport {\n getNormalizedAxesList,\n getAxisId,\n canonicalizeJson,\n isLinkerColumn,\n matchAxisId,\n isLabelColumn,\n} from \"@milaboratories/pl-model-common\";\nimport type { AxesVault } from \"./axes\";\nimport { enrichCompatible, getAvailableWithLinkersAxes } from \"./axes\";\nimport type { RenderCtxBase, PColumnDataUniversal } from \"../render\";\nimport { PColumnCollection } from \"../render\";\n\nexport function getAllRelatedColumns<A, U>(\n ctx: RenderCtxBase<A, U>,\n predicate: (spec: PColumnSpec) => boolean,\n): PFrameDef<PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>> {\n // if current block doesn't produce own columns then use all columns from result pool\n const columns = new PColumnCollection();\n columns.addColumnProvider(ctx.resultPool);\n const allColumns =\n columns.getColumns(predicate, {\n dontWaitAllData: true,\n overrideLabelAnnotation: false,\n }) ?? [];\n\n const allAxes: AxesVault = new Map(\n allColumns\n .flatMap((column) => getNormalizedAxesList(column.spec.axesSpec))\n .map((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return [canonicalizeJson(axisId), axisSpec];\n }),\n );\n\n // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match\n const extendedColumns = enrichCompatible(allAxes, allColumns);\n\n return extendedColumns;\n}\n\nexport function getRelatedColumns<A, U>(\n ctx: RenderCtxBase<A, U>,\n {\n columns: rootColumns,\n predicate,\n }: {\n columns: PColumn<PColumnDataUniversal>[];\n predicate: (spec: PColumnSpec) => boolean;\n },\n): PFrameDef<PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>> {\n // if current block has its own columns then take from result pool only compatible with them\n const columns = new PColumnCollection();\n columns.addColumnProvider(ctx.resultPool);\n columns.addColumns(rootColumns);\n\n // all possible axes from block columns\n const blockAxes: AxesVault = new Map();\n // axes from block columns and compatible result pool columns\n const allAxes: AxesVault = new Map();\n for (const c of rootColumns) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n blockAxes.set(canonicalizeJson(aid), spec);\n allAxes.set(canonicalizeJson(aid), spec);\n }\n }\n\n // all linker columns always go to pFrame - even it's impossible to use some of them they all are hidden\n const linkerColumns =\n columns.getColumns((spec) => predicate(spec) && isLinkerColumn(spec), {\n dontWaitAllData: true,\n }) ?? [];\n const availableWithLinkersAxes = getAvailableWithLinkersAxes(linkerColumns, blockAxes);\n\n // all possible axes from connected linkers\n for (const item of availableWithLinkersAxes) {\n blockAxes.set(...item);\n allAxes.set(...item);\n }\n\n const blockAxesArr = Array.from(blockAxes.values());\n // all compatible with block columns but without label columns\n let compatibleWithoutLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return blockAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => !isLabelColumn(column.spec));\n\n // extend axes set for label columns request\n for (const c of compatibleWithoutLabels) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n allAxes.set(canonicalizeJson(aid), spec);\n }\n }\n\n const allAxesArr = Array.from(allAxes.values());\n // extend allowed columns - add columns thad doesn't have axes from block, but have all axes in 'allAxes' list (that means all axes from linkers or from 'hanging' of other selected columns)\n compatibleWithoutLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.every((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => !isLabelColumn(column.spec));\n\n // label columns must be compatible with full set of axes - block axes and axes from compatible columns from result pool\n const compatibleLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => isLabelColumn(column.spec));\n\n const compatible = [...compatibleWithoutLabels, ...compatibleLabels];\n\n // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match\n const extendedColumns = enrichCompatible(blockAxes, compatible);\n\n return extendedColumns;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"columns.cjs","names":["PColumnCollection","enrichCompatible","getAvailableWithLinkersAxes","ColumnCollectionBuilder","collectCtxColumnSnapshotProviders"],"sources":["../../src/pframe_utils/columns.ts"],"sourcesContent":["import type {\n PColumn,\n PColumnSpec,\n PColumnLazy,\n PFrameDef,\n PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n getNormalizedAxesList,\n getAxisId,\n canonicalizeJson,\n isLinkerColumn,\n matchAxisId,\n isLabelColumn,\n} from \"@milaboratories/pl-model-common\";\nimport type { AxesVault } from \"./axes\";\nimport { enrichCompatible, getAvailableWithLinkersAxes } from \"./axes\";\nimport type { RenderCtxBase, PColumnDataUniversal } from \"../render\";\nimport { PColumnCollection } from \"../render\";\nimport { ColumnCollectionBuilder } from \"../columns\";\nimport { collectCtxColumnSnapshotProviders } from \"../columns/ctx_column_sources\";\n\nexport function getAllRelatedColumns<A, U>(\n ctx: RenderCtxBase<A, U>,\n predicate: (spec: PColumnSpec) => boolean,\n): PFrameDef<PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>> {\n // if current block doesn't produce own columns then use all columns from result pool\n const columns = new PColumnCollection();\n columns.addColumnProvider(ctx.resultPool);\n const allColumns =\n columns.getColumns(predicate, {\n dontWaitAllData: true,\n overrideLabelAnnotation: false,\n }) ?? [];\n\n const allAxes: AxesVault = new Map(\n allColumns\n .flatMap((column) => getNormalizedAxesList(column.spec.axesSpec))\n .map((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return [canonicalizeJson(axisId), axisSpec];\n }),\n );\n\n // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match\n const extendedColumns = enrichCompatible(allAxes, allColumns);\n\n return extendedColumns;\n}\n\nexport function getRelatedColumns<A, U>(\n ctx: RenderCtxBase<A, U>,\n {\n columns: rootColumns,\n predicate,\n }: {\n columns: PColumn<PColumnDataUniversal>[];\n predicate: (spec: PColumnSpec) => boolean;\n },\n): PFrameDef<PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>> {\n // if current block has its own columns then take from result pool only compatible with them\n const columns = new PColumnCollection();\n columns.addColumnProvider(ctx.resultPool);\n columns.addColumns(rootColumns);\n\n // all possible axes from block columns\n const blockAxes: AxesVault = new Map();\n // axes from block columns and compatible result pool columns\n const allAxes: AxesVault = new Map();\n for (const c of rootColumns) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n blockAxes.set(canonicalizeJson(aid), spec);\n allAxes.set(canonicalizeJson(aid), spec);\n }\n }\n\n // all linker columns always go to pFrame - even it's impossible to use some of them they all are hidden\n const linkerColumns =\n columns.getColumns((spec) => predicate(spec) && isLinkerColumn(spec), {\n dontWaitAllData: true,\n }) ?? [];\n const availableWithLinkersAxes = getAvailableWithLinkersAxes(linkerColumns, blockAxes);\n\n // all possible axes from connected linkers\n for (const item of availableWithLinkersAxes) {\n blockAxes.set(...item);\n allAxes.set(...item);\n }\n\n const blockAxesArr = Array.from(blockAxes.values());\n // all compatible with block columns but without label columns\n let compatibleWithoutLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return blockAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => !isLabelColumn(column.spec));\n\n // extend axes set for label columns request\n for (const c of compatibleWithoutLabels) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n allAxes.set(canonicalizeJson(aid), spec);\n }\n }\n\n const allAxesArr = Array.from(allAxes.values());\n // extend allowed columns - add columns thad doesn't have axes from block, but have all axes in 'allAxes' list (that means all axes from linkers or from 'hanging' of other selected columns)\n compatibleWithoutLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.every((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => !isLabelColumn(column.spec));\n\n // label columns must be compatible with full set of axes - block axes and axes from compatible columns from result pool\n const compatibleLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => isLabelColumn(column.spec));\n\n const compatible = [...compatibleWithoutLabels, ...compatibleLabels];\n\n // Drop result-pool columns that share an axis with the block but cannot join it.\n const integrableIds = discoverIntegrableColumnIds(ctx, rootColumns);\n const rootIds = new Set(rootColumns.map((c) => c.id));\n const connected = compatible.filter(\n (c) => rootIds.has(c.id) || isLinkerColumn(c.spec) || (integrableIds?.has(c.id) ?? true),\n );\n\n // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match\n const extendedColumns = enrichCompatible(blockAxes, connected);\n\n return extendedColumns;\n}\n\n/** Column ids that discovery confirms integrate with the block, or `undefined` when it can't decide. */\nfunction discoverIntegrableColumnIds<A, U>(\n ctx: RenderCtxBase<A, U>,\n rootColumns: PColumn<PColumnDataUniversal>[],\n): Set<PObjectId> | undefined {\n const anchorSpecs = Array.from(\n new Map(rootColumns.map((c) => [canonicalizeJson(c.spec), c.spec])).values(),\n );\n if (anchorSpecs.length === 0) return undefined;\n\n try {\n const collection = new ColumnCollectionBuilder()\n .addSources(collectCtxColumnSnapshotProviders(ctx))\n .build({\n allowPartialColumnList: true,\n anchors: Object.fromEntries(anchorSpecs.map((spec, i) => [`anchor_${i}`, spec])),\n });\n try {\n return new Set(collection.findColumns({ mode: \"enrichment\" }).map((m) => m.column.id));\n } finally {\n collection.dispose();\n }\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"columns.d.ts","names":[],"sources":["../../src/pframe_utils/columns.ts"],"mappings":";;;;;iBAcgB,oBAAA,MAAA,CACd,GAAA,EAAK,aAAA,CAAc,CAAA,EAAG,CAAA,GACtB,SAAA,GAAY,IAAA,EAAM,WAAA,eACjB,SAAA,CAAU,OAAA,CAAQ,oBAAA,IAAwB,WAAA,aAAwB,oBAAA;AAAA,iBAyBrD,iBAAA,MAAA,CACd,GAAA,EAAK,aAAA,CAAc,CAAA,EAAG,CAAA;EAEpB,OAAA,EAAS,WAAA;EACT;AAAA;EAEA,OAAA,EAAS,OAAA,CAAQ,oBAAA;EACjB,SAAA,GAAY,IAAA,EAAM,WAAA;AAAA,IAEnB,SAAA,CAAU,OAAA,CAAQ,oBAAA,IAAwB,WAAA,aAAwB,oBAAA"}
1
+ {"version":3,"file":"columns.d.ts","names":[],"sources":["../../src/pframe_utils/columns.ts"],"mappings":";;;;;iBAsBgB,oBAAA,MAAA,CACd,GAAA,EAAK,aAAA,CAAc,CAAA,EAAG,CAAA,GACtB,SAAA,GAAY,IAAA,EAAM,WAAA,eACjB,SAAA,CAAU,OAAA,CAAQ,oBAAA,IAAwB,WAAA,aAAwB,oBAAA;AAAA,iBAyBrD,iBAAA,MAAA,CACd,GAAA,EAAK,aAAA,CAAc,CAAA,EAAG,CAAA;EAEpB,OAAA,EAAS,WAAA;EACT;AAAA;EAEA,OAAA,EAAS,OAAA,CAAQ,oBAAA;EACjB,SAAA,GAAY,IAAA,EAAM,WAAA;AAAA,IAEnB,SAAA,CAAU,OAAA,CAAQ,oBAAA,IAAwB,WAAA,aAAwB,oBAAA"}
@@ -1,6 +1,9 @@
1
1
  import { PColumnCollection } from "../render/util/column_collection.js";
2
2
  import "../render/index.js";
3
3
  import { enrichCompatible, getAvailableWithLinkersAxes } from "./axes.js";
4
+ import { ColumnCollectionBuilder } from "../columns/column_collection_builder.js";
5
+ import { collectCtxColumnSnapshotProviders } from "../columns/ctx_column_sources.js";
6
+ import "../columns/index.js";
4
7
  import { canonicalizeJson, getAxisId, getNormalizedAxesList, isLabelColumn, isLinkerColumn, matchAxisId } from "@milaboratories/pl-model-common";
5
8
  //#region src/pframe_utils/columns.ts
6
9
  function getAllRelatedColumns(ctx, predicate) {
@@ -57,7 +60,28 @@ function getRelatedColumns(ctx, { columns: rootColumns, predicate }) {
57
60
  dontWaitAllData: true,
58
61
  overrideLabelAnnotation: false
59
62
  }) ?? []).filter((column) => isLabelColumn(column.spec));
60
- return enrichCompatible(blockAxes, [...compatibleWithoutLabels, ...compatibleLabels]);
63
+ const compatible = [...compatibleWithoutLabels, ...compatibleLabels];
64
+ const integrableIds = discoverIntegrableColumnIds(ctx, rootColumns);
65
+ const rootIds = new Set(rootColumns.map((c) => c.id));
66
+ return enrichCompatible(blockAxes, compatible.filter((c) => rootIds.has(c.id) || isLinkerColumn(c.spec) || (integrableIds?.has(c.id) ?? true)));
67
+ }
68
+ /** Column ids that discovery confirms integrate with the block, or `undefined` when it can't decide. */
69
+ function discoverIntegrableColumnIds(ctx, rootColumns) {
70
+ const anchorSpecs = Array.from(new Map(rootColumns.map((c) => [canonicalizeJson(c.spec), c.spec])).values());
71
+ if (anchorSpecs.length === 0) return void 0;
72
+ try {
73
+ const collection = new ColumnCollectionBuilder().addSources(collectCtxColumnSnapshotProviders(ctx)).build({
74
+ allowPartialColumnList: true,
75
+ anchors: Object.fromEntries(anchorSpecs.map((spec, i) => [`anchor_${i}`, spec]))
76
+ });
77
+ try {
78
+ return new Set(collection.findColumns({ mode: "enrichment" }).map((m) => m.column.id));
79
+ } finally {
80
+ collection.dispose();
81
+ }
82
+ } catch {
83
+ return;
84
+ }
61
85
  }
62
86
  //#endregion
63
87
  export { getAllRelatedColumns, getRelatedColumns };
@@ -1 +1 @@
1
- {"version":3,"file":"columns.js","names":[],"sources":["../../src/pframe_utils/columns.ts"],"sourcesContent":["import type { PColumn, PColumnSpec, PColumnLazy, PFrameDef } from \"@milaboratories/pl-model-common\";\nimport {\n getNormalizedAxesList,\n getAxisId,\n canonicalizeJson,\n isLinkerColumn,\n matchAxisId,\n isLabelColumn,\n} from \"@milaboratories/pl-model-common\";\nimport type { AxesVault } from \"./axes\";\nimport { enrichCompatible, getAvailableWithLinkersAxes } from \"./axes\";\nimport type { RenderCtxBase, PColumnDataUniversal } from \"../render\";\nimport { PColumnCollection } from \"../render\";\n\nexport function getAllRelatedColumns<A, U>(\n ctx: RenderCtxBase<A, U>,\n predicate: (spec: PColumnSpec) => boolean,\n): PFrameDef<PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>> {\n // if current block doesn't produce own columns then use all columns from result pool\n const columns = new PColumnCollection();\n columns.addColumnProvider(ctx.resultPool);\n const allColumns =\n columns.getColumns(predicate, {\n dontWaitAllData: true,\n overrideLabelAnnotation: false,\n }) ?? [];\n\n const allAxes: AxesVault = new Map(\n allColumns\n .flatMap((column) => getNormalizedAxesList(column.spec.axesSpec))\n .map((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return [canonicalizeJson(axisId), axisSpec];\n }),\n );\n\n // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match\n const extendedColumns = enrichCompatible(allAxes, allColumns);\n\n return extendedColumns;\n}\n\nexport function getRelatedColumns<A, U>(\n ctx: RenderCtxBase<A, U>,\n {\n columns: rootColumns,\n predicate,\n }: {\n columns: PColumn<PColumnDataUniversal>[];\n predicate: (spec: PColumnSpec) => boolean;\n },\n): PFrameDef<PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>> {\n // if current block has its own columns then take from result pool only compatible with them\n const columns = new PColumnCollection();\n columns.addColumnProvider(ctx.resultPool);\n columns.addColumns(rootColumns);\n\n // all possible axes from block columns\n const blockAxes: AxesVault = new Map();\n // axes from block columns and compatible result pool columns\n const allAxes: AxesVault = new Map();\n for (const c of rootColumns) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n blockAxes.set(canonicalizeJson(aid), spec);\n allAxes.set(canonicalizeJson(aid), spec);\n }\n }\n\n // all linker columns always go to pFrame - even it's impossible to use some of them they all are hidden\n const linkerColumns =\n columns.getColumns((spec) => predicate(spec) && isLinkerColumn(spec), {\n dontWaitAllData: true,\n }) ?? [];\n const availableWithLinkersAxes = getAvailableWithLinkersAxes(linkerColumns, blockAxes);\n\n // all possible axes from connected linkers\n for (const item of availableWithLinkersAxes) {\n blockAxes.set(...item);\n allAxes.set(...item);\n }\n\n const blockAxesArr = Array.from(blockAxes.values());\n // all compatible with block columns but without label columns\n let compatibleWithoutLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return blockAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => !isLabelColumn(column.spec));\n\n // extend axes set for label columns request\n for (const c of compatibleWithoutLabels) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n allAxes.set(canonicalizeJson(aid), spec);\n }\n }\n\n const allAxesArr = Array.from(allAxes.values());\n // extend allowed columns - add columns thad doesn't have axes from block, but have all axes in 'allAxes' list (that means all axes from linkers or from 'hanging' of other selected columns)\n compatibleWithoutLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.every((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => !isLabelColumn(column.spec));\n\n // label columns must be compatible with full set of axes - block axes and axes from compatible columns from result pool\n const compatibleLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => isLabelColumn(column.spec));\n\n const compatible = [...compatibleWithoutLabels, ...compatibleLabels];\n\n // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match\n const extendedColumns = enrichCompatible(blockAxes, compatible);\n\n return extendedColumns;\n}\n"],"mappings":";;;;;AAcA,SAAgB,qBACd,KACA,WAC0F;CAE1F,MAAM,UAAU,IAAI,mBAAmB;AACvC,SAAQ,kBAAkB,IAAI,WAAW;CACzC,MAAM,aACJ,QAAQ,WAAW,WAAW;EAC5B,iBAAiB;EACjB,yBAAyB;EAC1B,CAAC,IAAI,EAAE;AAcV,QAFwB,iBAVG,IAAI,IAC7B,WACG,SAAS,WAAW,sBAAsB,OAAO,KAAK,SAAS,CAAC,CAChE,KAAK,aAAa;AAEjB,SAAO,CAAC,iBADO,UAAU,SAAS,CACF,EAAE,SAAS;GAC3C,CACL,EAGiD,WAAW;;AAK/D,SAAgB,kBACd,KACA,EACE,SAAS,aACT,aAKwF;CAE1F,MAAM,UAAU,IAAI,mBAAmB;AACvC,SAAQ,kBAAkB,IAAI,WAAW;AACzC,SAAQ,WAAW,YAAY;CAG/B,MAAM,4BAAuB,IAAI,KAAK;CAEtC,MAAM,0BAAqB,IAAI,KAAK;AACpC,MAAK,MAAM,KAAK,YACd,MAAK,MAAM,QAAQ,sBAAsB,EAAE,KAAK,SAAS,EAAE;EACzD,MAAM,MAAM,UAAU,KAAK;AAC3B,YAAU,IAAI,iBAAiB,IAAI,EAAE,KAAK;AAC1C,UAAQ,IAAI,iBAAiB,IAAI,EAAE,KAAK;;CAS5C,MAAM,2BAA2B,4BAH/B,QAAQ,YAAY,SAAS,UAAU,KAAK,IAAI,eAAe,KAAK,EAAE,EACpE,iBAAiB,MAClB,CAAC,IAAI,EAAE,EACkE,UAAU;AAGtF,MAAK,MAAM,QAAQ,0BAA0B;AAC3C,YAAU,IAAI,GAAG,KAAK;AACtB,UAAQ,IAAI,GAAG,KAAK;;CAGtB,MAAM,eAAe,MAAM,KAAK,UAAU,QAAQ,CAAC;CAEnD,IAAI,2BACF,QAAQ,YACL,SACC,UAAU,KAAK,IACf,KAAK,SAAS,MAAM,aAAa;EAC/B,MAAM,SAAS,UAAU,SAAS;AAClC,SAAO,aAAa,MAAM,qBACxB,YAAY,UAAU,iBAAiB,EAAE,OAAO,CACjD;GACD,EACJ;EAAE,iBAAiB;EAAM,yBAAyB;EAAO,CAC1D,IAAI,EAAE,EACP,QAAQ,WAAW,CAAC,cAAc,OAAO,KAAK,CAAC;AAGjD,MAAK,MAAM,KAAK,wBACd,MAAK,MAAM,QAAQ,sBAAsB,EAAE,KAAK,SAAS,EAAE;EACzD,MAAM,MAAM,UAAU,KAAK;AAC3B,UAAQ,IAAI,iBAAiB,IAAI,EAAE,KAAK;;CAI5C,MAAM,aAAa,MAAM,KAAK,QAAQ,QAAQ,CAAC;AAE/C,4BACE,QAAQ,YACL,SACC,UAAU,KAAK,IACf,KAAK,SAAS,OAAO,aAAa;EAChC,MAAM,SAAS,UAAU,SAAS;AAClC,SAAO,WAAW,MAAM,qBACtB,YAAY,UAAU,iBAAiB,EAAE,OAAO,CACjD;GACD,EACJ;EAAE,iBAAiB;EAAM,yBAAyB;EAAO,CAC1D,IAAI,EAAE,EACP,QAAQ,WAAW,CAAC,cAAc,OAAO,KAAK,CAAC;CAGjD,MAAM,oBACJ,QAAQ,YACL,SACC,UAAU,KAAK,IACf,KAAK,SAAS,MAAM,aAAa;EAC/B,MAAM,SAAS,UAAU,SAAS;AAClC,SAAO,WAAW,MAAM,qBACtB,YAAY,UAAU,iBAAiB,EAAE,OAAO,CACjD;GACD,EACJ;EAAE,iBAAiB;EAAM,yBAAyB;EAAO,CAC1D,IAAI,EAAE,EACP,QAAQ,WAAW,cAAc,OAAO,KAAK,CAAC;AAOhD,QAFwB,iBAAiB,WAHtB,CAAC,GAAG,yBAAyB,GAAG,iBAAiB,CAGL"}
1
+ {"version":3,"file":"columns.js","names":[],"sources":["../../src/pframe_utils/columns.ts"],"sourcesContent":["import type {\n PColumn,\n PColumnSpec,\n PColumnLazy,\n PFrameDef,\n PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n getNormalizedAxesList,\n getAxisId,\n canonicalizeJson,\n isLinkerColumn,\n matchAxisId,\n isLabelColumn,\n} from \"@milaboratories/pl-model-common\";\nimport type { AxesVault } from \"./axes\";\nimport { enrichCompatible, getAvailableWithLinkersAxes } from \"./axes\";\nimport type { RenderCtxBase, PColumnDataUniversal } from \"../render\";\nimport { PColumnCollection } from \"../render\";\nimport { ColumnCollectionBuilder } from \"../columns\";\nimport { collectCtxColumnSnapshotProviders } from \"../columns/ctx_column_sources\";\n\nexport function getAllRelatedColumns<A, U>(\n ctx: RenderCtxBase<A, U>,\n predicate: (spec: PColumnSpec) => boolean,\n): PFrameDef<PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>> {\n // if current block doesn't produce own columns then use all columns from result pool\n const columns = new PColumnCollection();\n columns.addColumnProvider(ctx.resultPool);\n const allColumns =\n columns.getColumns(predicate, {\n dontWaitAllData: true,\n overrideLabelAnnotation: false,\n }) ?? [];\n\n const allAxes: AxesVault = new Map(\n allColumns\n .flatMap((column) => getNormalizedAxesList(column.spec.axesSpec))\n .map((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return [canonicalizeJson(axisId), axisSpec];\n }),\n );\n\n // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match\n const extendedColumns = enrichCompatible(allAxes, allColumns);\n\n return extendedColumns;\n}\n\nexport function getRelatedColumns<A, U>(\n ctx: RenderCtxBase<A, U>,\n {\n columns: rootColumns,\n predicate,\n }: {\n columns: PColumn<PColumnDataUniversal>[];\n predicate: (spec: PColumnSpec) => boolean;\n },\n): PFrameDef<PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>> {\n // if current block has its own columns then take from result pool only compatible with them\n const columns = new PColumnCollection();\n columns.addColumnProvider(ctx.resultPool);\n columns.addColumns(rootColumns);\n\n // all possible axes from block columns\n const blockAxes: AxesVault = new Map();\n // axes from block columns and compatible result pool columns\n const allAxes: AxesVault = new Map();\n for (const c of rootColumns) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n blockAxes.set(canonicalizeJson(aid), spec);\n allAxes.set(canonicalizeJson(aid), spec);\n }\n }\n\n // all linker columns always go to pFrame - even it's impossible to use some of them they all are hidden\n const linkerColumns =\n columns.getColumns((spec) => predicate(spec) && isLinkerColumn(spec), {\n dontWaitAllData: true,\n }) ?? [];\n const availableWithLinkersAxes = getAvailableWithLinkersAxes(linkerColumns, blockAxes);\n\n // all possible axes from connected linkers\n for (const item of availableWithLinkersAxes) {\n blockAxes.set(...item);\n allAxes.set(...item);\n }\n\n const blockAxesArr = Array.from(blockAxes.values());\n // all compatible with block columns but without label columns\n let compatibleWithoutLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return blockAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => !isLabelColumn(column.spec));\n\n // extend axes set for label columns request\n for (const c of compatibleWithoutLabels) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n allAxes.set(canonicalizeJson(aid), spec);\n }\n }\n\n const allAxesArr = Array.from(allAxes.values());\n // extend allowed columns - add columns thad doesn't have axes from block, but have all axes in 'allAxes' list (that means all axes from linkers or from 'hanging' of other selected columns)\n compatibleWithoutLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.every((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => !isLabelColumn(column.spec));\n\n // label columns must be compatible with full set of axes - block axes and axes from compatible columns from result pool\n const compatibleLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => isLabelColumn(column.spec));\n\n const compatible = [...compatibleWithoutLabels, ...compatibleLabels];\n\n // Drop result-pool columns that share an axis with the block but cannot join it.\n const integrableIds = discoverIntegrableColumnIds(ctx, rootColumns);\n const rootIds = new Set(rootColumns.map((c) => c.id));\n const connected = compatible.filter(\n (c) => rootIds.has(c.id) || isLinkerColumn(c.spec) || (integrableIds?.has(c.id) ?? true),\n );\n\n // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match\n const extendedColumns = enrichCompatible(blockAxes, connected);\n\n return extendedColumns;\n}\n\n/** Column ids that discovery confirms integrate with the block, or `undefined` when it can't decide. */\nfunction discoverIntegrableColumnIds<A, U>(\n ctx: RenderCtxBase<A, U>,\n rootColumns: PColumn<PColumnDataUniversal>[],\n): Set<PObjectId> | undefined {\n const anchorSpecs = Array.from(\n new Map(rootColumns.map((c) => [canonicalizeJson(c.spec), c.spec])).values(),\n );\n if (anchorSpecs.length === 0) return undefined;\n\n try {\n const collection = new ColumnCollectionBuilder()\n .addSources(collectCtxColumnSnapshotProviders(ctx))\n .build({\n allowPartialColumnList: true,\n anchors: Object.fromEntries(anchorSpecs.map((spec, i) => [`anchor_${i}`, spec])),\n });\n try {\n return new Set(collection.findColumns({ mode: \"enrichment\" }).map((m) => m.column.id));\n } finally {\n collection.dispose();\n }\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platforma-sdk/model",
3
- "version": "1.79.3",
3
+ "version": "1.79.14",
4
4
  "description": "Platforma.bio SDK / Block Model",
5
5
  "files": [
6
6
  "./dist/**/*",
@@ -30,22 +30,22 @@
30
30
  "fast-json-patch": "^3.1.1",
31
31
  "utility-types": "^3.11.0",
32
32
  "zod": "~3.25.76",
33
- "@milaboratories/pl-model-common": "1.46.1",
34
- "@milaboratories/pl-model-middle-layer": "1.30.5",
35
- "@milaboratories/ptabler-expression-js": "1.2.30",
36
33
  "@milaboratories/helpers": "1.14.2",
37
- "@milaboratories/pl-error-like": "1.12.10"
34
+ "@milaboratories/pl-error-like": "1.12.10",
35
+ "@milaboratories/pl-model-common": "1.46.1",
36
+ "@milaboratories/pl-model-middle-layer": "1.30.6",
37
+ "@milaboratories/ptabler-expression-js": "1.2.30"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@vitest/coverage-istanbul": "^4.1.3",
41
41
  "fast-json-patch": "^3.1.1",
42
42
  "typescript": "~5.9.3",
43
43
  "vitest": "^4.1.3",
44
+ "@milaboratories/ts-builder": "1.5.2",
45
+ "@milaboratories/pf-driver": "1.7.11",
46
+ "@milaboratories/pf-spec-driver": "1.4.13",
44
47
  "@milaboratories/build-configs": "2.0.0",
45
- "@milaboratories/pf-driver": "1.7.9",
46
- "@milaboratories/ts-builder": "1.5.0",
47
- "@milaboratories/ts-configs": "1.2.3",
48
- "@milaboratories/pf-spec-driver": "1.4.11"
48
+ "@milaboratories/ts-configs": "1.2.3"
49
49
  },
50
50
  "scripts": {
51
51
  "build": "ts-builder build --target node",
@@ -1,4 +1,10 @@
1
- import type { PColumn, PColumnSpec, PColumnLazy, PFrameDef } from "@milaboratories/pl-model-common";
1
+ import type {
2
+ PColumn,
3
+ PColumnSpec,
4
+ PColumnLazy,
5
+ PFrameDef,
6
+ PObjectId,
7
+ } from "@milaboratories/pl-model-common";
2
8
  import {
3
9
  getNormalizedAxesList,
4
10
  getAxisId,
@@ -11,6 +17,8 @@ import type { AxesVault } from "./axes";
11
17
  import { enrichCompatible, getAvailableWithLinkersAxes } from "./axes";
12
18
  import type { RenderCtxBase, PColumnDataUniversal } from "../render";
13
19
  import { PColumnCollection } from "../render";
20
+ import { ColumnCollectionBuilder } from "../columns";
21
+ import { collectCtxColumnSnapshotProviders } from "../columns/ctx_column_sources";
14
22
 
15
23
  export function getAllRelatedColumns<A, U>(
16
24
  ctx: RenderCtxBase<A, U>,
@@ -137,8 +145,42 @@ export function getRelatedColumns<A, U>(
137
145
 
138
146
  const compatible = [...compatibleWithoutLabels, ...compatibleLabels];
139
147
 
148
+ // Drop result-pool columns that share an axis with the block but cannot join it.
149
+ const integrableIds = discoverIntegrableColumnIds(ctx, rootColumns);
150
+ const rootIds = new Set(rootColumns.map((c) => c.id));
151
+ const connected = compatible.filter(
152
+ (c) => rootIds.has(c.id) || isLinkerColumn(c.spec) || (integrableIds?.has(c.id) ?? true),
153
+ );
154
+
140
155
  // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match
141
- const extendedColumns = enrichCompatible(blockAxes, compatible);
156
+ const extendedColumns = enrichCompatible(blockAxes, connected);
142
157
 
143
158
  return extendedColumns;
144
159
  }
160
+
161
+ /** Column ids that discovery confirms integrate with the block, or `undefined` when it can't decide. */
162
+ function discoverIntegrableColumnIds<A, U>(
163
+ ctx: RenderCtxBase<A, U>,
164
+ rootColumns: PColumn<PColumnDataUniversal>[],
165
+ ): Set<PObjectId> | undefined {
166
+ const anchorSpecs = Array.from(
167
+ new Map(rootColumns.map((c) => [canonicalizeJson(c.spec), c.spec])).values(),
168
+ );
169
+ if (anchorSpecs.length === 0) return undefined;
170
+
171
+ try {
172
+ const collection = new ColumnCollectionBuilder()
173
+ .addSources(collectCtxColumnSnapshotProviders(ctx))
174
+ .build({
175
+ allowPartialColumnList: true,
176
+ anchors: Object.fromEntries(anchorSpecs.map((spec, i) => [`anchor_${i}`, spec])),
177
+ });
178
+ try {
179
+ return new Set(collection.findColumns({ mode: "enrichment" }).map((m) => m.column.id));
180
+ } finally {
181
+ collection.dispose();
182
+ }
183
+ } catch {
184
+ return undefined;
185
+ }
186
+ }