@platforma-sdk/model 1.79.24 → 1.80.0
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 +9 -7
- 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
|
@@ -2,20 +2,22 @@ import type {
|
|
|
2
2
|
AxisFilterByIdx,
|
|
3
3
|
AxisFilterValue,
|
|
4
4
|
AxisId,
|
|
5
|
-
|
|
6
|
-
PObjectId,
|
|
5
|
+
TraceEntry,
|
|
7
6
|
} from "@milaboratories/pl-model-common";
|
|
8
7
|
import {
|
|
8
|
+
Annotation,
|
|
9
9
|
canonicalizeAxisId,
|
|
10
|
-
entriesToDataInfo,
|
|
11
10
|
getAxisId,
|
|
12
|
-
|
|
11
|
+
isDataInfoEntries,
|
|
12
|
+
readAnnotation,
|
|
13
13
|
} from "@milaboratories/pl-model-common";
|
|
14
|
-
import
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import
|
|
18
|
-
import {
|
|
14
|
+
import { TreeNodeAccessor } from "../render/accessor";
|
|
15
|
+
import { getUniquePartitionKeys } from "../render/util/pcolumn_data";
|
|
16
|
+
import type { ColumnRecipe } from "./column_recipes";
|
|
17
|
+
import { ColumnFilteredRecipe } from "./column_recipes/column_filtered_recipe";
|
|
18
|
+
import { ColumnOverriddenRecipe } from "./column_recipes/column_overrided_recipe";
|
|
19
|
+
import { Column } from "./column";
|
|
20
|
+
import { getLeafColumnData } from "./utils";
|
|
19
21
|
|
|
20
22
|
// --- Types ---
|
|
21
23
|
|
|
@@ -26,128 +28,114 @@ export interface SplitAxis {
|
|
|
26
28
|
|
|
27
29
|
export interface ExpandByPartitionOpts {
|
|
28
30
|
/** Resolve axis values to human-readable labels. */
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface ExpandByPartitionResult {
|
|
33
|
-
/** Expanded snapshots (one per key combination per original snapshot). */
|
|
34
|
-
readonly items: ColumnSnapshot<PObjectId>[];
|
|
35
|
-
/** False if any column's data was not ready for splitting. */
|
|
36
|
-
readonly complete: boolean;
|
|
31
|
+
axisValuesLabels?: (axisId: AxisId) => undefined | Record<string | number, string>;
|
|
37
32
|
}
|
|
38
33
|
|
|
39
34
|
// --- Implementation ---
|
|
40
35
|
|
|
36
|
+
const MAX_KEY_COMBINATIONS = 10_000;
|
|
37
|
+
|
|
41
38
|
/**
|
|
42
|
-
* Expand
|
|
39
|
+
* Expand each input column along the requested partition axes into one
|
|
40
|
+
* {@link ColumnRecipe} per Cartesian combination of unique partition values.
|
|
41
|
+
*
|
|
42
|
+
* Each split is produced as `ColumnOverriddenRecipe.wrap(ColumnFilteredRecipe.wrap(inner, axisFilters), { domain, annotations })`:
|
|
43
|
+
* - `ColumnFilteredRecipe` pins all split axes at once (one wrap call with
|
|
44
|
+
* every `[idx, value]` pair) and removes them from `axesSpec`. The
|
|
45
|
+
* engine performs the data slicing via the `sliceAxes` query node.
|
|
46
|
+
* - `ColumnOverriddenRecipe` overlays a `domain[axisName] = String(value)`
|
|
47
|
+
* entry per split axis and appends a `split:<canonicalAxisId>` trace
|
|
48
|
+
* entry per split axis to the existing `pl7.app/trace` annotation.
|
|
43
49
|
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
50
|
+
* The recipe id is a canonical
|
|
51
|
+
* `ColumnOverriddenId(source: ColumnFilteredId(source: inner.id, axisFilters), specOverrides)`
|
|
52
|
+
* — distinct per split combination, parseable by `extractPObjectId`, and
|
|
53
|
+
* traversable by recipe walkers.
|
|
48
54
|
*
|
|
49
|
-
* Returns `
|
|
50
|
-
*
|
|
55
|
+
* Returns `undefined` when any input's `getData()` is not a
|
|
56
|
+
* {@link TreeNodeAccessor} — partition inspection is not yet possible.
|
|
51
57
|
*/
|
|
52
58
|
export function expandByPartition(
|
|
53
|
-
|
|
59
|
+
inputs: Column[],
|
|
54
60
|
splitAxes: SplitAxis[],
|
|
55
61
|
opts?: ExpandByPartitionOpts,
|
|
56
|
-
):
|
|
62
|
+
): ColumnRecipe[] | undefined {
|
|
57
63
|
if (splitAxes.length === 0) {
|
|
58
|
-
return
|
|
64
|
+
return [...inputs];
|
|
59
65
|
}
|
|
60
66
|
|
|
61
67
|
const splitAxisIdxs = splitAxes.map((a) => a.idx).sort((a, b) => a - b);
|
|
62
|
-
const
|
|
68
|
+
const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];
|
|
63
69
|
|
|
64
|
-
|
|
65
|
-
if (snapshot.dataStatus !== "ready" || snapshot.data === undefined) {
|
|
66
|
-
return { items: [], complete: false };
|
|
67
|
-
}
|
|
70
|
+
const result: ColumnRecipe[] = [];
|
|
68
71
|
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if (!isPartitionedDataInfoEntries(dataEntries)) {
|
|
77
|
-
throw new Error(
|
|
78
|
-
`Splitting requires Partitioned DataInfoEntries, but got ${dataEntries.type} for column ${String(snapshot.id)}`,
|
|
79
|
-
);
|
|
72
|
+
for (const inner of inputs) {
|
|
73
|
+
const data = getLeafColumnData(inner);
|
|
74
|
+
// Partition inspection requires either a live tree-accessor or already
|
|
75
|
+
// parsed DataInfoEntries. Anything else means the input is not yet ready.
|
|
76
|
+
if (!(data instanceof TreeNodeAccessor) && !isDataInfoEntries(data)) {
|
|
77
|
+
return undefined;
|
|
80
78
|
}
|
|
81
79
|
|
|
82
|
-
const uniqueKeys = getUniquePartitionKeys(
|
|
80
|
+
const uniqueKeys = getUniquePartitionKeys(data);
|
|
81
|
+
if (uniqueKeys === undefined) return undefined;
|
|
83
82
|
|
|
84
|
-
|
|
85
|
-
if (maxSplitIdx >= dataEntries.partitionKeyLength) {
|
|
83
|
+
if (maxSplitIdx >= uniqueKeys.length) {
|
|
86
84
|
throw new Error(
|
|
87
|
-
`Not enough partition keys (${
|
|
85
|
+
`Not enough partition keys (${uniqueKeys.length}) for requested split axes (max index ${maxSplitIdx}) in column ${inner.getSpec().name}`,
|
|
88
86
|
);
|
|
89
87
|
}
|
|
90
88
|
|
|
91
|
-
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
);
|
|
89
|
+
const spec = inner.getSpec();
|
|
90
|
+
const axesSpec = spec.axesSpec;
|
|
91
|
+
const splitAxisSpecs = splitAxisIdxs.map((idx) => axesSpec[idx]);
|
|
92
|
+
const splitAxisIds = splitAxisSpecs.map((axisSpec) => getAxisId(axisSpec));
|
|
93
|
+
const axesLabels = splitAxisIds.map((axisId) => opts?.axisValuesLabels?.(axisId));
|
|
94
|
+
|
|
95
|
+
const existingTraceRaw = readAnnotation(spec, Annotation.Trace);
|
|
96
|
+
const baseTrace: TraceEntry[] = existingTraceRaw
|
|
97
|
+
? ((JSON.parse(existingTraceRaw) as TraceEntry[]) ?? [])
|
|
98
|
+
: [];
|
|
95
99
|
|
|
96
|
-
// Generate all key combinations across split axes
|
|
97
100
|
const keyCombinations = generateKeyCombinations(uniqueKeys, splitAxisIdxs);
|
|
98
101
|
if (keyCombinations.length === 0) continue;
|
|
99
102
|
|
|
100
|
-
// Build adjusted axesSpec (remove split axes in reverse order)
|
|
101
|
-
const newAxesSpec = [...snapshot.spec.axesSpec];
|
|
102
|
-
for (let i = splitAxisIdxs.length - 1; i >= 0; i--) {
|
|
103
|
-
newAxesSpec.splice(splitAxisIdxs[i], 1);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
103
|
for (const keyCombo of keyCombinations) {
|
|
107
104
|
const axisFilters: AxisFilterByIdx[] = keyCombo.map(
|
|
108
105
|
(value, sAxisIdx): AxisFilterByIdx => [splitAxisIdxs[sAxisIdx], value as AxisFilterValue],
|
|
109
106
|
);
|
|
110
107
|
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
108
|
+
const domain: Record<string, string> = {};
|
|
109
|
+
const traceEntries: TraceEntry[] = [];
|
|
110
|
+
for (let sAxisIdx = 0; sAxisIdx < keyCombo.length; sAxisIdx++) {
|
|
111
|
+
const value = keyCombo[sAxisIdx];
|
|
112
|
+
const axisSpec = splitAxisSpecs[sAxisIdx];
|
|
113
|
+
const axisId = splitAxisIds[sAxisIdx];
|
|
114
114
|
const labelMap = axesLabels[sAxisIdx];
|
|
115
115
|
const label = labelMap?.[value] ?? String(value);
|
|
116
|
-
|
|
116
|
+
domain[axisSpec.name] = String(value);
|
|
117
|
+
traceEntries.push({
|
|
117
118
|
type: `split:${canonicalizeAxisId(axisId)}`,
|
|
118
119
|
label,
|
|
119
120
|
importance: 1_000_000,
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
const filteredData = filterDataInfoEntries(
|
|
124
|
-
dataEntries as PartitionedDataInfoEntries<TreeNodeAccessor>,
|
|
125
|
-
axisFilters,
|
|
126
|
-
);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
127
123
|
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
|
|
124
|
+
const filtered = ColumnFilteredRecipe.wrap(inner, axisFilters);
|
|
125
|
+
const overrided = ColumnOverriddenRecipe.wrap(filtered, {
|
|
126
|
+
domain,
|
|
131
127
|
annotations: {
|
|
132
|
-
|
|
133
|
-
"pl7.app/trace": JSON.stringify(traceEntries),
|
|
128
|
+
[Annotation.Trace]: JSON.stringify([...baseTrace, ...traceEntries]),
|
|
134
129
|
},
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
result.push({
|
|
138
|
-
id: snapshot.id,
|
|
139
|
-
spec: adjustedSpec,
|
|
140
|
-
dataStatus: "ready",
|
|
141
|
-
data: createReadyColumnData(() => entriesToDataInfo(filteredData)),
|
|
142
130
|
});
|
|
131
|
+
|
|
132
|
+
result.push(overrided);
|
|
143
133
|
}
|
|
144
134
|
}
|
|
145
135
|
|
|
146
|
-
return
|
|
136
|
+
return result;
|
|
147
137
|
}
|
|
148
138
|
|
|
149
|
-
const MAX_KEY_COMBINATIONS = 10_000;
|
|
150
|
-
|
|
151
139
|
function generateKeyCombinations(
|
|
152
140
|
uniqueKeys: (string | number)[][],
|
|
153
141
|
splitAxisIdxs: number[],
|
package/src/columns/index.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
export * from "./
|
|
2
|
-
export * from "./column_snapshot_provider";
|
|
3
|
-
export * from "./column_selector";
|
|
4
|
-
export * from "./column_collection_builder";
|
|
5
|
-
export * from "./ctx_column_sources";
|
|
1
|
+
export * from "./column_providers";
|
|
6
2
|
export * from "./expand_by_partition";
|
|
3
|
+
export * from "./derive_axis_values_labels";
|
|
4
|
+
export * from "./columns_collection";
|
|
5
|
+
export * from "./column_lazy";
|
|
6
|
+
export * from "./column_recipes";
|
|
7
|
+
export * from "./column";
|
|
8
|
+
export * from "./utils";
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, test } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
createColumnDiscoveredKey,
|
|
4
|
+
createGlobalPObjectId,
|
|
5
|
+
createLocalPObjectId,
|
|
6
|
+
stringifyColumnDiscoveredId,
|
|
7
|
+
type AxisQualification,
|
|
8
|
+
type PColumnSpec,
|
|
9
|
+
type PObjectId,
|
|
10
|
+
type SpecOverrides,
|
|
11
|
+
type SpecQuery,
|
|
12
|
+
type ColumnUniversalId,
|
|
13
|
+
} from "@milaboratories/pl-model-common";
|
|
14
|
+
import { collectLinkerIds, hitQualifications, queriesQualifications } from "./utils";
|
|
15
|
+
import { ColumnDiscoveredRecipe } from "./column_recipes/column_discovered_recipe";
|
|
16
|
+
import { ColumnFilteredRecipe } from "./column_recipes/column_filtered_recipe";
|
|
17
|
+
import { ColumnOverriddenRecipe } from "./column_recipes/column_overrided_recipe";
|
|
18
|
+
import type { ColumnFieldStatus, ColumnRecipe } from "./column_recipes/types";
|
|
19
|
+
import { installStubRegistry } from "./__test_helpers__/stub_registry";
|
|
20
|
+
|
|
21
|
+
// ── ctx mock ────────────────────────────────────────────────────────────────
|
|
22
|
+
// ColumnDiscoveredRecipe pulls `getCfgRenderCtx()` for `pframeSpec`. Minimal
|
|
23
|
+
// no-op stub keeps the constructor happy.
|
|
24
|
+
|
|
25
|
+
function makeCtx() {
|
|
26
|
+
// Minimal pframeSpec mock — `ColumnFilteredRecipe.wrap` validates axis
|
|
27
|
+
// indices against `inner.getSpec()`, which for a real `ColumnDiscoveredRecipe`
|
|
28
|
+
// runs `createSpecFrame` + `evaluateQuery` through this service. The mock
|
|
29
|
+
// echoes the registered specs as `tableSpec` entries so `getSpec()` returns
|
|
30
|
+
// the spec planted by the discovered fixture.
|
|
31
|
+
const services: Record<string, (...args: unknown[]) => unknown> = {
|
|
32
|
+
// Wrap whatever specs map the caller passes; we don't inspect its shape.
|
|
33
|
+
createSpecFrame: (...args: unknown[]) => ({ key: { specs: args[0] }, unref: () => {} }),
|
|
34
|
+
// Echo the registered specs as `tableSpec` entries — `getSpec` looks up
|
|
35
|
+
// the entry by id, so we need the shape we planted in `createSpecFrame`.
|
|
36
|
+
evaluateQuery: (...args: unknown[]) => {
|
|
37
|
+
const frameKey = args[0] as { specs: Record<string, PColumnSpec> };
|
|
38
|
+
return {
|
|
39
|
+
tableSpec: Object.entries(frameKey.specs).map(([id, spec]) => ({
|
|
40
|
+
type: "column" as const,
|
|
41
|
+
id,
|
|
42
|
+
spec,
|
|
43
|
+
})),
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
return {
|
|
48
|
+
getAccessorHandleByName: () => undefined,
|
|
49
|
+
getUpstreamBlockCtx: () => [],
|
|
50
|
+
getServiceNames: () => ["pframeSpec"],
|
|
51
|
+
getServiceMethods: () => Object.keys(services),
|
|
52
|
+
callServiceMethod: (_id: string, method: string, ...args: unknown[]) =>
|
|
53
|
+
services[method]?.(...args),
|
|
54
|
+
} as unknown as never;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
let activeCtx: ReturnType<typeof makeCtx>;
|
|
58
|
+
beforeEach(() => {
|
|
59
|
+
activeCtx = makeCtx();
|
|
60
|
+
(globalThis as { cfgRenderCtx?: unknown }).cfgRenderCtx = activeCtx;
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
afterEach(() => {
|
|
64
|
+
delete (globalThis as { cfgRenderCtx?: unknown }).cfgRenderCtx;
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// ── fixtures ────────────────────────────────────────────────────────────────
|
|
68
|
+
|
|
69
|
+
const hit = createLocalPObjectId(["main", "out"], "hit");
|
|
70
|
+
const linker1 = createLocalPObjectId(["main"], "L1");
|
|
71
|
+
const linker2 = createLocalPObjectId(["main"], "L2");
|
|
72
|
+
const otherCol = createGlobalPObjectId("block-x", "extra");
|
|
73
|
+
|
|
74
|
+
const colNode = (c: PObjectId): SpecQuery => ({ type: "column", column: c });
|
|
75
|
+
|
|
76
|
+
const axisQual = (name: string): AxisQualification => ({ axis: { name }, contextDomain: {} });
|
|
77
|
+
|
|
78
|
+
const overrides = (patch: Partial<SpecOverrides> = {}): SpecOverrides => ({
|
|
79
|
+
annotations: patch.annotations ?? {},
|
|
80
|
+
domain: patch.domain ?? {},
|
|
81
|
+
contextDomain: patch.contextDomain ?? {},
|
|
82
|
+
axesSpec: patch.axesSpec ?? {},
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
class StubRecipe implements ColumnRecipe<ColumnUniversalId> {
|
|
86
|
+
constructor(
|
|
87
|
+
readonly id: ColumnUniversalId,
|
|
88
|
+
private readonly query: SpecQuery,
|
|
89
|
+
) {}
|
|
90
|
+
getReferencedIds(): PObjectId[] {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
getDataStatus(): ColumnFieldStatus {
|
|
94
|
+
return "present";
|
|
95
|
+
}
|
|
96
|
+
getSpec(): PColumnSpec {
|
|
97
|
+
return { kind: "PColumn", valueType: "String", name: "stub", axesSpec: [] };
|
|
98
|
+
}
|
|
99
|
+
getQuery(): SpecQuery {
|
|
100
|
+
return this.query;
|
|
101
|
+
}
|
|
102
|
+
withSpecs(o: SpecOverrides): ColumnRecipe {
|
|
103
|
+
return ColumnOverriddenRecipe.wrap(this, o);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const recipe = (id: PObjectId, query: SpecQuery): ColumnRecipe => new StubRecipe(id, query);
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Build a real ColumnDiscoveredRecipe from a manually-crafted key. Plants a
|
|
111
|
+
* stub registry that resolves the hit column so {@link
|
|
112
|
+
* ColumnDiscoveredRecipe.fromKey} succeeds without a real ctx.
|
|
113
|
+
*/
|
|
114
|
+
function discovered(opts: {
|
|
115
|
+
column: PObjectId;
|
|
116
|
+
columnQualifications?: AxisQualification[];
|
|
117
|
+
queriesQualifications?: Record<PObjectId, AxisQualification[]>;
|
|
118
|
+
}): ColumnDiscoveredRecipe {
|
|
119
|
+
const distilled = createColumnDiscoveredKey({
|
|
120
|
+
column: opts.column,
|
|
121
|
+
columnQualifications: opts.columnQualifications,
|
|
122
|
+
queriesQualifications: opts.queriesQualifications,
|
|
123
|
+
});
|
|
124
|
+
// Spec with two axes — leaves room for `ColumnFilteredRecipe.wrap` callers
|
|
125
|
+
// in dependent tests (need ≥1 filter and ≥1 remaining axis).
|
|
126
|
+
const stubSpec: PColumnSpec = {
|
|
127
|
+
kind: "PColumn",
|
|
128
|
+
name: "stub",
|
|
129
|
+
valueType: "String",
|
|
130
|
+
axesSpec: [
|
|
131
|
+
{ name: "donor", type: "String" },
|
|
132
|
+
{ name: "sample", type: "String" },
|
|
133
|
+
],
|
|
134
|
+
annotations: {},
|
|
135
|
+
};
|
|
136
|
+
installStubRegistry(activeCtx, { [opts.column]: stubSpec });
|
|
137
|
+
const rec = ColumnDiscoveredRecipe.fromKey(distilled);
|
|
138
|
+
if (rec === undefined) throw new Error("discovered fixture: fromKey returned undefined");
|
|
139
|
+
expect(rec.id).toBe(stringifyColumnDiscoveredId(distilled));
|
|
140
|
+
return rec;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
144
|
+
// collectLinkerIds
|
|
145
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
146
|
+
|
|
147
|
+
describe("collectLinkerIds", () => {
|
|
148
|
+
test("leaf recipe → empty", () => {
|
|
149
|
+
expect(collectLinkerIds(recipe(hit, colNode(hit)))).toEqual([]);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
test("linkerJoin chain → linker ids in outer-to-inner order, hit excluded", () => {
|
|
153
|
+
const q: SpecQuery = {
|
|
154
|
+
type: "linkerJoin",
|
|
155
|
+
linker: colNode(linker1),
|
|
156
|
+
secondary: [
|
|
157
|
+
{
|
|
158
|
+
entry: {
|
|
159
|
+
type: "linkerJoin",
|
|
160
|
+
linker: colNode(linker2),
|
|
161
|
+
secondary: [{ entry: colNode(hit) }],
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
],
|
|
165
|
+
};
|
|
166
|
+
expect(collectLinkerIds(recipe(hit, q))).toEqual([linker1, linker2]);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
test("dedupes repeated references", () => {
|
|
170
|
+
const q: SpecQuery = {
|
|
171
|
+
type: "linkerJoin",
|
|
172
|
+
linker: colNode(linker1),
|
|
173
|
+
secondary: [
|
|
174
|
+
{
|
|
175
|
+
entry: {
|
|
176
|
+
type: "linkerJoin",
|
|
177
|
+
linker: colNode(linker1),
|
|
178
|
+
secondary: [{ entry: colNode(hit) }],
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
],
|
|
182
|
+
};
|
|
183
|
+
expect(collectLinkerIds(recipe(hit, q))).toEqual([linker1]);
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
test("ignores the hit even when it appears multiple times", () => {
|
|
187
|
+
const q: SpecQuery = {
|
|
188
|
+
type: "innerJoin",
|
|
189
|
+
entries: [{ entry: colNode(hit) }, { entry: colNode(hit) }, { entry: colNode(otherCol) }],
|
|
190
|
+
};
|
|
191
|
+
expect(collectLinkerIds(recipe(hit, q))).toEqual([otherCol]);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
196
|
+
// hitQualifications / queriesQualifications — recipe-structure walk
|
|
197
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
198
|
+
|
|
199
|
+
describe("hitQualifications", () => {
|
|
200
|
+
test("leaf recipe → empty list", () => {
|
|
201
|
+
expect(hitQualifications(recipe(hit, colNode(hit)))).toEqual([]);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
test("reads ColumnDiscoveredRecipe.columnQualifications", () => {
|
|
205
|
+
const d = discovered({ column: hit, columnQualifications: [axisQual("sample")] });
|
|
206
|
+
expect(hitQualifications(d)).toEqual([axisQual("sample")]);
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
test("descends through Overridden wrapper", () => {
|
|
210
|
+
const d = discovered({ column: hit, columnQualifications: [axisQual("donor")] });
|
|
211
|
+
const wrapped = ColumnOverriddenRecipe.wrap(d, overrides({ annotations: { x: "1" } }));
|
|
212
|
+
expect(hitQualifications(wrapped)).toEqual([axisQual("donor")]);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
test("descends through Filtered wrapper", () => {
|
|
216
|
+
// Filter axis 0 — axis 1 remains, satisfying the wrap invariant.
|
|
217
|
+
const d = discovered({ column: hit, columnQualifications: [axisQual("donor")] });
|
|
218
|
+
const wrapped = ColumnFilteredRecipe.wrap(d, [[0, "v"]]);
|
|
219
|
+
expect(hitQualifications(wrapped)).toEqual([axisQual("donor")]);
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
test("descends through stacked Overridden<Filtered<Discovered>>", () => {
|
|
223
|
+
const d = discovered({ column: hit, columnQualifications: [axisQual("donor")] });
|
|
224
|
+
const stacked = ColumnOverriddenRecipe.wrap(
|
|
225
|
+
ColumnFilteredRecipe.wrap(d, [[0, "v"]]),
|
|
226
|
+
overrides({ annotations: { x: "1" } }),
|
|
227
|
+
);
|
|
228
|
+
expect(hitQualifications(stacked)).toEqual([axisQual("donor")]);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
describe("queriesQualifications", () => {
|
|
233
|
+
test("leaf recipe → empty record", () => {
|
|
234
|
+
expect(queriesQualifications(recipe(hit, colNode(hit)))).toEqual({});
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
test("reads ColumnDiscoveredRecipe.queriesQualifications", () => {
|
|
238
|
+
const quals = { [otherCol]: [axisQual("primary-side")] };
|
|
239
|
+
const d = discovered({ column: hit, queriesQualifications: quals });
|
|
240
|
+
expect(queriesQualifications(d)).toEqual(quals);
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
test("descends through wrappers", () => {
|
|
244
|
+
const quals = { [otherCol]: [axisQual("primary-side")] };
|
|
245
|
+
const d = discovered({ column: hit, queriesQualifications: quals });
|
|
246
|
+
const wrapped = ColumnOverriddenRecipe.wrap(d, overrides());
|
|
247
|
+
expect(queriesQualifications(wrapped)).toEqual(quals);
|
|
248
|
+
});
|
|
249
|
+
});
|