@platforma-sdk/model 1.79.27 → 1.80.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/block_model.d.ts +2 -0
- package/dist/block_model.d.ts.map +1 -1
- package/dist/columns/column.cjs +28 -0
- package/dist/columns/column.cjs.map +1 -0
- package/dist/columns/column.d.ts +30 -0
- package/dist/columns/column.d.ts.map +1 -0
- package/dist/columns/column.js +27 -0
- package/dist/columns/column.js.map +1 -0
- package/dist/columns/column_lazy.cjs +248 -0
- package/dist/columns/column_lazy.cjs.map +1 -0
- package/dist/columns/column_lazy.d.ts +137 -0
- package/dist/columns/column_lazy.d.ts.map +1 -0
- package/dist/columns/column_lazy.js +245 -0
- package/dist/columns/column_lazy.js.map +1 -0
- package/dist/columns/column_providers/index.cjs +62 -0
- package/dist/columns/column_providers/index.cjs.map +1 -0
- package/dist/columns/column_providers/index.d.ts +30 -0
- package/dist/columns/column_providers/index.d.ts.map +1 -0
- package/dist/columns/column_providers/index.js +53 -0
- package/dist/columns/column_providers/index.js.map +1 -0
- package/dist/columns/column_providers/providers.cjs +123 -0
- package/dist/columns/column_providers/providers.cjs.map +1 -0
- package/dist/columns/column_providers/providers.d.ts +75 -0
- package/dist/columns/column_providers/providers.d.ts.map +1 -0
- package/dist/columns/column_providers/providers.js +118 -0
- package/dist/columns/column_providers/providers.js.map +1 -0
- package/dist/columns/column_providers/types.d.ts +23 -0
- package/dist/columns/column_providers/types.d.ts.map +1 -0
- package/dist/columns/column_recipes/column_discovered_recipe.cjs +180 -0
- package/dist/columns/column_recipes/column_discovered_recipe.cjs.map +1 -0
- package/dist/columns/column_recipes/column_discovered_recipe.d.ts +120 -0
- package/dist/columns/column_recipes/column_discovered_recipe.d.ts.map +1 -0
- package/dist/columns/column_recipes/column_discovered_recipe.js +180 -0
- package/dist/columns/column_recipes/column_discovered_recipe.js.map +1 -0
- package/dist/columns/column_recipes/column_filtered_recipe.cjs +133 -0
- package/dist/columns/column_recipes/column_filtered_recipe.cjs.map +1 -0
- package/dist/columns/column_recipes/column_filtered_recipe.d.ts +75 -0
- package/dist/columns/column_recipes/column_filtered_recipe.d.ts.map +1 -0
- package/dist/columns/column_recipes/column_filtered_recipe.js +133 -0
- package/dist/columns/column_recipes/column_filtered_recipe.js.map +1 -0
- package/dist/columns/column_recipes/column_overrided_recipe.cjs +101 -0
- package/dist/columns/column_recipes/column_overrided_recipe.cjs.map +1 -0
- package/dist/columns/column_recipes/column_overrided_recipe.d.ts +73 -0
- package/dist/columns/column_recipes/column_overrided_recipe.d.ts.map +1 -0
- package/dist/columns/column_recipes/column_overrided_recipe.js +101 -0
- package/dist/columns/column_recipes/column_overrided_recipe.js.map +1 -0
- package/dist/columns/column_recipes/index.cjs +72 -0
- package/dist/columns/column_recipes/index.cjs.map +1 -0
- package/dist/columns/column_recipes/index.d.ts +52 -0
- package/dist/columns/column_recipes/index.d.ts.map +1 -0
- package/dist/columns/column_recipes/index.js +68 -0
- package/dist/columns/column_recipes/index.js.map +1 -0
- package/dist/columns/column_recipes/leaf_rebrand.cjs +22 -0
- package/dist/columns/column_recipes/leaf_rebrand.cjs.map +1 -0
- package/dist/columns/column_recipes/leaf_rebrand.js +22 -0
- package/dist/columns/column_recipes/leaf_rebrand.js.map +1 -0
- package/dist/columns/column_recipes/types.d.ts +101 -0
- package/dist/columns/column_recipes/types.d.ts.map +1 -0
- package/dist/columns/columns_collection.cjs +124 -0
- package/dist/columns/columns_collection.cjs.map +1 -0
- package/dist/columns/columns_collection.d.ts +64 -0
- package/dist/columns/columns_collection.d.ts.map +1 -0
- package/dist/columns/columns_collection.js +122 -0
- package/dist/columns/columns_collection.js.map +1 -0
- package/dist/columns/derive_axis_values_labels.cjs +76 -0
- package/dist/columns/derive_axis_values_labels.cjs.map +1 -0
- package/dist/columns/derive_axis_values_labels.d.ts +30 -0
- package/dist/columns/derive_axis_values_labels.d.ts.map +1 -0
- package/dist/columns/derive_axis_values_labels.js +76 -0
- package/dist/columns/derive_axis_values_labels.js.map +1 -0
- package/dist/columns/expand_by_partition.cjs +53 -56
- package/dist/columns/expand_by_partition.cjs.map +1 -1
- package/dist/columns/expand_by_partition.d.ts +22 -18
- package/dist/columns/expand_by_partition.d.ts.map +1 -1
- package/dist/columns/expand_by_partition.js +55 -58
- package/dist/columns/expand_by_partition.js.map +1 -1
- package/dist/columns/index.cjs +44 -18
- package/dist/columns/index.d.ts +15 -7
- package/dist/columns/index.js +12 -6
- package/dist/columns/utils.cjs +186 -0
- package/dist/columns/utils.cjs.map +1 -0
- package/dist/columns/utils.d.ts +96 -0
- package/dist/columns/utils.d.ts.map +1 -0
- package/dist/columns/utils.js +179 -0
- package/dist/columns/utils.js.map +1 -0
- package/dist/components/PFrameForGraphs.cjs +1 -0
- package/dist/components/PFrameForGraphs.cjs.map +1 -1
- package/dist/components/PFrameForGraphs.d.ts +1 -1
- package/dist/components/PFrameForGraphs.d.ts.map +1 -1
- package/dist/components/PFrameForGraphs.js +1 -0
- package/dist/components/PFrameForGraphs.js.map +1 -1
- package/dist/components/PlDataTable/columnResolver.cjs +28 -0
- package/dist/components/PlDataTable/columnResolver.cjs.map +1 -0
- package/dist/components/PlDataTable/columnResolver.js +28 -0
- package/dist/components/PlDataTable/columnResolver.js.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs +4 -2
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js +4 -2
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs +20 -25
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js +20 -25
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs +58 -26
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js +60 -28
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs +224 -194
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +13 -16
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js +228 -198
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs +40 -98
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts +17 -8
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js +40 -98
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/index.cjs +1 -1
- package/dist/components/PlDataTable/createPlDataTable/index.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/index.d.ts +2 -2
- package/dist/components/PlDataTable/createPlDataTable/index.js +2 -2
- package/dist/components/PlDataTable/createPlDataTable/index.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.cjs +51 -169
- package/dist/components/PlDataTable/createPlDataTable/utils.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.d.ts +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.js +52 -166
- package/dist/components/PlDataTable/createPlDataTable/utils.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTableSheet.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTableSheet.d.ts +1 -1
- package/dist/components/PlDataTable/createPlDataTableSheet.js.map +1 -1
- package/dist/components/PlDataTable/index.cjs +1 -1
- package/dist/components/PlDataTable/index.d.ts +4 -4
- package/dist/components/PlDataTable/index.js +2 -2
- package/dist/components/PlDataTable/labels.cjs +0 -1
- package/dist/components/PlDataTable/labels.cjs.map +1 -1
- package/dist/components/PlDataTable/labels.js +0 -1
- package/dist/components/PlDataTable/labels.js.map +1 -1
- package/dist/components/PlDataTable/state-migration.cjs +107 -10
- package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
- package/dist/components/PlDataTable/state-migration.d.ts +5 -4
- package/dist/components/PlDataTable/state-migration.d.ts.map +1 -1
- package/dist/components/PlDataTable/state-migration.js +107 -10
- package/dist/components/PlDataTable/state-migration.js.map +1 -1
- package/dist/components/PlDataTable/typesV7.d.ts +1 -36
- package/dist/components/PlDataTable/typesV7.d.ts.map +1 -1
- package/dist/components/PlDataTable/typesV8.d.ts +123 -0
- package/dist/components/PlDataTable/typesV8.d.ts.map +1 -0
- package/dist/components/PlDatasetSelector/build_dataset_options.cjs +27 -34
- package/dist/components/PlDatasetSelector/build_dataset_options.cjs.map +1 -1
- package/dist/components/PlDatasetSelector/build_dataset_options.d.ts.map +1 -1
- package/dist/components/PlDatasetSelector/build_dataset_options.js +27 -34
- package/dist/components/PlDatasetSelector/build_dataset_options.js.map +1 -1
- package/dist/components/PlDatasetSelector/enrichment_discovery.cjs +28 -33
- package/dist/components/PlDatasetSelector/enrichment_discovery.cjs.map +1 -1
- package/dist/components/PlDatasetSelector/enrichment_discovery.js +29 -34
- package/dist/components/PlDatasetSelector/enrichment_discovery.js.map +1 -1
- package/dist/components/PlDatasetSelector/filter_discovery.cjs +27 -17
- package/dist/components/PlDatasetSelector/filter_discovery.cjs.map +1 -1
- package/dist/components/PlDatasetSelector/filter_discovery.d.ts +24 -10
- package/dist/components/PlDatasetSelector/filter_discovery.d.ts.map +1 -1
- package/dist/components/PlDatasetSelector/filter_discovery.js +28 -18
- package/dist/components/PlDatasetSelector/filter_discovery.js.map +1 -1
- package/dist/components/PlDatasetSelector/index.d.ts +2 -2
- package/dist/components/index.cjs +1 -1
- package/dist/components/index.d.ts +5 -5
- package/dist/components/index.js +2 -2
- package/dist/filters/converters/filterToQuery.cjs +5 -6
- package/dist/filters/converters/filterToQuery.cjs.map +1 -1
- package/dist/filters/converters/filterToQuery.d.ts +12 -3
- package/dist/filters/converters/filterToQuery.d.ts.map +1 -1
- package/dist/filters/converters/filterToQuery.js +5 -6
- package/dist/filters/converters/filterToQuery.js.map +1 -1
- package/dist/filters/converters/index.d.ts +2 -2
- package/dist/filters/index.d.ts +2 -2
- package/dist/index.cjs +64 -35
- package/dist/index.d.ts +23 -15
- package/dist/index.js +15 -9
- package/dist/labels/derive_distinct_labels.cjs.map +1 -1
- package/dist/labels/derive_distinct_labels.d.ts +1 -2
- package/dist/labels/derive_distinct_labels.d.ts.map +1 -1
- package/dist/labels/derive_distinct_labels.js.map +1 -1
- package/dist/labels/derive_distinct_tooltips.cjs +1 -1
- package/dist/labels/derive_distinct_tooltips.cjs.map +1 -1
- package/dist/labels/derive_distinct_tooltips.d.ts +6 -3
- package/dist/labels/derive_distinct_tooltips.d.ts.map +1 -1
- package/dist/labels/derive_distinct_tooltips.js +1 -1
- package/dist/labels/derive_distinct_tooltips.js.map +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.js +1 -1
- package/dist/pframe_utils/axes.cjs.map +1 -1
- package/dist/pframe_utils/axes.d.ts +2 -2
- package/dist/pframe_utils/axes.d.ts.map +1 -1
- package/dist/pframe_utils/axes.js.map +1 -1
- package/dist/pframe_utils/columns.cjs +6 -10
- package/dist/pframe_utils/columns.cjs.map +1 -1
- package/dist/pframe_utils/columns.d.ts +4 -4
- package/dist/pframe_utils/columns.d.ts.map +1 -1
- package/dist/pframe_utils/columns.js +7 -11
- package/dist/pframe_utils/columns.js.map +1 -1
- package/dist/pframe_utils/index.cjs.map +1 -1
- package/dist/pframe_utils/index.d.ts +1 -1
- package/dist/pframe_utils/index.d.ts.map +1 -1
- package/dist/pframe_utils/index.js.map +1 -1
- package/dist/render/accessor.cjs +15 -16
- package/dist/render/accessor.cjs.map +1 -1
- package/dist/render/accessor.d.ts +7 -10
- package/dist/render/accessor.d.ts.map +1 -1
- package/dist/render/accessor.js +15 -16
- package/dist/render/accessor.js.map +1 -1
- package/dist/render/api.cjs +34 -36
- package/dist/render/api.cjs.map +1 -1
- package/dist/render/api.d.ts +30 -20
- package/dist/render/api.d.ts.map +1 -1
- package/dist/render/api.js +35 -38
- package/dist/render/api.js.map +1 -1
- package/dist/render/index.cjs +4 -0
- package/dist/render/index.d.ts +4 -4
- package/dist/render/index.js +3 -2
- package/dist/render/internal.cjs +3 -2
- package/dist/render/internal.cjs.map +1 -1
- package/dist/render/internal.d.ts +17 -9
- package/dist/render/internal.d.ts.map +1 -1
- package/dist/render/internal.js +3 -2
- package/dist/render/internal.js.map +1 -1
- package/dist/render/util/axis_filtering.cjs.map +1 -1
- package/dist/render/util/axis_filtering.js.map +1 -1
- package/dist/render/util/column_collection.cjs +6 -4
- package/dist/render/util/column_collection.cjs.map +1 -1
- package/dist/render/util/column_collection.d.ts +9 -9
- package/dist/render/util/column_collection.d.ts.map +1 -1
- package/dist/render/util/column_collection.js +6 -4
- package/dist/render/util/column_collection.js.map +1 -1
- package/dist/render/util/index.d.ts +2 -2
- package/dist/render/util/pcolumn_data.cjs +1 -1
- package/dist/render/util/pcolumn_data.cjs.map +1 -1
- package/dist/render/util/pcolumn_data.d.ts +3 -3
- package/dist/render/util/pcolumn_data.d.ts.map +1 -1
- package/dist/render/util/pcolumn_data.js +1 -1
- package/dist/render/util/pcolumn_data.js.map +1 -1
- package/dist/services/block_services.cjs +2 -1
- package/dist/services/block_services.cjs.map +1 -1
- package/dist/services/block_services.d.ts +1 -0
- package/dist/services/block_services.d.ts.map +1 -1
- package/dist/services/block_services.js +2 -1
- package/dist/services/block_services.js.map +1 -1
- package/dist/services/get_services.cjs +2 -2
- package/dist/services/get_services.cjs.map +1 -1
- package/dist/services/get_services.d.ts +4 -1
- package/dist/services/get_services.d.ts.map +1 -1
- package/dist/services/get_services.js +2 -2
- package/dist/services/get_services.js.map +1 -1
- package/package.json +10 -8
- package/src/columns/__test_helpers__/collection_driver.ts +197 -0
- package/src/columns/__test_helpers__/stub_registry.ts +134 -0
- package/src/columns/column.ts +46 -0
- package/src/columns/column_lazy.test.ts +201 -0
- package/src/columns/column_lazy.ts +311 -0
- package/src/columns/column_providers/index.ts +78 -0
- package/src/columns/column_providers/providers.ts +193 -0
- package/src/columns/column_providers/types.ts +24 -0
- package/src/columns/column_recipes/column_discovered_recipe.ts +231 -0
- package/src/columns/column_recipes/column_filtered_recipe.ts +184 -0
- package/src/columns/column_recipes/column_overrided_recipe.ts +146 -0
- package/src/columns/column_recipes/column_recipes.test.ts +681 -0
- package/src/columns/column_recipes/index.ts +127 -0
- package/src/columns/column_recipes/leaf_rebrand.ts +28 -0
- package/src/columns/column_recipes/types.ts +113 -0
- package/src/columns/columns_collection.test.ts +164 -0
- package/src/columns/columns_collection.ts +170 -0
- package/src/columns/derive_axis_values_labels.ts +98 -0
- package/src/columns/expand_by_partition.test.ts +146 -110
- package/src/columns/expand_by_partition.ts +72 -84
- package/src/columns/index.ts +7 -5
- package/src/columns/utils.test.ts +249 -0
- package/src/columns/utils.ts +226 -0
- package/src/components/PFrameForGraphs.ts +3 -1
- package/src/components/PlAnnotations/filters_ui.test.ts +46 -47
- package/src/components/PlDataTable/columnResolver.test.ts +122 -0
- package/src/components/PlDataTable/columnResolver.ts +57 -0
- package/src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts +9 -9
- package/src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts +31 -63
- package/src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts +85 -58
- package/src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts +316 -354
- package/src/components/PlDataTable/createPlDataTable/discoverColumns.ts +48 -144
- package/src/components/PlDataTable/createPlDataTable/index.ts +2 -2
- package/src/components/PlDataTable/createPlDataTable/utils.test.ts +60 -69
- package/src/components/PlDataTable/createPlDataTable/utils.ts +65 -173
- package/src/components/PlDataTable/createPlDataTableSheet.ts +1 -1
- package/src/components/PlDataTable/index.ts +4 -2
- package/src/components/PlDataTable/labels.ts +4 -33
- package/src/components/PlDataTable/state-migration.ts +151 -22
- package/src/components/PlDataTable/typesV8.ts +188 -0
- package/src/components/PlDatasetSelector/build_dataset_options.ts +35 -60
- package/src/components/PlDatasetSelector/enrichment_discovery.ts +65 -61
- package/src/components/PlDatasetSelector/filter_discovery.test.ts +110 -72
- package/src/components/PlDatasetSelector/filter_discovery.ts +51 -31
- package/src/filters/converters/filterToQuery.test.ts +15 -8
- package/src/filters/converters/filterToQuery.ts +22 -9
- package/src/filters/converters/filterUiToExpressionImpl.test.ts +35 -36
- package/src/labels/derive_distinct_labels.ts +1 -1
- package/src/labels/derive_distinct_tooltips.test.ts +7 -4
- package/src/labels/derive_distinct_tooltips.ts +3 -3
- package/src/pframe_utils/axes.ts +2 -2
- package/src/pframe_utils/columns.ts +14 -23
- package/src/pframe_utils/index.ts +1 -1
- package/src/render/accessor.ts +35 -38
- package/src/render/api.ts +45 -61
- package/src/render/index.ts +2 -1
- package/src/render/internal.ts +43 -10
- package/src/render/util/axis_filtering.ts +0 -1
- package/src/render/util/column_collection.ts +17 -17
- package/src/render/util/pcolumn_data.ts +5 -9
- package/src/services/block_services.ts +1 -0
- package/src/services/get_services.ts +5 -2
- package/dist/columns/column_collection_builder.cjs +0 -241
- package/dist/columns/column_collection_builder.cjs.map +0 -1
- package/dist/columns/column_collection_builder.d.ts +0 -119
- package/dist/columns/column_collection_builder.d.ts.map +0 -1
- package/dist/columns/column_collection_builder.js +0 -241
- package/dist/columns/column_collection_builder.js.map +0 -1
- package/dist/columns/column_selector.cjs +0 -49
- package/dist/columns/column_selector.cjs.map +0 -1
- package/dist/columns/column_selector.d.ts +0 -33
- package/dist/columns/column_selector.d.ts.map +0 -1
- package/dist/columns/column_selector.js +0 -47
- package/dist/columns/column_selector.js.map +0 -1
- package/dist/columns/column_snapshot.cjs +0 -19
- package/dist/columns/column_snapshot.cjs.map +0 -1
- package/dist/columns/column_snapshot.d.ts +0 -39
- package/dist/columns/column_snapshot.d.ts.map +0 -1
- package/dist/columns/column_snapshot.js +0 -18
- package/dist/columns/column_snapshot.js.map +0 -1
- package/dist/columns/column_snapshot_provider.cjs +0 -137
- package/dist/columns/column_snapshot_provider.cjs.map +0 -1
- package/dist/columns/column_snapshot_provider.d.ts +0 -74
- package/dist/columns/column_snapshot_provider.d.ts.map +0 -1
- package/dist/columns/column_snapshot_provider.js +0 -133
- package/dist/columns/column_snapshot_provider.js.map +0 -1
- package/dist/columns/ctx_column_sources.cjs +0 -80
- package/dist/columns/ctx_column_sources.cjs.map +0 -1
- package/dist/columns/ctx_column_sources.d.ts +0 -30
- package/dist/columns/ctx_column_sources.d.ts.map +0 -1
- package/dist/columns/ctx_column_sources.js +0 -79
- package/dist/columns/ctx_column_sources.js.map +0 -1
- package/src/columns/column_collection_builder.test.ts +0 -484
- package/src/columns/column_collection_builder.ts +0 -485
- package/src/columns/column_selector.test.ts +0 -90
- package/src/columns/column_selector.ts +0 -100
- package/src/columns/column_snapshot.ts +0 -58
- package/src/columns/column_snapshot_provider.ts +0 -194
- package/src/columns/ctx_column_sources.ts +0 -99
package/dist/index.d.ts
CHANGED
|
@@ -21,17 +21,13 @@ import { CurrentSdkInfo, PlatformaSDKVersion, SdkInfo } from "./version.js";
|
|
|
21
21
|
import { BLOCK_SERVICE_FLAGS, BlockServiceFlags, blockServiceNames } from "./services/block_services.js";
|
|
22
22
|
import { BlockDefaultModelServices, BlockDefaultUiServices, ModelServices, ResolveModelServices, ResolveUiServices, UiServices } from "./services/service_resolve.js";
|
|
23
23
|
import { CommonFieldTraverseOps, CommonTraversalOps, FieldTraversalStep, FieldType, GetFieldStep, ResourceTraversalOps, ResourceType } from "./render/traversal_ops.js";
|
|
24
|
-
import { PColumnDataUniversal, internal_d_exports } from "./render/internal.js";
|
|
24
|
+
import { AccessorHandle, MainAccessorName, PColumnDataUniversal, StagingAccessorName, internal_d_exports } from "./render/internal.js";
|
|
25
25
|
import { ExtractFutureRefType, FutureRef } from "./render/future.js";
|
|
26
26
|
import { TreeNodeAccessor, ifDef } from "./render/accessor.js";
|
|
27
|
-
import { ColumnSelector, RelaxedAxisSelector, RelaxedColumnSelector, RelaxedRecord, RelaxedStringMatchers, StringMatcher, convertColumnSelectorToMultiColumnSelector, convertRelaxedAxisSelectorToMultiAxisSelector, convertRelaxedColumnSelectorToMultiColumnSelector } from "./columns/column_selector.js";
|
|
28
|
-
import { ColumnData, ColumnDataStatus, ColumnSnapshot, createColumnSnapshot, createReadyColumnData } from "./columns/column_snapshot.js";
|
|
29
|
-
import { ArrayColumnProvider, ColumnSnapshotProvider, ColumnSource, OutputColumnProvider, OutputColumnProviderOpts, SnapshotColumnProvider, isColumnSnapshotProvider, toColumnSnapshotProvider } from "./columns/column_snapshot_provider.js";
|
|
30
|
-
import { AnchorEntry, AnchoredBuildOptions, AnchoredColumnCollection, AnchoredFindColumnsOptions, BuildOptions, ColumnCollection, ColumnCollectionBuilder, ColumnMatch, ColumnVariant, FindColumnsOptions, MatchQualifications, MatchVariant, MatchingMode } from "./columns/column_collection_builder.js";
|
|
31
27
|
import { DeriveLabelsFormatters, DeriveLabelsOptions, Entry, LinkerStep, Trace, TraceEntry, deriveDistinctLabels } from "./labels/derive_distinct_labels.js";
|
|
32
28
|
import { deriveLabels } from "./render/util/label.js";
|
|
33
|
-
import { AxisLabelProvider, ColumnProvider, PColumnCollection, PColumnEntryUniversal, PColumnEntryWithLabel,
|
|
34
|
-
import { BlockRenderCtx, InferRenderFunctionReturn, PluginRenderCtx, RenderCtx, RenderCtxBase, RenderCtxLegacy, RenderFunction, RenderFunctionLegacy, ResultPool, UniversalColumnOption, UnwrapFutureRef } from "./render/api.js";
|
|
29
|
+
import { AxisLabelProvider, ColumnProvider, PColumnCollection, PColumnEntryUniversal, PColumnEntryWithLabel, PColumnUniversal, PColumnWithLabel } from "./render/util/column_collection.js";
|
|
30
|
+
import { BlockRenderCtx, InferRenderFunctionReturn, PluginRenderCtx, RenderCtx, RenderCtxBase, RenderCtxLegacy, RenderFunction, RenderFunctionLegacy, ResultPool, UniversalColumnOption, UnwrapFutureRef, finalizePColumnData } from "./render/api.js";
|
|
35
31
|
import { PColumnKeyList, PColumnResourceMapData, PColumnResourceMapEntry, RT_BINARY_PARTITIONED, RT_BINARY_SUPER_PARTITIONED, RT_JSON_PARTITIONED, RT_JSON_SUPER_PARTITIONED, RT_PARQUET_PARTITIONED, RT_PARQUET_SUPER_PARTITIONED, RT_RESOURCE_MAP, RT_RESOURCE_MAP_PARTITIONED, allPColumnsReady, convertOrParsePColumnData, getNumberOfRows, getPartitionKeysList, getUniquePartitionKeys, isPColumnReady, parsePColumnData, parseResourceMap } from "./render/util/pcolumn_data.js";
|
|
36
32
|
import { filterDataInfoEntries } from "./render/util/axis_filtering.js";
|
|
37
33
|
import { PluginConfig, PluginData, PluginDataModel, PluginDataModelBuilder, PluginDataModelVersions, PluginFactory, PluginInstance, PluginModel, PluginOutputs, PluginParams, PluginPublicOutputs, PublicOutputFieldDef } from "./plugin_model.js";
|
|
@@ -41,7 +37,7 @@ import { BlockModel } from "./block_model_legacy.js";
|
|
|
41
37
|
import { AxesVault, enrichCompatible, getAvailableWithLinkersAxes } from "./pframe_utils/axes.js";
|
|
42
38
|
import { createPFrameForGraphs, isHiddenFromGraphColumn, isHiddenFromUIColumn } from "./components/PFrameForGraphs.js";
|
|
43
39
|
import { AndFilter, AnnotationFilter, AnnotationMode, AnnotationScript, AnnotationScript2, AnnotationStep, IsNA, Log10, NotFilter, NumericalComparisonFilter, OrFilter, PatternFilter, PatternPredicate, PatternPredicateContainSubsequence, PatternPredicateEquals, SortedCumulativeSum, TransformedColumn, ValueRank } from "./components/PlAnnotations/filter.js";
|
|
44
|
-
import { filterSpecToSpecQueryExpr } from "./filters/converters/filterToQuery.js";
|
|
40
|
+
import { QueryColumnId, QueryColumnIdAxis, QueryColumnIdColumn, filterSpecToSpecQueryExpr } from "./filters/converters/filterToQuery.js";
|
|
45
41
|
import { FilterSpec, FilterSpecLeaf, FilterSpecNode, FilterSpecOfType, FilterSpecType, SimplifiedPColumnSpec, SimplifiedUniversalPColumnEntry } from "./filters/types.js";
|
|
46
42
|
import { convertFilterUiToExpressionImpl, convertFilterUiToExpressions } from "./filters/converters/filterUiToExpressionImpl.js";
|
|
47
43
|
import { distillFilterSpec } from "./filters/distill.js";
|
|
@@ -49,16 +45,28 @@ import { AnnotationSpec, AnnotationSpecUi, ExpressionSpec, FilterSpecUi } from "
|
|
|
49
45
|
import { convertFilterSpecsToExpressionSpecs } from "./annotations/converter.js";
|
|
50
46
|
import { AnnotationScriptUi, AnnotationStepUi, AnyForm, FilterUi, FilterUiOfType, FilterUiType, FormField, TypeField, TypeFieldRecord, TypeForm, TypeToLiteral, compileAnnotationScript, compileFilter, compileFilters, unreachable } from "./components/PlAnnotations/filters_ui.js";
|
|
51
47
|
import { DatasetOption, DatasetSelection, createDatasetSelection, isDatasetSelection } from "./components/PlDatasetSelector/dataset_selection.js";
|
|
52
|
-
import {
|
|
48
|
+
import { ColumnFieldStatus, ColumnRecipeId, ColumnResolutionStatus, SpecQuery } from "./columns/column_recipes/types.js";
|
|
49
|
+
import { ColumnAbsentError, ColumnLazy, ColumnLazyData, ColumnLazyId, ColumnLazyImpl, isColumnLazy } from "./columns/column_lazy.js";
|
|
50
|
+
import { ColumnDiscoveredRecipe } from "./columns/column_recipes/column_discovered_recipe.js";
|
|
51
|
+
import { ColumnFilteredRecipe } from "./columns/column_recipes/column_filtered_recipe.js";
|
|
52
|
+
import { Column, ColumnSource, isColumn } from "./columns/column.js";
|
|
53
|
+
import { ColumnOverriddenRecipe } from "./columns/column_recipes/column_overrided_recipe.js";
|
|
54
|
+
import { ColumnRecipe, isColumnRecipe } from "./columns/column_recipes/index.js";
|
|
55
|
+
import { AccessorColumnsProvider, AccessorColumnsProviderImpl, ArrayColumnsProvider, ColumnsProvider, ResultPoolColumnsProvider, ResultPoolColumnsProviderImpl } from "./columns/column_providers/providers.js";
|
|
56
|
+
import { ColumnsSource } from "./columns/column_providers/types.js";
|
|
57
|
+
import { _ctxProvidersCache, getCtxProviders, isColumnProvider, toColumnProvider } from "./columns/column_providers/index.js";
|
|
58
|
+
import { ExpandByPartitionOpts, SplitAxis, expandByPartition } from "./columns/expand_by_partition.js";
|
|
59
|
+
import { ColumnsCollection, ColumnsCollectionDeps, ColumnsCollectionImpl, ColumnsSourceShorthand, isColumnsCollection } from "./columns/columns_collection.js";
|
|
60
|
+
import { deriveAxisValuesLabels } from "./columns/derive_axis_values_labels.js";
|
|
61
|
+
import { ColumnOption, collectLinkerColumns, collectLinkerIds, deriveColumnOptions, getLeafColumnData, hasColumnData, hitQualifications, isLeafColumn, queriesQualifications } from "./columns/utils.js";
|
|
62
|
+
import { FilterMatchOptions, FindFilterColumnsOptions, buildRefMap, filterMatchesToOptions, findFilterColumns } from "./components/PlDatasetSelector/filter_discovery.js";
|
|
53
63
|
import { BuildDatasetOptions, buildDatasetOptions } from "./components/PlDatasetSelector/build_dataset_options.js";
|
|
54
|
-
import { PTableParamsV2, PlDataTableFilterMeta, PlDataTableFilterSpecLeaf, PlDataTableFilters, PlDataTableFiltersWithMeta, PlDataTableGridStateCore, PlDataTableModel, PlDataTableSheet, PlDataTableSheetState, PlDataTableStateV2CacheEntry, PlDataTableStateV2Normalized, PlTableColumnIdJson } from "./components/PlDataTable/
|
|
64
|
+
import { PTableParamsV2, PlDataTableAxisMeta, PlDataTableColumnMeta, PlDataTableColumnsMeta, PlDataTableFilterMeta, PlDataTableFilterSpecLeaf, PlDataTableFilters, PlDataTableFiltersWithMeta, PlDataTableGridStateCore, PlDataTableModel, PlDataTableSheet, PlDataTableSheetState, PlDataTableStateV2CacheEntry, PlDataTableStateV2Normalized, PlTableColumnIdJson } from "./components/PlDataTable/typesV8.js";
|
|
55
65
|
import { PlDataTableStateV2, createDefaultPTableParams, createPlDataTableStateV2, upgradePlDataTableStateV2 } from "./components/PlDataTable/state-migration.js";
|
|
56
66
|
import { createPlDataTableSheet } from "./components/PlDataTable/createPlDataTableSheet.js";
|
|
57
67
|
import { createPlDataTableV2 } from "./components/PlDataTable/createPlDataTable/createPlDataTableV2.js";
|
|
58
|
-
import {
|
|
59
|
-
import {
|
|
60
|
-
import { discoverTableColumnSnaphots } from "./components/PlDataTable/createPlDataTable/discoverColumns.js";
|
|
61
|
-
import { ColumnMatcher, ColumnOrderRule, ColumnVisibilityRule, ColumnsDisplayOptions, ColumnsSelectorConfig, createPlDataTableOptionsV3, createPlDataTableV3 } from "./components/PlDataTable/createPlDataTable/createPlDataTableV3.js";
|
|
68
|
+
import { discoverTableColumns } from "./components/PlDataTable/createPlDataTable/discoverColumns.js";
|
|
69
|
+
import { ColumnOrderRule, ColumnVisibilityRule, ColumnsDisplayOptions, ColumnsSelectorConfig, createPlDataTableOptionsV3, createPlDataTableV3 } from "./components/PlDataTable/createPlDataTable/createPlDataTableV3.js";
|
|
62
70
|
import { createPlDataTable } from "./components/PlDataTable/createPlDataTable/index.js";
|
|
63
71
|
import { getEffectiveVisibility, getOrderPriority, isColumnHidden, isColumnOptional } from "./components/PlDataTable/createPlDataTable/utils.js";
|
|
64
72
|
import { PTableKey, PlSelectionModel, createPlSelectionModel } from "./components/PlSelectionModel.js";
|
|
@@ -74,4 +82,4 @@ import { getService } from "./services/get_services.js";
|
|
|
74
82
|
import { getEnvironmentValue } from "./env_value.js";
|
|
75
83
|
export * from "@milaboratories/pl-model-common";
|
|
76
84
|
export * from "@milaboratories/pl-error-like";
|
|
77
|
-
export { ActAnd, ActExtractArchiveAndGetURL, ActFlatten, ActGetBlobContent, ActGetBlobContentAsJson, ActGetBlobContentAsString, ActGetDownloadedBlobContent, ActGetField, ActGetFromCtx, ActGetImmediate, ActGetLastLogs, ActGetLogHandle, ActGetOnDemandBlobContent, ActGetProgressLog, ActGetProgressLogWithInfo, ActGetResourceField, ActGetResourceValueAsJson, ActImportProgress, ActIsEmpty, ActIsolate, ActMakeArray, ActMakeObject, ActMapArrayValues, ActMapRecordValues, ActMapResourceFields, ActNot, ActOr, ActionResult,
|
|
85
|
+
export { AccessorColumnsProvider, AccessorColumnsProviderImpl, type AccessorHandle, ActAnd, ActExtractArchiveAndGetURL, ActFlatten, ActGetBlobContent, ActGetBlobContentAsJson, ActGetBlobContentAsString, ActGetDownloadedBlobContent, ActGetField, ActGetFromCtx, ActGetImmediate, ActGetLastLogs, ActGetLogHandle, ActGetOnDemandBlobContent, ActGetProgressLog, ActGetProgressLogWithInfo, ActGetResourceField, ActGetResourceValueAsJson, ActImportProgress, ActIsEmpty, ActIsolate, ActMakeArray, ActMakeObject, ActMapArrayValues, ActMapRecordValues, ActMapResourceFields, ActNot, ActOr, ActionResult, AndFilter, AnnotationFilter, AnnotationMode, AnnotationScript, AnnotationScript2, AnnotationScriptUi, AnnotationSpec, AnnotationSpecUi, AnnotationStep, AnnotationStepUi, AnyForm, Args, ArrayColumnsProvider, type AxesVault, AxisLabelProvider, BLOCK_SERVICE_FLAGS, BLOCK_STORAGE_FACADE_VERSION, BlockApiV1, BlockApiV2, BlockConfig, BlockConfigV3, BlockConfigV4, BlockDefaultModelServices, BlockDefaultUiServices, BlockModel, BlockModelInfo, BlockModelV3, BlockRenderCtx, BlockServiceFlags, BlockStatePatch, type BlockStorage, BlockStorageFacade, BlockStorageFacadeCallbacks, BlockStorageFacadeHandles, type BlockStorageSchemaVersion, BuildDatasetOptions, CancelSubscription, Cfg, CfgAnd, CfgBlobContent, CfgBlobContentAsJson, CfgBlobContentAsString, CfgDownloadedBlobContent, CfgExtractArchiveAndGetURL, CfgFlatten, CfgGetFromCtx, CfgGetJsonField, CfgGetResourceField, CfgImmediate, CfgImportProgress, CfgIsEmpty, CfgIsolate, CfgLastLogs, CfgLogHandle, CfgMakeArray, CfgMakeObject, CfgMapArrayValues, CfgMapRecordValues, CfgMapResourceFields, CfgNot, CfgOnDemandBlobContent, CfgOr, CfgProgressLog, CfgProgressLogWithInfo, CfgRenderingMode, CfgResourceValueAsJson, type Checked, Column, ColumnAbsentError, ColumnDiscoveredRecipe, type ColumnFieldStatus, ColumnFilteredRecipe, ColumnLazy, ColumnLazyData, ColumnLazyId, ColumnLazyImpl, ColumnOption, type ColumnOrderRule, ColumnOverriddenRecipe, ColumnProvider, ColumnRecipe, type ColumnRecipeId, type ColumnResolutionStatus, ColumnSource, type ColumnVisibilityRule, ColumnsCollection, ColumnsCollectionDeps, ColumnsCollectionImpl, type ColumnsDisplayOptions, ColumnsProvider, type ColumnsSelectorConfig, ColumnsSource, ColumnsSourceShorthand, CommonFieldTraverseOps, CommonTraversalOps, ConfAction, ConfigRenderLambda, ConfigRenderLambdaFlags, ConfigResult, CurrentSdkInfo, DataModel, DataModelBuilder, DatasetOption, DatasetSelection, DeriveHref, DeriveLabelsFormatters, DeriveLabelsOptions, Entry, ExpandByPartitionOpts, ExpressionSpec, ExtractAction, ExtractFunctionHandleReturn, type ExtractFutureRefType, FieldTraversalStep, FieldType, FilterMatchOptions, type FilterSpec, type FilterSpecLeaf, type FilterSpecNode, type FilterSpecOfType, type FilterSpecType, FilterSpecUi, FilterUi, FilterUiOfType, FilterUiType, FindFilterColumnsOptions, FormField, FutureRef, GetFieldStep, InferArgsType, InferBlockState, InferBlockStatePatch, InferDataType, InferFactoryData, InferFactoryModelServices, InferFactoryOutputs, InferFactoryParams, InferFactoryUiServices, InferHrefType, InferOutputType, InferOutputsFromConfigs, InferOutputsFromLambdas, InferOutputsType, InferPluginData, InferPluginHandle, InferPluginNames, InferPluginUiEntries, InferRenderFunctionReturn, InferUiState, InferVarTypeSafe, IsNA, It, internal_d_exports as JsRenderInternal, type DeriveLabelsOptions as LabelDerivationOps, LinkerStep, Log10, MainAccessorName, MainOutputs, type MigrateBlockStorageConfig, type MigrationFailure, type MigrationResult, type MigrationSuccess, type ModelServices, type MutateStoragePayload, NotFilter, NumericalComparisonFilter, OptionalPlResourceEntry, OrFilter, OutputError, PColumnCollection, type PColumnDataUniversal, PColumnEntryUniversal, PColumnEntryWithLabel, PColumnKeyList, PColumnPredicate, PColumnResourceMapData, PColumnResourceMapEntry, PColumnUniversal, PColumnWithLabel, PFrameImpl, POCExtractAction, PTableKey, type PTableParamsV2, type ParamsInput, Patch, PatternFilter, PatternPredicate, PatternPredicateContainSubsequence, PatternPredicateEquals, type PlDataTableAxisMeta, type PlDataTableColumnMeta, type PlDataTableColumnsMeta, type PlDataTableFilterMeta, type PlDataTableFilterSpecLeaf, type PlDataTableFilters, type PlDataTableFiltersWithMeta, type PlDataTableGridStateCore, type PlDataTableModel, type PlDataTableSheet, type PlDataTableSheetState, type PlDataTableStateV2, type PlDataTableStateV2CacheEntry, type PlDataTableStateV2Normalized, PlMultiSequenceAlignmentColorSchemeOption, PlMultiSequenceAlignmentModel, PlMultiSequenceAlignmentSettings, PlMultiSequenceAlignmentWidget, PlResourceEntry, PlSelectionModel, type PlTableColumnIdJson, Platforma, PlatformaApiVersion, PlatformaExtended, PlatformaFactory, PlatformaSDKVersion, PlatformaV1, PlatformaV2, PlatformaV3, type PluginConfig, type PluginData, PluginDataModel, PluginDataModelBuilder, type PluginDataModelVersions, type PluginFactory, PluginFactoryLike, PluginHandle, PluginInstance, PluginModel, type PluginName, type PluginOutputs, type PluginParams, type PluginPublicOutputs, type PluginRecord, type PluginRegistry, PluginRenderCtx, PrimitiveOrConfig, PrimitiveToCfg, type PublicOutputFieldDef, QueryColumnId, QueryColumnIdAxis, QueryColumnIdColumn, RT_BINARY_PARTITIONED, RT_BINARY_SUPER_PARTITIONED, RT_JSON_PARTITIONED, RT_JSON_SUPER_PARTITIONED, RT_PARQUET_PARTITIONED, RT_PARQUET_SUPER_PARTITIONED, RT_RESOURCE_MAP, RT_RESOURCE_MAP_PARTITIONED, RenderCtx, RenderCtxBase, RenderCtxLegacy, RenderFunction, RenderFunctionLegacy, ResolveCfgType, ResolveModelServices, ResolveUiServices, ResourceTraversalOps, ResourceType, ResultPool, ResultPoolColumnsProvider, ResultPoolColumnsProviderImpl, SdkInfo, ServiceProxy, SimplifiedPColumnSpec, SimplifiedUniversalPColumnEntry, SortedCumulativeSum, type Entry as SpecExtractorResult, type SpecQuery, SplitAxis, StagingAccessorName, StagingOutputs, StdCtx, StdCtxArgsOnly, TooltipEntry, type Trace, type TraceEntry, TransformedColumn, TreeNodeAccessor, TypeField, TypeFieldRecord, TypeForm, TypeToLiteral, TypedConfig, TypedConfigOrConfigLambda, TypedConfigOrString, type UiServices, UiState, Unionize, UniversalColumnOption, UnwrapFutureRef, ValueRank, type VersionedData, _ctxProvidersCache, allPColumnsReady, and, blockServiceNames, buildDatasetOptions, buildRefMap, buildServices, collectLinkerColumns, collectLinkerIds, compileAnnotationScript, compileFilter, compileFilters, convertFilterSpecsToExpressionSpecs, convertFilterUiToExpressionImpl, convertFilterUiToExpressions, convertOrParsePColumnData, createBlockStorage, createDatasetSelection, createDefaultPTableParams, createPFrameForGraphs, createPlDataTable, type createPlDataTableOptionsV3, createPlDataTableSheet, createPlDataTableStateV2, createPlDataTableV2, createPlDataTableV3, createPlSelectionModel, createRowSelectionColumn, createServiceProxy, deriveAxisValuesLabels, deriveColumnOptions, deriveDataFromStorage, deriveDistinctLabels, deriveDistinctTooltips, deriveLabels, discoverTableColumns as discoverTableColumnSnaphots, distillFilterSpec, downgradeCfgOrLambda, enrichCompatible, expandByPartition, extractArchiveAndGetURL, extractConfig, filterDataInfoEntries, filterMatchesToOptions, filterSpecToSpecQueryExpr, finalizePColumnData, findFilterColumns, flatten, fromPlOption, fromPlRef, getAllRelatedColumns, getAvailableWithLinkersAxes, getAxisUniqueValues, getBlobContent, getBlobContentAsJson, getBlobContentAsString, getColumnOrAxisValueLabelsId, getColumnSpecById, getColumnUniqueValues, getColumnsFull, getCtxProviders, getDownloadedBlobContent, getEffectiveVisibility, getEnvironmentValue, getFromCfg, getImmediate, getImportProgress, getJsonField, getLastLogs, getLeafColumnData, getLogHandle, getNumberOfRows, getOnDemandBlobContent, getOrderPriority, getPartitionKeysList, getPlatformaApiVersion, getPluginData, getProgressLog, getProgressLogWithInfo, getRawPlatformaInstance, getRelatedColumns, getRequestColumnsFromSelectedSources, getResourceField, getResourceValueAsJson, getService, getSingleColumnData, getStorageData, getUniquePartitionKeys, getUniqueSourceValuesWithLabels, hasColumnData, hitQualifications, ifDef, isBlockStorage, isColumn, isColumnHidden, isColumnLazy, isColumnOptional, isColumnProvider, isColumnRecipe, isColumnsCollection, isConfigLambda, isDatasetSelection, isEmpty, isHiddenFromGraphColumn, isHiddenFromUIColumn, isLeafColumn, isPColumnReady, isPluginOutputKey, isolate, makeArray, makeObject, mapArrayValues, mapRecordValues, mapResourceFields, migrateBlockStorage, normalizeBlockStorage, not, or, parsePColumnData, parseResourceMap, pluginOutputKey, pluginOutputPrefix, queriesQualifications, readOutput, registerFacadeCallbacks, toColumnProvider, unreachable, updateStorageData, upgradePlDataTableStateV2, wrapOutputs };
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import { Args, It, MainOutputs, StagingOutputs, UiState, and, extractArchiveAndG
|
|
|
7
7
|
import "./config/index.js";
|
|
8
8
|
import { FutureRef } from "./render/future.js";
|
|
9
9
|
import { TreeNodeAccessor, ifDef } from "./render/accessor.js";
|
|
10
|
-
import { internal_exports } from "./render/internal.js";
|
|
10
|
+
import { MainAccessorName, StagingAccessorName, internal_exports } from "./render/internal.js";
|
|
11
11
|
import { filterDataInfoEntries } from "./render/util/axis_filtering.js";
|
|
12
12
|
import { deriveDistinctLabels } from "./labels/derive_distinct_labels.js";
|
|
13
13
|
import { deriveLabels } from "./render/util/label.js";
|
|
@@ -17,7 +17,7 @@ import { BLOCK_SERVICE_FLAGS, blockServiceNames } from "./services/block_service
|
|
|
17
17
|
import { buildServices, createServiceProxy } from "./services/service_bridge.js";
|
|
18
18
|
import { getService } from "./services/get_services.js";
|
|
19
19
|
import "./services/index.js";
|
|
20
|
-
import { BlockRenderCtx, PluginRenderCtx, RenderCtxBase, RenderCtxLegacy, ResultPool } from "./render/api.js";
|
|
20
|
+
import { BlockRenderCtx, PluginRenderCtx, RenderCtxBase, RenderCtxLegacy, ResultPool, finalizePColumnData } from "./render/api.js";
|
|
21
21
|
import "./render/index.js";
|
|
22
22
|
import { CurrentSdkInfo, PlatformaSDKVersion } from "./version.js";
|
|
23
23
|
import { isConfigLambda } from "./bconfig/types.js";
|
|
@@ -27,12 +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 {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
30
|
+
import { Column, isColumn } from "./columns/column.js";
|
|
31
|
+
import { ColumnDiscoveredRecipe } from "./columns/column_recipes/column_discovered_recipe.js";
|
|
32
|
+
import { ColumnFilteredRecipe } from "./columns/column_recipes/column_filtered_recipe.js";
|
|
33
|
+
import { ColumnRecipe, isColumnRecipe } from "./columns/column_recipes/index.js";
|
|
34
|
+
import { ColumnOverriddenRecipe } from "./columns/column_recipes/column_overrided_recipe.js";
|
|
35
|
+
import { ColumnAbsentError, ColumnLazy, ColumnLazyImpl, isColumnLazy } from "./columns/column_lazy.js";
|
|
36
|
+
import { AccessorColumnsProvider, AccessorColumnsProviderImpl, ArrayColumnsProvider, ColumnsProvider, ResultPoolColumnsProvider, ResultPoolColumnsProviderImpl } from "./columns/column_providers/providers.js";
|
|
37
|
+
import { _ctxProvidersCache, getCtxProviders, isColumnProvider, toColumnProvider } from "./columns/column_providers/index.js";
|
|
38
|
+
import { ColumnsCollection, ColumnsCollectionImpl, isColumnsCollection } from "./columns/columns_collection.js";
|
|
39
|
+
import { collectLinkerColumns, collectLinkerIds, deriveColumnOptions, getLeafColumnData, hasColumnData, hitQualifications, isLeafColumn, queriesQualifications } from "./columns/utils.js";
|
|
35
40
|
import { expandByPartition } from "./columns/expand_by_partition.js";
|
|
41
|
+
import { deriveAxisValuesLabels } from "./columns/derive_axis_values_labels.js";
|
|
36
42
|
import "./columns/index.js";
|
|
37
43
|
import { getAllRelatedColumns, getRelatedColumns } from "./pframe_utils/columns.js";
|
|
38
44
|
import { createPFrameForGraphs, isHiddenFromGraphColumn, isHiddenFromUIColumn } from "./components/PFrameForGraphs.js";
|
|
@@ -49,7 +55,7 @@ import { createPlDataTableSheet } from "./components/PlDataTable/createPlDataTab
|
|
|
49
55
|
import { deriveDistinctTooltips } from "./labels/derive_distinct_tooltips.js";
|
|
50
56
|
import { getEffectiveVisibility, getOrderPriority, isColumnHidden, isColumnOptional } from "./components/PlDataTable/createPlDataTable/utils.js";
|
|
51
57
|
import { createPlDataTableV2 } from "./components/PlDataTable/createPlDataTable/createPlDataTableV2.js";
|
|
52
|
-
import {
|
|
58
|
+
import { discoverTableColumns } from "./components/PlDataTable/createPlDataTable/discoverColumns.js";
|
|
53
59
|
import { createPlDataTableV3 } from "./components/PlDataTable/createPlDataTable/createPlDataTableV3.js";
|
|
54
60
|
import { createPlDataTable } from "./components/PlDataTable/createPlDataTable/index.js";
|
|
55
61
|
import { createRowSelectionColumn } from "./components/PlMultiSequenceAlignment.js";
|
|
@@ -65,4 +71,4 @@ import { getAxisUniqueValues, getColumnOrAxisValueLabelsId, getColumnSpecById, g
|
|
|
65
71
|
import { getEnvironmentValue } from "./env_value.js";
|
|
66
72
|
export * from "@milaboratories/pl-model-common";
|
|
67
73
|
export * from "@milaboratories/pl-error-like";
|
|
68
|
-
export { Args,
|
|
74
|
+
export { AccessorColumnsProvider, AccessorColumnsProviderImpl, Args, ArrayColumnsProvider, BLOCK_SERVICE_FLAGS, BLOCK_STORAGE_FACADE_VERSION, BlockModel, BlockModelV3, BlockRenderCtx, BlockStorageFacadeCallbacks, BlockStorageFacadeHandles, Column, ColumnAbsentError, ColumnDiscoveredRecipe, ColumnFilteredRecipe, ColumnLazy, ColumnLazyImpl, ColumnOverriddenRecipe, ColumnRecipe, ColumnsCollection, ColumnsCollectionImpl, ColumnsProvider, CurrentSdkInfo, DataModel, DataModelBuilder, FutureRef, It, internal_exports as JsRenderInternal, MainAccessorName, MainOutputs, OutputError, PColumnCollection, PFrameImpl, PlatformaSDKVersion, PluginDataModel, PluginDataModelBuilder, PluginInstance, PluginModel, PluginRenderCtx, RT_BINARY_PARTITIONED, RT_BINARY_SUPER_PARTITIONED, RT_JSON_PARTITIONED, RT_JSON_SUPER_PARTITIONED, RT_PARQUET_PARTITIONED, RT_PARQUET_SUPER_PARTITIONED, RT_RESOURCE_MAP, RT_RESOURCE_MAP_PARTITIONED, RenderCtxBase, RenderCtxLegacy, ResultPool, ResultPoolColumnsProvider, ResultPoolColumnsProviderImpl, StagingAccessorName, StagingOutputs, TreeNodeAccessor, UiState, _ctxProvidersCache, allPColumnsReady, and, blockServiceNames, buildDatasetOptions, buildRefMap, buildServices, collectLinkerColumns, collectLinkerIds, compileAnnotationScript, compileFilter, compileFilters, convertFilterSpecsToExpressionSpecs, convertFilterUiToExpressionImpl, convertFilterUiToExpressions, convertOrParsePColumnData, createBlockStorage, createDatasetSelection, createDefaultPTableParams, createPFrameForGraphs, createPlDataTable, createPlDataTableSheet, createPlDataTableStateV2, createPlDataTableV2, createPlDataTableV3, createPlSelectionModel, createRowSelectionColumn, createServiceProxy, deriveAxisValuesLabels, deriveColumnOptions, deriveDataFromStorage, deriveDistinctLabels, deriveDistinctTooltips, deriveLabels, discoverTableColumns as discoverTableColumnSnaphots, distillFilterSpec, downgradeCfgOrLambda, enrichCompatible, expandByPartition, extractArchiveAndGetURL, extractConfig, filterDataInfoEntries, filterMatchesToOptions, filterSpecToSpecQueryExpr, finalizePColumnData, findFilterColumns, flatten, fromPlOption, fromPlRef, getAllRelatedColumns, getAvailableWithLinkersAxes, getAxisUniqueValues, getBlobContent, getBlobContentAsJson, getBlobContentAsString, getColumnOrAxisValueLabelsId, getColumnSpecById, getColumnUniqueValues, getColumnsFull, getCtxProviders, getDownloadedBlobContent, getEffectiveVisibility, getEnvironmentValue, getFromCfg, getImmediate, getImportProgress, getJsonField, getLastLogs, getLeafColumnData, getLogHandle, getNumberOfRows, getOnDemandBlobContent, getOrderPriority, getPartitionKeysList, getPlatformaApiVersion, getPluginData, getProgressLog, getProgressLogWithInfo, getRawPlatformaInstance, getRelatedColumns, getRequestColumnsFromSelectedSources, getResourceField, getResourceValueAsJson, getService, getSingleColumnData, getStorageData, getUniquePartitionKeys, getUniqueSourceValuesWithLabels, hasColumnData, hitQualifications, ifDef, isBlockStorage, isColumn, isColumnHidden, isColumnLazy, isColumnOptional, isColumnProvider, isColumnRecipe, isColumnsCollection, isConfigLambda, isDatasetSelection, isEmpty, isHiddenFromGraphColumn, isHiddenFromUIColumn, isLeafColumn, isPColumnReady, isPluginOutputKey, isolate, makeArray, makeObject, mapArrayValues, mapRecordValues, mapResourceFields, migrateBlockStorage, normalizeBlockStorage, not, or, parsePColumnData, parseResourceMap, pluginOutputKey, pluginOutputPrefix, queriesQualifications, readOutput, registerFacadeCallbacks, toColumnProvider, unreachable, updateStorageData, upgradePlDataTableStateV2, wrapOutputs };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive_distinct_labels.cjs","names":["Annotation"],"sources":["../../src/labels/derive_distinct_labels.ts"],"sourcesContent":["import {\n Annotation,\n parseJson,\n readAnnotation,\n type AxisQualification,\n type PObjectId,\n type PObjectSpec,\n type StringifiedJson,\n type Trace,\n} from \"@milaboratories/pl-model-common\";\nimport { throwError } from \"@milaboratories/helpers\";\nimport { isFunction, isNil } from \"es-toolkit\";\nimport type { MatchQualifications } from \"../columns/column_collection_builder\";\n\nexport type { Trace, TraceEntry } from \"@milaboratories/pl-model-common\";\n\nconst DISTANCE_PENALTY = 0.001;\nconst LABEL_TYPE = \"__LABEL__\";\nconst LABEL_TYPE_FULL = \"__LABEL__@1\";\nconst LINKER_TYPE = \"__LINKER__\";\nconst LINKER_TYPE_FULL = \"__LINKER__@1\";\nconst HIT_QUAL_TYPE = \"__HIT_QUAL__\";\nconst ANCHOR_QUAL_TYPE_PREFIX = \"__ANCHOR_QUAL__:\";\n\nfunction isAnchorQualType(t: string): boolean {\n return t.startsWith(ANCHOR_QUAL_TYPE_PREFIX);\n}\n\nfunction isSyntheticType(t: string): boolean {\n return t === LINKER_TYPE || t === HIT_QUAL_TYPE || isAnchorQualType(t);\n}\n\n/** SDK-internal trace shape — adds fields used by this algorithm only, not part of the on-disk contract. */\ntype ExtendedTraceEntry = Trace[number] & {\n importance?: number;\n position?: \"prefix\" | \"suffix\";\n};\n\nexport type LinkerStep = {\n spec: PObjectSpec;\n qualifications?: AxisQualification[];\n};\n\nexport type Entry =\n | PObjectSpec\n | {\n spec: PObjectSpec;\n /** Extra trace entries merged with the base trace from annotations. */\n extraTrace?: ExtendedTraceEntry[];\n /** Linker steps traversed to discover this column; rendered as \"via …\" only when needed for uniqueness. */\n linkerPath?: LinkerStep[];\n /** Axis qualifications applied to the hit column / already-bound anchors; rendered as \"[…]\" suffixes. */\n qualifications?: MatchQualifications;\n };\n\n/**\n * Per-zone formatters. Each one receives raw inputs and returns the rendered text for that zone,\n * or `undefined` to suppress the zone entirely (no synthetic injection → no minimization, no render).\n */\nexport type DeriveLabelsFormatters = {\n /** Native column label. Default: identity. `undefined` → label entry not added (treated as if spec had no label). */\n native?: (label: string, spec: PObjectSpec, index: number) => string | undefined;\n /** Linker zone (whole \"via …\" piece). Receives step labels with step-quals already inlined.\n * Default: `via ${steps.join(\" > \")}`. */\n linker?: (linkerLabels: string[], spec: PObjectSpec, index: number) => string | undefined;\n /** Per-step linker qualifications inlined into the step base label.\n * Default: `[${formatQualifications(qs)}]`. `undefined` → step rendered without quals. */\n linkerStepQualification?: (\n qualifications: AxisQualification[],\n stepIndex: number,\n stepSpec: PObjectSpec,\n ) => string | undefined;\n /** Hit-axis qualifications block. Default: `[${formatQualifications(qs)}]`. */\n hitQualification?: (\n qualifications: AxisQualification[],\n spec: PObjectSpec,\n index: number,\n ) => string | undefined;\n /** Per-anchor qualifications block. Default: `[${anchorId}: ${formatQualifications(qs)}]`. */\n anchorQualification?: (\n anchorId: PObjectId,\n qualifications: AxisQualification[],\n spec: PObjectSpec,\n index: number,\n ) => string | undefined;\n};\n\nexport type DeriveLabelsOptions = {\n /** Separator to use between label parts (\" / \" by default). */\n separator?: string;\n /** If true, native label is appended at the end of the trace zone. By default it is prepended (label is the most important name). */\n addLabelAsSuffix?: boolean;\n /** Force inclusion of native column label even when not needed for uniqueness. */\n includeNativeLabel?: boolean;\n /** Trace types that must be included in the label. */\n forceTraceElements?: string[];\n /** Per-zone custom formatters. Returning `undefined` from any formatter suppresses the corresponding zone. */\n formatters?: DeriveLabelsFormatters;\n};\n\nexport function deriveDistinctLabels(values: Entry[], options: DeriveLabelsOptions = {}): string[] {\n const forceTraceElements =\n options.forceTraceElements !== undefined && options.forceTraceElements.length > 0\n ? new Set(options.forceTraceElements)\n : undefined;\n const separator = options.separator ?? \" / \";\n\n const records = values.map((v, i) => enrichRecord(v, i, options));\n const stats = collectTypeStats(records);\n\n const hasAnySynthetic = records.some((r) => r.fullTrace.some((ft) => isSyntheticType(ft.type)));\n const labelForced =\n (options.includeNativeLabel === true || hasAnySynthetic) &&\n stats.countByType.has(LABEL_TYPE_FULL);\n // Tied to labeled-step presence, not path presence: entries with a non-empty linkerPath\n // but no labeled steps contribute no LINKER_TYPE trace entry, so they do not count here.\n const linkerForced = stats.countByType.get(LINKER_TYPE_FULL) === values.length;\n\n const forcedSet = new Set<string>();\n if (labelForced) forcedSet.add(LABEL_TYPE_FULL);\n if (linkerForced) forcedSet.add(LINKER_TYPE_FULL);\n\n const { mainTypes, secondaryTypes } = classifyTypes(stats, values.length);\n\n const build = (typeSet: Set<string>, force: boolean) =>\n buildLabels(records, typeSet, forceTraceElements, separator, force);\n\n if (mainTypes.length === 0) {\n if (secondaryTypes.length !== 0)\n throw new Error(\"Non-empty secondary types list while main types list is empty.\");\n\n return (\n build(new Set([LABEL_TYPE_FULL]), true) ??\n throwError(\"Failed to derive labels using native column labels\")\n );\n }\n\n let includedCount = 0;\n let additionalType = -1;\n while (includedCount < mainTypes.length) {\n const currentSet = new Set<string>(forcedSet);\n for (let i = 0; i < includedCount; ++i) currentSet.add(mainTypes[i]);\n if (additionalType >= 0) currentSet.add(mainTypes[additionalType]);\n\n const candidateResult = build(currentSet, false);\n if (candidateResult !== undefined && countUniqueLabels(candidateResult) === values.length) {\n const minimized = minimizeTypeSet(\n currentSet,\n records,\n stats,\n forceTraceElements,\n forcedSet,\n separator,\n );\n const minimizedLabels =\n build(minimized, false) ?? throwError(\"Failed to derive unique labels\");\n return dropRedundantLinkerSuffix(\n records,\n minimized,\n forceTraceElements,\n forcedSet,\n separator,\n minimizedLabels,\n );\n }\n\n additionalType++;\n if (additionalType >= mainTypes.length) {\n includedCount++;\n additionalType = includedCount;\n }\n }\n\n const fallbackSet = new Set([...forcedSet, ...mainTypes, ...secondaryTypes]);\n const minimized = minimizeTypeSet(\n fallbackSet,\n records,\n stats,\n forceTraceElements,\n forcedSet,\n separator,\n );\n const minimizedLabels = build(minimized, true) ?? throwError(\"Failed to derive unique labels\");\n return dropRedundantLinkerSuffix(\n records,\n minimized,\n forceTraceElements,\n forcedSet,\n separator,\n minimizedLabels,\n );\n}\n\n// --- Pure helpers ---\ntype FullTraceEntry = ExtendedTraceEntry & { fullType: string; occurrenceIndex: number };\n\ntype EnrichedRecord = {\n fullTrace: FullTraceEntry[];\n};\n\nfunction extractEntryParts(entry: Entry): {\n spec: PObjectSpec;\n extraTrace: ExtendedTraceEntry[] | undefined;\n linkerPath: LinkerStep[] | undefined;\n qualifications: MatchQualifications | undefined;\n} {\n const isEnriched = \"spec\" in entry && typeof entry.spec === \"object\";\n if (!isEnriched) {\n return {\n spec: entry as PObjectSpec,\n extraTrace: undefined,\n linkerPath: undefined,\n qualifications: undefined,\n };\n }\n return {\n spec: entry.spec,\n extraTrace: entry.extraTrace,\n linkerPath: entry.linkerPath,\n qualifications: entry.qualifications,\n };\n}\n\nfunction formatQualification(q: AxisQualification): string {\n const ctx = q.contextDomain ?? {};\n const keys = Object.keys(ctx);\n if (keys.length === 0) return q.axis.name;\n const pairs = keys.map((k) => `${k}=${ctx[k]}`).join(\", \");\n return Object.prototype.hasOwnProperty.call(ctx, q.axis.name) ? pairs : `${q.axis.name} ${pairs}`;\n}\n\nfunction formatQualifications(qs: AxisQualification[]): string {\n return qs.map(formatQualification).join(\"; \");\n}\n\nfunction computeStepLabel(\n step: LinkerStep,\n stepIndex: number,\n formatters: DeriveLabelsFormatters | undefined,\n): string | undefined {\n const base = (\n readAnnotation(step.spec, Annotation.LinkLabel) ?? readAnnotation(step.spec, Annotation.Label)\n )?.trim();\n if (isNil(base) || base.length === 0) return undefined;\n if (step.qualifications === undefined || step.qualifications.length === 0) return base;\n const qualText = isFunction(formatters?.linkerStepQualification)\n ? formatters.linkerStepQualification(step.qualifications, stepIndex, step.spec)\n : `[${formatQualifications(step.qualifications)}]`;\n return isNil(qualText) ? base : `${base} ${qualText}`;\n}\n\nfunction buildFullTrace(trace: ExtendedTraceEntry[]): FullTraceEntry[] {\n const result: FullTraceEntry[] = [];\n const occurrences = new Map<string, number>();\n\n for (let i = trace.length - 1; i >= 0; --i) {\n const entry = trace[i];\n const occurrenceIndex = (occurrences.get(entry.type) ?? 0) + 1;\n occurrences.set(entry.type, occurrenceIndex);\n result.push({\n ...entry,\n fullType: `${entry.type}@${occurrenceIndex}`,\n occurrenceIndex,\n });\n }\n\n result.reverse();\n return result;\n}\n\nfunction enrichRecord(value: Entry, index: number, options: DeriveLabelsOptions): EnrichedRecord {\n const { spec, extraTrace, linkerPath, qualifications } = extractEntryParts(value);\n const formatters = options.formatters;\n\n const rawLabel = readAnnotation(spec, Annotation.Label);\n const traceStr = readAnnotation(spec, Annotation.Trace);\n const baseTrace = traceStr\n ? (parseJson(traceStr as StringifiedJson<ExtendedTraceEntry[]>) ?? [])\n : [];\n const prefixExtra = extraTrace?.filter((e) => e.position === \"prefix\") ?? [];\n const suffixExtra = extraTrace?.filter((e) => e.position !== \"prefix\") ?? [];\n const trace: ExtendedTraceEntry[] = [...prefixExtra, ...baseTrace, ...suffixExtra];\n\n if (!isNil(rawLabel)) {\n const label = isFunction(formatters?.native)\n ? formatters.native(rawLabel, spec, index)\n : rawLabel;\n if (!isNil(label)) {\n const labelEntry = { label, type: LABEL_TYPE, importance: -2 };\n if (options.addLabelAsSuffix === true) trace.push(labelEntry);\n else trace.splice(0, 0, labelEntry);\n }\n }\n\n if (linkerPath !== undefined && linkerPath.length > 0) {\n const stepLabels = linkerPath\n .map((step, i) => computeStepLabel(step, i, formatters))\n .filter((s): s is string => !isNil(s));\n if (stepLabels.length > 0) {\n const linkerText = isFunction(formatters?.linker)\n ? formatters.linker(stepLabels, spec, index)\n : `via ${stepLabels.join(\" > \")}`;\n if (!isNil(linkerText)) {\n trace.push({ type: LINKER_TYPE, label: linkerText, importance: -10 });\n }\n }\n }\n\n if (qualifications !== undefined && qualifications.forQueries !== undefined) {\n for (const [anchorId, qs] of Object.entries(qualifications.forQueries)) {\n if (qs.length === 0) continue;\n const anchorText = isFunction(formatters?.anchorQualification)\n ? formatters.anchorQualification(anchorId as PObjectId, qs, spec, index)\n : `[${anchorId}: ${formatQualifications(qs)}]`;\n if (isNil(anchorText)) continue;\n trace.push({\n type: `${ANCHOR_QUAL_TYPE_PREFIX}${anchorId}`,\n label: anchorText,\n importance: -11,\n });\n }\n if (qualifications.forHit !== undefined && qualifications.forHit.length > 0) {\n const hitText = isFunction(formatters?.hitQualification)\n ? formatters.hitQualification(qualifications.forHit, spec, index)\n : `[${formatQualifications(qualifications.forHit)}]`;\n if (!isNil(hitText)) {\n trace.push({ type: HIT_QUAL_TYPE, label: hitText, importance: -12 });\n }\n }\n }\n\n return { fullTrace: buildFullTrace(trace) };\n}\n\ntype TypeStats = {\n importances: Map<string, number>;\n countByType: Map<string, number>;\n};\n\nfunction collectTypeStats(records: EnrichedRecord[]): TypeStats {\n const importances = new Map<string, number>();\n const countByType = new Map<string, number>();\n\n for (const record of records) {\n for (let i = 0; i < record.fullTrace.length; i++) {\n const { fullType, importance: rawImportance } = record.fullTrace[i];\n const importance = rawImportance ?? 0;\n const distance = (record.fullTrace.length - i) * DISTANCE_PENALTY;\n\n countByType.set(fullType, (countByType.get(fullType) ?? 0) + 1);\n importances.set(\n fullType,\n Math.max(importances.get(fullType) ?? Number.NEGATIVE_INFINITY, importance - distance),\n );\n }\n }\n\n return { importances, countByType };\n}\n\nfunction classifyTypes(\n stats: TypeStats,\n totalRecords: number,\n): { mainTypes: string[]; secondaryTypes: string[] } {\n const sorted = [...stats.importances].sort(([, i1], [, i2]) => i2 - i1);\n\n const mainTypes: string[] = [];\n const secondaryTypes: string[] = [];\n\n for (const [typeName] of sorted) {\n if (typeName.endsWith(\"@1\") || stats.countByType.get(typeName) === totalRecords)\n mainTypes.push(typeName);\n else secondaryTypes.push(typeName);\n }\n\n return { mainTypes, secondaryTypes };\n}\n\nfunction renderRecordLabel(\n record: EnrichedRecord,\n includedTypes: Set<string>,\n forceTraceElements: Set<string> | undefined,\n separator: string,\n): string | undefined {\n const traceParts: string[] = [];\n const anchorParts: string[] = [];\n let linkerLabel: string | undefined;\n let hitLabel: string | undefined;\n\n for (const ft of record.fullTrace) {\n if (!(includedTypes.has(ft.fullType) || forceTraceElements?.has(ft.type))) continue;\n if (ft.type === LINKER_TYPE) linkerLabel = ft.label;\n else if (ft.type === HIT_QUAL_TYPE) hitLabel = ft.label;\n else if (isAnchorQualType(ft.type)) anchorParts.push(ft.label);\n else traceParts.push(ft.label);\n }\n\n const isEmpty =\n traceParts.length === 0 &&\n anchorParts.length === 0 &&\n linkerLabel === undefined &&\n hitLabel === undefined;\n\n if (isEmpty) return undefined;\n\n let label = traceParts.join(separator);\n const append = (part: string) => {\n label = label.length === 0 ? part : `${label} ${part}`;\n };\n if (linkerLabel !== undefined) append(linkerLabel);\n for (const a of anchorParts) append(a);\n if (hitLabel !== undefined) append(hitLabel);\n\n return label;\n}\n\nfunction buildLabels(\n records: EnrichedRecord[],\n includedTypes: Set<string>,\n forceTraceElements: Set<string> | undefined,\n separator: string,\n force: boolean,\n): string[] | undefined {\n const result: string[] = [];\n\n for (const r of records) {\n const rendered = renderRecordLabel(r, includedTypes, forceTraceElements, separator);\n if (rendered === undefined) {\n if (!force) return undefined;\n result.push(\"Unlabeled\");\n continue;\n }\n result.push(rendered);\n }\n\n return result;\n}\n\n/**\n * Drop the \"via …\" linker suffix from records whose label is already unique without it.\n *\n * Global minimization may include `LINKER_TYPE_FULL` solely to resolve a collision between a\n * subset of records — but `buildLabels` then renders the suffix on every record that carries a\n * linker trace entry, including ones whose stem is already unique. We strip the suffix where it\n * isn't load-bearing while keeping the symmetric rendering required by `linkerForced` /\n * `forceTraceElements`.\n *\n * Rule: a record's linker suffix is redundant iff its stem (label rendered without LINKER) does\n * not appear anywhere else in the set.\n */\nfunction dropRedundantLinkerSuffix(\n records: EnrichedRecord[],\n globalTypeSet: Set<string>,\n forceTraceElements: Set<string> | undefined,\n forcedSet: Set<string>,\n separator: string,\n labels: string[],\n): string[] {\n if (!globalTypeSet.has(LINKER_TYPE_FULL)) return labels;\n if (forcedSet.has(LINKER_TYPE_FULL) || forceTraceElements?.has(LINKER_TYPE)) return labels;\n\n const setWithoutLinker = new Set(globalTypeSet);\n setWithoutLinker.delete(LINKER_TYPE_FULL);\n\n const stems = records.map((r) =>\n renderRecordLabel(r, setWithoutLinker, forceTraceElements, separator),\n );\n\n const stemOccurrences = new Map<string, number>();\n for (const s of stems) {\n if (s !== undefined) stemOccurrences.set(s, (stemOccurrences.get(s) ?? 0) + 1);\n }\n\n return labels.map((label, i) => {\n const stem = stems[i];\n if (stem === undefined) return label;\n return stemOccurrences.get(stem) === 1 ? stem : label;\n });\n}\n\nfunction countUniqueLabels(result: string[] | undefined): number {\n if (result === undefined) return 0;\n return new Set(result).size;\n}\n\nfunction minimizeTypeSet(\n typeSet: Set<string>,\n records: EnrichedRecord[],\n stats: TypeStats,\n forceTraceElements: Set<string> | undefined,\n forcedSet: Set<string>,\n separator: string,\n): Set<string> {\n const initialResult = buildLabels(records, typeSet, forceTraceElements, separator, false);\n if (initialResult === undefined) return typeSet;\n\n const targetCardinality = countUniqueLabels(initialResult);\n const result = new Set(typeSet);\n\n const removable = [...result]\n .filter((t) => !forceTraceElements?.has(t.split(\"@\")[0]) && !forcedSet.has(t))\n .sort((a, b) => (stats.importances.get(a) ?? 0) - (stats.importances.get(b) ?? 0));\n\n for (const typeToRemove of removable) {\n const candidate = new Set(result);\n candidate.delete(typeToRemove);\n const candidateResult = buildLabels(records, candidate, forceTraceElements, separator, false);\n if (candidateResult !== undefined && countUniqueLabels(candidateResult) >= targetCardinality) {\n result.delete(typeToRemove);\n }\n }\n\n return result;\n}\n"],"mappings":";;;;AAgBA,MAAM,mBAAmB;AACzB,MAAM,aAAa;AACnB,MAAM,kBAAkB;AACxB,MAAM,cAAc;AACpB,MAAM,mBAAmB;AACzB,MAAM,gBAAgB;AACtB,MAAM,0BAA0B;AAEhC,SAAS,iBAAiB,GAAoB;CAC5C,OAAO,EAAE,WAAW,uBAAuB;AAC7C;AAEA,SAAS,gBAAgB,GAAoB;CAC3C,OAAO,MAAM,eAAe,MAAM,iBAAiB,iBAAiB,CAAC;AACvE;AAsEA,SAAgB,qBAAqB,QAAiB,UAA+B,CAAC,GAAa;CACjG,MAAM,qBACJ,QAAQ,uBAAuB,KAAA,KAAa,QAAQ,mBAAmB,SAAS,IAC5E,IAAI,IAAI,QAAQ,kBAAkB,IAClC,KAAA;CACN,MAAM,YAAY,QAAQ,aAAa;CAEvC,MAAM,UAAU,OAAO,KAAK,GAAG,MAAM,aAAa,GAAG,GAAG,OAAO,CAAC;CAChE,MAAM,QAAQ,iBAAiB,OAAO;CAEtC,MAAM,kBAAkB,QAAQ,MAAM,MAAM,EAAE,UAAU,MAAM,OAAO,gBAAgB,GAAG,IAAI,CAAC,CAAC;CAC9F,MAAM,eACH,QAAQ,uBAAuB,QAAQ,oBACxC,MAAM,YAAY,IAAI,eAAe;CAGvC,MAAM,eAAe,MAAM,YAAY,IAAI,gBAAgB,MAAM,OAAO;CAExE,MAAM,4BAAY,IAAI,IAAY;CAClC,IAAI,aAAa,UAAU,IAAI,eAAe;CAC9C,IAAI,cAAc,UAAU,IAAI,gBAAgB;CAEhD,MAAM,EAAE,WAAW,mBAAmB,cAAc,OAAO,OAAO,MAAM;CAExE,MAAM,SAAS,SAAsB,UACnC,YAAY,SAAS,SAAS,oBAAoB,WAAW,KAAK;CAEpE,IAAI,UAAU,WAAW,GAAG;EAC1B,IAAI,eAAe,WAAW,GAC5B,MAAM,IAAI,MAAM,gEAAgE;EAElF,OACE,sBAAM,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,MAAA,GAAA,wBAAA,WAAA,CAC3B,oDAAoD;CAEnE;CAEA,IAAI,gBAAgB;CACpB,IAAI,iBAAiB;CACrB,OAAO,gBAAgB,UAAU,QAAQ;EACvC,MAAM,aAAa,IAAI,IAAY,SAAS;EAC5C,KAAK,IAAI,IAAI,GAAG,IAAI,eAAe,EAAE,GAAG,WAAW,IAAI,UAAU,EAAE;EACnE,IAAI,kBAAkB,GAAG,WAAW,IAAI,UAAU,eAAe;EAEjE,MAAM,kBAAkB,MAAM,YAAY,KAAK;EAC/C,IAAI,oBAAoB,KAAA,KAAa,kBAAkB,eAAe,MAAM,OAAO,QAAQ;GACzF,MAAM,YAAY,gBAChB,YACA,SACA,OACA,oBACA,WACA,SACF;GAGA,OAAO,0BACL,SACA,WACA,oBACA,WACA,WANA,MAAM,WAAW,KAAK,MAAA,GAAA,wBAAA,WAAA,CAAgB,gCAAgC,CAQxE;EACF;EAEA;EACA,IAAI,kBAAkB,UAAU,QAAQ;GACtC;GACA,iBAAiB;EACnB;CACF;CAGA,MAAM,YAAY,gCAChB,IAFsB,IAAI;EAAC,GAAG;EAAW,GAAG;EAAW,GAAG;CAAc,CAE9D,GACV,SACA,OACA,oBACA,WACA,SACF;CAEA,OAAO,0BACL,SACA,WACA,oBACA,WACA,WANsB,MAAM,WAAW,IAAI,MAAA,GAAA,wBAAA,WAAA,CAAgB,gCAAgC,CAQ7F;AACF;AASA,SAAS,kBAAkB,OAKzB;CAEA,IAAI,EADe,UAAU,SAAS,OAAO,MAAM,SAAS,WAE1D,OAAO;EACL,MAAM;EACN,YAAY,KAAA;EACZ,YAAY,KAAA;EACZ,gBAAgB,KAAA;CAClB;CAEF,OAAO;EACL,MAAM,MAAM;EACZ,YAAY,MAAM;EAClB,YAAY,MAAM;EAClB,gBAAgB,MAAM;CACxB;AACF;AAEA,SAAS,oBAAoB,GAA8B;CACzD,MAAM,MAAM,EAAE,iBAAiB,CAAC;CAChC,MAAM,OAAO,OAAO,KAAK,GAAG;CAC5B,IAAI,KAAK,WAAW,GAAG,OAAO,EAAE,KAAK;CACrC,MAAM,QAAQ,KAAK,KAAK,MAAM,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI;CACzD,OAAO,OAAO,UAAU,eAAe,KAAK,KAAK,EAAE,KAAK,IAAI,IAAI,QAAQ,GAAG,EAAE,KAAK,KAAK,GAAG;AAC5F;AAEA,SAAS,qBAAqB,IAAiC;CAC7D,OAAO,GAAG,IAAI,mBAAmB,CAAC,CAAC,KAAK,IAAI;AAC9C;AAEA,SAAS,iBACP,MACA,WACA,YACoB;CACpB,MAAM,SAAA,GAAA,gCAAA,eAAA,CACW,KAAK,MAAMA,gCAAAA,WAAW,SAAS,MAAA,GAAA,gCAAA,eAAA,CAAoB,KAAK,MAAMA,gCAAAA,WAAW,KAAK,EAAA,EAC5F,KAAK;CACR,KAAA,GAAA,WAAA,MAAA,CAAU,IAAI,KAAK,KAAK,WAAW,GAAG,OAAO,KAAA;CAC7C,IAAI,KAAK,mBAAmB,KAAA,KAAa,KAAK,eAAe,WAAW,GAAG,OAAO;CAClF,MAAM,YAAA,GAAA,WAAA,WAAA,CAAsB,YAAY,uBAAuB,IAC3D,WAAW,wBAAwB,KAAK,gBAAgB,WAAW,KAAK,IAAI,IAC5E,IAAI,qBAAqB,KAAK,cAAc,EAAE;CAClD,QAAA,GAAA,WAAA,MAAA,CAAa,QAAQ,IAAI,OAAO,GAAG,KAAK,GAAG;AAC7C;AAEA,SAAS,eAAe,OAA+C;CACrE,MAAM,SAA2B,CAAC;CAClC,MAAM,8BAAc,IAAI,IAAoB;CAE5C,KAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,EAAE,GAAG;EAC1C,MAAM,QAAQ,MAAM;EACpB,MAAM,mBAAmB,YAAY,IAAI,MAAM,IAAI,KAAK,KAAK;EAC7D,YAAY,IAAI,MAAM,MAAM,eAAe;EAC3C,OAAO,KAAK;GACV,GAAG;GACH,UAAU,GAAG,MAAM,KAAK,GAAG;GAC3B;EACF,CAAC;CACH;CAEA,OAAO,QAAQ;CACf,OAAO;AACT;AAEA,SAAS,aAAa,OAAc,OAAe,SAA8C;CAC/F,MAAM,EAAE,MAAM,YAAY,YAAY,mBAAmB,kBAAkB,KAAK;CAChF,MAAM,aAAa,QAAQ;CAE3B,MAAM,YAAA,GAAA,gCAAA,eAAA,CAA0B,MAAMA,gCAAAA,WAAW,KAAK;CACtD,MAAM,YAAA,GAAA,gCAAA,eAAA,CAA0B,MAAMA,gCAAAA,WAAW,KAAK;CACtD,MAAM,YAAY,YAAA,GAAA,gCAAA,UAAA,CACH,QAAiD,KAAK,CAAC,IAClE,CAAC;CACL,MAAM,cAAc,YAAY,QAAQ,MAAM,EAAE,aAAa,QAAQ,KAAK,CAAC;CAC3E,MAAM,cAAc,YAAY,QAAQ,MAAM,EAAE,aAAa,QAAQ,KAAK,CAAC;CAC3E,MAAM,QAA8B;EAAC,GAAG;EAAa,GAAG;EAAW,GAAG;CAAW;CAEjF,IAAI,EAAA,GAAA,WAAA,MAAA,CAAO,QAAQ,GAAG;EACpB,MAAM,SAAA,GAAA,WAAA,WAAA,CAAmB,YAAY,MAAM,IACvC,WAAW,OAAO,UAAU,MAAM,KAAK,IACvC;EACJ,IAAI,EAAA,GAAA,WAAA,MAAA,CAAO,KAAK,GAAG;GACjB,MAAM,aAAa;IAAE;IAAO,MAAM;IAAY,YAAY;GAAG;GAC7D,IAAI,QAAQ,qBAAqB,MAAM,MAAM,KAAK,UAAU;QACvD,MAAM,OAAO,GAAG,GAAG,UAAU;EACpC;CACF;CAEA,IAAI,eAAe,KAAA,KAAa,WAAW,SAAS,GAAG;EACrD,MAAM,aAAa,WAChB,KAAK,MAAM,MAAM,iBAAiB,MAAM,GAAG,UAAU,CAAC,CAAC,CACvD,QAAQ,MAAmB,EAAA,GAAA,WAAA,MAAA,CAAO,CAAC,CAAC;EACvC,IAAI,WAAW,SAAS,GAAG;GACzB,MAAM,cAAA,GAAA,WAAA,WAAA,CAAwB,YAAY,MAAM,IAC5C,WAAW,OAAO,YAAY,MAAM,KAAK,IACzC,OAAO,WAAW,KAAK,KAAK;GAChC,IAAI,EAAA,GAAA,WAAA,MAAA,CAAO,UAAU,GACnB,MAAM,KAAK;IAAE,MAAM;IAAa,OAAO;IAAY,YAAY;GAAI,CAAC;EAExE;CACF;CAEA,IAAI,mBAAmB,KAAA,KAAa,eAAe,eAAe,KAAA,GAAW;EAC3E,KAAK,MAAM,CAAC,UAAU,OAAO,OAAO,QAAQ,eAAe,UAAU,GAAG;GACtE,IAAI,GAAG,WAAW,GAAG;GACrB,MAAM,cAAA,GAAA,WAAA,WAAA,CAAwB,YAAY,mBAAmB,IACzD,WAAW,oBAAoB,UAAuB,IAAI,MAAM,KAAK,IACrE,IAAI,SAAS,IAAI,qBAAqB,EAAE,EAAE;GAC9C,KAAA,GAAA,WAAA,MAAA,CAAU,UAAU,GAAG;GACvB,MAAM,KAAK;IACT,MAAM,GAAG,0BAA0B;IACnC,OAAO;IACP,YAAY;GACd,CAAC;EACH;EACA,IAAI,eAAe,WAAW,KAAA,KAAa,eAAe,OAAO,SAAS,GAAG;GAC3E,MAAM,WAAA,GAAA,WAAA,WAAA,CAAqB,YAAY,gBAAgB,IACnD,WAAW,iBAAiB,eAAe,QAAQ,MAAM,KAAK,IAC9D,IAAI,qBAAqB,eAAe,MAAM,EAAE;GACpD,IAAI,EAAA,GAAA,WAAA,MAAA,CAAO,OAAO,GAChB,MAAM,KAAK;IAAE,MAAM;IAAe,OAAO;IAAS,YAAY;GAAI,CAAC;EAEvE;CACF;CAEA,OAAO,EAAE,WAAW,eAAe,KAAK,EAAE;AAC5C;AAOA,SAAS,iBAAiB,SAAsC;CAC9D,MAAM,8BAAc,IAAI,IAAoB;CAC5C,MAAM,8BAAc,IAAI,IAAoB;CAE5C,KAAK,MAAM,UAAU,SACnB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,UAAU,QAAQ,KAAK;EAChD,MAAM,EAAE,UAAU,YAAY,kBAAkB,OAAO,UAAU;EACjE,MAAM,aAAa,iBAAiB;EACpC,MAAM,YAAY,OAAO,UAAU,SAAS,KAAK;EAEjD,YAAY,IAAI,WAAW,YAAY,IAAI,QAAQ,KAAK,KAAK,CAAC;EAC9D,YAAY,IACV,UACA,KAAK,IAAI,YAAY,IAAI,QAAQ,KAAK,OAAO,mBAAmB,aAAa,QAAQ,CACvF;CACF;CAGF,OAAO;EAAE;EAAa;CAAY;AACpC;AAEA,SAAS,cACP,OACA,cACmD;CACnD,MAAM,SAAS,CAAC,GAAG,MAAM,WAAW,CAAC,CAAC,MAAM,GAAG,KAAK,GAAG,QAAQ,KAAK,EAAE;CAEtE,MAAM,YAAsB,CAAC;CAC7B,MAAM,iBAA2B,CAAC;CAElC,KAAK,MAAM,CAAC,aAAa,QACvB,IAAI,SAAS,SAAS,IAAI,KAAK,MAAM,YAAY,IAAI,QAAQ,MAAM,cACjE,UAAU,KAAK,QAAQ;MACpB,eAAe,KAAK,QAAQ;CAGnC,OAAO;EAAE;EAAW;CAAe;AACrC;AAEA,SAAS,kBACP,QACA,eACA,oBACA,WACoB;CACpB,MAAM,aAAuB,CAAC;CAC9B,MAAM,cAAwB,CAAC;CAC/B,IAAI;CACJ,IAAI;CAEJ,KAAK,MAAM,MAAM,OAAO,WAAW;EACjC,IAAI,EAAE,cAAc,IAAI,GAAG,QAAQ,KAAK,oBAAoB,IAAI,GAAG,IAAI,IAAI;EAC3E,IAAI,GAAG,SAAS,aAAa,cAAc,GAAG;OACzC,IAAI,GAAG,SAAS,eAAe,WAAW,GAAG;OAC7C,IAAI,iBAAiB,GAAG,IAAI,GAAG,YAAY,KAAK,GAAG,KAAK;OACxD,WAAW,KAAK,GAAG,KAAK;CAC/B;CAQA,IALE,WAAW,WAAW,KACtB,YAAY,WAAW,KACvB,gBAAgB,KAAA,KAChB,aAAa,KAAA,GAEF,OAAO,KAAA;CAEpB,IAAI,QAAQ,WAAW,KAAK,SAAS;CACrC,MAAM,UAAU,SAAiB;EAC/B,QAAQ,MAAM,WAAW,IAAI,OAAO,GAAG,MAAM,GAAG;CAClD;CACA,IAAI,gBAAgB,KAAA,GAAW,OAAO,WAAW;CACjD,KAAK,MAAM,KAAK,aAAa,OAAO,CAAC;CACrC,IAAI,aAAa,KAAA,GAAW,OAAO,QAAQ;CAE3C,OAAO;AACT;AAEA,SAAS,YACP,SACA,eACA,oBACA,WACA,OACsB;CACtB,MAAM,SAAmB,CAAC;CAE1B,KAAK,MAAM,KAAK,SAAS;EACvB,MAAM,WAAW,kBAAkB,GAAG,eAAe,oBAAoB,SAAS;EAClF,IAAI,aAAa,KAAA,GAAW;GAC1B,IAAI,CAAC,OAAO,OAAO,KAAA;GACnB,OAAO,KAAK,WAAW;GACvB;EACF;EACA,OAAO,KAAK,QAAQ;CACtB;CAEA,OAAO;AACT;;;;;;;;;;;;;AAcA,SAAS,0BACP,SACA,eACA,oBACA,WACA,WACA,QACU;CACV,IAAI,CAAC,cAAc,IAAI,gBAAgB,GAAG,OAAO;CACjD,IAAI,UAAU,IAAI,gBAAgB,KAAK,oBAAoB,IAAI,WAAW,GAAG,OAAO;CAEpF,MAAM,mBAAmB,IAAI,IAAI,aAAa;CAC9C,iBAAiB,OAAO,gBAAgB;CAExC,MAAM,QAAQ,QAAQ,KAAK,MACzB,kBAAkB,GAAG,kBAAkB,oBAAoB,SAAS,CACtE;CAEA,MAAM,kCAAkB,IAAI,IAAoB;CAChD,KAAK,MAAM,KAAK,OACd,IAAI,MAAM,KAAA,GAAW,gBAAgB,IAAI,IAAI,gBAAgB,IAAI,CAAC,KAAK,KAAK,CAAC;CAG/E,OAAO,OAAO,KAAK,OAAO,MAAM;EAC9B,MAAM,OAAO,MAAM;EACnB,IAAI,SAAS,KAAA,GAAW,OAAO;EAC/B,OAAO,gBAAgB,IAAI,IAAI,MAAM,IAAI,OAAO;CAClD,CAAC;AACH;AAEA,SAAS,kBAAkB,QAAsC;CAC/D,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,OAAO,IAAI,IAAI,MAAM,CAAC,CAAC;AACzB;AAEA,SAAS,gBACP,SACA,SACA,OACA,oBACA,WACA,WACa;CACb,MAAM,gBAAgB,YAAY,SAAS,SAAS,oBAAoB,WAAW,KAAK;CACxF,IAAI,kBAAkB,KAAA,GAAW,OAAO;CAExC,MAAM,oBAAoB,kBAAkB,aAAa;CACzD,MAAM,SAAS,IAAI,IAAI,OAAO;CAE9B,MAAM,YAAY,CAAC,GAAG,MAAM,CAAC,CAC1B,QAAQ,MAAM,CAAC,oBAAoB,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,CAC7E,MAAM,GAAG,OAAO,MAAM,YAAY,IAAI,CAAC,KAAK,MAAM,MAAM,YAAY,IAAI,CAAC,KAAK,EAAE;CAEnF,KAAK,MAAM,gBAAgB,WAAW;EACpC,MAAM,YAAY,IAAI,IAAI,MAAM;EAChC,UAAU,OAAO,YAAY;EAC7B,MAAM,kBAAkB,YAAY,SAAS,WAAW,oBAAoB,WAAW,KAAK;EAC5F,IAAI,oBAAoB,KAAA,KAAa,kBAAkB,eAAe,KAAK,mBACzE,OAAO,OAAO,YAAY;CAE9B;CAEA,OAAO;AACT"}
|
|
1
|
+
{"version":3,"file":"derive_distinct_labels.cjs","names":["Annotation"],"sources":["../../src/labels/derive_distinct_labels.ts"],"sourcesContent":["import {\n Annotation,\n parseJson,\n readAnnotation,\n type AxisQualification,\n type MatchQualifications,\n type PObjectId,\n type PObjectSpec,\n type StringifiedJson,\n type Trace,\n} from \"@milaboratories/pl-model-common\";\nimport { throwError } from \"@milaboratories/helpers\";\nimport { isFunction, isNil } from \"es-toolkit\";\n\nexport type { Trace, TraceEntry } from \"@milaboratories/pl-model-common\";\n\nconst DISTANCE_PENALTY = 0.001;\nconst LABEL_TYPE = \"__LABEL__\";\nconst LABEL_TYPE_FULL = \"__LABEL__@1\";\nconst LINKER_TYPE = \"__LINKER__\";\nconst LINKER_TYPE_FULL = \"__LINKER__@1\";\nconst HIT_QUAL_TYPE = \"__HIT_QUAL__\";\nconst ANCHOR_QUAL_TYPE_PREFIX = \"__ANCHOR_QUAL__:\";\n\nfunction isAnchorQualType(t: string): boolean {\n return t.startsWith(ANCHOR_QUAL_TYPE_PREFIX);\n}\n\nfunction isSyntheticType(t: string): boolean {\n return t === LINKER_TYPE || t === HIT_QUAL_TYPE || isAnchorQualType(t);\n}\n\n/** SDK-internal trace shape — adds fields used by this algorithm only, not part of the on-disk contract. */\ntype ExtendedTraceEntry = Trace[number] & {\n importance?: number;\n position?: \"prefix\" | \"suffix\";\n};\n\nexport type LinkerStep = {\n spec: PObjectSpec;\n qualifications?: AxisQualification[];\n};\n\nexport type Entry =\n | PObjectSpec\n | {\n spec: PObjectSpec;\n /** Extra trace entries merged with the base trace from annotations. */\n extraTrace?: ExtendedTraceEntry[];\n /** Linker steps traversed to discover this column; rendered as \"via …\" only when needed for uniqueness. */\n linkerPath?: LinkerStep[];\n /** Axis qualifications applied to the hit column / already-bound anchors; rendered as \"[…]\" suffixes. */\n qualifications?: MatchQualifications;\n };\n\n/**\n * Per-zone formatters. Each one receives raw inputs and returns the rendered text for that zone,\n * or `undefined` to suppress the zone entirely (no synthetic injection → no minimization, no render).\n */\nexport type DeriveLabelsFormatters = {\n /** Native column label. Default: identity. `undefined` → label entry not added (treated as if spec had no label). */\n native?: (label: string, spec: PObjectSpec, index: number) => string | undefined;\n /** Linker zone (whole \"via …\" piece). Receives step labels with step-quals already inlined.\n * Default: `via ${steps.join(\" > \")}`. */\n linker?: (linkerLabels: string[], spec: PObjectSpec, index: number) => string | undefined;\n /** Per-step linker qualifications inlined into the step base label.\n * Default: `[${formatQualifications(qs)}]`. `undefined` → step rendered without quals. */\n linkerStepQualification?: (\n qualifications: AxisQualification[],\n stepIndex: number,\n stepSpec: PObjectSpec,\n ) => string | undefined;\n /** Hit-axis qualifications block. Default: `[${formatQualifications(qs)}]`. */\n hitQualification?: (\n qualifications: AxisQualification[],\n spec: PObjectSpec,\n index: number,\n ) => string | undefined;\n /** Per-anchor qualifications block. Default: `[${anchorId}: ${formatQualifications(qs)}]`. */\n anchorQualification?: (\n anchorId: PObjectId,\n qualifications: AxisQualification[],\n spec: PObjectSpec,\n index: number,\n ) => string | undefined;\n};\n\nexport type DeriveLabelsOptions = {\n /** Separator to use between label parts (\" / \" by default). */\n separator?: string;\n /** If true, native label is appended at the end of the trace zone. By default it is prepended (label is the most important name). */\n addLabelAsSuffix?: boolean;\n /** Force inclusion of native column label even when not needed for uniqueness. */\n includeNativeLabel?: boolean;\n /** Trace types that must be included in the label. */\n forceTraceElements?: string[];\n /** Per-zone custom formatters. Returning `undefined` from any formatter suppresses the corresponding zone. */\n formatters?: DeriveLabelsFormatters;\n};\n\nexport function deriveDistinctLabels(values: Entry[], options: DeriveLabelsOptions = {}): string[] {\n const forceTraceElements =\n options.forceTraceElements !== undefined && options.forceTraceElements.length > 0\n ? new Set(options.forceTraceElements)\n : undefined;\n const separator = options.separator ?? \" / \";\n\n const records = values.map((v, i) => enrichRecord(v, i, options));\n const stats = collectTypeStats(records);\n\n const hasAnySynthetic = records.some((r) => r.fullTrace.some((ft) => isSyntheticType(ft.type)));\n const labelForced =\n (options.includeNativeLabel === true || hasAnySynthetic) &&\n stats.countByType.has(LABEL_TYPE_FULL);\n // Tied to labeled-step presence, not path presence: entries with a non-empty linkerPath\n // but no labeled steps contribute no LINKER_TYPE trace entry, so they do not count here.\n const linkerForced = stats.countByType.get(LINKER_TYPE_FULL) === values.length;\n\n const forcedSet = new Set<string>();\n if (labelForced) forcedSet.add(LABEL_TYPE_FULL);\n if (linkerForced) forcedSet.add(LINKER_TYPE_FULL);\n\n const { mainTypes, secondaryTypes } = classifyTypes(stats, values.length);\n\n const build = (typeSet: Set<string>, force: boolean) =>\n buildLabels(records, typeSet, forceTraceElements, separator, force);\n\n if (mainTypes.length === 0) {\n if (secondaryTypes.length !== 0)\n throw new Error(\"Non-empty secondary types list while main types list is empty.\");\n\n return (\n build(new Set([LABEL_TYPE_FULL]), true) ??\n throwError(\"Failed to derive labels using native column labels\")\n );\n }\n\n let includedCount = 0;\n let additionalType = -1;\n while (includedCount < mainTypes.length) {\n const currentSet = new Set<string>(forcedSet);\n for (let i = 0; i < includedCount; ++i) currentSet.add(mainTypes[i]);\n if (additionalType >= 0) currentSet.add(mainTypes[additionalType]);\n\n const candidateResult = build(currentSet, false);\n if (candidateResult !== undefined && countUniqueLabels(candidateResult) === values.length) {\n const minimized = minimizeTypeSet(\n currentSet,\n records,\n stats,\n forceTraceElements,\n forcedSet,\n separator,\n );\n const minimizedLabels =\n build(minimized, false) ?? throwError(\"Failed to derive unique labels\");\n return dropRedundantLinkerSuffix(\n records,\n minimized,\n forceTraceElements,\n forcedSet,\n separator,\n minimizedLabels,\n );\n }\n\n additionalType++;\n if (additionalType >= mainTypes.length) {\n includedCount++;\n additionalType = includedCount;\n }\n }\n\n const fallbackSet = new Set([...forcedSet, ...mainTypes, ...secondaryTypes]);\n const minimized = minimizeTypeSet(\n fallbackSet,\n records,\n stats,\n forceTraceElements,\n forcedSet,\n separator,\n );\n const minimizedLabels = build(minimized, true) ?? throwError(\"Failed to derive unique labels\");\n return dropRedundantLinkerSuffix(\n records,\n minimized,\n forceTraceElements,\n forcedSet,\n separator,\n minimizedLabels,\n );\n}\n\n// --- Pure helpers ---\ntype FullTraceEntry = ExtendedTraceEntry & { fullType: string; occurrenceIndex: number };\n\ntype EnrichedRecord = {\n fullTrace: FullTraceEntry[];\n};\n\nfunction extractEntryParts(entry: Entry): {\n spec: PObjectSpec;\n extraTrace: ExtendedTraceEntry[] | undefined;\n linkerPath: LinkerStep[] | undefined;\n qualifications: MatchQualifications | undefined;\n} {\n const isEnriched = \"spec\" in entry && typeof entry.spec === \"object\";\n if (!isEnriched) {\n return {\n spec: entry as PObjectSpec,\n extraTrace: undefined,\n linkerPath: undefined,\n qualifications: undefined,\n };\n }\n return {\n spec: entry.spec,\n extraTrace: entry.extraTrace,\n linkerPath: entry.linkerPath,\n qualifications: entry.qualifications,\n };\n}\n\nfunction formatQualification(q: AxisQualification): string {\n const ctx = q.contextDomain ?? {};\n const keys = Object.keys(ctx);\n if (keys.length === 0) return q.axis.name;\n const pairs = keys.map((k) => `${k}=${ctx[k]}`).join(\", \");\n return Object.prototype.hasOwnProperty.call(ctx, q.axis.name) ? pairs : `${q.axis.name} ${pairs}`;\n}\n\nfunction formatQualifications(qs: AxisQualification[]): string {\n return qs.map(formatQualification).join(\"; \");\n}\n\nfunction computeStepLabel(\n step: LinkerStep,\n stepIndex: number,\n formatters: DeriveLabelsFormatters | undefined,\n): string | undefined {\n const base = (\n readAnnotation(step.spec, Annotation.LinkLabel) ?? readAnnotation(step.spec, Annotation.Label)\n )?.trim();\n if (isNil(base) || base.length === 0) return undefined;\n if (step.qualifications === undefined || step.qualifications.length === 0) return base;\n const qualText = isFunction(formatters?.linkerStepQualification)\n ? formatters.linkerStepQualification(step.qualifications, stepIndex, step.spec)\n : `[${formatQualifications(step.qualifications)}]`;\n return isNil(qualText) ? base : `${base} ${qualText}`;\n}\n\nfunction buildFullTrace(trace: ExtendedTraceEntry[]): FullTraceEntry[] {\n const result: FullTraceEntry[] = [];\n const occurrences = new Map<string, number>();\n\n for (let i = trace.length - 1; i >= 0; --i) {\n const entry = trace[i];\n const occurrenceIndex = (occurrences.get(entry.type) ?? 0) + 1;\n occurrences.set(entry.type, occurrenceIndex);\n result.push({\n ...entry,\n fullType: `${entry.type}@${occurrenceIndex}`,\n occurrenceIndex,\n });\n }\n\n result.reverse();\n return result;\n}\n\nfunction enrichRecord(value: Entry, index: number, options: DeriveLabelsOptions): EnrichedRecord {\n const { spec, extraTrace, linkerPath, qualifications } = extractEntryParts(value);\n const formatters = options.formatters;\n\n const rawLabel = readAnnotation(spec, Annotation.Label);\n const traceStr = readAnnotation(spec, Annotation.Trace);\n const baseTrace = traceStr\n ? (parseJson(traceStr as StringifiedJson<ExtendedTraceEntry[]>) ?? [])\n : [];\n const prefixExtra = extraTrace?.filter((e) => e.position === \"prefix\") ?? [];\n const suffixExtra = extraTrace?.filter((e) => e.position !== \"prefix\") ?? [];\n const trace: ExtendedTraceEntry[] = [...prefixExtra, ...baseTrace, ...suffixExtra];\n\n if (!isNil(rawLabel)) {\n const label = isFunction(formatters?.native)\n ? formatters.native(rawLabel, spec, index)\n : rawLabel;\n if (!isNil(label)) {\n const labelEntry = { label, type: LABEL_TYPE, importance: -2 };\n if (options.addLabelAsSuffix === true) trace.push(labelEntry);\n else trace.splice(0, 0, labelEntry);\n }\n }\n\n if (linkerPath !== undefined && linkerPath.length > 0) {\n const stepLabels = linkerPath\n .map((step, i) => computeStepLabel(step, i, formatters))\n .filter((s): s is string => !isNil(s));\n if (stepLabels.length > 0) {\n const linkerText = isFunction(formatters?.linker)\n ? formatters.linker(stepLabels, spec, index)\n : `via ${stepLabels.join(\" > \")}`;\n if (!isNil(linkerText)) {\n trace.push({ type: LINKER_TYPE, label: linkerText, importance: -10 });\n }\n }\n }\n\n if (qualifications !== undefined && qualifications.forQueries !== undefined) {\n for (const [anchorId, qs] of Object.entries(qualifications.forQueries)) {\n if (qs.length === 0) continue;\n const anchorText = isFunction(formatters?.anchorQualification)\n ? formatters.anchorQualification(anchorId as PObjectId, qs, spec, index)\n : `[${anchorId}: ${formatQualifications(qs)}]`;\n if (isNil(anchorText)) continue;\n trace.push({\n type: `${ANCHOR_QUAL_TYPE_PREFIX}${anchorId}`,\n label: anchorText,\n importance: -11,\n });\n }\n if (qualifications.forHit !== undefined && qualifications.forHit.length > 0) {\n const hitText = isFunction(formatters?.hitQualification)\n ? formatters.hitQualification(qualifications.forHit, spec, index)\n : `[${formatQualifications(qualifications.forHit)}]`;\n if (!isNil(hitText)) {\n trace.push({ type: HIT_QUAL_TYPE, label: hitText, importance: -12 });\n }\n }\n }\n\n return { fullTrace: buildFullTrace(trace) };\n}\n\ntype TypeStats = {\n importances: Map<string, number>;\n countByType: Map<string, number>;\n};\n\nfunction collectTypeStats(records: EnrichedRecord[]): TypeStats {\n const importances = new Map<string, number>();\n const countByType = new Map<string, number>();\n\n for (const record of records) {\n for (let i = 0; i < record.fullTrace.length; i++) {\n const { fullType, importance: rawImportance } = record.fullTrace[i];\n const importance = rawImportance ?? 0;\n const distance = (record.fullTrace.length - i) * DISTANCE_PENALTY;\n\n countByType.set(fullType, (countByType.get(fullType) ?? 0) + 1);\n importances.set(\n fullType,\n Math.max(importances.get(fullType) ?? Number.NEGATIVE_INFINITY, importance - distance),\n );\n }\n }\n\n return { importances, countByType };\n}\n\nfunction classifyTypes(\n stats: TypeStats,\n totalRecords: number,\n): { mainTypes: string[]; secondaryTypes: string[] } {\n const sorted = [...stats.importances].sort(([, i1], [, i2]) => i2 - i1);\n\n const mainTypes: string[] = [];\n const secondaryTypes: string[] = [];\n\n for (const [typeName] of sorted) {\n if (typeName.endsWith(\"@1\") || stats.countByType.get(typeName) === totalRecords)\n mainTypes.push(typeName);\n else secondaryTypes.push(typeName);\n }\n\n return { mainTypes, secondaryTypes };\n}\n\nfunction renderRecordLabel(\n record: EnrichedRecord,\n includedTypes: Set<string>,\n forceTraceElements: Set<string> | undefined,\n separator: string,\n): string | undefined {\n const traceParts: string[] = [];\n const anchorParts: string[] = [];\n let linkerLabel: string | undefined;\n let hitLabel: string | undefined;\n\n for (const ft of record.fullTrace) {\n if (!(includedTypes.has(ft.fullType) || forceTraceElements?.has(ft.type))) continue;\n if (ft.type === LINKER_TYPE) linkerLabel = ft.label;\n else if (ft.type === HIT_QUAL_TYPE) hitLabel = ft.label;\n else if (isAnchorQualType(ft.type)) anchorParts.push(ft.label);\n else traceParts.push(ft.label);\n }\n\n const isEmpty =\n traceParts.length === 0 &&\n anchorParts.length === 0 &&\n linkerLabel === undefined &&\n hitLabel === undefined;\n\n if (isEmpty) return undefined;\n\n let label = traceParts.join(separator);\n const append = (part: string) => {\n label = label.length === 0 ? part : `${label} ${part}`;\n };\n if (linkerLabel !== undefined) append(linkerLabel);\n for (const a of anchorParts) append(a);\n if (hitLabel !== undefined) append(hitLabel);\n\n return label;\n}\n\nfunction buildLabels(\n records: EnrichedRecord[],\n includedTypes: Set<string>,\n forceTraceElements: Set<string> | undefined,\n separator: string,\n force: boolean,\n): string[] | undefined {\n const result: string[] = [];\n\n for (const r of records) {\n const rendered = renderRecordLabel(r, includedTypes, forceTraceElements, separator);\n if (rendered === undefined) {\n if (!force) return undefined;\n result.push(\"Unlabeled\");\n continue;\n }\n result.push(rendered);\n }\n\n return result;\n}\n\n/**\n * Drop the \"via …\" linker suffix from records whose label is already unique without it.\n *\n * Global minimization may include `LINKER_TYPE_FULL` solely to resolve a collision between a\n * subset of records — but `buildLabels` then renders the suffix on every record that carries a\n * linker trace entry, including ones whose stem is already unique. We strip the suffix where it\n * isn't load-bearing while keeping the symmetric rendering required by `linkerForced` /\n * `forceTraceElements`.\n *\n * Rule: a record's linker suffix is redundant iff its stem (label rendered without LINKER) does\n * not appear anywhere else in the set.\n */\nfunction dropRedundantLinkerSuffix(\n records: EnrichedRecord[],\n globalTypeSet: Set<string>,\n forceTraceElements: Set<string> | undefined,\n forcedSet: Set<string>,\n separator: string,\n labels: string[],\n): string[] {\n if (!globalTypeSet.has(LINKER_TYPE_FULL)) return labels;\n if (forcedSet.has(LINKER_TYPE_FULL) || forceTraceElements?.has(LINKER_TYPE)) return labels;\n\n const setWithoutLinker = new Set(globalTypeSet);\n setWithoutLinker.delete(LINKER_TYPE_FULL);\n\n const stems = records.map((r) =>\n renderRecordLabel(r, setWithoutLinker, forceTraceElements, separator),\n );\n\n const stemOccurrences = new Map<string, number>();\n for (const s of stems) {\n if (s !== undefined) stemOccurrences.set(s, (stemOccurrences.get(s) ?? 0) + 1);\n }\n\n return labels.map((label, i) => {\n const stem = stems[i];\n if (stem === undefined) return label;\n return stemOccurrences.get(stem) === 1 ? stem : label;\n });\n}\n\nfunction countUniqueLabels(result: string[] | undefined): number {\n if (result === undefined) return 0;\n return new Set(result).size;\n}\n\nfunction minimizeTypeSet(\n typeSet: Set<string>,\n records: EnrichedRecord[],\n stats: TypeStats,\n forceTraceElements: Set<string> | undefined,\n forcedSet: Set<string>,\n separator: string,\n): Set<string> {\n const initialResult = buildLabels(records, typeSet, forceTraceElements, separator, false);\n if (initialResult === undefined) return typeSet;\n\n const targetCardinality = countUniqueLabels(initialResult);\n const result = new Set(typeSet);\n\n const removable = [...result]\n .filter((t) => !forceTraceElements?.has(t.split(\"@\")[0]) && !forcedSet.has(t))\n .sort((a, b) => (stats.importances.get(a) ?? 0) - (stats.importances.get(b) ?? 0));\n\n for (const typeToRemove of removable) {\n const candidate = new Set(result);\n candidate.delete(typeToRemove);\n const candidateResult = buildLabels(records, candidate, forceTraceElements, separator, false);\n if (candidateResult !== undefined && countUniqueLabels(candidateResult) >= targetCardinality) {\n result.delete(typeToRemove);\n }\n }\n\n return result;\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { MatchQualifications } from "
|
|
2
|
-
import { AxisQualification, PObjectId, PObjectSpec, Trace, Trace as Trace$1, TraceEntry } from "@milaboratories/pl-model-common";
|
|
1
|
+
import { AxisQualification, MatchQualifications, PObjectId, PObjectSpec, Trace, Trace as Trace$1, TraceEntry } from "@milaboratories/pl-model-common";
|
|
3
2
|
|
|
4
3
|
//#region src/labels/derive_distinct_labels.d.ts
|
|
5
4
|
/** SDK-internal trace shape — adds fields used by this algorithm only, not part of the on-disk contract. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive_distinct_labels.d.ts","names":[],"sources":["../../src/labels/derive_distinct_labels.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"derive_distinct_labels.d.ts","names":[],"sources":["../../src/labels/derive_distinct_labels.ts"],"mappings":";;;;KAiCK,kBAAA,GAAqB,KAAK;EAC7B,UAAA;EACA,QAAA;AAAA;AAAA,KAGU,UAAA;EACV,IAAA,EAAM,WAAA;EACN,cAAA,GAAiB,iBAAiB;AAAA;AAAA,KAGxB,KAAA,GACR,WAAA;EAEE,IAAA,EAAM,WAAA,EARU;EAUhB,UAAA,GAAa,kBAAA,IARiB;EAU9B,UAAA,GAAa,UAAA,IAXX;EAaF,cAAA,GAAiB,mBAAA;AAAA;;AAZa;AAGpC;;KAgBY,sBAAA;EAfR,qHAiBF,MAAA,IAAU,KAAA,UAAe,IAAA,EAAM,WAAA,EAAa,KAAA;EAb3B;;EAgBjB,MAAA,IAAU,YAAA,YAAwB,IAAA,EAAM,WAAA,EAAa,KAAA;EAZb;;EAexC,uBAAA,IACE,cAAA,EAAgB,iBAAA,IAChB,SAAA,UACA,QAAA,EAAU,WAAA,yBAxBR;EA2BJ,gBAAA,IACE,cAAA,EAAgB,iBAAA,IAChB,IAAA,EAAM,WAAA,EACN,KAAA,iCA5BE;EA+BJ,mBAAA,IACE,QAAA,EAAU,SAAA,EACV,cAAA,EAAgB,iBAAA,IAChB,IAAA,EAAM,WAAA,EACN,KAAA;AAAA;AAAA,KAIQ,mBAAA;EAnCN,+DAqCJ,SAAA,WArCwC;EAuCxC,gBAAA,YAhCU;EAkCV,kBAAA;EAEA,kBAAA,aA/BwC;EAiCxC,UAAA,GAAa,sBAAsB;AAAA;AAAA,iBAGrB,oBAAA,CAAqB,MAAA,EAAQ,KAAA,IAAS,OAAA,GAAS,mBAAwB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive_distinct_labels.js","names":["isNil"],"sources":["../../src/labels/derive_distinct_labels.ts"],"sourcesContent":["import {\n Annotation,\n parseJson,\n readAnnotation,\n type AxisQualification,\n type PObjectId,\n type PObjectSpec,\n type StringifiedJson,\n type Trace,\n} from \"@milaboratories/pl-model-common\";\nimport { throwError } from \"@milaboratories/helpers\";\nimport { isFunction, isNil } from \"es-toolkit\";\nimport type { MatchQualifications } from \"../columns/column_collection_builder\";\n\nexport type { Trace, TraceEntry } from \"@milaboratories/pl-model-common\";\n\nconst DISTANCE_PENALTY = 0.001;\nconst LABEL_TYPE = \"__LABEL__\";\nconst LABEL_TYPE_FULL = \"__LABEL__@1\";\nconst LINKER_TYPE = \"__LINKER__\";\nconst LINKER_TYPE_FULL = \"__LINKER__@1\";\nconst HIT_QUAL_TYPE = \"__HIT_QUAL__\";\nconst ANCHOR_QUAL_TYPE_PREFIX = \"__ANCHOR_QUAL__:\";\n\nfunction isAnchorQualType(t: string): boolean {\n return t.startsWith(ANCHOR_QUAL_TYPE_PREFIX);\n}\n\nfunction isSyntheticType(t: string): boolean {\n return t === LINKER_TYPE || t === HIT_QUAL_TYPE || isAnchorQualType(t);\n}\n\n/** SDK-internal trace shape — adds fields used by this algorithm only, not part of the on-disk contract. */\ntype ExtendedTraceEntry = Trace[number] & {\n importance?: number;\n position?: \"prefix\" | \"suffix\";\n};\n\nexport type LinkerStep = {\n spec: PObjectSpec;\n qualifications?: AxisQualification[];\n};\n\nexport type Entry =\n | PObjectSpec\n | {\n spec: PObjectSpec;\n /** Extra trace entries merged with the base trace from annotations. */\n extraTrace?: ExtendedTraceEntry[];\n /** Linker steps traversed to discover this column; rendered as \"via …\" only when needed for uniqueness. */\n linkerPath?: LinkerStep[];\n /** Axis qualifications applied to the hit column / already-bound anchors; rendered as \"[…]\" suffixes. */\n qualifications?: MatchQualifications;\n };\n\n/**\n * Per-zone formatters. Each one receives raw inputs and returns the rendered text for that zone,\n * or `undefined` to suppress the zone entirely (no synthetic injection → no minimization, no render).\n */\nexport type DeriveLabelsFormatters = {\n /** Native column label. Default: identity. `undefined` → label entry not added (treated as if spec had no label). */\n native?: (label: string, spec: PObjectSpec, index: number) => string | undefined;\n /** Linker zone (whole \"via …\" piece). Receives step labels with step-quals already inlined.\n * Default: `via ${steps.join(\" > \")}`. */\n linker?: (linkerLabels: string[], spec: PObjectSpec, index: number) => string | undefined;\n /** Per-step linker qualifications inlined into the step base label.\n * Default: `[${formatQualifications(qs)}]`. `undefined` → step rendered without quals. */\n linkerStepQualification?: (\n qualifications: AxisQualification[],\n stepIndex: number,\n stepSpec: PObjectSpec,\n ) => string | undefined;\n /** Hit-axis qualifications block. Default: `[${formatQualifications(qs)}]`. */\n hitQualification?: (\n qualifications: AxisQualification[],\n spec: PObjectSpec,\n index: number,\n ) => string | undefined;\n /** Per-anchor qualifications block. Default: `[${anchorId}: ${formatQualifications(qs)}]`. */\n anchorQualification?: (\n anchorId: PObjectId,\n qualifications: AxisQualification[],\n spec: PObjectSpec,\n index: number,\n ) => string | undefined;\n};\n\nexport type DeriveLabelsOptions = {\n /** Separator to use between label parts (\" / \" by default). */\n separator?: string;\n /** If true, native label is appended at the end of the trace zone. By default it is prepended (label is the most important name). */\n addLabelAsSuffix?: boolean;\n /** Force inclusion of native column label even when not needed for uniqueness. */\n includeNativeLabel?: boolean;\n /** Trace types that must be included in the label. */\n forceTraceElements?: string[];\n /** Per-zone custom formatters. Returning `undefined` from any formatter suppresses the corresponding zone. */\n formatters?: DeriveLabelsFormatters;\n};\n\nexport function deriveDistinctLabels(values: Entry[], options: DeriveLabelsOptions = {}): string[] {\n const forceTraceElements =\n options.forceTraceElements !== undefined && options.forceTraceElements.length > 0\n ? new Set(options.forceTraceElements)\n : undefined;\n const separator = options.separator ?? \" / \";\n\n const records = values.map((v, i) => enrichRecord(v, i, options));\n const stats = collectTypeStats(records);\n\n const hasAnySynthetic = records.some((r) => r.fullTrace.some((ft) => isSyntheticType(ft.type)));\n const labelForced =\n (options.includeNativeLabel === true || hasAnySynthetic) &&\n stats.countByType.has(LABEL_TYPE_FULL);\n // Tied to labeled-step presence, not path presence: entries with a non-empty linkerPath\n // but no labeled steps contribute no LINKER_TYPE trace entry, so they do not count here.\n const linkerForced = stats.countByType.get(LINKER_TYPE_FULL) === values.length;\n\n const forcedSet = new Set<string>();\n if (labelForced) forcedSet.add(LABEL_TYPE_FULL);\n if (linkerForced) forcedSet.add(LINKER_TYPE_FULL);\n\n const { mainTypes, secondaryTypes } = classifyTypes(stats, values.length);\n\n const build = (typeSet: Set<string>, force: boolean) =>\n buildLabels(records, typeSet, forceTraceElements, separator, force);\n\n if (mainTypes.length === 0) {\n if (secondaryTypes.length !== 0)\n throw new Error(\"Non-empty secondary types list while main types list is empty.\");\n\n return (\n build(new Set([LABEL_TYPE_FULL]), true) ??\n throwError(\"Failed to derive labels using native column labels\")\n );\n }\n\n let includedCount = 0;\n let additionalType = -1;\n while (includedCount < mainTypes.length) {\n const currentSet = new Set<string>(forcedSet);\n for (let i = 0; i < includedCount; ++i) currentSet.add(mainTypes[i]);\n if (additionalType >= 0) currentSet.add(mainTypes[additionalType]);\n\n const candidateResult = build(currentSet, false);\n if (candidateResult !== undefined && countUniqueLabels(candidateResult) === values.length) {\n const minimized = minimizeTypeSet(\n currentSet,\n records,\n stats,\n forceTraceElements,\n forcedSet,\n separator,\n );\n const minimizedLabels =\n build(minimized, false) ?? throwError(\"Failed to derive unique labels\");\n return dropRedundantLinkerSuffix(\n records,\n minimized,\n forceTraceElements,\n forcedSet,\n separator,\n minimizedLabels,\n );\n }\n\n additionalType++;\n if (additionalType >= mainTypes.length) {\n includedCount++;\n additionalType = includedCount;\n }\n }\n\n const fallbackSet = new Set([...forcedSet, ...mainTypes, ...secondaryTypes]);\n const minimized = minimizeTypeSet(\n fallbackSet,\n records,\n stats,\n forceTraceElements,\n forcedSet,\n separator,\n );\n const minimizedLabels = build(minimized, true) ?? throwError(\"Failed to derive unique labels\");\n return dropRedundantLinkerSuffix(\n records,\n minimized,\n forceTraceElements,\n forcedSet,\n separator,\n minimizedLabels,\n );\n}\n\n// --- Pure helpers ---\ntype FullTraceEntry = ExtendedTraceEntry & { fullType: string; occurrenceIndex: number };\n\ntype EnrichedRecord = {\n fullTrace: FullTraceEntry[];\n};\n\nfunction extractEntryParts(entry: Entry): {\n spec: PObjectSpec;\n extraTrace: ExtendedTraceEntry[] | undefined;\n linkerPath: LinkerStep[] | undefined;\n qualifications: MatchQualifications | undefined;\n} {\n const isEnriched = \"spec\" in entry && typeof entry.spec === \"object\";\n if (!isEnriched) {\n return {\n spec: entry as PObjectSpec,\n extraTrace: undefined,\n linkerPath: undefined,\n qualifications: undefined,\n };\n }\n return {\n spec: entry.spec,\n extraTrace: entry.extraTrace,\n linkerPath: entry.linkerPath,\n qualifications: entry.qualifications,\n };\n}\n\nfunction formatQualification(q: AxisQualification): string {\n const ctx = q.contextDomain ?? {};\n const keys = Object.keys(ctx);\n if (keys.length === 0) return q.axis.name;\n const pairs = keys.map((k) => `${k}=${ctx[k]}`).join(\", \");\n return Object.prototype.hasOwnProperty.call(ctx, q.axis.name) ? pairs : `${q.axis.name} ${pairs}`;\n}\n\nfunction formatQualifications(qs: AxisQualification[]): string {\n return qs.map(formatQualification).join(\"; \");\n}\n\nfunction computeStepLabel(\n step: LinkerStep,\n stepIndex: number,\n formatters: DeriveLabelsFormatters | undefined,\n): string | undefined {\n const base = (\n readAnnotation(step.spec, Annotation.LinkLabel) ?? readAnnotation(step.spec, Annotation.Label)\n )?.trim();\n if (isNil(base) || base.length === 0) return undefined;\n if (step.qualifications === undefined || step.qualifications.length === 0) return base;\n const qualText = isFunction(formatters?.linkerStepQualification)\n ? formatters.linkerStepQualification(step.qualifications, stepIndex, step.spec)\n : `[${formatQualifications(step.qualifications)}]`;\n return isNil(qualText) ? base : `${base} ${qualText}`;\n}\n\nfunction buildFullTrace(trace: ExtendedTraceEntry[]): FullTraceEntry[] {\n const result: FullTraceEntry[] = [];\n const occurrences = new Map<string, number>();\n\n for (let i = trace.length - 1; i >= 0; --i) {\n const entry = trace[i];\n const occurrenceIndex = (occurrences.get(entry.type) ?? 0) + 1;\n occurrences.set(entry.type, occurrenceIndex);\n result.push({\n ...entry,\n fullType: `${entry.type}@${occurrenceIndex}`,\n occurrenceIndex,\n });\n }\n\n result.reverse();\n return result;\n}\n\nfunction enrichRecord(value: Entry, index: number, options: DeriveLabelsOptions): EnrichedRecord {\n const { spec, extraTrace, linkerPath, qualifications } = extractEntryParts(value);\n const formatters = options.formatters;\n\n const rawLabel = readAnnotation(spec, Annotation.Label);\n const traceStr = readAnnotation(spec, Annotation.Trace);\n const baseTrace = traceStr\n ? (parseJson(traceStr as StringifiedJson<ExtendedTraceEntry[]>) ?? [])\n : [];\n const prefixExtra = extraTrace?.filter((e) => e.position === \"prefix\") ?? [];\n const suffixExtra = extraTrace?.filter((e) => e.position !== \"prefix\") ?? [];\n const trace: ExtendedTraceEntry[] = [...prefixExtra, ...baseTrace, ...suffixExtra];\n\n if (!isNil(rawLabel)) {\n const label = isFunction(formatters?.native)\n ? formatters.native(rawLabel, spec, index)\n : rawLabel;\n if (!isNil(label)) {\n const labelEntry = { label, type: LABEL_TYPE, importance: -2 };\n if (options.addLabelAsSuffix === true) trace.push(labelEntry);\n else trace.splice(0, 0, labelEntry);\n }\n }\n\n if (linkerPath !== undefined && linkerPath.length > 0) {\n const stepLabels = linkerPath\n .map((step, i) => computeStepLabel(step, i, formatters))\n .filter((s): s is string => !isNil(s));\n if (stepLabels.length > 0) {\n const linkerText = isFunction(formatters?.linker)\n ? formatters.linker(stepLabels, spec, index)\n : `via ${stepLabels.join(\" > \")}`;\n if (!isNil(linkerText)) {\n trace.push({ type: LINKER_TYPE, label: linkerText, importance: -10 });\n }\n }\n }\n\n if (qualifications !== undefined && qualifications.forQueries !== undefined) {\n for (const [anchorId, qs] of Object.entries(qualifications.forQueries)) {\n if (qs.length === 0) continue;\n const anchorText = isFunction(formatters?.anchorQualification)\n ? formatters.anchorQualification(anchorId as PObjectId, qs, spec, index)\n : `[${anchorId}: ${formatQualifications(qs)}]`;\n if (isNil(anchorText)) continue;\n trace.push({\n type: `${ANCHOR_QUAL_TYPE_PREFIX}${anchorId}`,\n label: anchorText,\n importance: -11,\n });\n }\n if (qualifications.forHit !== undefined && qualifications.forHit.length > 0) {\n const hitText = isFunction(formatters?.hitQualification)\n ? formatters.hitQualification(qualifications.forHit, spec, index)\n : `[${formatQualifications(qualifications.forHit)}]`;\n if (!isNil(hitText)) {\n trace.push({ type: HIT_QUAL_TYPE, label: hitText, importance: -12 });\n }\n }\n }\n\n return { fullTrace: buildFullTrace(trace) };\n}\n\ntype TypeStats = {\n importances: Map<string, number>;\n countByType: Map<string, number>;\n};\n\nfunction collectTypeStats(records: EnrichedRecord[]): TypeStats {\n const importances = new Map<string, number>();\n const countByType = new Map<string, number>();\n\n for (const record of records) {\n for (let i = 0; i < record.fullTrace.length; i++) {\n const { fullType, importance: rawImportance } = record.fullTrace[i];\n const importance = rawImportance ?? 0;\n const distance = (record.fullTrace.length - i) * DISTANCE_PENALTY;\n\n countByType.set(fullType, (countByType.get(fullType) ?? 0) + 1);\n importances.set(\n fullType,\n Math.max(importances.get(fullType) ?? Number.NEGATIVE_INFINITY, importance - distance),\n );\n }\n }\n\n return { importances, countByType };\n}\n\nfunction classifyTypes(\n stats: TypeStats,\n totalRecords: number,\n): { mainTypes: string[]; secondaryTypes: string[] } {\n const sorted = [...stats.importances].sort(([, i1], [, i2]) => i2 - i1);\n\n const mainTypes: string[] = [];\n const secondaryTypes: string[] = [];\n\n for (const [typeName] of sorted) {\n if (typeName.endsWith(\"@1\") || stats.countByType.get(typeName) === totalRecords)\n mainTypes.push(typeName);\n else secondaryTypes.push(typeName);\n }\n\n return { mainTypes, secondaryTypes };\n}\n\nfunction renderRecordLabel(\n record: EnrichedRecord,\n includedTypes: Set<string>,\n forceTraceElements: Set<string> | undefined,\n separator: string,\n): string | undefined {\n const traceParts: string[] = [];\n const anchorParts: string[] = [];\n let linkerLabel: string | undefined;\n let hitLabel: string | undefined;\n\n for (const ft of record.fullTrace) {\n if (!(includedTypes.has(ft.fullType) || forceTraceElements?.has(ft.type))) continue;\n if (ft.type === LINKER_TYPE) linkerLabel = ft.label;\n else if (ft.type === HIT_QUAL_TYPE) hitLabel = ft.label;\n else if (isAnchorQualType(ft.type)) anchorParts.push(ft.label);\n else traceParts.push(ft.label);\n }\n\n const isEmpty =\n traceParts.length === 0 &&\n anchorParts.length === 0 &&\n linkerLabel === undefined &&\n hitLabel === undefined;\n\n if (isEmpty) return undefined;\n\n let label = traceParts.join(separator);\n const append = (part: string) => {\n label = label.length === 0 ? part : `${label} ${part}`;\n };\n if (linkerLabel !== undefined) append(linkerLabel);\n for (const a of anchorParts) append(a);\n if (hitLabel !== undefined) append(hitLabel);\n\n return label;\n}\n\nfunction buildLabels(\n records: EnrichedRecord[],\n includedTypes: Set<string>,\n forceTraceElements: Set<string> | undefined,\n separator: string,\n force: boolean,\n): string[] | undefined {\n const result: string[] = [];\n\n for (const r of records) {\n const rendered = renderRecordLabel(r, includedTypes, forceTraceElements, separator);\n if (rendered === undefined) {\n if (!force) return undefined;\n result.push(\"Unlabeled\");\n continue;\n }\n result.push(rendered);\n }\n\n return result;\n}\n\n/**\n * Drop the \"via …\" linker suffix from records whose label is already unique without it.\n *\n * Global minimization may include `LINKER_TYPE_FULL` solely to resolve a collision between a\n * subset of records — but `buildLabels` then renders the suffix on every record that carries a\n * linker trace entry, including ones whose stem is already unique. We strip the suffix where it\n * isn't load-bearing while keeping the symmetric rendering required by `linkerForced` /\n * `forceTraceElements`.\n *\n * Rule: a record's linker suffix is redundant iff its stem (label rendered without LINKER) does\n * not appear anywhere else in the set.\n */\nfunction dropRedundantLinkerSuffix(\n records: EnrichedRecord[],\n globalTypeSet: Set<string>,\n forceTraceElements: Set<string> | undefined,\n forcedSet: Set<string>,\n separator: string,\n labels: string[],\n): string[] {\n if (!globalTypeSet.has(LINKER_TYPE_FULL)) return labels;\n if (forcedSet.has(LINKER_TYPE_FULL) || forceTraceElements?.has(LINKER_TYPE)) return labels;\n\n const setWithoutLinker = new Set(globalTypeSet);\n setWithoutLinker.delete(LINKER_TYPE_FULL);\n\n const stems = records.map((r) =>\n renderRecordLabel(r, setWithoutLinker, forceTraceElements, separator),\n );\n\n const stemOccurrences = new Map<string, number>();\n for (const s of stems) {\n if (s !== undefined) stemOccurrences.set(s, (stemOccurrences.get(s) ?? 0) + 1);\n }\n\n return labels.map((label, i) => {\n const stem = stems[i];\n if (stem === undefined) return label;\n return stemOccurrences.get(stem) === 1 ? stem : label;\n });\n}\n\nfunction countUniqueLabels(result: string[] | undefined): number {\n if (result === undefined) return 0;\n return new Set(result).size;\n}\n\nfunction minimizeTypeSet(\n typeSet: Set<string>,\n records: EnrichedRecord[],\n stats: TypeStats,\n forceTraceElements: Set<string> | undefined,\n forcedSet: Set<string>,\n separator: string,\n): Set<string> {\n const initialResult = buildLabels(records, typeSet, forceTraceElements, separator, false);\n if (initialResult === undefined) return typeSet;\n\n const targetCardinality = countUniqueLabels(initialResult);\n const result = new Set(typeSet);\n\n const removable = [...result]\n .filter((t) => !forceTraceElements?.has(t.split(\"@\")[0]) && !forcedSet.has(t))\n .sort((a, b) => (stats.importances.get(a) ?? 0) - (stats.importances.get(b) ?? 0));\n\n for (const typeToRemove of removable) {\n const candidate = new Set(result);\n candidate.delete(typeToRemove);\n const candidateResult = buildLabels(records, candidate, forceTraceElements, separator, false);\n if (candidateResult !== undefined && countUniqueLabels(candidateResult) >= targetCardinality) {\n result.delete(typeToRemove);\n }\n }\n\n return result;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"derive_distinct_labels.js","names":["isNil"],"sources":["../../src/labels/derive_distinct_labels.ts"],"sourcesContent":["import {\n Annotation,\n parseJson,\n readAnnotation,\n type AxisQualification,\n type MatchQualifications,\n type PObjectId,\n type PObjectSpec,\n type StringifiedJson,\n type Trace,\n} from \"@milaboratories/pl-model-common\";\nimport { throwError } from \"@milaboratories/helpers\";\nimport { isFunction, isNil } from \"es-toolkit\";\n\nexport type { Trace, TraceEntry } from \"@milaboratories/pl-model-common\";\n\nconst DISTANCE_PENALTY = 0.001;\nconst LABEL_TYPE = \"__LABEL__\";\nconst LABEL_TYPE_FULL = \"__LABEL__@1\";\nconst LINKER_TYPE = \"__LINKER__\";\nconst LINKER_TYPE_FULL = \"__LINKER__@1\";\nconst HIT_QUAL_TYPE = \"__HIT_QUAL__\";\nconst ANCHOR_QUAL_TYPE_PREFIX = \"__ANCHOR_QUAL__:\";\n\nfunction isAnchorQualType(t: string): boolean {\n return t.startsWith(ANCHOR_QUAL_TYPE_PREFIX);\n}\n\nfunction isSyntheticType(t: string): boolean {\n return t === LINKER_TYPE || t === HIT_QUAL_TYPE || isAnchorQualType(t);\n}\n\n/** SDK-internal trace shape — adds fields used by this algorithm only, not part of the on-disk contract. */\ntype ExtendedTraceEntry = Trace[number] & {\n importance?: number;\n position?: \"prefix\" | \"suffix\";\n};\n\nexport type LinkerStep = {\n spec: PObjectSpec;\n qualifications?: AxisQualification[];\n};\n\nexport type Entry =\n | PObjectSpec\n | {\n spec: PObjectSpec;\n /** Extra trace entries merged with the base trace from annotations. */\n extraTrace?: ExtendedTraceEntry[];\n /** Linker steps traversed to discover this column; rendered as \"via …\" only when needed for uniqueness. */\n linkerPath?: LinkerStep[];\n /** Axis qualifications applied to the hit column / already-bound anchors; rendered as \"[…]\" suffixes. */\n qualifications?: MatchQualifications;\n };\n\n/**\n * Per-zone formatters. Each one receives raw inputs and returns the rendered text for that zone,\n * or `undefined` to suppress the zone entirely (no synthetic injection → no minimization, no render).\n */\nexport type DeriveLabelsFormatters = {\n /** Native column label. Default: identity. `undefined` → label entry not added (treated as if spec had no label). */\n native?: (label: string, spec: PObjectSpec, index: number) => string | undefined;\n /** Linker zone (whole \"via …\" piece). Receives step labels with step-quals already inlined.\n * Default: `via ${steps.join(\" > \")}`. */\n linker?: (linkerLabels: string[], spec: PObjectSpec, index: number) => string | undefined;\n /** Per-step linker qualifications inlined into the step base label.\n * Default: `[${formatQualifications(qs)}]`. `undefined` → step rendered without quals. */\n linkerStepQualification?: (\n qualifications: AxisQualification[],\n stepIndex: number,\n stepSpec: PObjectSpec,\n ) => string | undefined;\n /** Hit-axis qualifications block. Default: `[${formatQualifications(qs)}]`. */\n hitQualification?: (\n qualifications: AxisQualification[],\n spec: PObjectSpec,\n index: number,\n ) => string | undefined;\n /** Per-anchor qualifications block. Default: `[${anchorId}: ${formatQualifications(qs)}]`. */\n anchorQualification?: (\n anchorId: PObjectId,\n qualifications: AxisQualification[],\n spec: PObjectSpec,\n index: number,\n ) => string | undefined;\n};\n\nexport type DeriveLabelsOptions = {\n /** Separator to use between label parts (\" / \" by default). */\n separator?: string;\n /** If true, native label is appended at the end of the trace zone. By default it is prepended (label is the most important name). */\n addLabelAsSuffix?: boolean;\n /** Force inclusion of native column label even when not needed for uniqueness. */\n includeNativeLabel?: boolean;\n /** Trace types that must be included in the label. */\n forceTraceElements?: string[];\n /** Per-zone custom formatters. Returning `undefined` from any formatter suppresses the corresponding zone. */\n formatters?: DeriveLabelsFormatters;\n};\n\nexport function deriveDistinctLabels(values: Entry[], options: DeriveLabelsOptions = {}): string[] {\n const forceTraceElements =\n options.forceTraceElements !== undefined && options.forceTraceElements.length > 0\n ? new Set(options.forceTraceElements)\n : undefined;\n const separator = options.separator ?? \" / \";\n\n const records = values.map((v, i) => enrichRecord(v, i, options));\n const stats = collectTypeStats(records);\n\n const hasAnySynthetic = records.some((r) => r.fullTrace.some((ft) => isSyntheticType(ft.type)));\n const labelForced =\n (options.includeNativeLabel === true || hasAnySynthetic) &&\n stats.countByType.has(LABEL_TYPE_FULL);\n // Tied to labeled-step presence, not path presence: entries with a non-empty linkerPath\n // but no labeled steps contribute no LINKER_TYPE trace entry, so they do not count here.\n const linkerForced = stats.countByType.get(LINKER_TYPE_FULL) === values.length;\n\n const forcedSet = new Set<string>();\n if (labelForced) forcedSet.add(LABEL_TYPE_FULL);\n if (linkerForced) forcedSet.add(LINKER_TYPE_FULL);\n\n const { mainTypes, secondaryTypes } = classifyTypes(stats, values.length);\n\n const build = (typeSet: Set<string>, force: boolean) =>\n buildLabels(records, typeSet, forceTraceElements, separator, force);\n\n if (mainTypes.length === 0) {\n if (secondaryTypes.length !== 0)\n throw new Error(\"Non-empty secondary types list while main types list is empty.\");\n\n return (\n build(new Set([LABEL_TYPE_FULL]), true) ??\n throwError(\"Failed to derive labels using native column labels\")\n );\n }\n\n let includedCount = 0;\n let additionalType = -1;\n while (includedCount < mainTypes.length) {\n const currentSet = new Set<string>(forcedSet);\n for (let i = 0; i < includedCount; ++i) currentSet.add(mainTypes[i]);\n if (additionalType >= 0) currentSet.add(mainTypes[additionalType]);\n\n const candidateResult = build(currentSet, false);\n if (candidateResult !== undefined && countUniqueLabels(candidateResult) === values.length) {\n const minimized = minimizeTypeSet(\n currentSet,\n records,\n stats,\n forceTraceElements,\n forcedSet,\n separator,\n );\n const minimizedLabels =\n build(minimized, false) ?? throwError(\"Failed to derive unique labels\");\n return dropRedundantLinkerSuffix(\n records,\n minimized,\n forceTraceElements,\n forcedSet,\n separator,\n minimizedLabels,\n );\n }\n\n additionalType++;\n if (additionalType >= mainTypes.length) {\n includedCount++;\n additionalType = includedCount;\n }\n }\n\n const fallbackSet = new Set([...forcedSet, ...mainTypes, ...secondaryTypes]);\n const minimized = minimizeTypeSet(\n fallbackSet,\n records,\n stats,\n forceTraceElements,\n forcedSet,\n separator,\n );\n const minimizedLabels = build(minimized, true) ?? throwError(\"Failed to derive unique labels\");\n return dropRedundantLinkerSuffix(\n records,\n minimized,\n forceTraceElements,\n forcedSet,\n separator,\n minimizedLabels,\n );\n}\n\n// --- Pure helpers ---\ntype FullTraceEntry = ExtendedTraceEntry & { fullType: string; occurrenceIndex: number };\n\ntype EnrichedRecord = {\n fullTrace: FullTraceEntry[];\n};\n\nfunction extractEntryParts(entry: Entry): {\n spec: PObjectSpec;\n extraTrace: ExtendedTraceEntry[] | undefined;\n linkerPath: LinkerStep[] | undefined;\n qualifications: MatchQualifications | undefined;\n} {\n const isEnriched = \"spec\" in entry && typeof entry.spec === \"object\";\n if (!isEnriched) {\n return {\n spec: entry as PObjectSpec,\n extraTrace: undefined,\n linkerPath: undefined,\n qualifications: undefined,\n };\n }\n return {\n spec: entry.spec,\n extraTrace: entry.extraTrace,\n linkerPath: entry.linkerPath,\n qualifications: entry.qualifications,\n };\n}\n\nfunction formatQualification(q: AxisQualification): string {\n const ctx = q.contextDomain ?? {};\n const keys = Object.keys(ctx);\n if (keys.length === 0) return q.axis.name;\n const pairs = keys.map((k) => `${k}=${ctx[k]}`).join(\", \");\n return Object.prototype.hasOwnProperty.call(ctx, q.axis.name) ? pairs : `${q.axis.name} ${pairs}`;\n}\n\nfunction formatQualifications(qs: AxisQualification[]): string {\n return qs.map(formatQualification).join(\"; \");\n}\n\nfunction computeStepLabel(\n step: LinkerStep,\n stepIndex: number,\n formatters: DeriveLabelsFormatters | undefined,\n): string | undefined {\n const base = (\n readAnnotation(step.spec, Annotation.LinkLabel) ?? readAnnotation(step.spec, Annotation.Label)\n )?.trim();\n if (isNil(base) || base.length === 0) return undefined;\n if (step.qualifications === undefined || step.qualifications.length === 0) return base;\n const qualText = isFunction(formatters?.linkerStepQualification)\n ? formatters.linkerStepQualification(step.qualifications, stepIndex, step.spec)\n : `[${formatQualifications(step.qualifications)}]`;\n return isNil(qualText) ? base : `${base} ${qualText}`;\n}\n\nfunction buildFullTrace(trace: ExtendedTraceEntry[]): FullTraceEntry[] {\n const result: FullTraceEntry[] = [];\n const occurrences = new Map<string, number>();\n\n for (let i = trace.length - 1; i >= 0; --i) {\n const entry = trace[i];\n const occurrenceIndex = (occurrences.get(entry.type) ?? 0) + 1;\n occurrences.set(entry.type, occurrenceIndex);\n result.push({\n ...entry,\n fullType: `${entry.type}@${occurrenceIndex}`,\n occurrenceIndex,\n });\n }\n\n result.reverse();\n return result;\n}\n\nfunction enrichRecord(value: Entry, index: number, options: DeriveLabelsOptions): EnrichedRecord {\n const { spec, extraTrace, linkerPath, qualifications } = extractEntryParts(value);\n const formatters = options.formatters;\n\n const rawLabel = readAnnotation(spec, Annotation.Label);\n const traceStr = readAnnotation(spec, Annotation.Trace);\n const baseTrace = traceStr\n ? (parseJson(traceStr as StringifiedJson<ExtendedTraceEntry[]>) ?? [])\n : [];\n const prefixExtra = extraTrace?.filter((e) => e.position === \"prefix\") ?? [];\n const suffixExtra = extraTrace?.filter((e) => e.position !== \"prefix\") ?? [];\n const trace: ExtendedTraceEntry[] = [...prefixExtra, ...baseTrace, ...suffixExtra];\n\n if (!isNil(rawLabel)) {\n const label = isFunction(formatters?.native)\n ? formatters.native(rawLabel, spec, index)\n : rawLabel;\n if (!isNil(label)) {\n const labelEntry = { label, type: LABEL_TYPE, importance: -2 };\n if (options.addLabelAsSuffix === true) trace.push(labelEntry);\n else trace.splice(0, 0, labelEntry);\n }\n }\n\n if (linkerPath !== undefined && linkerPath.length > 0) {\n const stepLabels = linkerPath\n .map((step, i) => computeStepLabel(step, i, formatters))\n .filter((s): s is string => !isNil(s));\n if (stepLabels.length > 0) {\n const linkerText = isFunction(formatters?.linker)\n ? formatters.linker(stepLabels, spec, index)\n : `via ${stepLabels.join(\" > \")}`;\n if (!isNil(linkerText)) {\n trace.push({ type: LINKER_TYPE, label: linkerText, importance: -10 });\n }\n }\n }\n\n if (qualifications !== undefined && qualifications.forQueries !== undefined) {\n for (const [anchorId, qs] of Object.entries(qualifications.forQueries)) {\n if (qs.length === 0) continue;\n const anchorText = isFunction(formatters?.anchorQualification)\n ? formatters.anchorQualification(anchorId as PObjectId, qs, spec, index)\n : `[${anchorId}: ${formatQualifications(qs)}]`;\n if (isNil(anchorText)) continue;\n trace.push({\n type: `${ANCHOR_QUAL_TYPE_PREFIX}${anchorId}`,\n label: anchorText,\n importance: -11,\n });\n }\n if (qualifications.forHit !== undefined && qualifications.forHit.length > 0) {\n const hitText = isFunction(formatters?.hitQualification)\n ? formatters.hitQualification(qualifications.forHit, spec, index)\n : `[${formatQualifications(qualifications.forHit)}]`;\n if (!isNil(hitText)) {\n trace.push({ type: HIT_QUAL_TYPE, label: hitText, importance: -12 });\n }\n }\n }\n\n return { fullTrace: buildFullTrace(trace) };\n}\n\ntype TypeStats = {\n importances: Map<string, number>;\n countByType: Map<string, number>;\n};\n\nfunction collectTypeStats(records: EnrichedRecord[]): TypeStats {\n const importances = new Map<string, number>();\n const countByType = new Map<string, number>();\n\n for (const record of records) {\n for (let i = 0; i < record.fullTrace.length; i++) {\n const { fullType, importance: rawImportance } = record.fullTrace[i];\n const importance = rawImportance ?? 0;\n const distance = (record.fullTrace.length - i) * DISTANCE_PENALTY;\n\n countByType.set(fullType, (countByType.get(fullType) ?? 0) + 1);\n importances.set(\n fullType,\n Math.max(importances.get(fullType) ?? Number.NEGATIVE_INFINITY, importance - distance),\n );\n }\n }\n\n return { importances, countByType };\n}\n\nfunction classifyTypes(\n stats: TypeStats,\n totalRecords: number,\n): { mainTypes: string[]; secondaryTypes: string[] } {\n const sorted = [...stats.importances].sort(([, i1], [, i2]) => i2 - i1);\n\n const mainTypes: string[] = [];\n const secondaryTypes: string[] = [];\n\n for (const [typeName] of sorted) {\n if (typeName.endsWith(\"@1\") || stats.countByType.get(typeName) === totalRecords)\n mainTypes.push(typeName);\n else secondaryTypes.push(typeName);\n }\n\n return { mainTypes, secondaryTypes };\n}\n\nfunction renderRecordLabel(\n record: EnrichedRecord,\n includedTypes: Set<string>,\n forceTraceElements: Set<string> | undefined,\n separator: string,\n): string | undefined {\n const traceParts: string[] = [];\n const anchorParts: string[] = [];\n let linkerLabel: string | undefined;\n let hitLabel: string | undefined;\n\n for (const ft of record.fullTrace) {\n if (!(includedTypes.has(ft.fullType) || forceTraceElements?.has(ft.type))) continue;\n if (ft.type === LINKER_TYPE) linkerLabel = ft.label;\n else if (ft.type === HIT_QUAL_TYPE) hitLabel = ft.label;\n else if (isAnchorQualType(ft.type)) anchorParts.push(ft.label);\n else traceParts.push(ft.label);\n }\n\n const isEmpty =\n traceParts.length === 0 &&\n anchorParts.length === 0 &&\n linkerLabel === undefined &&\n hitLabel === undefined;\n\n if (isEmpty) return undefined;\n\n let label = traceParts.join(separator);\n const append = (part: string) => {\n label = label.length === 0 ? part : `${label} ${part}`;\n };\n if (linkerLabel !== undefined) append(linkerLabel);\n for (const a of anchorParts) append(a);\n if (hitLabel !== undefined) append(hitLabel);\n\n return label;\n}\n\nfunction buildLabels(\n records: EnrichedRecord[],\n includedTypes: Set<string>,\n forceTraceElements: Set<string> | undefined,\n separator: string,\n force: boolean,\n): string[] | undefined {\n const result: string[] = [];\n\n for (const r of records) {\n const rendered = renderRecordLabel(r, includedTypes, forceTraceElements, separator);\n if (rendered === undefined) {\n if (!force) return undefined;\n result.push(\"Unlabeled\");\n continue;\n }\n result.push(rendered);\n }\n\n return result;\n}\n\n/**\n * Drop the \"via …\" linker suffix from records whose label is already unique without it.\n *\n * Global minimization may include `LINKER_TYPE_FULL` solely to resolve a collision between a\n * subset of records — but `buildLabels` then renders the suffix on every record that carries a\n * linker trace entry, including ones whose stem is already unique. We strip the suffix where it\n * isn't load-bearing while keeping the symmetric rendering required by `linkerForced` /\n * `forceTraceElements`.\n *\n * Rule: a record's linker suffix is redundant iff its stem (label rendered without LINKER) does\n * not appear anywhere else in the set.\n */\nfunction dropRedundantLinkerSuffix(\n records: EnrichedRecord[],\n globalTypeSet: Set<string>,\n forceTraceElements: Set<string> | undefined,\n forcedSet: Set<string>,\n separator: string,\n labels: string[],\n): string[] {\n if (!globalTypeSet.has(LINKER_TYPE_FULL)) return labels;\n if (forcedSet.has(LINKER_TYPE_FULL) || forceTraceElements?.has(LINKER_TYPE)) return labels;\n\n const setWithoutLinker = new Set(globalTypeSet);\n setWithoutLinker.delete(LINKER_TYPE_FULL);\n\n const stems = records.map((r) =>\n renderRecordLabel(r, setWithoutLinker, forceTraceElements, separator),\n );\n\n const stemOccurrences = new Map<string, number>();\n for (const s of stems) {\n if (s !== undefined) stemOccurrences.set(s, (stemOccurrences.get(s) ?? 0) + 1);\n }\n\n return labels.map((label, i) => {\n const stem = stems[i];\n if (stem === undefined) return label;\n return stemOccurrences.get(stem) === 1 ? stem : label;\n });\n}\n\nfunction countUniqueLabels(result: string[] | undefined): number {\n if (result === undefined) return 0;\n return new Set(result).size;\n}\n\nfunction minimizeTypeSet(\n typeSet: Set<string>,\n records: EnrichedRecord[],\n stats: TypeStats,\n forceTraceElements: Set<string> | undefined,\n forcedSet: Set<string>,\n separator: string,\n): Set<string> {\n const initialResult = buildLabels(records, typeSet, forceTraceElements, separator, false);\n if (initialResult === undefined) return typeSet;\n\n const targetCardinality = countUniqueLabels(initialResult);\n const result = new Set(typeSet);\n\n const removable = [...result]\n .filter((t) => !forceTraceElements?.has(t.split(\"@\")[0]) && !forcedSet.has(t))\n .sort((a, b) => (stats.importances.get(a) ?? 0) - (stats.importances.get(b) ?? 0));\n\n for (const typeToRemove of removable) {\n const candidate = new Set(result);\n candidate.delete(typeToRemove);\n const candidateResult = buildLabels(records, candidate, forceTraceElements, separator, false);\n if (candidateResult !== undefined && countUniqueLabels(candidateResult) >= targetCardinality) {\n result.delete(typeToRemove);\n }\n }\n\n return result;\n}\n"],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ function formatTooltip(entry) {
|
|
|
16
16
|
const hit = formatHit(entry.qualifications);
|
|
17
17
|
if (hit !== void 0) sections.push(hit);
|
|
18
18
|
if (sections.length <= 1) return void 0;
|
|
19
|
-
return sections.join("\n\n");
|
|
19
|
+
return sections.filter((s) => s.length > 0).join("\n\n");
|
|
20
20
|
}
|
|
21
21
|
const BULLET_1 = " • ";
|
|
22
22
|
function formatHeader(entry) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive_distinct_tooltips.cjs","names":["Annotation"],"sources":["../../src/labels/derive_distinct_tooltips.ts"],"sourcesContent":["import {\n Annotation,\n PObjectId,\n readAnnotation,\n type AxisQualification,\n type PColumnSpec,\n} from \"@milaboratories/pl-model-common\";\nimport { isNil } from \"es-toolkit\";\
|
|
1
|
+
{"version":3,"file":"derive_distinct_tooltips.cjs","names":["Annotation"],"sources":["../../src/labels/derive_distinct_tooltips.ts"],"sourcesContent":["import {\n Annotation,\n PObjectId,\n readAnnotation,\n type AxisQualification,\n type MatchQualifications,\n type PColumnSpec,\n} from \"@milaboratories/pl-model-common\";\nimport { isNil } from \"es-toolkit\";\n\nexport type TooltipEntry = {\n /** Main column spec — used for column-name fallback when no label. */\n spec: PColumnSpec;\n /** Qualifications carried by this variant. */\n qualifications?: MatchQualifications;\n /** Linker steps traversed to reach the hit column. */\n linkerPath?: ReadonlyArray<{ readonly linker: { readonly spec: PColumnSpec } }>;\n /** Position of this variant within the same physical column (1-based). */\n variantIndex?: number;\n /** Total variants for the same physical column. */\n variantCount?: number;\n};\n\n/** Format tooltip strings for each entry. Returns `undefined` when nothing useful. */\nexport function deriveDistinctTooltips(entries: TooltipEntry[]): (undefined | string)[] {\n return entries.map(formatTooltip);\n}\n\nfunction formatTooltip(entry: TooltipEntry): undefined | string {\n const sections: string[] = [];\n\n const header = formatHeader(entry);\n if (header !== undefined) sections.push(header);\n\n const origin = formatOriginPath(entry);\n if (origin !== undefined) sections.push(origin);\n\n const anchors = formatAnchors(entry.qualifications);\n if (anchors !== undefined) sections.push(anchors);\n\n const hit = formatHit(entry.qualifications);\n if (hit !== undefined) sections.push(hit);\n\n if (sections.length <= 1) return undefined;\n return sections.filter((s) => s.length > 0).join(\"\\n\\n\");\n}\n\nconst BULLET_1 = \" • \";\n\nfunction formatHeader(entry: TooltipEntry): undefined | string {\n const lines: string[] = [];\n if (entry.variantCount !== undefined && entry.variantCount > 1) {\n lines.push(`Variant: ${entry.variantIndex ?? \"?\"} of ${entry.variantCount}`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction formatOriginPath(entry: TooltipEntry): undefined | string {\n const path = entry.linkerPath ?? [];\n if (path.length === 0) return undefined;\n\n const lines = [\"Origin path\"];\n path.forEach((step, i) => {\n const label =\n readAnnotation(step.linker.spec, Annotation.LinkLabel) ??\n readAnnotation(step.linker.spec, Annotation.Label) ??\n step.linker.spec.name;\n lines.push(`${BULLET_1}linker ${i + 1}: ${label}`);\n });\n const hitName = readAnnotation(entry.spec, Annotation.Label) ?? entry.spec.name;\n lines.push(`${BULLET_1}hit column: ${hitName}`);\n return lines.join(\"\\n\");\n}\n\nfunction formatAnchors(q: undefined | MatchQualifications): undefined | string {\n if (isNil(q)) return undefined;\n if (isNil(q.forQueries)) return undefined;\n const ids = Object.keys(q.forQueries);\n if (ids.length === 0) return undefined;\n\n const lines = [];\n for (const id of ids) {\n const item = q.forQueries[id as PObjectId];\n if (item.length === 0) continue;\n const rendered = formatAxisQualifications(item);\n lines.push(`${BULLET_1}${id}${rendered !== undefined ? ` ${rendered}` : \"\"}`);\n }\n return lines.length > 0\n ? [\"Anchors (bound via this variant)\"].concat(lines).join(\"\\n\")\n : undefined;\n}\n\nfunction formatHit(q: undefined | MatchQualifications): undefined | string {\n if (isNil(q) || isNil(q.forHit) || q.forHit.length === 0) return undefined;\n const rendered = formatAxisQualifications(q.forHit);\n if (rendered === undefined) return undefined;\n return [\"Hit column qualifications\", `${BULLET_1}${rendered}`].join(\"\\n\");\n}\n\nfunction formatAxisQualifications(qs: AxisQualification[]): undefined | string {\n if (qs.length === 0) return undefined;\n return qs.map(formatQualification).join(\"; \");\n}\n\nfunction formatQualification(q: AxisQualification): string {\n const axisName = typeof q.axis === \"string\" ? q.axis : (q.axis.name ?? JSON.stringify(q.axis));\n const entries = Object.entries(q.contextDomain);\n if (entries.length === 0) return axisName;\n const kv = entries.map(([k, v]) => `${k}=${v}`).join(\", \");\n return `${axisName} context: ${kv}`;\n}\n"],"mappings":"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"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import { MatchQualifications,
|
|
2
|
-
import { PColumnSpec } from "@milaboratories/pl-model-common";
|
|
1
|
+
import { MatchQualifications, PColumnSpec } from "@milaboratories/pl-model-common";
|
|
3
2
|
|
|
4
3
|
//#region src/labels/derive_distinct_tooltips.d.ts
|
|
5
4
|
type TooltipEntry = {
|
|
6
5
|
/** Main column spec — used for column-name fallback when no label. */spec: PColumnSpec; /** Qualifications carried by this variant. */
|
|
7
6
|
qualifications?: MatchQualifications; /** Linker steps traversed to reach the hit column. */
|
|
8
|
-
linkerPath?:
|
|
7
|
+
linkerPath?: ReadonlyArray<{
|
|
8
|
+
readonly linker: {
|
|
9
|
+
readonly spec: PColumnSpec;
|
|
10
|
+
};
|
|
11
|
+
}>; /** Position of this variant within the same physical column (1-based). */
|
|
9
12
|
variantIndex?: number; /** Total variants for the same physical column. */
|
|
10
13
|
variantCount?: number;
|
|
11
14
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive_distinct_tooltips.d.ts","names":[],"sources":["../../src/labels/derive_distinct_tooltips.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"derive_distinct_tooltips.d.ts","names":[],"sources":["../../src/labels/derive_distinct_tooltips.ts"],"mappings":";;;KAUY,YAAA;wEAEV,IAAA,EAAM,WAAA,EAFgB;EAItB,cAAA,GAAiB,mBAAA,EAFX;EAIN,UAAA,GAAa,aAAA;IAAA,SAAyB,MAAA;MAAA,SAAmB,IAAA,EAAM,WAAA;IAAA;EAAA,IAJ/D;EAMA,YAAA,WAJA;EAMA,YAAA;AAAA;;iBAIc,sBAAA,CAAuB,OAAuB,EAAd,YAAY"}
|
|
@@ -16,7 +16,7 @@ function formatTooltip(entry) {
|
|
|
16
16
|
const hit = formatHit(entry.qualifications);
|
|
17
17
|
if (hit !== void 0) sections.push(hit);
|
|
18
18
|
if (sections.length <= 1) return void 0;
|
|
19
|
-
return sections.join("\n\n");
|
|
19
|
+
return sections.filter((s) => s.length > 0).join("\n\n");
|
|
20
20
|
}
|
|
21
21
|
const BULLET_1 = " • ";
|
|
22
22
|
function formatHeader(entry) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive_distinct_tooltips.js","names":[],"sources":["../../src/labels/derive_distinct_tooltips.ts"],"sourcesContent":["import {\n Annotation,\n PObjectId,\n readAnnotation,\n type AxisQualification,\n type PColumnSpec,\n} from \"@milaboratories/pl-model-common\";\nimport { isNil } from \"es-toolkit\";\
|
|
1
|
+
{"version":3,"file":"derive_distinct_tooltips.js","names":[],"sources":["../../src/labels/derive_distinct_tooltips.ts"],"sourcesContent":["import {\n Annotation,\n PObjectId,\n readAnnotation,\n type AxisQualification,\n type MatchQualifications,\n type PColumnSpec,\n} from \"@milaboratories/pl-model-common\";\nimport { isNil } from \"es-toolkit\";\n\nexport type TooltipEntry = {\n /** Main column spec — used for column-name fallback when no label. */\n spec: PColumnSpec;\n /** Qualifications carried by this variant. */\n qualifications?: MatchQualifications;\n /** Linker steps traversed to reach the hit column. */\n linkerPath?: ReadonlyArray<{ readonly linker: { readonly spec: PColumnSpec } }>;\n /** Position of this variant within the same physical column (1-based). */\n variantIndex?: number;\n /** Total variants for the same physical column. */\n variantCount?: number;\n};\n\n/** Format tooltip strings for each entry. Returns `undefined` when nothing useful. */\nexport function deriveDistinctTooltips(entries: TooltipEntry[]): (undefined | string)[] {\n return entries.map(formatTooltip);\n}\n\nfunction formatTooltip(entry: TooltipEntry): undefined | string {\n const sections: string[] = [];\n\n const header = formatHeader(entry);\n if (header !== undefined) sections.push(header);\n\n const origin = formatOriginPath(entry);\n if (origin !== undefined) sections.push(origin);\n\n const anchors = formatAnchors(entry.qualifications);\n if (anchors !== undefined) sections.push(anchors);\n\n const hit = formatHit(entry.qualifications);\n if (hit !== undefined) sections.push(hit);\n\n if (sections.length <= 1) return undefined;\n return sections.filter((s) => s.length > 0).join(\"\\n\\n\");\n}\n\nconst BULLET_1 = \" • \";\n\nfunction formatHeader(entry: TooltipEntry): undefined | string {\n const lines: string[] = [];\n if (entry.variantCount !== undefined && entry.variantCount > 1) {\n lines.push(`Variant: ${entry.variantIndex ?? \"?\"} of ${entry.variantCount}`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction formatOriginPath(entry: TooltipEntry): undefined | string {\n const path = entry.linkerPath ?? [];\n if (path.length === 0) return undefined;\n\n const lines = [\"Origin path\"];\n path.forEach((step, i) => {\n const label =\n readAnnotation(step.linker.spec, Annotation.LinkLabel) ??\n readAnnotation(step.linker.spec, Annotation.Label) ??\n step.linker.spec.name;\n lines.push(`${BULLET_1}linker ${i + 1}: ${label}`);\n });\n const hitName = readAnnotation(entry.spec, Annotation.Label) ?? entry.spec.name;\n lines.push(`${BULLET_1}hit column: ${hitName}`);\n return lines.join(\"\\n\");\n}\n\nfunction formatAnchors(q: undefined | MatchQualifications): undefined | string {\n if (isNil(q)) return undefined;\n if (isNil(q.forQueries)) return undefined;\n const ids = Object.keys(q.forQueries);\n if (ids.length === 0) return undefined;\n\n const lines = [];\n for (const id of ids) {\n const item = q.forQueries[id as PObjectId];\n if (item.length === 0) continue;\n const rendered = formatAxisQualifications(item);\n lines.push(`${BULLET_1}${id}${rendered !== undefined ? ` ${rendered}` : \"\"}`);\n }\n return lines.length > 0\n ? [\"Anchors (bound via this variant)\"].concat(lines).join(\"\\n\")\n : undefined;\n}\n\nfunction formatHit(q: undefined | MatchQualifications): undefined | string {\n if (isNil(q) || isNil(q.forHit) || q.forHit.length === 0) return undefined;\n const rendered = formatAxisQualifications(q.forHit);\n if (rendered === undefined) return undefined;\n return [\"Hit column qualifications\", `${BULLET_1}${rendered}`].join(\"\\n\");\n}\n\nfunction formatAxisQualifications(qs: AxisQualification[]): undefined | string {\n if (qs.length === 0) return undefined;\n return qs.map(formatQualification).join(\"; \");\n}\n\nfunction formatQualification(q: AxisQualification): string {\n const axisName = typeof q.axis === \"string\" ? q.axis : (q.axis.name ?? JSON.stringify(q.axis));\n const entries = Object.entries(q.contextDomain);\n if (entries.length === 0) return axisName;\n const kv = entries.map(([k, v]) => `${k}=${v}`).join(\", \");\n return `${axisName} context: ${kv}`;\n}\n"],"mappings":"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"}
|