@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
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
Annotation,
|
|
3
|
+
createEnrichmentRef,
|
|
4
|
+
extractPObjectId,
|
|
5
|
+
isGlobalPObjectId,
|
|
6
|
+
} from "@milaboratories/pl-model-common";
|
|
2
7
|
import type {
|
|
8
|
+
ColumnsCollectionDriverModel,
|
|
3
9
|
EnrichmentStep,
|
|
4
10
|
LabeledEnrichmentRef,
|
|
5
11
|
LabeledEnrichmentRefs,
|
|
6
12
|
MultiColumnSelector,
|
|
7
|
-
|
|
13
|
+
PColumnSpec,
|
|
8
14
|
PObjectSpec,
|
|
9
15
|
} from "@milaboratories/pl-model-common";
|
|
10
|
-
import type {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
16
|
+
import type { ColumnRecipe, ColumnsSource } from "../../columns";
|
|
17
|
+
import {
|
|
18
|
+
isLeafColumn,
|
|
19
|
+
ColumnsCollection,
|
|
20
|
+
collectLinkerIds,
|
|
21
|
+
hitQualifications,
|
|
22
|
+
collectLinkerColumns,
|
|
23
|
+
queriesQualifications,
|
|
24
|
+
} from "../../columns";
|
|
14
25
|
import {
|
|
15
26
|
deriveDistinctLabels,
|
|
16
27
|
type DeriveLabelsOptions,
|
|
17
28
|
type Entry,
|
|
18
29
|
} from "../../labels/derive_distinct_labels";
|
|
19
30
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const decoded = JSON.parse(id);
|
|
29
|
-
return (
|
|
30
|
-
typeof decoded === "object" &&
|
|
31
|
-
decoded !== null &&
|
|
32
|
-
decoded.__isRef === true &&
|
|
33
|
-
typeof decoded.blockId === "string" &&
|
|
34
|
-
typeof decoded.name === "string"
|
|
35
|
-
);
|
|
36
|
-
} catch {
|
|
37
|
-
return false;
|
|
38
|
-
}
|
|
31
|
+
export interface FindEnrichmentColumnsOptions {
|
|
32
|
+
sources: ReadonlyArray<ColumnsSource>;
|
|
33
|
+
anchorSpec: PColumnSpec;
|
|
34
|
+
maxHops?: number;
|
|
35
|
+
include?: MultiColumnSelector | MultiColumnSelector[];
|
|
36
|
+
predicate?: (spec: PObjectSpec) => boolean;
|
|
37
|
+
/** Override the resolved `columnsCollection` service (primarily for tests). */
|
|
38
|
+
driver?: ColumnsCollectionDriverModel;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
/**
|
|
@@ -43,36 +43,34 @@ function isGloballyAddressable(id: PObjectId): boolean {
|
|
|
43
43
|
* (filters / the primary itself) and structural hits (subset, linker, label
|
|
44
44
|
* columns). Narrow further with `include` selectors or a `predicate`.
|
|
45
45
|
*/
|
|
46
|
-
export function findEnrichmentColumns(
|
|
47
|
-
collection: AnchoredColumnCollection,
|
|
48
|
-
options?: {
|
|
49
|
-
maxHops?: number;
|
|
50
|
-
include?: MultiColumnSelector | MultiColumnSelector[];
|
|
51
|
-
predicate?: (spec: PObjectSpec) => boolean;
|
|
52
|
-
},
|
|
53
|
-
): ColumnVariant[] {
|
|
46
|
+
export function findEnrichmentColumns(options: FindEnrichmentColumnsOptions): ColumnRecipe[] {
|
|
54
47
|
const include =
|
|
55
|
-
options
|
|
48
|
+
options.include === undefined
|
|
56
49
|
? undefined
|
|
57
50
|
: Array.isArray(options.include)
|
|
58
51
|
? options.include
|
|
59
52
|
: [options.include];
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
53
|
+
|
|
54
|
+
const columns = ColumnsCollection([...options.sources], { driver: options.driver })
|
|
55
|
+
.discover({
|
|
56
|
+
anchors: { main: options.anchorSpec },
|
|
57
|
+
mode: "enrichment",
|
|
58
|
+
maxHops: options.maxHops ?? 4,
|
|
59
|
+
include,
|
|
60
|
+
exclude: [
|
|
61
|
+
{ annotations: { [Annotation.IsSubset]: "true" } },
|
|
62
|
+
{ annotations: { [Annotation.IsLinkerColumn]: "true" } },
|
|
63
|
+
{ name: Annotation.Label },
|
|
64
|
+
],
|
|
65
|
+
})
|
|
66
|
+
.getColumns();
|
|
67
|
+
|
|
68
|
+
const predicate = options.predicate;
|
|
69
|
+
return columns.filter((v) => {
|
|
70
|
+
if (isLeafColumn(v)) return false;
|
|
71
|
+
if (predicate !== undefined && !predicate(v.getSpec())) return false;
|
|
72
|
+
if (!isGlobalPObjectId(extractPObjectId(v.id))) return false;
|
|
73
|
+
if (collectLinkerIds(v).some((id) => !isGlobalPObjectId(id))) return false;
|
|
76
74
|
return true;
|
|
77
75
|
});
|
|
78
76
|
}
|
|
@@ -83,27 +81,33 @@ export function findEnrichmentColumns(
|
|
|
83
81
|
* `qualifications.forHit`; `forQueries` is re-derived by the table builder.
|
|
84
82
|
*/
|
|
85
83
|
export function enrichmentVariantsToRefs(
|
|
86
|
-
variants:
|
|
84
|
+
variants: ColumnRecipe[],
|
|
87
85
|
labelOptions?: DeriveLabelsOptions,
|
|
88
86
|
): LabeledEnrichmentRefs {
|
|
89
87
|
if (variants.length === 0) return [];
|
|
90
88
|
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
89
|
+
const linkerIdsByVariant = variants.map((v) => collectLinkerIds(v));
|
|
90
|
+
const hitQualsByVariant = variants.map((v) => [...hitQualifications(v)]);
|
|
91
|
+
|
|
92
|
+
const entries: Entry[] = variants.map((variant, i) => ({
|
|
93
|
+
spec: variant.getSpec(),
|
|
94
|
+
linkerPath: collectLinkerColumns(variant).map((linker) => ({ spec: linker.getSpec() })),
|
|
95
|
+
qualifications: {
|
|
96
|
+
forHit: hitQualsByVariant[i],
|
|
97
|
+
forQueries: queriesQualifications(variant),
|
|
98
|
+
},
|
|
95
99
|
}));
|
|
96
100
|
const labels = deriveDistinctLabels(entries, labelOptions);
|
|
97
101
|
|
|
98
102
|
return variants.map((variant, i): LabeledEnrichmentRef => {
|
|
99
|
-
const path: undefined | EnrichmentStep[] =
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
+
const path: undefined | EnrichmentStep[] =
|
|
104
|
+
linkerIdsByVariant[i].length === 0
|
|
105
|
+
? undefined
|
|
106
|
+
: linkerIdsByVariant[i].map((id) => ({ type: "linker", linker: id }));
|
|
103
107
|
return {
|
|
104
|
-
ref: createEnrichmentRef(variant.
|
|
108
|
+
ref: createEnrichmentRef(extractPObjectId(variant.id), {
|
|
105
109
|
path,
|
|
106
|
-
qualifications:
|
|
110
|
+
qualifications: hitQualsByVariant[i],
|
|
107
111
|
}),
|
|
108
112
|
label: labels[i],
|
|
109
113
|
};
|
|
@@ -1,25 +1,36 @@
|
|
|
1
|
-
import { Annotation, createPlRef } from "@milaboratories/pl-model-common";
|
|
2
|
-
import type {
|
|
3
|
-
|
|
1
|
+
import { Annotation, createGlobalPObjectId, createPlRef } from "@milaboratories/pl-model-common";
|
|
2
|
+
import type {
|
|
3
|
+
AxisSpec,
|
|
4
|
+
PColumn,
|
|
5
|
+
PColumnSpec,
|
|
6
|
+
PlRef,
|
|
7
|
+
PObjectId,
|
|
8
|
+
} from "@milaboratories/pl-model-common";
|
|
4
9
|
import canonicalize from "canonicalize";
|
|
5
|
-
import { afterEach, describe, expect, test } from "vitest";
|
|
6
|
-
import type {
|
|
7
|
-
import { ColumnCollectionBuilder } from "../../columns/column_collection_builder";
|
|
10
|
+
import { afterEach, beforeEach, describe, expect, test } from "vitest";
|
|
11
|
+
import type { PColumnDataUniversal } from "../../render/internal";
|
|
8
12
|
import { buildRefMap, filterMatchesToOptions, findFilterColumns } from "./filter_discovery";
|
|
13
|
+
import {
|
|
14
|
+
createTestCollectionDriver,
|
|
15
|
+
type TestCollectionDriverHandle,
|
|
16
|
+
} from "../../columns/__test_helpers__/collection_driver";
|
|
9
17
|
|
|
10
|
-
|
|
18
|
+
let driverHandle: TestCollectionDriverHandle;
|
|
11
19
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
driverHandle = createTestCollectionDriver();
|
|
22
|
+
driverHandle.installAmbientCtx();
|
|
23
|
+
});
|
|
17
24
|
|
|
18
25
|
afterEach(async () => {
|
|
19
|
-
|
|
20
|
-
|
|
26
|
+
driverHandle.uninstallAmbientCtx();
|
|
27
|
+
await driverHandle.dispose();
|
|
21
28
|
});
|
|
22
29
|
|
|
30
|
+
function registerCols(cols: PColumn<PColumnDataUniversal | undefined>[]): void {
|
|
31
|
+
driverHandle.register(cols.map((c) => ({ id: c.id, spec: c.spec })));
|
|
32
|
+
}
|
|
33
|
+
|
|
23
34
|
function axis(name: string): AxisSpec {
|
|
24
35
|
return { name, type: "String" } as AxisSpec;
|
|
25
36
|
}
|
|
@@ -32,52 +43,68 @@ function spec(
|
|
|
32
43
|
return { kind: "PColumn", name, valueType: "Int", axesSpec, annotations } as PColumnSpec;
|
|
33
44
|
}
|
|
34
45
|
|
|
35
|
-
function
|
|
36
|
-
return {
|
|
46
|
+
function col(id: PObjectId, s: PColumnSpec): PColumn<PColumnDataUniversal | undefined> {
|
|
47
|
+
return {
|
|
48
|
+
id,
|
|
49
|
+
spec: s,
|
|
50
|
+
data: {} as never,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Canonical global PObjectId — required so downstream `extractPObjectId` accepts it. */
|
|
55
|
+
function gid(name: string): PObjectId {
|
|
56
|
+
return createGlobalPObjectId("test-block", name);
|
|
37
57
|
}
|
|
38
58
|
|
|
39
59
|
// anchor defines the key space: [sample, gene]
|
|
40
60
|
const anchorAxes = [axis("sample"), axis("gene")];
|
|
41
61
|
const anchorSpec = spec("anchor", anchorAxes);
|
|
42
|
-
const anchorSnap =
|
|
62
|
+
const anchorSnap = col(gid("anchor"), anchorSpec);
|
|
43
63
|
|
|
44
64
|
describe("findFilterColumns", () => {
|
|
45
65
|
test("returns columns with pl7.app/isSubset annotation", () => {
|
|
46
|
-
const filter =
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
66
|
+
const filter = col(
|
|
67
|
+
gid("f1"),
|
|
68
|
+
spec("filter1", [axis("sample")], { [Annotation.IsSubset]: "true" }),
|
|
69
|
+
);
|
|
70
|
+
const regular = col(gid("r1"), spec("regular1", [axis("sample")]));
|
|
71
|
+
registerCols([filter, regular, anchorSnap]);
|
|
52
72
|
|
|
53
|
-
const results = findFilterColumns(
|
|
54
|
-
|
|
55
|
-
|
|
73
|
+
const results = findFilterColumns({
|
|
74
|
+
sources: [{ columns: [filter, regular, anchorSnap], isFinal: true }],
|
|
75
|
+
anchorSpec,
|
|
76
|
+
driver: driverHandle.driver,
|
|
77
|
+
});
|
|
78
|
+
expect(results.every((m) => m.getSpec().name !== "regular1")).toBe(true);
|
|
79
|
+
expect(results.some((m) => m.getSpec().name === "filter1")).toBe(true);
|
|
56
80
|
});
|
|
57
81
|
|
|
58
82
|
test("axes subset: excludes filter whose axes are not a subset of anchor axes", () => {
|
|
59
83
|
// filter with axis "other" — not a subset of anchor axes [sample, gene]
|
|
60
|
-
const badFilter =
|
|
61
|
-
"f2",
|
|
84
|
+
const badFilter = col(
|
|
85
|
+
gid("f2"),
|
|
62
86
|
spec("bad-filter", [axis("other")], { [Annotation.IsSubset]: "true" }),
|
|
63
87
|
);
|
|
88
|
+
registerCols([badFilter, anchorSnap]);
|
|
64
89
|
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
expect(results.every((m) => m.
|
|
90
|
+
const results = findFilterColumns({
|
|
91
|
+
sources: [{ columns: [badFilter, anchorSnap], isFinal: true }],
|
|
92
|
+
anchorSpec,
|
|
93
|
+
driver: driverHandle.driver,
|
|
94
|
+
});
|
|
95
|
+
expect(results.every((m) => m.getSpec().name !== "bad-filter")).toBe(true);
|
|
71
96
|
});
|
|
72
97
|
|
|
73
98
|
test("empty result when no filters exist", () => {
|
|
74
|
-
const regular =
|
|
75
|
-
|
|
76
|
-
const builder = new ColumnCollectionBuilder(createSpecFrameCtx());
|
|
77
|
-
builder.addSource([regular, anchorSnap]);
|
|
78
|
-
const collection = builder.build({ anchors: { main: anchorSpec } })!;
|
|
99
|
+
const regular = col(gid("r1"), spec("regular1", [axis("sample")]));
|
|
100
|
+
registerCols([regular, anchorSnap]);
|
|
79
101
|
|
|
80
|
-
|
|
102
|
+
const results = findFilterColumns({
|
|
103
|
+
sources: [{ columns: [regular, anchorSnap], isFinal: true }],
|
|
104
|
+
anchorSpec,
|
|
105
|
+
driver: driverHandle.driver,
|
|
106
|
+
});
|
|
107
|
+
expect(results).toHaveLength(0);
|
|
81
108
|
});
|
|
82
109
|
});
|
|
83
110
|
|
|
@@ -101,18 +128,25 @@ describe("filterMatchesToOptions", () => {
|
|
|
101
128
|
const filterRef1 = createPlRef("b1", "filter-top1000");
|
|
102
129
|
const filterRef2 = createPlRef("b1", "filter-highconf");
|
|
103
130
|
|
|
104
|
-
|
|
131
|
+
// Build ref map from entries (simulating result pool)
|
|
132
|
+
const refMap = buildRefMap([
|
|
133
|
+
{ ref: anchorSnap.id as unknown as PlRef },
|
|
134
|
+
{ ref: filterRef1 },
|
|
135
|
+
{ ref: filterRef2 },
|
|
136
|
+
]);
|
|
137
|
+
|
|
105
138
|
const filterSpec1 = spec("filter1", [axis("sample")], { [Annotation.IsSubset]: "true" });
|
|
106
139
|
const filterSpec2 = spec("filter2", [axis("sample")], { [Annotation.IsSubset]: "true" });
|
|
107
140
|
|
|
108
|
-
const f1Snap =
|
|
109
|
-
const f2Snap =
|
|
110
|
-
|
|
111
|
-
const builder = new ColumnCollectionBuilder(createSpecFrameCtx());
|
|
112
|
-
builder.addSource([f1Snap, f2Snap, anchorSnap]);
|
|
113
|
-
const collection = builder.build({ anchors: { main: anchorSpec } })!;
|
|
141
|
+
const f1Snap = col(canonicalize(filterRef1)! as PObjectId, filterSpec1);
|
|
142
|
+
const f2Snap = col(canonicalize(filterRef2)! as PObjectId, filterSpec2);
|
|
143
|
+
registerCols([f1Snap, f2Snap, anchorSnap]);
|
|
114
144
|
|
|
115
|
-
const matches = findFilterColumns(
|
|
145
|
+
const matches = findFilterColumns({
|
|
146
|
+
sources: [{ columns: [f1Snap, f2Snap, anchorSnap], isFinal: true }],
|
|
147
|
+
anchorSpec,
|
|
148
|
+
driver: driverHandle.driver,
|
|
149
|
+
});
|
|
116
150
|
expect(matches.length).toBe(2);
|
|
117
151
|
|
|
118
152
|
const options = filterMatchesToOptions(matches, {
|
|
@@ -120,7 +154,6 @@ describe("filterMatchesToOptions", () => {
|
|
|
120
154
|
datasetSpec: anchorSpec,
|
|
121
155
|
});
|
|
122
156
|
expect(options).toHaveLength(2);
|
|
123
|
-
// Each option has a ref and label
|
|
124
157
|
for (const opt of options) {
|
|
125
158
|
expect(opt.ref).toBeDefined();
|
|
126
159
|
expect(opt.label).toBeDefined();
|
|
@@ -153,13 +186,15 @@ describe("filterMatchesToOptions", () => {
|
|
|
153
186
|
{ type: "milaboratories.antibody-tcr-lead-selection", label: "Top 10", importance: 30 },
|
|
154
187
|
]),
|
|
155
188
|
});
|
|
156
|
-
const fSnap =
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
const
|
|
161
|
-
|
|
162
|
-
|
|
189
|
+
const fSnap = col(canonicalize(filterRef)! as PObjectId, filterSpec);
|
|
190
|
+
const dsSnap = col(gid("dataset"), datasetSpec);
|
|
191
|
+
registerCols([fSnap, dsSnap]);
|
|
192
|
+
|
|
193
|
+
const matches = findFilterColumns({
|
|
194
|
+
sources: [{ columns: [fSnap, dsSnap], isFinal: true }],
|
|
195
|
+
anchorSpec: datasetSpec,
|
|
196
|
+
driver: driverHandle.driver,
|
|
197
|
+
});
|
|
163
198
|
expect(matches).toHaveLength(1);
|
|
164
199
|
|
|
165
200
|
const options = filterMatchesToOptions(matches, { refsByObjectId: refMap, datasetSpec });
|
|
@@ -215,14 +250,16 @@ describe("filterMatchesToOptions", () => {
|
|
|
215
250
|
{ type: "milaboratories.antibody-tcr-lead-selection", label: "Top 11", importance: 30 },
|
|
216
251
|
]),
|
|
217
252
|
});
|
|
218
|
-
const f1Snap =
|
|
219
|
-
const f2Snap =
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
const
|
|
224
|
-
|
|
225
|
-
|
|
253
|
+
const f1Snap = col(canonicalize(ref1)! as PObjectId, filterSpec1);
|
|
254
|
+
const f2Snap = col(canonicalize(ref2)! as PObjectId, filterSpec2);
|
|
255
|
+
const dsSnap = col(gid("dataset"), datasetSpec);
|
|
256
|
+
registerCols([f1Snap, f2Snap, dsSnap]);
|
|
257
|
+
|
|
258
|
+
const matches = findFilterColumns({
|
|
259
|
+
sources: [{ columns: [f1Snap, f2Snap, dsSnap], isFinal: true }],
|
|
260
|
+
anchorSpec: datasetSpec,
|
|
261
|
+
driver: driverHandle.driver,
|
|
262
|
+
});
|
|
226
263
|
expect(matches).toHaveLength(2);
|
|
227
264
|
|
|
228
265
|
const options = filterMatchesToOptions(matches, { refsByObjectId: refMap, datasetSpec });
|
|
@@ -239,14 +276,15 @@ describe("filterMatchesToOptions", () => {
|
|
|
239
276
|
const knownRef = createPlRef("b1", "known");
|
|
240
277
|
const knownSpec = spec("known", [axis("sample")], { [Annotation.IsSubset]: "true" });
|
|
241
278
|
const orphanSpec = spec("orphan", [axis("sample")], { [Annotation.IsSubset]: "true" });
|
|
242
|
-
const knownSnap =
|
|
243
|
-
const orphanSnap =
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
279
|
+
const knownSnap = col(canonicalize(knownRef)! as PObjectId, knownSpec);
|
|
280
|
+
const orphanSnap = col(gid("orphan"), orphanSpec);
|
|
281
|
+
registerCols([knownSnap, orphanSnap, anchorSnap]);
|
|
282
|
+
|
|
283
|
+
const matches = findFilterColumns({
|
|
284
|
+
sources: [{ columns: [knownSnap, orphanSnap, anchorSnap], isFinal: true }],
|
|
285
|
+
anchorSpec,
|
|
286
|
+
driver: driverHandle.driver,
|
|
287
|
+
});
|
|
250
288
|
expect(matches.length).toBe(2);
|
|
251
289
|
const refMap = buildRefMap([{ ref: knownRef }]);
|
|
252
290
|
const options = filterMatchesToOptions(matches, {
|
|
@@ -1,27 +1,45 @@
|
|
|
1
|
-
import { Annotation } from "@milaboratories/pl-model-common";
|
|
2
|
-
import type { Option, PlRef, PObjectId, PObjectSpec } from "@milaboratories/pl-model-common";
|
|
3
|
-
import canonicalize from "canonicalize";
|
|
1
|
+
import { Annotation, extractPObjectId } from "@milaboratories/pl-model-common";
|
|
4
2
|
import type {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
ColumnsCollectionDriverModel,
|
|
4
|
+
Option,
|
|
5
|
+
PColumnSpec,
|
|
6
|
+
PlRef,
|
|
7
|
+
PObjectId,
|
|
8
|
+
PObjectSpec,
|
|
9
|
+
} from "@milaboratories/pl-model-common";
|
|
10
|
+
import canonicalize from "canonicalize";
|
|
11
|
+
import type { ColumnRecipe, ColumnsSource } from "../../columns";
|
|
12
|
+
import { ColumnsCollection, collectLinkerColumns } from "../../columns";
|
|
8
13
|
import {
|
|
9
14
|
deriveDistinctLabels,
|
|
10
15
|
type DeriveLabelsOptions,
|
|
11
16
|
type Entry,
|
|
12
17
|
} from "../../labels/derive_distinct_labels";
|
|
13
18
|
|
|
19
|
+
export interface FindFilterColumnsOptions {
|
|
20
|
+
sources: ReadonlyArray<ColumnsSource>;
|
|
21
|
+
anchorSpec: PColumnSpec;
|
|
22
|
+
/** Override the resolved `columnsCollection` service (primarily for tests). */
|
|
23
|
+
driver?: ColumnsCollectionDriverModel;
|
|
24
|
+
}
|
|
25
|
+
|
|
14
26
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
27
|
+
* Matches columns annotated `pl7.app/isSubset: "true"` whose axes ⊆ anchor axes.
|
|
28
|
+
*
|
|
29
|
+
* Filter-intent: only the dataset's own direct subset columns, no linker
|
|
30
|
+
* traversal — so this uses `.filter()` (pins `maxHops: 0`), not `.discover()`
|
|
31
|
+
* (which would default to 4 hops and surface subset columns from other,
|
|
32
|
+
* linker-reachable datasets). `.filter()` still applies the default
|
|
33
|
+
* `enrichment` matching mode (`allowFloatingHitAxes: false`), which enforces
|
|
34
|
+
* the axes-subset constraint. See `matchingModeToConstraints()`.
|
|
17
35
|
*/
|
|
18
|
-
export function findFilterColumns(
|
|
19
|
-
return
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
annotations: { [Annotation.IsSubset]: "true" },
|
|
23
|
-
}
|
|
24
|
-
|
|
36
|
+
export function findFilterColumns(options: FindFilterColumnsOptions): ColumnRecipe[] {
|
|
37
|
+
return ColumnsCollection([...options.sources], { driver: options.driver })
|
|
38
|
+
.filter({
|
|
39
|
+
anchors: { main: options.anchorSpec },
|
|
40
|
+
include: { annotations: { [Annotation.IsSubset]: "true" } },
|
|
41
|
+
})
|
|
42
|
+
.getColumns();
|
|
25
43
|
}
|
|
26
44
|
|
|
27
45
|
export type FilterMatchOptions = {
|
|
@@ -39,30 +57,32 @@ export type FilterMatchOptions = {
|
|
|
39
57
|
};
|
|
40
58
|
|
|
41
59
|
/**
|
|
42
|
-
* Derive
|
|
43
|
-
*
|
|
44
|
-
*
|
|
60
|
+
* Derive labeled options from filter column variants, for use in DatasetOption.filters.
|
|
61
|
+
*
|
|
62
|
+
* Entries whose column id has no PlRef in `refsByObjectId` are silently
|
|
63
|
+
* skipped — they cannot be exposed as user-selectable options.
|
|
45
64
|
*/
|
|
46
65
|
export function filterMatchesToOptions(
|
|
47
|
-
|
|
66
|
+
variants: ColumnRecipe[],
|
|
48
67
|
options: FilterMatchOptions,
|
|
49
68
|
): Option[] {
|
|
50
|
-
if (
|
|
69
|
+
if (variants.length === 0) return [];
|
|
51
70
|
|
|
52
71
|
const { refsByObjectId, datasetSpec, labelOptions } = options;
|
|
53
72
|
|
|
54
|
-
// One
|
|
55
|
-
//
|
|
56
|
-
//
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const ref = refsByObjectId.get(match.column.id);
|
|
73
|
+
// One Option per variant — `deriveDistinctLabels` disambiguates labels by
|
|
74
|
+
// path. All variants of the same column share a terminal PObjectId, so the
|
|
75
|
+
// ref lookup happens once per variant.
|
|
76
|
+
const entries: (Entry & { ref: PlRef })[] = variants.flatMap((variant) => {
|
|
77
|
+
const ref = refsByObjectId.get(extractPObjectId(variant.id));
|
|
60
78
|
if (ref === undefined) return [];
|
|
61
|
-
return
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
79
|
+
return [
|
|
80
|
+
{
|
|
81
|
+
ref,
|
|
82
|
+
spec: variant.getSpec(),
|
|
83
|
+
linkerPath: collectLinkerColumns(variant).map((linker) => ({ spec: linker.getSpec() })),
|
|
84
|
+
},
|
|
85
|
+
];
|
|
66
86
|
});
|
|
67
87
|
|
|
68
88
|
// Appending the dataset forces a discriminating trace step into every
|
|
@@ -1,17 +1,24 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
|
-
import type {
|
|
2
|
+
import type {
|
|
3
|
+
AxisId,
|
|
4
|
+
FilterSpec,
|
|
5
|
+
FilterSpecLeaf,
|
|
6
|
+
PObjectId,
|
|
7
|
+
PTableColumnId,
|
|
8
|
+
} from "@milaboratories/pl-model-common";
|
|
3
9
|
import { filterSpecToSpecQueryExpr } from "./filterToQuery";
|
|
4
10
|
|
|
5
|
-
type QFilterSpec = FilterSpec<FilterSpecLeaf<
|
|
11
|
+
type QFilterSpec = FilterSpec<FilterSpecLeaf<PTableColumnId>>;
|
|
6
12
|
|
|
7
|
-
/** Helper: creates a
|
|
8
|
-
function colRef(id: string):
|
|
9
|
-
return
|
|
13
|
+
/** Helper: creates a PTableColumnId for a regular column. */
|
|
14
|
+
function colRef(id: string): PTableColumnId {
|
|
15
|
+
return { type: "column", id: id as PObjectId };
|
|
10
16
|
}
|
|
11
17
|
|
|
12
|
-
/** Helper: creates a
|
|
13
|
-
|
|
14
|
-
|
|
18
|
+
/** Helper: creates a PTableColumnId for an axis. AxisId stays as a string-shaped
|
|
19
|
+
* value here because the converter passes `id` through to SingleAxisSelector. */
|
|
20
|
+
function axisRef(id: string): PTableColumnId {
|
|
21
|
+
return { type: "axis", id: id as unknown as AxisId };
|
|
15
22
|
}
|
|
16
23
|
|
|
17
24
|
describe("filterSpecToSpecQueryExpr", () => {
|
|
@@ -1,23 +1,36 @@
|
|
|
1
1
|
import { assertNever } from "@milaboratories/pl-model-common";
|
|
2
2
|
import type {
|
|
3
|
+
AxisId,
|
|
4
|
+
ColumnUniversalId,
|
|
3
5
|
FilterSpec,
|
|
4
6
|
FilterSpecLeaf,
|
|
5
|
-
PTableColumnId,
|
|
6
7
|
SingleAxisSelector,
|
|
7
8
|
SpecQueryExpression,
|
|
8
9
|
} from "@milaboratories/pl-model-common";
|
|
9
10
|
import { traverseFilterSpec } from "../traverse";
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
export type QueryColumnIdAxis = {
|
|
13
|
+
type: "axis";
|
|
14
|
+
id: AxisId;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export type QueryColumnIdColumn = {
|
|
18
|
+
type: "column";
|
|
19
|
+
/** May be a rich {@link ColumnUniversalId} (Discovered / Overridden / Filtered) or bare PObjectId. */
|
|
20
|
+
id: ColumnUniversalId;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export type QueryColumnId = QueryColumnIdAxis | QueryColumnIdColumn;
|
|
24
|
+
|
|
25
|
+
/** Converts a QueryColumnId object into a SpecQueryExpression reference. */
|
|
26
|
+
function resolveColumnRef(col: QueryColumnId): SpecQueryExpression {
|
|
27
|
+
return col.type === "axis"
|
|
28
|
+
? { type: "axisRef", value: col.id as SingleAxisSelector }
|
|
29
|
+
: { type: "columnRef", value: col.id };
|
|
17
30
|
}
|
|
18
31
|
|
|
19
32
|
/** Converts a FilterSpec tree into a SpecQueryExpression. */
|
|
20
|
-
export function filterSpecToSpecQueryExpr<Leaf extends FilterSpecLeaf<
|
|
33
|
+
export function filterSpecToSpecQueryExpr<Leaf extends FilterSpecLeaf<QueryColumnId>>(
|
|
21
34
|
filter: FilterSpec<Leaf>,
|
|
22
35
|
): SpecQueryExpression {
|
|
23
36
|
return traverseFilterSpec(filter, {
|
|
@@ -38,7 +51,7 @@ export function filterSpecToSpecQueryExpr<Leaf extends FilterSpecLeaf<string>>(
|
|
|
38
51
|
});
|
|
39
52
|
}
|
|
40
53
|
|
|
41
|
-
function leafToSpecQueryExpr<Leaf extends FilterSpecLeaf<
|
|
54
|
+
function leafToSpecQueryExpr<Leaf extends FilterSpecLeaf<QueryColumnId>>(
|
|
42
55
|
filter: Leaf,
|
|
43
56
|
): SpecQueryExpression {
|
|
44
57
|
switch (filter.type) {
|