@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
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { TreeNodeAccessor } from "../render/accessor.js";
|
|
2
|
+
import "../render/index.js";
|
|
3
|
+
import { isColumnLazy } from "./column_lazy.js";
|
|
4
|
+
import { ColumnsCollection, isColumnsCollection } from "./columns_collection.js";
|
|
5
|
+
import { PColumnName, canonicalizeAxisId, getAxisId } from "@milaboratories/pl-model-common";
|
|
6
|
+
//#region src/columns/derive_axis_values_labels.ts
|
|
7
|
+
const RT_JSON = "PColumnData/Json";
|
|
8
|
+
const RT_JSON_PARTITIONED = "PColumnData/JsonPartitioned";
|
|
9
|
+
/**
|
|
10
|
+
* Build an `axisValuesLabels` callback by discovering `pl7.app/label` columns
|
|
11
|
+
* from the given source, eagerly materialising their value→label maps, and
|
|
12
|
+
* keying them by canonical axis id.
|
|
13
|
+
*
|
|
14
|
+
* Modern replacement for `ctx.resultPool.findLabels` — uses the new
|
|
15
|
+
* column-access mechanism (filtered {@link ColumnsCollection}) instead of
|
|
16
|
+
* walking the raw result pool.
|
|
17
|
+
*
|
|
18
|
+
* Pair with {@link expandByPartition} (or any consumer expecting the
|
|
19
|
+
* `(axisId) => Record<axisValue, label>` shape).
|
|
20
|
+
*
|
|
21
|
+
* Skips:
|
|
22
|
+
* - non-leaf recipes (only direct `ColumnLazy` data is read);
|
|
23
|
+
* - label columns whose `axesSpec.length !== 1`;
|
|
24
|
+
* - label columns whose data resource type isn't `PColumnData/Json` /
|
|
25
|
+
* `PColumnData/JsonPartitioned`.
|
|
26
|
+
*/
|
|
27
|
+
function deriveAxisValuesLabels(source, opts) {
|
|
28
|
+
const byAxis = (source === void 0 ? ColumnsCollection(void 0, opts) : isColumnsCollection(source) ? source : ColumnsCollection(source, opts)).filter({ include: { name: [{
|
|
29
|
+
type: "exact",
|
|
30
|
+
value: PColumnName.Label
|
|
31
|
+
}] } }).getColumns().reduce((map, col) => {
|
|
32
|
+
if (!isColumnLazy(col)) return map;
|
|
33
|
+
const spec = col.getSpec();
|
|
34
|
+
if (spec.axesSpec.length !== 1) return map;
|
|
35
|
+
const data = col.getData();
|
|
36
|
+
if (!(data instanceof TreeNodeAccessor)) return map;
|
|
37
|
+
const labelMap = readLabelMap(data);
|
|
38
|
+
if (!labelMap) return map;
|
|
39
|
+
map.set(canonicalizeAxisId(getAxisId(spec.axesSpec[0])), labelMap);
|
|
40
|
+
return map;
|
|
41
|
+
}, /* @__PURE__ */ new Map());
|
|
42
|
+
return (axisId) => byAxis.get(canonicalizeAxisId(axisId));
|
|
43
|
+
}
|
|
44
|
+
function readLabelMap(acc) {
|
|
45
|
+
const rt = acc.resourceType.name;
|
|
46
|
+
if (rt === RT_JSON) {
|
|
47
|
+
const json = acc.getDataAsJson();
|
|
48
|
+
return json?.data ? parseLabelKeys(json.data) : void 0;
|
|
49
|
+
}
|
|
50
|
+
if (rt === RT_JSON_PARTITIONED) return acc.listInputFields().reduce((merged, partKey) => {
|
|
51
|
+
const part = acc.resolve({
|
|
52
|
+
field: partKey,
|
|
53
|
+
assertFieldType: "Input",
|
|
54
|
+
ignoreError: true
|
|
55
|
+
});
|
|
56
|
+
if (!part) return merged;
|
|
57
|
+
const json = part.getDataAsJson();
|
|
58
|
+
if (!json?.data) return merged;
|
|
59
|
+
return Object.assign(merged, parseLabelKeys(json.data));
|
|
60
|
+
}, {});
|
|
61
|
+
}
|
|
62
|
+
function parseLabelKeys(raw) {
|
|
63
|
+
return Object.entries(raw).reduce((acc, [k, v]) => {
|
|
64
|
+
try {
|
|
65
|
+
const parsed = JSON.parse(k);
|
|
66
|
+
acc[Array.isArray(parsed) ? parsed[0] : parsed] = v;
|
|
67
|
+
} catch {
|
|
68
|
+
acc[k] = v;
|
|
69
|
+
}
|
|
70
|
+
return acc;
|
|
71
|
+
}, {});
|
|
72
|
+
}
|
|
73
|
+
//#endregion
|
|
74
|
+
export { deriveAxisValuesLabels };
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=derive_axis_values_labels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive_axis_values_labels.js","names":[],"sources":["../../src/columns/derive_axis_values_labels.ts"],"sourcesContent":["import type { AxisId } from \"@milaboratories/pl-model-common\";\nimport { canonicalizeAxisId, getAxisId, PColumnName } from \"@milaboratories/pl-model-common\";\nimport type { ColumnsSource } from \"./column_providers\";\nimport { ColumnsCollection, isColumnsCollection } from \"./columns_collection\";\nimport type { GlobalCfgRenderCtx } from \"../render/internal\";\nimport { TreeNodeAccessor } from \"../render\";\nimport { isColumnLazy } from \"./column_lazy\";\n\nconst RT_JSON = \"PColumnData/Json\";\nconst RT_JSON_PARTITIONED = \"PColumnData/JsonPartitioned\";\n\n/**\n * Build an `axisValuesLabels` callback by discovering `pl7.app/label` columns\n * from the given source, eagerly materialising their value→label maps, and\n * keying them by canonical axis id.\n *\n * Modern replacement for `ctx.resultPool.findLabels` — uses the new\n * column-access mechanism (filtered {@link ColumnsCollection}) instead of\n * walking the raw result pool.\n *\n * Pair with {@link expandByPartition} (or any consumer expecting the\n * `(axisId) => Record<axisValue, label>` shape).\n *\n * Skips:\n * - non-leaf recipes (only direct `ColumnLazy` data is read);\n * - label columns whose `axesSpec.length !== 1`;\n * - label columns whose data resource type isn't `PColumnData/Json` /\n * `PColumnData/JsonPartitioned`.\n */\nexport function deriveAxisValuesLabels(\n source?: ColumnsCollection | (ColumnsCollection | ColumnsSource)[],\n opts?: { ctx?: GlobalCfgRenderCtx },\n): (axisId: AxisId) => Record<string | number, string> | undefined {\n const collection =\n source === undefined\n ? ColumnsCollection(undefined, opts)\n : isColumnsCollection(source)\n ? source\n : ColumnsCollection(source, opts);\n\n const labelCols = collection\n .filter({ include: { name: [{ type: \"exact\", value: PColumnName.Label }] } })\n .getColumns();\n\n const byAxis = labelCols.reduce<Map<string, Record<string | number, string>>>((map, col) => {\n if (!isColumnLazy(col)) return map;\n const spec = col.getSpec();\n if (spec.axesSpec.length !== 1) return map;\n\n const data = col.getData();\n if (!(data instanceof TreeNodeAccessor)) return map;\n\n const labelMap = readLabelMap(data);\n if (!labelMap) return map;\n\n map.set(canonicalizeAxisId(getAxisId(spec.axesSpec[0])), labelMap);\n return map;\n }, new Map());\n\n return (axisId) => byAxis.get(canonicalizeAxisId(axisId));\n}\n\nfunction readLabelMap(acc: TreeNodeAccessor): undefined | Record<string | number, string> {\n const rt = acc.resourceType.name;\n\n if (rt === RT_JSON) {\n const json = acc.getDataAsJson<{ data?: Record<string, string> }>();\n return json?.data ? parseLabelKeys(json.data) : undefined;\n }\n\n if (rt === RT_JSON_PARTITIONED) {\n return acc.listInputFields().reduce<Record<string | number, string>>((merged, partKey) => {\n const part = acc.resolve({\n field: partKey,\n assertFieldType: \"Input\",\n ignoreError: true,\n });\n if (!part) return merged;\n const json = part.getDataAsJson<{ data?: Record<string, string> }>();\n if (!json?.data) return merged;\n return Object.assign(merged, parseLabelKeys(json.data));\n }, {});\n }\n\n return undefined;\n}\n\nfunction parseLabelKeys(raw: Record<string, string>): Record<string | number, string> {\n return Object.entries(raw).reduce<Record<string | number, string>>((acc, [k, v]) => {\n try {\n const parsed = JSON.parse(k);\n acc[Array.isArray(parsed) ? parsed[0] : parsed] = v;\n } catch {\n acc[k] = v;\n }\n return acc;\n }, {});\n}\n"],"mappings":";;;;;;AAQA,MAAM,UAAU;AAChB,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;AAoB5B,SAAgB,uBACd,QACA,MACiE;CAYjE,MAAM,UAVJ,WAAW,KAAA,IACP,kBAAkB,KAAA,GAAW,IAAI,IACjC,oBAAoB,MAAM,IACxB,SACA,kBAAkB,QAAQ,IAAI,EAAA,CAGnC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC;EAAE,MAAM;EAAS,OAAO,YAAY;CAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAC5E,WAEoB,CAAC,CAAC,QAAsD,KAAK,QAAQ;EAC1F,IAAI,CAAC,aAAa,GAAG,GAAG,OAAO;EAC/B,MAAM,OAAO,IAAI,QAAQ;EACzB,IAAI,KAAK,SAAS,WAAW,GAAG,OAAO;EAEvC,MAAM,OAAO,IAAI,QAAQ;EACzB,IAAI,EAAE,gBAAgB,mBAAmB,OAAO;EAEhD,MAAM,WAAW,aAAa,IAAI;EAClC,IAAI,CAAC,UAAU,OAAO;EAEtB,IAAI,IAAI,mBAAmB,UAAU,KAAK,SAAS,EAAE,CAAC,GAAG,QAAQ;EACjE,OAAO;CACT,mBAAG,IAAI,IAAI,CAAC;CAEZ,QAAQ,WAAW,OAAO,IAAI,mBAAmB,MAAM,CAAC;AAC1D;AAEA,SAAS,aAAa,KAAoE;CACxF,MAAM,KAAK,IAAI,aAAa;CAE5B,IAAI,OAAO,SAAS;EAClB,MAAM,OAAO,IAAI,cAAiD;EAClE,OAAO,MAAM,OAAO,eAAe,KAAK,IAAI,IAAI,KAAA;CAClD;CAEA,IAAI,OAAO,qBACT,OAAO,IAAI,gBAAgB,CAAC,CAAC,QAAyC,QAAQ,YAAY;EACxF,MAAM,OAAO,IAAI,QAAQ;GACvB,OAAO;GACP,iBAAiB;GACjB,aAAa;EACf,CAAC;EACD,IAAI,CAAC,MAAM,OAAO;EAClB,MAAM,OAAO,KAAK,cAAiD;EACnE,IAAI,CAAC,MAAM,MAAM,OAAO;EACxB,OAAO,OAAO,OAAO,QAAQ,eAAe,KAAK,IAAI,CAAC;CACxD,GAAG,CAAC,CAAC;AAIT;AAEA,SAAS,eAAe,KAA8D;CACpF,OAAO,OAAO,QAAQ,GAAG,CAAC,CAAC,QAAyC,KAAK,CAAC,GAAG,OAAO;EAClF,IAAI;GACF,MAAM,SAAS,KAAK,MAAM,CAAC;GAC3B,IAAI,MAAM,QAAQ,MAAM,IAAI,OAAO,KAAK,UAAU;EACpD,QAAQ;GACN,IAAI,KAAK;EACX;EACA,OAAO;CACT,GAAG,CAAC,CAAC;AACP"}
|
|
@@ -1,80 +1,77 @@
|
|
|
1
|
-
const
|
|
1
|
+
const require_accessor = require("../render/accessor.cjs");
|
|
2
2
|
const require_pcolumn_data = require("../render/util/pcolumn_data.cjs");
|
|
3
|
-
const
|
|
3
|
+
const require_column_filtered_recipe = require("./column_recipes/column_filtered_recipe.cjs");
|
|
4
|
+
const require_column_overrided_recipe = require("./column_recipes/column_overrided_recipe.cjs");
|
|
5
|
+
const require_utils = require("./utils.cjs");
|
|
4
6
|
let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
|
|
5
7
|
//#region src/columns/expand_by_partition.ts
|
|
8
|
+
const MAX_KEY_COMBINATIONS = 1e4;
|
|
6
9
|
/**
|
|
7
|
-
* Expand
|
|
10
|
+
* Expand each input column along the requested partition axes into one
|
|
11
|
+
* {@link ColumnRecipe} per Cartesian combination of unique partition values.
|
|
12
|
+
*
|
|
13
|
+
* Each split is produced as `ColumnOverriddenRecipe.wrap(ColumnFilteredRecipe.wrap(inner, axisFilters), { domain, annotations })`:
|
|
14
|
+
* - `ColumnFilteredRecipe` pins all split axes at once (one wrap call with
|
|
15
|
+
* every `[idx, value]` pair) and removes them from `axesSpec`. The
|
|
16
|
+
* engine performs the data slicing via the `sliceAxes` query node.
|
|
17
|
+
* - `ColumnOverriddenRecipe` overlays a `domain[axisName] = String(value)`
|
|
18
|
+
* entry per split axis and appends a `split:<canonicalAxisId>` trace
|
|
19
|
+
* entry per split axis to the existing `pl7.app/trace` annotation.
|
|
8
20
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
21
|
+
* The recipe id is a canonical
|
|
22
|
+
* `ColumnOverriddenId(source: ColumnFilteredId(source: inner.id, axisFilters), specOverrides)`
|
|
23
|
+
* — distinct per split combination, parseable by `extractPObjectId`, and
|
|
24
|
+
* traversable by recipe walkers.
|
|
13
25
|
*
|
|
14
|
-
* Returns `
|
|
15
|
-
*
|
|
26
|
+
* Returns `undefined` when any input's `getData()` is not a
|
|
27
|
+
* {@link TreeNodeAccessor} — partition inspection is not yet possible.
|
|
16
28
|
*/
|
|
17
|
-
function expandByPartition(
|
|
18
|
-
if (splitAxes.length === 0) return
|
|
19
|
-
items: snapshots,
|
|
20
|
-
complete: true
|
|
21
|
-
};
|
|
29
|
+
function expandByPartition(inputs, splitAxes, opts) {
|
|
30
|
+
if (splitAxes.length === 0) return [...inputs];
|
|
22
31
|
const splitAxisIdxs = splitAxes.map((a) => a.idx).sort((a, b) => a - b);
|
|
32
|
+
const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];
|
|
23
33
|
const result = [];
|
|
24
|
-
for (const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
if (maxSplitIdx >= dataEntries.partitionKeyLength) throw new Error(`Not enough partition keys (${dataEntries.partitionKeyLength}) for requested split axes (max index ${maxSplitIdx}) in column ${snapshot.spec.name}`);
|
|
38
|
-
const axesLabels = splitAxisIdxs.map((idx) => opts?.axisLabels?.((0, _milaboratories_pl_model_common.getAxisId)(snapshot.spec.axesSpec[idx])));
|
|
34
|
+
for (const inner of inputs) {
|
|
35
|
+
const data = require_utils.getLeafColumnData(inner);
|
|
36
|
+
if (!(data instanceof require_accessor.TreeNodeAccessor) && !(0, _milaboratories_pl_model_common.isDataInfoEntries)(data)) return;
|
|
37
|
+
const uniqueKeys = require_pcolumn_data.getUniquePartitionKeys(data);
|
|
38
|
+
if (uniqueKeys === void 0) return void 0;
|
|
39
|
+
if (maxSplitIdx >= uniqueKeys.length) throw new Error(`Not enough partition keys (${uniqueKeys.length}) for requested split axes (max index ${maxSplitIdx}) in column ${inner.getSpec().name}`);
|
|
40
|
+
const spec = inner.getSpec();
|
|
41
|
+
const axesSpec = spec.axesSpec;
|
|
42
|
+
const splitAxisSpecs = splitAxisIdxs.map((idx) => axesSpec[idx]);
|
|
43
|
+
const splitAxisIds = splitAxisSpecs.map((axisSpec) => (0, _milaboratories_pl_model_common.getAxisId)(axisSpec));
|
|
44
|
+
const axesLabels = splitAxisIds.map((axisId) => opts?.axisValuesLabels?.(axisId));
|
|
45
|
+
const existingTraceRaw = (0, _milaboratories_pl_model_common.readAnnotation)(spec, _milaboratories_pl_model_common.Annotation.Trace);
|
|
46
|
+
const baseTrace = existingTraceRaw ? JSON.parse(existingTraceRaw) ?? [] : [];
|
|
39
47
|
const keyCombinations = generateKeyCombinations(uniqueKeys, splitAxisIdxs);
|
|
40
48
|
if (keyCombinations.length === 0) continue;
|
|
41
|
-
const newAxesSpec = [...snapshot.spec.axesSpec];
|
|
42
|
-
for (let i = splitAxisIdxs.length - 1; i >= 0; i--) newAxesSpec.splice(splitAxisIdxs[i], 1);
|
|
43
49
|
for (const keyCombo of keyCombinations) {
|
|
44
50
|
const axisFilters = keyCombo.map((value, sAxisIdx) => [splitAxisIdxs[sAxisIdx], value]);
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
51
|
+
const domain = {};
|
|
52
|
+
const traceEntries = [];
|
|
53
|
+
for (let sAxisIdx = 0; sAxisIdx < keyCombo.length; sAxisIdx++) {
|
|
54
|
+
const value = keyCombo[sAxisIdx];
|
|
55
|
+
const axisSpec = splitAxisSpecs[sAxisIdx];
|
|
56
|
+
const axisId = splitAxisIds[sAxisIdx];
|
|
48
57
|
const label = axesLabels[sAxisIdx]?.[value] ?? String(value);
|
|
49
|
-
|
|
58
|
+
domain[axisSpec.name] = String(value);
|
|
59
|
+
traceEntries.push({
|
|
50
60
|
type: `split:${(0, _milaboratories_pl_model_common.canonicalizeAxisId)(axisId)}`,
|
|
51
61
|
label,
|
|
52
62
|
importance: 1e6
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
const
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
annotations: {
|
|
60
|
-
...snapshot.spec.annotations,
|
|
61
|
-
"pl7.app/trace": JSON.stringify(traceEntries)
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
result.push({
|
|
65
|
-
id: snapshot.id,
|
|
66
|
-
spec: adjustedSpec,
|
|
67
|
-
dataStatus: "ready",
|
|
68
|
-
data: require_column_snapshot.createReadyColumnData(() => (0, _milaboratories_pl_model_common.entriesToDataInfo)(filteredData))
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const filtered = require_column_filtered_recipe.ColumnFilteredRecipe.wrap(inner, axisFilters);
|
|
66
|
+
const overrided = require_column_overrided_recipe.ColumnOverriddenRecipe.wrap(filtered, {
|
|
67
|
+
domain,
|
|
68
|
+
annotations: { [_milaboratories_pl_model_common.Annotation.Trace]: JSON.stringify([...baseTrace, ...traceEntries]) }
|
|
69
69
|
});
|
|
70
|
+
result.push(overrided);
|
|
70
71
|
}
|
|
71
72
|
}
|
|
72
|
-
return
|
|
73
|
-
items: result,
|
|
74
|
-
complete: true
|
|
75
|
-
};
|
|
73
|
+
return result;
|
|
76
74
|
}
|
|
77
|
-
const MAX_KEY_COMBINATIONS = 1e4;
|
|
78
75
|
function generateKeyCombinations(uniqueKeys, splitAxisIdxs) {
|
|
79
76
|
const combinations = [];
|
|
80
77
|
function generate(currentCombo, sAxisIdx) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expand_by_partition.cjs","names":["
|
|
1
|
+
{"version":3,"file":"expand_by_partition.cjs","names":["getLeafColumnData","TreeNodeAccessor","getUniquePartitionKeys","Annotation","ColumnFilteredRecipe","ColumnOverriddenRecipe"],"sources":["../../src/columns/expand_by_partition.ts"],"sourcesContent":["import type {\n AxisFilterByIdx,\n AxisFilterValue,\n AxisId,\n TraceEntry,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeAxisId,\n getAxisId,\n isDataInfoEntries,\n readAnnotation,\n} from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport { getUniquePartitionKeys } from \"../render/util/pcolumn_data\";\nimport type { ColumnRecipe } from \"./column_recipes\";\nimport { ColumnFilteredRecipe } from \"./column_recipes/column_filtered_recipe\";\nimport { ColumnOverriddenRecipe } from \"./column_recipes/column_overrided_recipe\";\nimport { Column } from \"./column\";\nimport { getLeafColumnData } from \"./utils\";\n\n// --- Types ---\n\nexport interface SplitAxis {\n /** Index of the axis in the column's axesSpec to split by. */\n readonly idx: number;\n}\n\nexport interface ExpandByPartitionOpts {\n /** Resolve axis values to human-readable labels. */\n axisValuesLabels?: (axisId: AxisId) => undefined | Record<string | number, string>;\n}\n\n// --- Implementation ---\n\nconst MAX_KEY_COMBINATIONS = 10_000;\n\n/**\n * Expand each input column along the requested partition axes into one\n * {@link ColumnRecipe} per Cartesian combination of unique partition values.\n *\n * Each split is produced as `ColumnOverriddenRecipe.wrap(ColumnFilteredRecipe.wrap(inner, axisFilters), { domain, annotations })`:\n * - `ColumnFilteredRecipe` pins all split axes at once (one wrap call with\n * every `[idx, value]` pair) and removes them from `axesSpec`. The\n * engine performs the data slicing via the `sliceAxes` query node.\n * - `ColumnOverriddenRecipe` overlays a `domain[axisName] = String(value)`\n * entry per split axis and appends a `split:<canonicalAxisId>` trace\n * entry per split axis to the existing `pl7.app/trace` annotation.\n *\n * The recipe id is a canonical\n * `ColumnOverriddenId(source: ColumnFilteredId(source: inner.id, axisFilters), specOverrides)`\n * — distinct per split combination, parseable by `extractPObjectId`, and\n * traversable by recipe walkers.\n *\n * Returns `undefined` when any input's `getData()` is not a\n * {@link TreeNodeAccessor} — partition inspection is not yet possible.\n */\nexport function expandByPartition(\n inputs: Column[],\n splitAxes: SplitAxis[],\n opts?: ExpandByPartitionOpts,\n): ColumnRecipe[] | undefined {\n if (splitAxes.length === 0) {\n return [...inputs];\n }\n\n const splitAxisIdxs = splitAxes.map((a) => a.idx).sort((a, b) => a - b);\n const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];\n\n const result: ColumnRecipe[] = [];\n\n for (const inner of inputs) {\n const data = getLeafColumnData(inner);\n // Partition inspection requires either a live tree-accessor or already\n // parsed DataInfoEntries. Anything else means the input is not yet ready.\n if (!(data instanceof TreeNodeAccessor) && !isDataInfoEntries(data)) {\n return undefined;\n }\n\n const uniqueKeys = getUniquePartitionKeys(data);\n if (uniqueKeys === undefined) return undefined;\n\n if (maxSplitIdx >= uniqueKeys.length) {\n throw new Error(\n `Not enough partition keys (${uniqueKeys.length}) for requested split axes (max index ${maxSplitIdx}) in column ${inner.getSpec().name}`,\n );\n }\n\n const spec = inner.getSpec();\n const axesSpec = spec.axesSpec;\n const splitAxisSpecs = splitAxisIdxs.map((idx) => axesSpec[idx]);\n const splitAxisIds = splitAxisSpecs.map((axisSpec) => getAxisId(axisSpec));\n const axesLabels = splitAxisIds.map((axisId) => opts?.axisValuesLabels?.(axisId));\n\n const existingTraceRaw = readAnnotation(spec, Annotation.Trace);\n const baseTrace: TraceEntry[] = existingTraceRaw\n ? ((JSON.parse(existingTraceRaw) as TraceEntry[]) ?? [])\n : [];\n\n const keyCombinations = generateKeyCombinations(uniqueKeys, splitAxisIdxs);\n if (keyCombinations.length === 0) continue;\n\n for (const keyCombo of keyCombinations) {\n const axisFilters: AxisFilterByIdx[] = keyCombo.map(\n (value, sAxisIdx): AxisFilterByIdx => [splitAxisIdxs[sAxisIdx], value as AxisFilterValue],\n );\n\n const domain: Record<string, string> = {};\n const traceEntries: TraceEntry[] = [];\n for (let sAxisIdx = 0; sAxisIdx < keyCombo.length; sAxisIdx++) {\n const value = keyCombo[sAxisIdx];\n const axisSpec = splitAxisSpecs[sAxisIdx];\n const axisId = splitAxisIds[sAxisIdx];\n const labelMap = axesLabels[sAxisIdx];\n const label = labelMap?.[value] ?? String(value);\n domain[axisSpec.name] = String(value);\n traceEntries.push({\n type: `split:${canonicalizeAxisId(axisId)}`,\n label,\n importance: 1_000_000,\n });\n }\n\n const filtered = ColumnFilteredRecipe.wrap(inner, axisFilters);\n const overrided = ColumnOverriddenRecipe.wrap(filtered, {\n domain,\n annotations: {\n [Annotation.Trace]: JSON.stringify([...baseTrace, ...traceEntries]),\n },\n });\n\n result.push(overrided);\n }\n }\n\n return result;\n}\n\nfunction generateKeyCombinations(\n uniqueKeys: (string | number)[][],\n splitAxisIdxs: number[],\n): (string | number)[][] {\n const combinations: (string | number)[][] = [];\n\n function generate(currentCombo: (string | number)[], sAxisIdx: number): void {\n if (sAxisIdx >= splitAxisIdxs.length) {\n combinations.push([...currentCombo]);\n if (combinations.length > MAX_KEY_COMBINATIONS) {\n throw new Error(\"Too many key combinations, aborting.\");\n }\n return;\n }\n\n const axisIdx = splitAxisIdxs[sAxisIdx];\n if (axisIdx >= uniqueKeys.length) {\n throw new Error(\n `Axis index ${axisIdx} out of bounds for unique keys array (length ${uniqueKeys.length})`,\n );\n }\n\n const axisValues = uniqueKeys[axisIdx];\n if (!axisValues || axisValues.length === 0) {\n combinations.length = 0;\n return;\n }\n\n for (const val of axisValues) {\n currentCombo.push(val);\n generate(currentCombo, sAxisIdx + 1);\n currentCombo.pop();\n }\n }\n\n generate([], 0);\n return combinations;\n}\n"],"mappings":";;;;;;;AAmCA,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;AAsB7B,SAAgB,kBACd,QACA,WACA,MAC4B;CAC5B,IAAI,UAAU,WAAW,GACvB,OAAO,CAAC,GAAG,MAAM;CAGnB,MAAM,gBAAgB,UAAU,KAAK,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC;CACtE,MAAM,cAAc,cAAc,cAAc,SAAS;CAEzD,MAAM,SAAyB,CAAC;CAEhC,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,OAAOA,cAAAA,kBAAkB,KAAK;EAGpC,IAAI,EAAE,gBAAgBC,iBAAAA,qBAAqB,EAAA,GAAA,gCAAA,kBAAA,CAAmB,IAAI,GAChE;EAGF,MAAM,aAAaC,qBAAAA,uBAAuB,IAAI;EAC9C,IAAI,eAAe,KAAA,GAAW,OAAO,KAAA;EAErC,IAAI,eAAe,WAAW,QAC5B,MAAM,IAAI,MACR,8BAA8B,WAAW,OAAO,wCAAwC,YAAY,cAAc,MAAM,QAAQ,CAAC,CAAC,MACpI;EAGF,MAAM,OAAO,MAAM,QAAQ;EAC3B,MAAM,WAAW,KAAK;EACtB,MAAM,iBAAiB,cAAc,KAAK,QAAQ,SAAS,IAAI;EAC/D,MAAM,eAAe,eAAe,KAAK,cAAA,GAAA,gCAAA,UAAA,CAAuB,QAAQ,CAAC;EACzE,MAAM,aAAa,aAAa,KAAK,WAAW,MAAM,mBAAmB,MAAM,CAAC;EAEhF,MAAM,oBAAA,GAAA,gCAAA,eAAA,CAAkC,MAAMC,gCAAAA,WAAW,KAAK;EAC9D,MAAM,YAA0B,mBAC1B,KAAK,MAAM,gBAAgB,KAAsB,CAAC,IACpD,CAAC;EAEL,MAAM,kBAAkB,wBAAwB,YAAY,aAAa;EACzE,IAAI,gBAAgB,WAAW,GAAG;EAElC,KAAK,MAAM,YAAY,iBAAiB;GACtC,MAAM,cAAiC,SAAS,KAC7C,OAAO,aAA8B,CAAC,cAAc,WAAW,KAAwB,CAC1F;GAEA,MAAM,SAAiC,CAAC;GACxC,MAAM,eAA6B,CAAC;GACpC,KAAK,IAAI,WAAW,GAAG,WAAW,SAAS,QAAQ,YAAY;IAC7D,MAAM,QAAQ,SAAS;IACvB,MAAM,WAAW,eAAe;IAChC,MAAM,SAAS,aAAa;IAE5B,MAAM,QADW,WAAW,SACN,GAAG,UAAU,OAAO,KAAK;IAC/C,OAAO,SAAS,QAAQ,OAAO,KAAK;IACpC,aAAa,KAAK;KAChB,MAAM,UAAA,GAAA,gCAAA,mBAAA,CAA4B,MAAM;KACxC;KACA,YAAY;IACd,CAAC;GACH;GAEA,MAAM,WAAWC,+BAAAA,qBAAqB,KAAK,OAAO,WAAW;GAC7D,MAAM,YAAYC,gCAAAA,uBAAuB,KAAK,UAAU;IACtD;IACA,aAAa,GACVF,gCAAAA,WAAW,QAAQ,KAAK,UAAU,CAAC,GAAG,WAAW,GAAG,YAAY,CAAC,EACpE;GACF,CAAC;GAED,OAAO,KAAK,SAAS;EACvB;CACF;CAEA,OAAO;AACT;AAEA,SAAS,wBACP,YACA,eACuB;CACvB,MAAM,eAAsC,CAAC;CAE7C,SAAS,SAAS,cAAmC,UAAwB;EAC3E,IAAI,YAAY,cAAc,QAAQ;GACpC,aAAa,KAAK,CAAC,GAAG,YAAY,CAAC;GACnC,IAAI,aAAa,SAAS,sBACxB,MAAM,IAAI,MAAM,sCAAsC;GAExD;EACF;EAEA,MAAM,UAAU,cAAc;EAC9B,IAAI,WAAW,WAAW,QACxB,MAAM,IAAI,MACR,cAAc,QAAQ,+CAA+C,WAAW,OAAO,EACzF;EAGF,MAAM,aAAa,WAAW;EAC9B,IAAI,CAAC,cAAc,WAAW,WAAW,GAAG;GAC1C,aAAa,SAAS;GACtB;EACF;EAEA,KAAK,MAAM,OAAO,YAAY;GAC5B,aAAa,KAAK,GAAG;GACrB,SAAS,cAAc,WAAW,CAAC;GACnC,aAAa,IAAI;EACnB;CACF;CAEA,SAAS,CAAC,GAAG,CAAC;CACd,OAAO;AACT"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { Column } from "./column.js";
|
|
2
|
+
import { ColumnRecipe } from "./column_recipes/index.js";
|
|
3
|
+
import { AxisId } from "@milaboratories/pl-model-common";
|
|
3
4
|
|
|
4
5
|
//#region src/columns/expand_by_partition.d.ts
|
|
5
6
|
interface SplitAxis {
|
|
@@ -8,26 +9,29 @@ interface SplitAxis {
|
|
|
8
9
|
}
|
|
9
10
|
interface ExpandByPartitionOpts {
|
|
10
11
|
/** Resolve axis values to human-readable labels. */
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
interface ExpandByPartitionResult {
|
|
14
|
-
/** Expanded snapshots (one per key combination per original snapshot). */
|
|
15
|
-
readonly items: ColumnSnapshot<PObjectId>[];
|
|
16
|
-
/** False if any column's data was not ready for splitting. */
|
|
17
|
-
readonly complete: boolean;
|
|
12
|
+
axisValuesLabels?: (axisId: AxisId) => undefined | Record<string | number, string>;
|
|
18
13
|
}
|
|
19
14
|
/**
|
|
20
|
-
* Expand
|
|
15
|
+
* Expand each input column along the requested partition axes into one
|
|
16
|
+
* {@link ColumnRecipe} per Cartesian combination of unique partition values.
|
|
17
|
+
*
|
|
18
|
+
* Each split is produced as `ColumnOverriddenRecipe.wrap(ColumnFilteredRecipe.wrap(inner, axisFilters), { domain, annotations })`:
|
|
19
|
+
* - `ColumnFilteredRecipe` pins all split axes at once (one wrap call with
|
|
20
|
+
* every `[idx, value]` pair) and removes them from `axesSpec`. The
|
|
21
|
+
* engine performs the data slicing via the `sliceAxes` query node.
|
|
22
|
+
* - `ColumnOverriddenRecipe` overlays a `domain[axisName] = String(value)`
|
|
23
|
+
* entry per split axis and appends a `split:<canonicalAxisId>` trace
|
|
24
|
+
* entry per split axis to the existing `pl7.app/trace` annotation.
|
|
21
25
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
+
* The recipe id is a canonical
|
|
27
|
+
* `ColumnOverriddenId(source: ColumnFilteredId(source: inner.id, axisFilters), specOverrides)`
|
|
28
|
+
* — distinct per split combination, parseable by `extractPObjectId`, and
|
|
29
|
+
* traversable by recipe walkers.
|
|
26
30
|
*
|
|
27
|
-
* Returns `
|
|
28
|
-
*
|
|
31
|
+
* Returns `undefined` when any input's `getData()` is not a
|
|
32
|
+
* {@link TreeNodeAccessor} — partition inspection is not yet possible.
|
|
29
33
|
*/
|
|
30
|
-
declare function expandByPartition(
|
|
34
|
+
declare function expandByPartition(inputs: Column[], splitAxes: SplitAxis[], opts?: ExpandByPartitionOpts): ColumnRecipe[] | undefined;
|
|
31
35
|
//#endregion
|
|
32
|
-
export { ExpandByPartitionOpts,
|
|
36
|
+
export { ExpandByPartitionOpts, SplitAxis, expandByPartition };
|
|
33
37
|
//# sourceMappingURL=expand_by_partition.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expand_by_partition.d.ts","names":[],"sources":["../../src/columns/expand_by_partition.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"expand_by_partition.d.ts","names":[],"sources":["../../src/columns/expand_by_partition.ts"],"mappings":";;;;;UAuBiB,SAAA;;WAEN,GAAG;AAAA;AAAA,UAGG,qBAAA;EAHH;EAKZ,gBAAA,IAAoB,MAAA,EAAQ,MAAA,iBAAuB,MAAM;AAAA;;;;;;;;;AAAA;AA2B3D;;;;;;;;;;;iBAAgB,iBAAA,CACd,MAAA,EAAQ,MAAA,IACR,SAAA,EAAW,SAAA,IACX,IAAA,GAAO,qBAAA,GACN,YAAA"}
|
|
@@ -1,80 +1,77 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { TreeNodeAccessor } from "../render/accessor.js";
|
|
2
|
+
import { getUniquePartitionKeys } from "../render/util/pcolumn_data.js";
|
|
3
|
+
import { ColumnFilteredRecipe } from "./column_recipes/column_filtered_recipe.js";
|
|
4
|
+
import { ColumnOverriddenRecipe } from "./column_recipes/column_overrided_recipe.js";
|
|
5
|
+
import { getLeafColumnData } from "./utils.js";
|
|
6
|
+
import { Annotation, canonicalizeAxisId, getAxisId, isDataInfoEntries, readAnnotation } from "@milaboratories/pl-model-common";
|
|
5
7
|
//#region src/columns/expand_by_partition.ts
|
|
8
|
+
const MAX_KEY_COMBINATIONS = 1e4;
|
|
6
9
|
/**
|
|
7
|
-
* Expand
|
|
10
|
+
* Expand each input column along the requested partition axes into one
|
|
11
|
+
* {@link ColumnRecipe} per Cartesian combination of unique partition values.
|
|
12
|
+
*
|
|
13
|
+
* Each split is produced as `ColumnOverriddenRecipe.wrap(ColumnFilteredRecipe.wrap(inner, axisFilters), { domain, annotations })`:
|
|
14
|
+
* - `ColumnFilteredRecipe` pins all split axes at once (one wrap call with
|
|
15
|
+
* every `[idx, value]` pair) and removes them from `axesSpec`. The
|
|
16
|
+
* engine performs the data slicing via the `sliceAxes` query node.
|
|
17
|
+
* - `ColumnOverriddenRecipe` overlays a `domain[axisName] = String(value)`
|
|
18
|
+
* entry per split axis and appends a `split:<canonicalAxisId>` trace
|
|
19
|
+
* entry per split axis to the existing `pl7.app/trace` annotation.
|
|
8
20
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
21
|
+
* The recipe id is a canonical
|
|
22
|
+
* `ColumnOverriddenId(source: ColumnFilteredId(source: inner.id, axisFilters), specOverrides)`
|
|
23
|
+
* — distinct per split combination, parseable by `extractPObjectId`, and
|
|
24
|
+
* traversable by recipe walkers.
|
|
13
25
|
*
|
|
14
|
-
* Returns `
|
|
15
|
-
*
|
|
26
|
+
* Returns `undefined` when any input's `getData()` is not a
|
|
27
|
+
* {@link TreeNodeAccessor} — partition inspection is not yet possible.
|
|
16
28
|
*/
|
|
17
|
-
function expandByPartition(
|
|
18
|
-
if (splitAxes.length === 0) return
|
|
19
|
-
items: snapshots,
|
|
20
|
-
complete: true
|
|
21
|
-
};
|
|
29
|
+
function expandByPartition(inputs, splitAxes, opts) {
|
|
30
|
+
if (splitAxes.length === 0) return [...inputs];
|
|
22
31
|
const splitAxisIdxs = splitAxes.map((a) => a.idx).sort((a, b) => a - b);
|
|
32
|
+
const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];
|
|
23
33
|
const result = [];
|
|
24
|
-
for (const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
if (maxSplitIdx >= dataEntries.partitionKeyLength) throw new Error(`Not enough partition keys (${dataEntries.partitionKeyLength}) for requested split axes (max index ${maxSplitIdx}) in column ${snapshot.spec.name}`);
|
|
38
|
-
const axesLabels = splitAxisIdxs.map((idx) => opts?.axisLabels?.(getAxisId(snapshot.spec.axesSpec[idx])));
|
|
34
|
+
for (const inner of inputs) {
|
|
35
|
+
const data = getLeafColumnData(inner);
|
|
36
|
+
if (!(data instanceof TreeNodeAccessor) && !isDataInfoEntries(data)) return;
|
|
37
|
+
const uniqueKeys = getUniquePartitionKeys(data);
|
|
38
|
+
if (uniqueKeys === void 0) return void 0;
|
|
39
|
+
if (maxSplitIdx >= uniqueKeys.length) throw new Error(`Not enough partition keys (${uniqueKeys.length}) for requested split axes (max index ${maxSplitIdx}) in column ${inner.getSpec().name}`);
|
|
40
|
+
const spec = inner.getSpec();
|
|
41
|
+
const axesSpec = spec.axesSpec;
|
|
42
|
+
const splitAxisSpecs = splitAxisIdxs.map((idx) => axesSpec[idx]);
|
|
43
|
+
const splitAxisIds = splitAxisSpecs.map((axisSpec) => getAxisId(axisSpec));
|
|
44
|
+
const axesLabels = splitAxisIds.map((axisId) => opts?.axisValuesLabels?.(axisId));
|
|
45
|
+
const existingTraceRaw = readAnnotation(spec, Annotation.Trace);
|
|
46
|
+
const baseTrace = existingTraceRaw ? JSON.parse(existingTraceRaw) ?? [] : [];
|
|
39
47
|
const keyCombinations = generateKeyCombinations(uniqueKeys, splitAxisIdxs);
|
|
40
48
|
if (keyCombinations.length === 0) continue;
|
|
41
|
-
const newAxesSpec = [...snapshot.spec.axesSpec];
|
|
42
|
-
for (let i = splitAxisIdxs.length - 1; i >= 0; i--) newAxesSpec.splice(splitAxisIdxs[i], 1);
|
|
43
49
|
for (const keyCombo of keyCombinations) {
|
|
44
50
|
const axisFilters = keyCombo.map((value, sAxisIdx) => [splitAxisIdxs[sAxisIdx], value]);
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
51
|
+
const domain = {};
|
|
52
|
+
const traceEntries = [];
|
|
53
|
+
for (let sAxisIdx = 0; sAxisIdx < keyCombo.length; sAxisIdx++) {
|
|
54
|
+
const value = keyCombo[sAxisIdx];
|
|
55
|
+
const axisSpec = splitAxisSpecs[sAxisIdx];
|
|
56
|
+
const axisId = splitAxisIds[sAxisIdx];
|
|
48
57
|
const label = axesLabels[sAxisIdx]?.[value] ?? String(value);
|
|
49
|
-
|
|
58
|
+
domain[axisSpec.name] = String(value);
|
|
59
|
+
traceEntries.push({
|
|
50
60
|
type: `split:${canonicalizeAxisId(axisId)}`,
|
|
51
61
|
label,
|
|
52
62
|
importance: 1e6
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
const
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
annotations: {
|
|
60
|
-
...snapshot.spec.annotations,
|
|
61
|
-
"pl7.app/trace": JSON.stringify(traceEntries)
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
result.push({
|
|
65
|
-
id: snapshot.id,
|
|
66
|
-
spec: adjustedSpec,
|
|
67
|
-
dataStatus: "ready",
|
|
68
|
-
data: createReadyColumnData(() => entriesToDataInfo(filteredData))
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const filtered = ColumnFilteredRecipe.wrap(inner, axisFilters);
|
|
66
|
+
const overrided = ColumnOverriddenRecipe.wrap(filtered, {
|
|
67
|
+
domain,
|
|
68
|
+
annotations: { [Annotation.Trace]: JSON.stringify([...baseTrace, ...traceEntries]) }
|
|
69
69
|
});
|
|
70
|
+
result.push(overrided);
|
|
70
71
|
}
|
|
71
72
|
}
|
|
72
|
-
return
|
|
73
|
-
items: result,
|
|
74
|
-
complete: true
|
|
75
|
-
};
|
|
73
|
+
return result;
|
|
76
74
|
}
|
|
77
|
-
const MAX_KEY_COMBINATIONS = 1e4;
|
|
78
75
|
function generateKeyCombinations(uniqueKeys, splitAxisIdxs) {
|
|
79
76
|
const combinations = [];
|
|
80
77
|
function generate(currentCombo, sAxisIdx) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expand_by_partition.js","names":[],"sources":["../../src/columns/expand_by_partition.ts"],"sourcesContent":["import type {\n AxisFilterByIdx,\n AxisFilterValue,\n AxisId,\n
|
|
1
|
+
{"version":3,"file":"expand_by_partition.js","names":[],"sources":["../../src/columns/expand_by_partition.ts"],"sourcesContent":["import type {\n AxisFilterByIdx,\n AxisFilterValue,\n AxisId,\n TraceEntry,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeAxisId,\n getAxisId,\n isDataInfoEntries,\n readAnnotation,\n} from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport { getUniquePartitionKeys } from \"../render/util/pcolumn_data\";\nimport type { ColumnRecipe } from \"./column_recipes\";\nimport { ColumnFilteredRecipe } from \"./column_recipes/column_filtered_recipe\";\nimport { ColumnOverriddenRecipe } from \"./column_recipes/column_overrided_recipe\";\nimport { Column } from \"./column\";\nimport { getLeafColumnData } from \"./utils\";\n\n// --- Types ---\n\nexport interface SplitAxis {\n /** Index of the axis in the column's axesSpec to split by. */\n readonly idx: number;\n}\n\nexport interface ExpandByPartitionOpts {\n /** Resolve axis values to human-readable labels. */\n axisValuesLabels?: (axisId: AxisId) => undefined | Record<string | number, string>;\n}\n\n// --- Implementation ---\n\nconst MAX_KEY_COMBINATIONS = 10_000;\n\n/**\n * Expand each input column along the requested partition axes into one\n * {@link ColumnRecipe} per Cartesian combination of unique partition values.\n *\n * Each split is produced as `ColumnOverriddenRecipe.wrap(ColumnFilteredRecipe.wrap(inner, axisFilters), { domain, annotations })`:\n * - `ColumnFilteredRecipe` pins all split axes at once (one wrap call with\n * every `[idx, value]` pair) and removes them from `axesSpec`. The\n * engine performs the data slicing via the `sliceAxes` query node.\n * - `ColumnOverriddenRecipe` overlays a `domain[axisName] = String(value)`\n * entry per split axis and appends a `split:<canonicalAxisId>` trace\n * entry per split axis to the existing `pl7.app/trace` annotation.\n *\n * The recipe id is a canonical\n * `ColumnOverriddenId(source: ColumnFilteredId(source: inner.id, axisFilters), specOverrides)`\n * — distinct per split combination, parseable by `extractPObjectId`, and\n * traversable by recipe walkers.\n *\n * Returns `undefined` when any input's `getData()` is not a\n * {@link TreeNodeAccessor} — partition inspection is not yet possible.\n */\nexport function expandByPartition(\n inputs: Column[],\n splitAxes: SplitAxis[],\n opts?: ExpandByPartitionOpts,\n): ColumnRecipe[] | undefined {\n if (splitAxes.length === 0) {\n return [...inputs];\n }\n\n const splitAxisIdxs = splitAxes.map((a) => a.idx).sort((a, b) => a - b);\n const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];\n\n const result: ColumnRecipe[] = [];\n\n for (const inner of inputs) {\n const data = getLeafColumnData(inner);\n // Partition inspection requires either a live tree-accessor or already\n // parsed DataInfoEntries. Anything else means the input is not yet ready.\n if (!(data instanceof TreeNodeAccessor) && !isDataInfoEntries(data)) {\n return undefined;\n }\n\n const uniqueKeys = getUniquePartitionKeys(data);\n if (uniqueKeys === undefined) return undefined;\n\n if (maxSplitIdx >= uniqueKeys.length) {\n throw new Error(\n `Not enough partition keys (${uniqueKeys.length}) for requested split axes (max index ${maxSplitIdx}) in column ${inner.getSpec().name}`,\n );\n }\n\n const spec = inner.getSpec();\n const axesSpec = spec.axesSpec;\n const splitAxisSpecs = splitAxisIdxs.map((idx) => axesSpec[idx]);\n const splitAxisIds = splitAxisSpecs.map((axisSpec) => getAxisId(axisSpec));\n const axesLabels = splitAxisIds.map((axisId) => opts?.axisValuesLabels?.(axisId));\n\n const existingTraceRaw = readAnnotation(spec, Annotation.Trace);\n const baseTrace: TraceEntry[] = existingTraceRaw\n ? ((JSON.parse(existingTraceRaw) as TraceEntry[]) ?? [])\n : [];\n\n const keyCombinations = generateKeyCombinations(uniqueKeys, splitAxisIdxs);\n if (keyCombinations.length === 0) continue;\n\n for (const keyCombo of keyCombinations) {\n const axisFilters: AxisFilterByIdx[] = keyCombo.map(\n (value, sAxisIdx): AxisFilterByIdx => [splitAxisIdxs[sAxisIdx], value as AxisFilterValue],\n );\n\n const domain: Record<string, string> = {};\n const traceEntries: TraceEntry[] = [];\n for (let sAxisIdx = 0; sAxisIdx < keyCombo.length; sAxisIdx++) {\n const value = keyCombo[sAxisIdx];\n const axisSpec = splitAxisSpecs[sAxisIdx];\n const axisId = splitAxisIds[sAxisIdx];\n const labelMap = axesLabels[sAxisIdx];\n const label = labelMap?.[value] ?? String(value);\n domain[axisSpec.name] = String(value);\n traceEntries.push({\n type: `split:${canonicalizeAxisId(axisId)}`,\n label,\n importance: 1_000_000,\n });\n }\n\n const filtered = ColumnFilteredRecipe.wrap(inner, axisFilters);\n const overrided = ColumnOverriddenRecipe.wrap(filtered, {\n domain,\n annotations: {\n [Annotation.Trace]: JSON.stringify([...baseTrace, ...traceEntries]),\n },\n });\n\n result.push(overrided);\n }\n }\n\n return result;\n}\n\nfunction generateKeyCombinations(\n uniqueKeys: (string | number)[][],\n splitAxisIdxs: number[],\n): (string | number)[][] {\n const combinations: (string | number)[][] = [];\n\n function generate(currentCombo: (string | number)[], sAxisIdx: number): void {\n if (sAxisIdx >= splitAxisIdxs.length) {\n combinations.push([...currentCombo]);\n if (combinations.length > MAX_KEY_COMBINATIONS) {\n throw new Error(\"Too many key combinations, aborting.\");\n }\n return;\n }\n\n const axisIdx = splitAxisIdxs[sAxisIdx];\n if (axisIdx >= uniqueKeys.length) {\n throw new Error(\n `Axis index ${axisIdx} out of bounds for unique keys array (length ${uniqueKeys.length})`,\n );\n }\n\n const axisValues = uniqueKeys[axisIdx];\n if (!axisValues || axisValues.length === 0) {\n combinations.length = 0;\n return;\n }\n\n for (const val of axisValues) {\n currentCombo.push(val);\n generate(currentCombo, sAxisIdx + 1);\n currentCombo.pop();\n }\n }\n\n generate([], 0);\n return combinations;\n}\n"],"mappings":";;;;;;;AAmCA,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;AAsB7B,SAAgB,kBACd,QACA,WACA,MAC4B;CAC5B,IAAI,UAAU,WAAW,GACvB,OAAO,CAAC,GAAG,MAAM;CAGnB,MAAM,gBAAgB,UAAU,KAAK,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC;CACtE,MAAM,cAAc,cAAc,cAAc,SAAS;CAEzD,MAAM,SAAyB,CAAC;CAEhC,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,OAAO,kBAAkB,KAAK;EAGpC,IAAI,EAAE,gBAAgB,qBAAqB,CAAC,kBAAkB,IAAI,GAChE;EAGF,MAAM,aAAa,uBAAuB,IAAI;EAC9C,IAAI,eAAe,KAAA,GAAW,OAAO,KAAA;EAErC,IAAI,eAAe,WAAW,QAC5B,MAAM,IAAI,MACR,8BAA8B,WAAW,OAAO,wCAAwC,YAAY,cAAc,MAAM,QAAQ,CAAC,CAAC,MACpI;EAGF,MAAM,OAAO,MAAM,QAAQ;EAC3B,MAAM,WAAW,KAAK;EACtB,MAAM,iBAAiB,cAAc,KAAK,QAAQ,SAAS,IAAI;EAC/D,MAAM,eAAe,eAAe,KAAK,aAAa,UAAU,QAAQ,CAAC;EACzE,MAAM,aAAa,aAAa,KAAK,WAAW,MAAM,mBAAmB,MAAM,CAAC;EAEhF,MAAM,mBAAmB,eAAe,MAAM,WAAW,KAAK;EAC9D,MAAM,YAA0B,mBAC1B,KAAK,MAAM,gBAAgB,KAAsB,CAAC,IACpD,CAAC;EAEL,MAAM,kBAAkB,wBAAwB,YAAY,aAAa;EACzE,IAAI,gBAAgB,WAAW,GAAG;EAElC,KAAK,MAAM,YAAY,iBAAiB;GACtC,MAAM,cAAiC,SAAS,KAC7C,OAAO,aAA8B,CAAC,cAAc,WAAW,KAAwB,CAC1F;GAEA,MAAM,SAAiC,CAAC;GACxC,MAAM,eAA6B,CAAC;GACpC,KAAK,IAAI,WAAW,GAAG,WAAW,SAAS,QAAQ,YAAY;IAC7D,MAAM,QAAQ,SAAS;IACvB,MAAM,WAAW,eAAe;IAChC,MAAM,SAAS,aAAa;IAE5B,MAAM,QADW,WAAW,SACN,GAAG,UAAU,OAAO,KAAK;IAC/C,OAAO,SAAS,QAAQ,OAAO,KAAK;IACpC,aAAa,KAAK;KAChB,MAAM,SAAS,mBAAmB,MAAM;KACxC;KACA,YAAY;IACd,CAAC;GACH;GAEA,MAAM,WAAW,qBAAqB,KAAK,OAAO,WAAW;GAC7D,MAAM,YAAY,uBAAuB,KAAK,UAAU;IACtD;IACA,aAAa,GACV,WAAW,QAAQ,KAAK,UAAU,CAAC,GAAG,WAAW,GAAG,YAAY,CAAC,EACpE;GACF,CAAC;GAED,OAAO,KAAK,SAAS;EACvB;CACF;CAEA,OAAO;AACT;AAEA,SAAS,wBACP,YACA,eACuB;CACvB,MAAM,eAAsC,CAAC;CAE7C,SAAS,SAAS,cAAmC,UAAwB;EAC3E,IAAI,YAAY,cAAc,QAAQ;GACpC,aAAa,KAAK,CAAC,GAAG,YAAY,CAAC;GACnC,IAAI,aAAa,SAAS,sBACxB,MAAM,IAAI,MAAM,sCAAsC;GAExD;EACF;EAEA,MAAM,UAAU,cAAc;EAC9B,IAAI,WAAW,WAAW,QACxB,MAAM,IAAI,MACR,cAAc,QAAQ,+CAA+C,WAAW,OAAO,EACzF;EAGF,MAAM,aAAa,WAAW;EAC9B,IAAI,CAAC,cAAc,WAAW,WAAW,GAAG;GAC1C,aAAa,SAAS;GACtB;EACF;EAEA,KAAK,MAAM,OAAO,YAAY;GAC5B,aAAa,KAAK,GAAG;GACrB,SAAS,cAAc,WAAW,CAAC;GACnC,aAAa,IAAI;EACnB;CACF;CAEA,SAAS,CAAC,GAAG,CAAC;CACd,OAAO;AACT"}
|
package/dist/columns/index.cjs
CHANGED
|
@@ -1,20 +1,46 @@
|
|
|
1
|
-
const
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const
|
|
1
|
+
const require_column = require("./column.cjs");
|
|
2
|
+
const require_column_discovered_recipe = require("./column_recipes/column_discovered_recipe.cjs");
|
|
3
|
+
const require_column_filtered_recipe = require("./column_recipes/column_filtered_recipe.cjs");
|
|
4
|
+
const require_index = require("./column_recipes/index.cjs");
|
|
5
|
+
const require_column_overrided_recipe = require("./column_recipes/column_overrided_recipe.cjs");
|
|
6
|
+
const require_column_lazy = require("./column_lazy.cjs");
|
|
7
|
+
const require_providers = require("./column_providers/providers.cjs");
|
|
8
|
+
const require_index$1 = require("./column_providers/index.cjs");
|
|
9
|
+
const require_columns_collection = require("./columns_collection.cjs");
|
|
10
|
+
const require_utils = require("./utils.cjs");
|
|
6
11
|
const require_expand_by_partition = require("./expand_by_partition.cjs");
|
|
7
|
-
|
|
8
|
-
exports.
|
|
9
|
-
exports.
|
|
10
|
-
exports.
|
|
11
|
-
exports.
|
|
12
|
-
exports.
|
|
13
|
-
exports.
|
|
14
|
-
exports.
|
|
15
|
-
exports.
|
|
16
|
-
exports.
|
|
17
|
-
exports.
|
|
12
|
+
const require_derive_axis_values_labels = require("./derive_axis_values_labels.cjs");
|
|
13
|
+
exports.AccessorColumnsProvider = require_providers.AccessorColumnsProvider;
|
|
14
|
+
exports.AccessorColumnsProviderImpl = require_providers.AccessorColumnsProviderImpl;
|
|
15
|
+
exports.ArrayColumnsProvider = require_providers.ArrayColumnsProvider;
|
|
16
|
+
exports.Column = require_column.Column;
|
|
17
|
+
exports.ColumnAbsentError = require_column_lazy.ColumnAbsentError;
|
|
18
|
+
exports.ColumnDiscoveredRecipe = require_column_discovered_recipe.ColumnDiscoveredRecipe;
|
|
19
|
+
exports.ColumnFilteredRecipe = require_column_filtered_recipe.ColumnFilteredRecipe;
|
|
20
|
+
exports.ColumnLazy = require_column_lazy.ColumnLazy;
|
|
21
|
+
exports.ColumnLazyImpl = require_column_lazy.ColumnLazyImpl;
|
|
22
|
+
exports.ColumnOverriddenRecipe = require_column_overrided_recipe.ColumnOverriddenRecipe;
|
|
23
|
+
exports.ColumnRecipe = require_index.ColumnRecipe;
|
|
24
|
+
exports.ColumnsCollection = require_columns_collection.ColumnsCollection;
|
|
25
|
+
exports.ColumnsCollectionImpl = require_columns_collection.ColumnsCollectionImpl;
|
|
26
|
+
exports.ColumnsProvider = require_providers.ColumnsProvider;
|
|
27
|
+
exports.ResultPoolColumnsProvider = require_providers.ResultPoolColumnsProvider;
|
|
28
|
+
exports.ResultPoolColumnsProviderImpl = require_providers.ResultPoolColumnsProviderImpl;
|
|
29
|
+
exports._ctxProvidersCache = require_index$1._ctxProvidersCache;
|
|
30
|
+
exports.collectLinkerColumns = require_utils.collectLinkerColumns;
|
|
31
|
+
exports.collectLinkerIds = require_utils.collectLinkerIds;
|
|
32
|
+
exports.deriveAxisValuesLabels = require_derive_axis_values_labels.deriveAxisValuesLabels;
|
|
33
|
+
exports.deriveColumnOptions = require_utils.deriveColumnOptions;
|
|
18
34
|
exports.expandByPartition = require_expand_by_partition.expandByPartition;
|
|
19
|
-
exports.
|
|
20
|
-
exports.
|
|
35
|
+
exports.getCtxProviders = require_index$1.getCtxProviders;
|
|
36
|
+
exports.getLeafColumnData = require_utils.getLeafColumnData;
|
|
37
|
+
exports.hasColumnData = require_utils.hasColumnData;
|
|
38
|
+
exports.hitQualifications = require_utils.hitQualifications;
|
|
39
|
+
exports.isColumn = require_column.isColumn;
|
|
40
|
+
exports.isColumnLazy = require_column_lazy.isColumnLazy;
|
|
41
|
+
exports.isColumnProvider = require_index$1.isColumnProvider;
|
|
42
|
+
exports.isColumnRecipe = require_index.isColumnRecipe;
|
|
43
|
+
exports.isColumnsCollection = require_columns_collection.isColumnsCollection;
|
|
44
|
+
exports.isLeafColumn = require_utils.isLeafColumn;
|
|
45
|
+
exports.queriesQualifications = require_utils.queriesQualifications;
|
|
46
|
+
exports.toColumnProvider = require_index$1.toColumnProvider;
|