@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
package/dist/package.cjs
CHANGED
package/dist/package.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axes.cjs","names":["LinkerMap","getColumnIdAndSpec","getAxisId","Annotation"],"sources":["../../src/pframe_utils/axes.ts"],"sourcesContent":["/**\n * Axes utilities for PFrame graph operations.\n *\n * Extracted from PFrameForGraphs to break circular dependency\n * between PFrameForGraphs and columns modules.\n *\n * @module pframe_utils/axes\n */\n\nimport type {\n AxisId,\n AxisSpecNormalized,\n CanonicalizedJson,\n PColumn,\n PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n LinkerMap,\n matchAxisId,\n readAnnotation,\n stringifyJson,\n} from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal } from \"../render\";\n\nexport type AxesVault = Map<CanonicalizedJson<AxisId>, AxisSpecNormalized>;\n\n/** Create id for column copy with added keys in axes domains */\nconst colId = (\n id: PObjectId,\n domains: (Record<string, string> | undefined)[],\n contextDomains: (Record<string, string> | undefined)[],\n) => {\n let wid = id.toString();\n domains?.forEach((domain) => {\n if (domain) {\n for (const [k, v] of Object.entries(domain)) {\n wid += k;\n wid += v;\n }\n }\n });\n contextDomains?.forEach((contextDomain) => {\n if (contextDomain) {\n for (const [k, v] of Object.entries(contextDomain)) {\n wid += k;\n wid += v;\n }\n }\n });\n return wid;\n};\n\n/** All combinations with 1 key from each list */\nfunction getKeysCombinations(idsLists: AxisId[][]) {\n if (!idsLists.length) {\n return [];\n }\n let result: AxisId[][] = [[]];\n idsLists.forEach((list) => {\n const nextResult: AxisId[][] = [];\n list.forEach((key) => {\n nextResult.push(...result.map((resultItem) => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\n\nexport function getAvailableWithLinkersAxes(\n linkerColumns: PColumn<PColumnDataUniversal>[],\n blockAxes: AxesVault,\n): AxesVault {\n const linkerMap = LinkerMap.fromColumns(linkerColumns.map(getColumnIdAndSpec));\n const availableAxes = linkerMap.getReachableByLinkersAxesFromAxesNormalized(\n [...blockAxes.values()],\n (linkerKeyId, sourceAxisId) => matchAxisId(sourceAxisId, linkerKeyId),\n );\n\n return new Map(\n availableAxes.map((axisSpec) => {\n const id = getAxisId(axisSpec);\n return [canonicalizeJson(id), axisSpec];\n }),\n );\n}\n\n/** Add columns with fully compatible axes created from partial compatible ones */\nexport function enrichCompatible<T extends Omit<PColumn<PColumnDataUniversal>, \"data\">>(\n blockAxes: AxesVault,\n columns: T[],\n): T[] {\n return columns.flatMap((column) => getAdditionalColumnsForColumn(blockAxes, column));\n}\n\nfunction getAdditionalColumnsForColumn<T extends Omit<PColumn<PColumnDataUniversal>, \"data\">>(\n blockAxes: AxesVault,\n column: T,\n): T[] {\n const columnAxesIds = column.spec.axesSpec.map(getAxisId);\n\n if (columnAxesIds.every((id) => blockAxes.has(canonicalizeJson(id)))) {\n return [column]; // the column is compatible with its own domains without modifications\n }\n\n // options with different possible domains for every axis of secondary column\n const secondaryIdsOptions = columnAxesIds.map((id) => {\n const result = [];\n for (const [_, mainId] of blockAxes) {\n if (matchAxisId(mainId, id) && !matchAxisId(id, mainId)) {\n result.push(mainId);\n }\n }\n return result;\n });\n // all possible combinations of axes with added domains\n const secondaryIdsVariants = getKeysCombinations(secondaryIdsOptions);\n\n // sets of added to column domain fields\n const allAddedDomainValues = new Set<string>();\n const addedNotToAllVariantsDomainValues = new Set<string>();\n const addedByVariantsDomainValues = secondaryIdsVariants.map((idsList) => {\n const addedSet = new Set<string>();\n idsList.map((axisId, idx) => {\n const d1 = column.spec.axesSpec[idx].domain;\n const d2 = axisId.domain;\n Object.entries(d2 ?? {}).forEach(([key, value]) => {\n if (d1?.[key] === undefined) {\n const item = JSON.stringify([key, value]);\n addedSet.add(item);\n allAddedDomainValues.add(item);\n }\n });\n const cd1 = column.spec.axesSpec[idx].contextDomain;\n const cd2 = axisId.contextDomain;\n Object.entries(cd2 ?? {}).forEach(([key, value]) => {\n if (cd1?.[key] === undefined) {\n const item = JSON.stringify([\"ctx:\" + key, value]);\n addedSet.add(item);\n allAddedDomainValues.add(item);\n }\n });\n return {\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n };\n });\n return addedSet;\n });\n [...allAddedDomainValues].forEach((addedPart) => {\n if (addedByVariantsDomainValues.some((s) => !s.has(addedPart))) {\n addedNotToAllVariantsDomainValues.add(addedPart);\n }\n });\n\n const additionalColumns = secondaryIdsVariants.map((idsList, idx) => {\n const id = colId(\n column.id,\n idsList.map((id) => id.domain),\n idsList.map((id) => id.contextDomain),\n );\n\n const label = readAnnotation(column.spec, Annotation.Label) ?? \"\";\n const labelDomainPart = [...addedByVariantsDomainValues[idx]]\n .filter((str) => addedNotToAllVariantsDomainValues.has(str))\n .sort()\n .map((v) => JSON.parse(v)?.[1]) // use in labels only domain values, but sort them by key to save the same order in all column variants\n .join(\" / \");\n\n const annotations: Annotation = {\n ...column.spec.annotations,\n [Annotation.Graph.IsVirtual]: stringifyJson(true),\n };\n if (label || labelDomainPart) {\n annotations[Annotation.Label] =\n label && labelDomainPart ? label + \" / \" + labelDomainPart : label + labelDomainPart;\n }\n\n return {\n ...column,\n id: id as PObjectId,\n spec: {\n ...column.spec,\n axesSpec: idsList.map((axisId, idx) => ({\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n })),\n annotations,\n },\n };\n });\n\n return [column, ...additionalColumns];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"axes.cjs","names":["LinkerMap","getColumnIdAndSpec","getAxisId","Annotation"],"sources":["../../src/pframe_utils/axes.ts"],"sourcesContent":["/**\n * Axes utilities for PFrame graph operations.\n *\n * Extracted from PFrameForGraphs to break circular dependency\n * between PFrameForGraphs and columns modules.\n *\n * @module pframe_utils/axes\n */\n\nimport type {\n AxisId,\n AxisSpecNormalized,\n CanonicalizedJson,\n PColumn,\n PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n LinkerMap,\n matchAxisId,\n readAnnotation,\n stringifyJson,\n} from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal } from \"../render\";\n\nexport type AxesVault = Map<CanonicalizedJson<AxisId>, AxisSpecNormalized>;\n\n/** Create id for column copy with added keys in axes domains */\nconst colId = (\n id: PObjectId,\n domains: (Record<string, string> | undefined)[],\n contextDomains: (Record<string, string> | undefined)[],\n) => {\n let wid = id.toString();\n domains?.forEach((domain) => {\n if (domain) {\n for (const [k, v] of Object.entries(domain)) {\n wid += k;\n wid += v;\n }\n }\n });\n contextDomains?.forEach((contextDomain) => {\n if (contextDomain) {\n for (const [k, v] of Object.entries(contextDomain)) {\n wid += k;\n wid += v;\n }\n }\n });\n return wid;\n};\n\n/** All combinations with 1 key from each list */\nfunction getKeysCombinations(idsLists: AxisId[][]) {\n if (!idsLists.length) {\n return [];\n }\n let result: AxisId[][] = [[]];\n idsLists.forEach((list) => {\n const nextResult: AxisId[][] = [];\n list.forEach((key) => {\n nextResult.push(...result.map((resultItem) => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\n\nexport function getAvailableWithLinkersAxes(\n linkerColumns: PColumn<undefined | PColumnDataUniversal>[],\n blockAxes: AxesVault,\n): AxesVault {\n const linkerMap = LinkerMap.fromColumns(linkerColumns.map(getColumnIdAndSpec));\n const availableAxes = linkerMap.getReachableByLinkersAxesFromAxesNormalized(\n [...blockAxes.values()],\n (linkerKeyId, sourceAxisId) => matchAxisId(sourceAxisId, linkerKeyId),\n );\n\n return new Map(\n availableAxes.map((axisSpec) => {\n const id = getAxisId(axisSpec);\n return [canonicalizeJson(id), axisSpec];\n }),\n );\n}\n\n/** Add columns with fully compatible axes created from partial compatible ones */\nexport function enrichCompatible<T extends Omit<PColumn<undefined | PColumnDataUniversal>, \"data\">>(\n blockAxes: AxesVault,\n columns: T[],\n): T[] {\n return columns.flatMap((column) => getAdditionalColumnsForColumn(blockAxes, column));\n}\n\nfunction getAdditionalColumnsForColumn<T extends Omit<PColumn<PColumnDataUniversal>, \"data\">>(\n blockAxes: AxesVault,\n column: T,\n): T[] {\n const columnAxesIds = column.spec.axesSpec.map(getAxisId);\n\n if (columnAxesIds.every((id) => blockAxes.has(canonicalizeJson(id)))) {\n return [column]; // the column is compatible with its own domains without modifications\n }\n\n // options with different possible domains for every axis of secondary column\n const secondaryIdsOptions = columnAxesIds.map((id) => {\n const result = [];\n for (const [_, mainId] of blockAxes) {\n if (matchAxisId(mainId, id) && !matchAxisId(id, mainId)) {\n result.push(mainId);\n }\n }\n return result;\n });\n // all possible combinations of axes with added domains\n const secondaryIdsVariants = getKeysCombinations(secondaryIdsOptions);\n\n // sets of added to column domain fields\n const allAddedDomainValues = new Set<string>();\n const addedNotToAllVariantsDomainValues = new Set<string>();\n const addedByVariantsDomainValues = secondaryIdsVariants.map((idsList) => {\n const addedSet = new Set<string>();\n idsList.map((axisId, idx) => {\n const d1 = column.spec.axesSpec[idx].domain;\n const d2 = axisId.domain;\n Object.entries(d2 ?? {}).forEach(([key, value]) => {\n if (d1?.[key] === undefined) {\n const item = JSON.stringify([key, value]);\n addedSet.add(item);\n allAddedDomainValues.add(item);\n }\n });\n const cd1 = column.spec.axesSpec[idx].contextDomain;\n const cd2 = axisId.contextDomain;\n Object.entries(cd2 ?? {}).forEach(([key, value]) => {\n if (cd1?.[key] === undefined) {\n const item = JSON.stringify([\"ctx:\" + key, value]);\n addedSet.add(item);\n allAddedDomainValues.add(item);\n }\n });\n return {\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n };\n });\n return addedSet;\n });\n [...allAddedDomainValues].forEach((addedPart) => {\n if (addedByVariantsDomainValues.some((s) => !s.has(addedPart))) {\n addedNotToAllVariantsDomainValues.add(addedPart);\n }\n });\n\n const additionalColumns = secondaryIdsVariants.map((idsList, idx) => {\n const id = colId(\n column.id,\n idsList.map((id) => id.domain),\n idsList.map((id) => id.contextDomain),\n );\n\n const label = readAnnotation(column.spec, Annotation.Label) ?? \"\";\n const labelDomainPart = [...addedByVariantsDomainValues[idx]]\n .filter((str) => addedNotToAllVariantsDomainValues.has(str))\n .sort()\n .map((v) => JSON.parse(v)?.[1]) // use in labels only domain values, but sort them by key to save the same order in all column variants\n .join(\" / \");\n\n const annotations: Annotation = {\n ...column.spec.annotations,\n [Annotation.Graph.IsVirtual]: stringifyJson(true),\n };\n if (label || labelDomainPart) {\n annotations[Annotation.Label] =\n label && labelDomainPart ? label + \" / \" + labelDomainPart : label + labelDomainPart;\n }\n\n return {\n ...column,\n id: id as PObjectId,\n spec: {\n ...column.spec,\n axesSpec: idsList.map((axisId, idx) => ({\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n })),\n annotations,\n },\n };\n });\n\n return [column, ...additionalColumns];\n}\n"],"mappings":"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"}
|
|
@@ -3,9 +3,9 @@ import { AxisId, AxisSpecNormalized, CanonicalizedJson, PColumn } from "@milabor
|
|
|
3
3
|
|
|
4
4
|
//#region src/pframe_utils/axes.d.ts
|
|
5
5
|
type AxesVault = Map<CanonicalizedJson<AxisId>, AxisSpecNormalized>;
|
|
6
|
-
declare function getAvailableWithLinkersAxes(linkerColumns: PColumn<PColumnDataUniversal>[], blockAxes: AxesVault): AxesVault;
|
|
6
|
+
declare function getAvailableWithLinkersAxes(linkerColumns: PColumn<undefined | PColumnDataUniversal>[], blockAxes: AxesVault): AxesVault;
|
|
7
7
|
/** Add columns with fully compatible axes created from partial compatible ones */
|
|
8
|
-
declare function enrichCompatible<T extends Omit<PColumn<PColumnDataUniversal>, "data">>(blockAxes: AxesVault, columns: T[]): T[];
|
|
8
|
+
declare function enrichCompatible<T extends Omit<PColumn<undefined | PColumnDataUniversal>, "data">>(blockAxes: AxesVault, columns: T[]): T[];
|
|
9
9
|
//#endregion
|
|
10
10
|
export { AxesVault, enrichCompatible, getAvailableWithLinkersAxes };
|
|
11
11
|
//# sourceMappingURL=axes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axes.d.ts","names":[],"sources":["../../src/pframe_utils/axes.ts"],"mappings":";;;;KA4BY,SAAA,GAAY,GAAA,CAAI,iBAAA,CAAkB,MAAA,GAAS,kBAAA;AAAA,iBA4CvC,2BAAA,CACd,aAAA,EAAe,OAAA,
|
|
1
|
+
{"version":3,"file":"axes.d.ts","names":[],"sources":["../../src/pframe_utils/axes.ts"],"mappings":";;;;KA4BY,SAAA,GAAY,GAAA,CAAI,iBAAA,CAAkB,MAAA,GAAS,kBAAA;AAAA,iBA4CvC,2BAAA,CACd,aAAA,EAAe,OAAA,aAAoB,oBAAA,KACnC,SAAA,EAAW,SAAA,GACV,SAAA;;iBAgBa,gBAAA,WAA2B,IAAA,CAAK,OAAA,aAAoB,oBAAA,YAClE,SAAA,EAAW,SAAA,EACX,OAAA,EAAS,CAAA,KACR,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axes.js","names":[],"sources":["../../src/pframe_utils/axes.ts"],"sourcesContent":["/**\n * Axes utilities for PFrame graph operations.\n *\n * Extracted from PFrameForGraphs to break circular dependency\n * between PFrameForGraphs and columns modules.\n *\n * @module pframe_utils/axes\n */\n\nimport type {\n AxisId,\n AxisSpecNormalized,\n CanonicalizedJson,\n PColumn,\n PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n LinkerMap,\n matchAxisId,\n readAnnotation,\n stringifyJson,\n} from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal } from \"../render\";\n\nexport type AxesVault = Map<CanonicalizedJson<AxisId>, AxisSpecNormalized>;\n\n/** Create id for column copy with added keys in axes domains */\nconst colId = (\n id: PObjectId,\n domains: (Record<string, string> | undefined)[],\n contextDomains: (Record<string, string> | undefined)[],\n) => {\n let wid = id.toString();\n domains?.forEach((domain) => {\n if (domain) {\n for (const [k, v] of Object.entries(domain)) {\n wid += k;\n wid += v;\n }\n }\n });\n contextDomains?.forEach((contextDomain) => {\n if (contextDomain) {\n for (const [k, v] of Object.entries(contextDomain)) {\n wid += k;\n wid += v;\n }\n }\n });\n return wid;\n};\n\n/** All combinations with 1 key from each list */\nfunction getKeysCombinations(idsLists: AxisId[][]) {\n if (!idsLists.length) {\n return [];\n }\n let result: AxisId[][] = [[]];\n idsLists.forEach((list) => {\n const nextResult: AxisId[][] = [];\n list.forEach((key) => {\n nextResult.push(...result.map((resultItem) => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\n\nexport function getAvailableWithLinkersAxes(\n linkerColumns: PColumn<PColumnDataUniversal>[],\n blockAxes: AxesVault,\n): AxesVault {\n const linkerMap = LinkerMap.fromColumns(linkerColumns.map(getColumnIdAndSpec));\n const availableAxes = linkerMap.getReachableByLinkersAxesFromAxesNormalized(\n [...blockAxes.values()],\n (linkerKeyId, sourceAxisId) => matchAxisId(sourceAxisId, linkerKeyId),\n );\n\n return new Map(\n availableAxes.map((axisSpec) => {\n const id = getAxisId(axisSpec);\n return [canonicalizeJson(id), axisSpec];\n }),\n );\n}\n\n/** Add columns with fully compatible axes created from partial compatible ones */\nexport function enrichCompatible<T extends Omit<PColumn<PColumnDataUniversal>, \"data\">>(\n blockAxes: AxesVault,\n columns: T[],\n): T[] {\n return columns.flatMap((column) => getAdditionalColumnsForColumn(blockAxes, column));\n}\n\nfunction getAdditionalColumnsForColumn<T extends Omit<PColumn<PColumnDataUniversal>, \"data\">>(\n blockAxes: AxesVault,\n column: T,\n): T[] {\n const columnAxesIds = column.spec.axesSpec.map(getAxisId);\n\n if (columnAxesIds.every((id) => blockAxes.has(canonicalizeJson(id)))) {\n return [column]; // the column is compatible with its own domains without modifications\n }\n\n // options with different possible domains for every axis of secondary column\n const secondaryIdsOptions = columnAxesIds.map((id) => {\n const result = [];\n for (const [_, mainId] of blockAxes) {\n if (matchAxisId(mainId, id) && !matchAxisId(id, mainId)) {\n result.push(mainId);\n }\n }\n return result;\n });\n // all possible combinations of axes with added domains\n const secondaryIdsVariants = getKeysCombinations(secondaryIdsOptions);\n\n // sets of added to column domain fields\n const allAddedDomainValues = new Set<string>();\n const addedNotToAllVariantsDomainValues = new Set<string>();\n const addedByVariantsDomainValues = secondaryIdsVariants.map((idsList) => {\n const addedSet = new Set<string>();\n idsList.map((axisId, idx) => {\n const d1 = column.spec.axesSpec[idx].domain;\n const d2 = axisId.domain;\n Object.entries(d2 ?? {}).forEach(([key, value]) => {\n if (d1?.[key] === undefined) {\n const item = JSON.stringify([key, value]);\n addedSet.add(item);\n allAddedDomainValues.add(item);\n }\n });\n const cd1 = column.spec.axesSpec[idx].contextDomain;\n const cd2 = axisId.contextDomain;\n Object.entries(cd2 ?? {}).forEach(([key, value]) => {\n if (cd1?.[key] === undefined) {\n const item = JSON.stringify([\"ctx:\" + key, value]);\n addedSet.add(item);\n allAddedDomainValues.add(item);\n }\n });\n return {\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n };\n });\n return addedSet;\n });\n [...allAddedDomainValues].forEach((addedPart) => {\n if (addedByVariantsDomainValues.some((s) => !s.has(addedPart))) {\n addedNotToAllVariantsDomainValues.add(addedPart);\n }\n });\n\n const additionalColumns = secondaryIdsVariants.map((idsList, idx) => {\n const id = colId(\n column.id,\n idsList.map((id) => id.domain),\n idsList.map((id) => id.contextDomain),\n );\n\n const label = readAnnotation(column.spec, Annotation.Label) ?? \"\";\n const labelDomainPart = [...addedByVariantsDomainValues[idx]]\n .filter((str) => addedNotToAllVariantsDomainValues.has(str))\n .sort()\n .map((v) => JSON.parse(v)?.[1]) // use in labels only domain values, but sort them by key to save the same order in all column variants\n .join(\" / \");\n\n const annotations: Annotation = {\n ...column.spec.annotations,\n [Annotation.Graph.IsVirtual]: stringifyJson(true),\n };\n if (label || labelDomainPart) {\n annotations[Annotation.Label] =\n label && labelDomainPart ? label + \" / \" + labelDomainPart : label + labelDomainPart;\n }\n\n return {\n ...column,\n id: id as PObjectId,\n spec: {\n ...column.spec,\n axesSpec: idsList.map((axisId, idx) => ({\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n })),\n annotations,\n },\n };\n });\n\n return [column, ...additionalColumns];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"axes.js","names":[],"sources":["../../src/pframe_utils/axes.ts"],"sourcesContent":["/**\n * Axes utilities for PFrame graph operations.\n *\n * Extracted from PFrameForGraphs to break circular dependency\n * between PFrameForGraphs and columns modules.\n *\n * @module pframe_utils/axes\n */\n\nimport type {\n AxisId,\n AxisSpecNormalized,\n CanonicalizedJson,\n PColumn,\n PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n LinkerMap,\n matchAxisId,\n readAnnotation,\n stringifyJson,\n} from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal } from \"../render\";\n\nexport type AxesVault = Map<CanonicalizedJson<AxisId>, AxisSpecNormalized>;\n\n/** Create id for column copy with added keys in axes domains */\nconst colId = (\n id: PObjectId,\n domains: (Record<string, string> | undefined)[],\n contextDomains: (Record<string, string> | undefined)[],\n) => {\n let wid = id.toString();\n domains?.forEach((domain) => {\n if (domain) {\n for (const [k, v] of Object.entries(domain)) {\n wid += k;\n wid += v;\n }\n }\n });\n contextDomains?.forEach((contextDomain) => {\n if (contextDomain) {\n for (const [k, v] of Object.entries(contextDomain)) {\n wid += k;\n wid += v;\n }\n }\n });\n return wid;\n};\n\n/** All combinations with 1 key from each list */\nfunction getKeysCombinations(idsLists: AxisId[][]) {\n if (!idsLists.length) {\n return [];\n }\n let result: AxisId[][] = [[]];\n idsLists.forEach((list) => {\n const nextResult: AxisId[][] = [];\n list.forEach((key) => {\n nextResult.push(...result.map((resultItem) => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\n\nexport function getAvailableWithLinkersAxes(\n linkerColumns: PColumn<undefined | PColumnDataUniversal>[],\n blockAxes: AxesVault,\n): AxesVault {\n const linkerMap = LinkerMap.fromColumns(linkerColumns.map(getColumnIdAndSpec));\n const availableAxes = linkerMap.getReachableByLinkersAxesFromAxesNormalized(\n [...blockAxes.values()],\n (linkerKeyId, sourceAxisId) => matchAxisId(sourceAxisId, linkerKeyId),\n );\n\n return new Map(\n availableAxes.map((axisSpec) => {\n const id = getAxisId(axisSpec);\n return [canonicalizeJson(id), axisSpec];\n }),\n );\n}\n\n/** Add columns with fully compatible axes created from partial compatible ones */\nexport function enrichCompatible<T extends Omit<PColumn<undefined | PColumnDataUniversal>, \"data\">>(\n blockAxes: AxesVault,\n columns: T[],\n): T[] {\n return columns.flatMap((column) => getAdditionalColumnsForColumn(blockAxes, column));\n}\n\nfunction getAdditionalColumnsForColumn<T extends Omit<PColumn<PColumnDataUniversal>, \"data\">>(\n blockAxes: AxesVault,\n column: T,\n): T[] {\n const columnAxesIds = column.spec.axesSpec.map(getAxisId);\n\n if (columnAxesIds.every((id) => blockAxes.has(canonicalizeJson(id)))) {\n return [column]; // the column is compatible with its own domains without modifications\n }\n\n // options with different possible domains for every axis of secondary column\n const secondaryIdsOptions = columnAxesIds.map((id) => {\n const result = [];\n for (const [_, mainId] of blockAxes) {\n if (matchAxisId(mainId, id) && !matchAxisId(id, mainId)) {\n result.push(mainId);\n }\n }\n return result;\n });\n // all possible combinations of axes with added domains\n const secondaryIdsVariants = getKeysCombinations(secondaryIdsOptions);\n\n // sets of added to column domain fields\n const allAddedDomainValues = new Set<string>();\n const addedNotToAllVariantsDomainValues = new Set<string>();\n const addedByVariantsDomainValues = secondaryIdsVariants.map((idsList) => {\n const addedSet = new Set<string>();\n idsList.map((axisId, idx) => {\n const d1 = column.spec.axesSpec[idx].domain;\n const d2 = axisId.domain;\n Object.entries(d2 ?? {}).forEach(([key, value]) => {\n if (d1?.[key] === undefined) {\n const item = JSON.stringify([key, value]);\n addedSet.add(item);\n allAddedDomainValues.add(item);\n }\n });\n const cd1 = column.spec.axesSpec[idx].contextDomain;\n const cd2 = axisId.contextDomain;\n Object.entries(cd2 ?? {}).forEach(([key, value]) => {\n if (cd1?.[key] === undefined) {\n const item = JSON.stringify([\"ctx:\" + key, value]);\n addedSet.add(item);\n allAddedDomainValues.add(item);\n }\n });\n return {\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n };\n });\n return addedSet;\n });\n [...allAddedDomainValues].forEach((addedPart) => {\n if (addedByVariantsDomainValues.some((s) => !s.has(addedPart))) {\n addedNotToAllVariantsDomainValues.add(addedPart);\n }\n });\n\n const additionalColumns = secondaryIdsVariants.map((idsList, idx) => {\n const id = colId(\n column.id,\n idsList.map((id) => id.domain),\n idsList.map((id) => id.contextDomain),\n );\n\n const label = readAnnotation(column.spec, Annotation.Label) ?? \"\";\n const labelDomainPart = [...addedByVariantsDomainValues[idx]]\n .filter((str) => addedNotToAllVariantsDomainValues.has(str))\n .sort()\n .map((v) => JSON.parse(v)?.[1]) // use in labels only domain values, but sort them by key to save the same order in all column variants\n .join(\" / \");\n\n const annotations: Annotation = {\n ...column.spec.annotations,\n [Annotation.Graph.IsVirtual]: stringifyJson(true),\n };\n if (label || labelDomainPart) {\n annotations[Annotation.Label] =\n label && labelDomainPart ? label + \" / \" + labelDomainPart : label + labelDomainPart;\n }\n\n return {\n ...column,\n id: id as PObjectId,\n spec: {\n ...column.spec,\n axesSpec: idsList.map((axisId, idx) => ({\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n })),\n annotations,\n },\n };\n });\n\n return [column, ...additionalColumns];\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
const require_column_collection = require("../render/util/column_collection.cjs");
|
|
2
2
|
require("../render/index.cjs");
|
|
3
3
|
const require_axes = require("./axes.cjs");
|
|
4
|
-
const
|
|
5
|
-
const require_ctx_column_sources = require("../columns/ctx_column_sources.cjs");
|
|
4
|
+
const require_columns_collection = require("../columns/columns_collection.cjs");
|
|
6
5
|
require("../columns/index.cjs");
|
|
7
6
|
let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
|
|
8
7
|
//#region src/pframe_utils/columns.ts
|
|
@@ -70,15 +69,12 @@ function discoverIntegrableColumnIds(ctx, rootColumns) {
|
|
|
70
69
|
const anchorSpecs = Array.from(new Map(rootColumns.map((c) => [(0, _milaboratories_pl_model_common.canonicalizeJson)(c.spec), c.spec])).values());
|
|
71
70
|
if (anchorSpecs.length === 0) return void 0;
|
|
72
71
|
try {
|
|
73
|
-
const
|
|
74
|
-
|
|
72
|
+
const columns = require_columns_collection.ColumnsCollection(void 0, { ctx: ctx.ctx }).discover({
|
|
73
|
+
mode: "enrichment",
|
|
74
|
+
maxHops: 4,
|
|
75
75
|
anchors: Object.fromEntries(anchorSpecs.map((spec, i) => [`anchor_${i}`, spec]))
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
return new Set(collection.findColumns({ mode: "enrichment" }).map((m) => m.column.id));
|
|
79
|
-
} finally {
|
|
80
|
-
collection.dispose();
|
|
81
|
-
}
|
|
76
|
+
}).getColumns();
|
|
77
|
+
return new Set(columns.map((c) => (0, _milaboratories_pl_model_common.extractPObjectId)(c.id)));
|
|
82
78
|
} catch {
|
|
83
79
|
return;
|
|
84
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"columns.cjs","names":["PColumnCollection","enrichCompatible","getAvailableWithLinkersAxes","ColumnCollectionBuilder","collectCtxColumnSnapshotProviders"],"sources":["../../src/pframe_utils/columns.ts"],"sourcesContent":["import type {\n PColumn,\n PColumnSpec,\n PColumnLazy,\n PFrameDef,\n PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n getNormalizedAxesList,\n getAxisId,\n canonicalizeJson,\n isLinkerColumn,\n matchAxisId,\n isLabelColumn,\n} from \"@milaboratories/pl-model-common\";\nimport type { AxesVault } from \"./axes\";\nimport { enrichCompatible, getAvailableWithLinkersAxes } from \"./axes\";\nimport type { RenderCtxBase, PColumnDataUniversal } from \"../render\";\nimport { PColumnCollection } from \"../render\";\nimport { ColumnCollectionBuilder } from \"../columns\";\nimport { collectCtxColumnSnapshotProviders } from \"../columns/ctx_column_sources\";\n\nexport function getAllRelatedColumns<A, U>(\n ctx: RenderCtxBase<A, U>,\n predicate: (spec: PColumnSpec) => boolean,\n): PFrameDef<PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>> {\n // if current block doesn't produce own columns then use all columns from result pool\n const columns = new PColumnCollection();\n columns.addColumnProvider(ctx.resultPool);\n const allColumns =\n columns.getColumns(predicate, {\n dontWaitAllData: true,\n overrideLabelAnnotation: false,\n }) ?? [];\n\n const allAxes: AxesVault = new Map(\n allColumns\n .flatMap((column) => getNormalizedAxesList(column.spec.axesSpec))\n .map((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return [canonicalizeJson(axisId), axisSpec];\n }),\n );\n\n // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match\n const extendedColumns = enrichCompatible(allAxes, allColumns);\n\n return extendedColumns;\n}\n\nexport function getRelatedColumns<A, U>(\n ctx: RenderCtxBase<A, U>,\n {\n columns: rootColumns,\n predicate,\n }: {\n columns: PColumn<PColumnDataUniversal>[];\n predicate: (spec: PColumnSpec) => boolean;\n },\n): PFrameDef<PColumn<PColumnDataUniversal> | PColumnLazy<undefined | PColumnDataUniversal>> {\n // if current block has its own columns then take from result pool only compatible with them\n const columns = new PColumnCollection();\n columns.addColumnProvider(ctx.resultPool);\n columns.addColumns(rootColumns);\n\n // all possible axes from block columns\n const blockAxes: AxesVault = new Map();\n // axes from block columns and compatible result pool columns\n const allAxes: AxesVault = new Map();\n for (const c of rootColumns) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n blockAxes.set(canonicalizeJson(aid), spec);\n allAxes.set(canonicalizeJson(aid), spec);\n }\n }\n\n // all linker columns always go to pFrame - even it's impossible to use some of them they all are hidden\n const linkerColumns =\n columns.getColumns((spec) => predicate(spec) && isLinkerColumn(spec), {\n dontWaitAllData: true,\n }) ?? [];\n const availableWithLinkersAxes = getAvailableWithLinkersAxes(linkerColumns, blockAxes);\n\n // all possible axes from connected linkers\n for (const item of availableWithLinkersAxes) {\n blockAxes.set(...item);\n allAxes.set(...item);\n }\n\n const blockAxesArr = Array.from(blockAxes.values());\n // all compatible with block columns but without label columns\n let compatibleWithoutLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return blockAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => !isLabelColumn(column.spec));\n\n // extend axes set for label columns request\n for (const c of compatibleWithoutLabels) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n allAxes.set(canonicalizeJson(aid), spec);\n }\n }\n\n const allAxesArr = Array.from(allAxes.values());\n // extend allowed columns - add columns thad doesn't have axes from block, but have all axes in 'allAxes' list (that means all axes from linkers or from 'hanging' of other selected columns)\n compatibleWithoutLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.every((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => !isLabelColumn(column.spec));\n\n // label columns must be compatible with full set of axes - block axes and axes from compatible columns from result pool\n const compatibleLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => isLabelColumn(column.spec));\n\n const compatible = [...compatibleWithoutLabels, ...compatibleLabels];\n\n // Drop result-pool columns that share an axis with the block but cannot join it.\n const integrableIds = discoverIntegrableColumnIds(ctx, rootColumns);\n const rootIds = new Set(rootColumns.map((c) => c.id));\n const connected = compatible.filter(\n (c) => rootIds.has(c.id) || isLinkerColumn(c.spec) || (integrableIds?.has(c.id) ?? true),\n );\n\n // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match\n const extendedColumns = enrichCompatible(blockAxes, connected);\n\n return extendedColumns;\n}\n\n/** Column ids that discovery confirms integrate with the block, or `undefined` when it can't decide. */\nfunction discoverIntegrableColumnIds<A, U>(\n ctx: RenderCtxBase<A, U>,\n rootColumns: PColumn<PColumnDataUniversal>[],\n): Set<PObjectId> | undefined {\n const anchorSpecs = Array.from(\n new Map(rootColumns.map((c) => [canonicalizeJson(c.spec), c.spec])).values(),\n );\n if (anchorSpecs.length === 0) return undefined;\n\n try {\n const collection = new ColumnCollectionBuilder()\n .addSources(collectCtxColumnSnapshotProviders(ctx))\n .build({\n allowPartialColumnList: true,\n anchors: Object.fromEntries(anchorSpecs.map((spec, i) => [`anchor_${i}`, spec])),\n });\n try {\n return new Set(collection.findColumns({ mode: \"enrichment\" }).map((m) => m.column.id));\n } finally {\n collection.dispose();\n }\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"columns.cjs","names":["PColumnCollection","enrichCompatible","getAvailableWithLinkersAxes","ColumnsCollection"],"sources":["../../src/pframe_utils/columns.ts"],"sourcesContent":["import type { PColumn, PColumnSpec, PFrameDef, PObjectId } from \"@milaboratories/pl-model-common\";\nimport {\n getNormalizedAxesList,\n getAxisId,\n canonicalizeJson,\n isLinkerColumn,\n matchAxisId,\n isLabelColumn,\n extractPObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport type { AxesVault } from \"./axes\";\nimport { enrichCompatible, getAvailableWithLinkersAxes } from \"./axes\";\nimport type { RenderCtxBase, PColumnDataUniversal } from \"../render\";\nimport { PColumnCollection } from \"../render\";\nimport { ColumnsCollection } from \"../columns\";\n\nexport function getAllRelatedColumns<A, U>(\n ctx: RenderCtxBase<A, U>,\n predicate: (spec: PColumnSpec) => boolean,\n): PFrameDef<PColumn<undefined | PColumnDataUniversal>> {\n // if current block doesn't produce own columns then use all columns from result pool\n const columns = new PColumnCollection();\n columns.addColumnProvider(ctx.resultPool);\n const allColumns =\n columns.getColumns(predicate, {\n dontWaitAllData: true,\n overrideLabelAnnotation: false,\n }) ?? [];\n\n const allAxes: AxesVault = new Map(\n allColumns\n .flatMap((column) => getNormalizedAxesList(column.spec.axesSpec))\n .map((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return [canonicalizeJson(axisId), axisSpec];\n }),\n );\n\n // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match\n const extendedColumns = enrichCompatible(allAxes, allColumns);\n\n return extendedColumns;\n}\n\nexport function getRelatedColumns<A, U>(\n ctx: RenderCtxBase<A, U>,\n {\n columns: rootColumns,\n predicate,\n }: {\n columns: PColumn<undefined | PColumnDataUniversal>[];\n predicate: (spec: PColumnSpec) => boolean;\n },\n): PFrameDef<PColumn<undefined | PColumnDataUniversal>> {\n // if current block has its own columns then take from result pool only compatible with them\n const columns = new PColumnCollection();\n columns.addColumnProvider(ctx.resultPool);\n columns.addColumns(rootColumns);\n\n // all possible axes from block columns\n const blockAxes: AxesVault = new Map();\n // axes from block columns and compatible result pool columns\n const allAxes: AxesVault = new Map();\n for (const c of rootColumns) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n blockAxes.set(canonicalizeJson(aid), spec);\n allAxes.set(canonicalizeJson(aid), spec);\n }\n }\n\n // all linker columns always go to pFrame - even it's impossible to use some of them they all are hidden\n const linkerColumns =\n columns.getColumns((spec) => predicate(spec) && isLinkerColumn(spec), {\n dontWaitAllData: true,\n }) ?? [];\n const availableWithLinkersAxes = getAvailableWithLinkersAxes(linkerColumns, blockAxes);\n\n // all possible axes from connected linkers\n for (const item of availableWithLinkersAxes) {\n blockAxes.set(...item);\n allAxes.set(...item);\n }\n\n const blockAxesArr = Array.from(blockAxes.values());\n // all compatible with block columns but without label columns\n let compatibleWithoutLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return blockAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => !isLabelColumn(column.spec));\n\n // extend axes set for label columns request\n for (const c of compatibleWithoutLabels) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n allAxes.set(canonicalizeJson(aid), spec);\n }\n }\n\n const allAxesArr = Array.from(allAxes.values());\n // extend allowed columns - add columns thad doesn't have axes from block, but have all axes in 'allAxes' list (that means all axes from linkers or from 'hanging' of other selected columns)\n compatibleWithoutLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.every((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => !isLabelColumn(column.spec));\n\n // label columns must be compatible with full set of axes - block axes and axes from compatible columns from result pool\n const compatibleLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => isLabelColumn(column.spec));\n\n const compatible = [...compatibleWithoutLabels, ...compatibleLabels];\n\n // Drop result-pool columns that share an axis with the block but cannot join it.\n const integrableIds = discoverIntegrableColumnIds(ctx, rootColumns);\n const rootIds = new Set(rootColumns.map((c) => c.id));\n const connected = compatible.filter(\n (c) => rootIds.has(c.id) || isLinkerColumn(c.spec) || (integrableIds?.has(c.id) ?? true),\n );\n\n // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match\n const extendedColumns = enrichCompatible(blockAxes, connected);\n\n return extendedColumns;\n}\n\n/** Column ids that discovery confirms integrate with the block, or `undefined` when it can't decide. */\nfunction discoverIntegrableColumnIds<A, U>(\n ctx: RenderCtxBase<A, U>,\n rootColumns: PColumn<undefined | PColumnDataUniversal>[],\n): Set<PObjectId> | undefined {\n const anchorSpecs = Array.from(\n new Map(rootColumns.map((c) => [canonicalizeJson(c.spec), c.spec])).values(),\n );\n if (anchorSpecs.length === 0) return undefined;\n\n try {\n const columns = ColumnsCollection(undefined, { ctx: ctx.ctx })\n .discover({\n mode: \"enrichment\",\n maxHops: 4,\n anchors: Object.fromEntries(anchorSpecs.map((spec, i) => [`anchor_${i}`, spec])),\n })\n .getColumns();\n return new Set(columns.map((c) => extractPObjectId(c.id)));\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { PColumnDataUniversal } from "../render/internal.js";
|
|
2
2
|
import { RenderCtxBase } from "../render/api.js";
|
|
3
|
-
import { PColumn,
|
|
3
|
+
import { PColumn, PColumnSpec, PFrameDef } from "@milaboratories/pl-model-common";
|
|
4
4
|
|
|
5
5
|
//#region src/pframe_utils/columns.d.ts
|
|
6
|
-
declare function getAllRelatedColumns<A, U>(ctx: RenderCtxBase<A, U>, predicate: (spec: PColumnSpec) => boolean): PFrameDef<PColumn<
|
|
6
|
+
declare function getAllRelatedColumns<A, U>(ctx: RenderCtxBase<A, U>, predicate: (spec: PColumnSpec) => boolean): PFrameDef<PColumn<undefined | PColumnDataUniversal>>;
|
|
7
7
|
declare function getRelatedColumns<A, U>(ctx: RenderCtxBase<A, U>, {
|
|
8
8
|
columns: rootColumns,
|
|
9
9
|
predicate
|
|
10
10
|
}: {
|
|
11
|
-
columns: PColumn<PColumnDataUniversal>[];
|
|
11
|
+
columns: PColumn<undefined | PColumnDataUniversal>[];
|
|
12
12
|
predicate: (spec: PColumnSpec) => boolean;
|
|
13
|
-
}): PFrameDef<PColumn<
|
|
13
|
+
}): PFrameDef<PColumn<undefined | PColumnDataUniversal>>;
|
|
14
14
|
//#endregion
|
|
15
15
|
export { getAllRelatedColumns, getRelatedColumns };
|
|
16
16
|
//# sourceMappingURL=columns.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"columns.d.ts","names":[],"sources":["../../src/pframe_utils/columns.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"columns.d.ts","names":[],"sources":["../../src/pframe_utils/columns.ts"],"mappings":";;;;;iBAgBgB,oBAAA,OACd,GAAA,EAAK,aAAA,CAAc,CAAA,EAAG,CAAA,GACtB,SAAA,GAAY,IAAA,EAAM,WAAA,eACjB,SAAA,CAAU,OAAA,aAAoB,oBAAA;AAAA,iBAyBjB,iBAAA,OACd,GAAA,EAAK,aAAA,CAAc,CAAA,EAAG,CAAA;EAEpB,OAAA,EAAS,WAAA;EACT;AAAA;EAEA,OAAA,EAAS,OAAA,aAAoB,oBAAA;EAC7B,SAAA,GAAY,IAAA,EAAM,WAAA;AAAA,IAEnB,SAAA,CAAU,OAAA,aAAoB,oBAAA"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { PColumnCollection } from "../render/util/column_collection.js";
|
|
2
2
|
import "../render/index.js";
|
|
3
3
|
import { enrichCompatible, getAvailableWithLinkersAxes } from "./axes.js";
|
|
4
|
-
import {
|
|
5
|
-
import { collectCtxColumnSnapshotProviders } from "../columns/ctx_column_sources.js";
|
|
4
|
+
import { ColumnsCollection } from "../columns/columns_collection.js";
|
|
6
5
|
import "../columns/index.js";
|
|
7
|
-
import { canonicalizeJson, getAxisId, getNormalizedAxesList, isLabelColumn, isLinkerColumn, matchAxisId } from "@milaboratories/pl-model-common";
|
|
6
|
+
import { canonicalizeJson, extractPObjectId, getAxisId, getNormalizedAxesList, isLabelColumn, isLinkerColumn, matchAxisId } from "@milaboratories/pl-model-common";
|
|
8
7
|
//#region src/pframe_utils/columns.ts
|
|
9
8
|
function getAllRelatedColumns(ctx, predicate) {
|
|
10
9
|
const columns = new PColumnCollection();
|
|
@@ -70,15 +69,12 @@ function discoverIntegrableColumnIds(ctx, rootColumns) {
|
|
|
70
69
|
const anchorSpecs = Array.from(new Map(rootColumns.map((c) => [canonicalizeJson(c.spec), c.spec])).values());
|
|
71
70
|
if (anchorSpecs.length === 0) return void 0;
|
|
72
71
|
try {
|
|
73
|
-
const
|
|
74
|
-
|
|
72
|
+
const columns = ColumnsCollection(void 0, { ctx: ctx.ctx }).discover({
|
|
73
|
+
mode: "enrichment",
|
|
74
|
+
maxHops: 4,
|
|
75
75
|
anchors: Object.fromEntries(anchorSpecs.map((spec, i) => [`anchor_${i}`, spec]))
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
return new Set(collection.findColumns({ mode: "enrichment" }).map((m) => m.column.id));
|
|
79
|
-
} finally {
|
|
80
|
-
collection.dispose();
|
|
81
|
-
}
|
|
76
|
+
}).getColumns();
|
|
77
|
+
return new Set(columns.map((c) => extractPObjectId(c.id)));
|
|
82
78
|
} catch {
|
|
83
79
|
return;
|
|
84
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"columns.js","names":[],"sources":["../../src/pframe_utils/columns.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"columns.js","names":[],"sources":["../../src/pframe_utils/columns.ts"],"sourcesContent":["import type { PColumn, PColumnSpec, PFrameDef, PObjectId } from \"@milaboratories/pl-model-common\";\nimport {\n getNormalizedAxesList,\n getAxisId,\n canonicalizeJson,\n isLinkerColumn,\n matchAxisId,\n isLabelColumn,\n extractPObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport type { AxesVault } from \"./axes\";\nimport { enrichCompatible, getAvailableWithLinkersAxes } from \"./axes\";\nimport type { RenderCtxBase, PColumnDataUniversal } from \"../render\";\nimport { PColumnCollection } from \"../render\";\nimport { ColumnsCollection } from \"../columns\";\n\nexport function getAllRelatedColumns<A, U>(\n ctx: RenderCtxBase<A, U>,\n predicate: (spec: PColumnSpec) => boolean,\n): PFrameDef<PColumn<undefined | PColumnDataUniversal>> {\n // if current block doesn't produce own columns then use all columns from result pool\n const columns = new PColumnCollection();\n columns.addColumnProvider(ctx.resultPool);\n const allColumns =\n columns.getColumns(predicate, {\n dontWaitAllData: true,\n overrideLabelAnnotation: false,\n }) ?? [];\n\n const allAxes: AxesVault = new Map(\n allColumns\n .flatMap((column) => getNormalizedAxesList(column.spec.axesSpec))\n .map((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return [canonicalizeJson(axisId), axisSpec];\n }),\n );\n\n // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match\n const extendedColumns = enrichCompatible(allAxes, allColumns);\n\n return extendedColumns;\n}\n\nexport function getRelatedColumns<A, U>(\n ctx: RenderCtxBase<A, U>,\n {\n columns: rootColumns,\n predicate,\n }: {\n columns: PColumn<undefined | PColumnDataUniversal>[];\n predicate: (spec: PColumnSpec) => boolean;\n },\n): PFrameDef<PColumn<undefined | PColumnDataUniversal>> {\n // if current block has its own columns then take from result pool only compatible with them\n const columns = new PColumnCollection();\n columns.addColumnProvider(ctx.resultPool);\n columns.addColumns(rootColumns);\n\n // all possible axes from block columns\n const blockAxes: AxesVault = new Map();\n // axes from block columns and compatible result pool columns\n const allAxes: AxesVault = new Map();\n for (const c of rootColumns) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n blockAxes.set(canonicalizeJson(aid), spec);\n allAxes.set(canonicalizeJson(aid), spec);\n }\n }\n\n // all linker columns always go to pFrame - even it's impossible to use some of them they all are hidden\n const linkerColumns =\n columns.getColumns((spec) => predicate(spec) && isLinkerColumn(spec), {\n dontWaitAllData: true,\n }) ?? [];\n const availableWithLinkersAxes = getAvailableWithLinkersAxes(linkerColumns, blockAxes);\n\n // all possible axes from connected linkers\n for (const item of availableWithLinkersAxes) {\n blockAxes.set(...item);\n allAxes.set(...item);\n }\n\n const blockAxesArr = Array.from(blockAxes.values());\n // all compatible with block columns but without label columns\n let compatibleWithoutLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return blockAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => !isLabelColumn(column.spec));\n\n // extend axes set for label columns request\n for (const c of compatibleWithoutLabels) {\n for (const spec of getNormalizedAxesList(c.spec.axesSpec)) {\n const aid = getAxisId(spec);\n allAxes.set(canonicalizeJson(aid), spec);\n }\n }\n\n const allAxesArr = Array.from(allAxes.values());\n // extend allowed columns - add columns thad doesn't have axes from block, but have all axes in 'allAxes' list (that means all axes from linkers or from 'hanging' of other selected columns)\n compatibleWithoutLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.every((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => !isLabelColumn(column.spec));\n\n // label columns must be compatible with full set of axes - block axes and axes from compatible columns from result pool\n const compatibleLabels = (\n columns.getColumns(\n (spec) =>\n predicate(spec) &&\n spec.axesSpec.some((axisSpec) => {\n const axisId = getAxisId(axisSpec);\n return allAxesArr.some((selectorAxisSpec) =>\n matchAxisId(getAxisId(selectorAxisSpec), axisId),\n );\n }),\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n ) ?? []\n ).filter((column) => isLabelColumn(column.spec));\n\n const compatible = [...compatibleWithoutLabels, ...compatibleLabels];\n\n // Drop result-pool columns that share an axis with the block but cannot join it.\n const integrableIds = discoverIntegrableColumnIds(ctx, rootColumns);\n const rootIds = new Set(rootColumns.map((c) => c.id));\n const connected = compatible.filter(\n (c) => rootIds.has(c.id) || isLinkerColumn(c.spec) || (integrableIds?.has(c.id) ?? true),\n );\n\n // additional columns are duplicates with extra fields in domains for compatibility if there are ones with partial match\n const extendedColumns = enrichCompatible(blockAxes, connected);\n\n return extendedColumns;\n}\n\n/** Column ids that discovery confirms integrate with the block, or `undefined` when it can't decide. */\nfunction discoverIntegrableColumnIds<A, U>(\n ctx: RenderCtxBase<A, U>,\n rootColumns: PColumn<undefined | PColumnDataUniversal>[],\n): Set<PObjectId> | undefined {\n const anchorSpecs = Array.from(\n new Map(rootColumns.map((c) => [canonicalizeJson(c.spec), c.spec])).values(),\n );\n if (anchorSpecs.length === 0) return undefined;\n\n try {\n const columns = ColumnsCollection(undefined, { ctx: ctx.ctx })\n .discover({\n mode: \"enrichment\",\n maxHops: 4,\n anchors: Object.fromEntries(anchorSpecs.map((spec, i) => [`anchor_${i}`, spec])),\n })\n .getColumns();\n return new Set(columns.map((c) => extractPObjectId(c.id)));\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["PColumnName","Annotation"],"sources":["../../src/pframe_utils/index.ts"],"sourcesContent":["import { flatten, uniq } from \"es-toolkit\";\n\nimport type {\n AxisSpec,\n CalculateTableDataRequest,\n PColumnSpec,\n PFrameHandle,\n PTableVector,\n UniqueValuesRequest,\n AxisId,\n CanonicalizedJson,\n FindColumnsRequest,\n FindColumnsResponse,\n FullPTableColumnData,\n PColumnIdAndSpec,\n PObjectId,\n PTableRecordSingleValueFilterV2,\n ValueType,\n} from \"@milaboratories/pl-model-common\";\nimport {\n pTableValue,\n Annotation,\n canonicalizeAxisId,\n getAxisId,\n readAnnotation,\n PColumnName,\n} from \"@milaboratories/pl-model-common\";\n\nexport * from \"./columns\";\n\n// Types\ntype PValue = string | number | null;\n\ntype SuggestionResponse = {\n values: {\n value: string;\n label: string;\n }[];\n overflow: boolean;\n};\n\ntype SingleColumnData = {\n axesData: Record<string, PValue[]>;\n data: PValue[];\n};\n\ntype UniqueValuesResponse = {\n values: string[];\n overflow: boolean;\n};\n\ntype GetUniqueSourceValuesParams = {\n columnId: PObjectId;\n axisIdx?: number;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n};\n\ntype GetAxisUniqueValuesParams = {\n axisId: AxisId;\n parentColumnIds: PObjectId[];\n limit?: number;\n filters?: PTableRecordSingleValueFilterV2[];\n};\n\ntype GetColumnsFullParams = {\n selectedSources: PObjectId[];\n strictlyCompatible: boolean;\n types?: ValueType[];\n names?: string[];\n annotations?: FindColumnsRequest[\"columnFilter\"][\"annotationValue\"];\n annotationsNotEmpty?: string[];\n};\n\n// Constants\nconst UNIQUE_VALUES_LIMIT = 1000000;\n\n// Helper functions\nconst sortValuesPredicate = (a: { label: string }, b: { label: string }) =>\n a.label.localeCompare(b.label, \"en\", { numeric: true });\n\nfunction convertColumnData(type: ValueType, response: PTableVector): PValue[] {\n if (type === \"String\") {\n return response.data as PValue[];\n }\n const res: PValue[] = new Array(response.data.length);\n for (let i = 0; i < response.data.length; i++) {\n res[i] = pTableValue(response, i) as PValue;\n }\n return res;\n}\n\nfunction createSearchFilter(\n columnId: PObjectId,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"column\",\n id: columnId,\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction createAxisSearchFilter(\n axisSpec: AxisSpec,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"axis\",\n id: {\n type: axisSpec.type,\n name: axisSpec.name,\n },\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction mapValuesToSuggestions(values: string[]): { value: string; label: string }[] {\n return values.map((v) => ({ value: String(v), label: String(v) })).sort(sortValuesPredicate);\n}\n\nfunction getPFrameDriver() {\n if (typeof platforma === \"undefined\") {\n throw new Error(\"Platforma instance is not available\");\n }\n if (typeof platforma.pFrameDriver === \"undefined\") {\n throw new Error(\"PFrame driver is not available in the current Platforma instance\");\n }\n return platforma.pFrameDriver;\n}\n\n// Core functions\nexport async function getColumnSpecById(\n handle: PFrameHandle,\n id: PObjectId,\n): Promise<PColumnSpec | null> {\n try {\n const response = await getPFrameDriver().getColumnSpec(handle, id);\n return response ?? null;\n } catch (err) {\n console.error(\"PFrame: get single column error\", err);\n return null;\n }\n}\n\nexport async function getSingleColumnData(\n handle: PFrameHandle,\n id: PObjectId,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<SingleColumnData> {\n try {\n const response: FullPTableColumnData[] = await getPFrameDriver().calculateTableData(handle, {\n src: {\n type: \"column\",\n column: id,\n },\n filters,\n sorting: [],\n } as CalculateTableDataRequest<PObjectId>);\n\n const axes = response.filter((item) => item.spec.type === \"axis\");\n const columns = response.filter((item) => item.spec.type === \"column\");\n\n return {\n axesData: axes.reduce((res: Record<string, PValue[]>, item) => {\n const id = getAxisId(item.spec.spec as AxisSpec);\n res[canonicalizeAxisId(id)] = convertColumnData(id.type, item.data);\n return res;\n }, {}),\n data: columns.length ? convertColumnData(columns[0].data.type, columns[0].data) : [],\n };\n } catch (err) {\n console.error(\"PFrame: calculateTableData error\");\n throw err;\n }\n}\n\nexport async function getColumnUniqueValues(\n handle: PFrameHandle,\n id: PObjectId,\n limit = UNIQUE_VALUES_LIMIT,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<UniqueValuesResponse> {\n const request: UniqueValuesRequest = {\n columnId: id,\n filters,\n limit,\n };\n\n try {\n const response = await getPFrameDriver().getUniqueValues(handle, request);\n if (response.overflow) {\n console.warn(`More than ${limit} values for ${id} column`);\n }\n return {\n values: Array.from(response.values.data as ArrayLike<unknown>).map(String),\n overflow: response.overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for column error\");\n throw err;\n }\n}\n\nexport async function getAxisUniqueValues(\n handle: PFrameHandle,\n params: GetAxisUniqueValuesParams,\n): Promise<UniqueValuesResponse> {\n const { axisId, parentColumnIds, limit = UNIQUE_VALUES_LIMIT, filters = [] } = params;\n const strAxisId = canonicalizeAxisId(axisId);\n\n const parentsSpecs = (await Promise.all(parentColumnIds.map((p) => getColumnSpecById(handle, p))))\n .flatMap((spec, i): [PObjectId, PColumnSpec][] =>\n spec != null && spec.kind === \"PColumn\" ? [[parentColumnIds[i], spec]] : [],\n )\n .filter(([_, spec]) =>\n spec.axesSpec.some((axisSpec) => canonicalizeAxisId(getAxisId(axisSpec)) === strAxisId),\n );\n\n if (parentsSpecs.length === 0) {\n console.warn(\"Axis unique values requested without parent columns\");\n return { values: [], overflow: false };\n }\n\n try {\n const responses = await Promise.all(\n parentsSpecs.map(([id]) =>\n getPFrameDriver().getUniqueValues(handle, {\n columnId: id,\n axis: axisId,\n filters,\n limit,\n }),\n ),\n );\n\n const overflow = responses.some((r) => r.overflow);\n return {\n values: uniq(\n flatten(responses.map((r) => Array.from(r.values.data as ArrayLike<unknown>).map(String))),\n ),\n overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for axis error\", err);\n return { values: [], overflow: false };\n }\n}\n\nexport async function getRequestColumnsFromSelectedSources(\n handle: PFrameHandle,\n sources: PObjectId[],\n): Promise<AxisId[]> {\n const result: AxisId[] = [];\n for (const item of sources) {\n const spec = await getColumnSpecById(handle, item);\n if (spec?.kind === \"PColumn\") {\n result.push(...spec.axesSpec.map((spec) => getAxisId(spec)));\n }\n }\n return result;\n}\n\nexport async function getColumnsFull(\n handle: PFrameHandle,\n params: GetColumnsFullParams,\n): Promise<PColumnIdAndSpec[]> {\n const { selectedSources, strictlyCompatible, types, names, annotations, annotationsNotEmpty } =\n params;\n\n try {\n const request: FindColumnsRequest = {\n columnFilter: {\n type: types,\n name: names,\n annotationValue: annotations,\n annotationPattern: annotationsNotEmpty?.reduce(\n (res, v) => {\n res[v] = \".+\";\n return res;\n },\n {} as Record<string, string>,\n ),\n },\n compatibleWith: await getRequestColumnsFromSelectedSources(handle, selectedSources),\n strictlyCompatible,\n };\n\n const response: FindColumnsResponse = await getPFrameDriver().findColumns(handle, request);\n return response.hits;\n } catch (err) {\n console.error(\"PFrame: findColumns error\");\n throw err;\n }\n}\n\nexport async function getColumnOrAxisValueLabelsId(\n handle: PFrameHandle,\n strAxisId: CanonicalizedJson<AxisId>,\n): Promise<PObjectId | undefined> {\n const labelColumns = await getColumnsFull(handle, {\n selectedSources: [],\n strictlyCompatible: false,\n names: [PColumnName.Label],\n });\n\n const labelColumn = labelColumns.find(({ spec }) => {\n return spec && spec.axesSpec.length === 1 && canonicalizeAxisId(spec.axesSpec[0]) === strAxisId;\n });\n\n return labelColumn?.columnId;\n}\n\nfunction getDiscreteValuesFromAnnotation(columnSpec: PColumnSpec): undefined | SuggestionResponse {\n const discreteValuesStr = readAnnotation(columnSpec, Annotation.DiscreteValues);\n if (!discreteValuesStr) {\n return undefined;\n }\n\n try {\n const discreteValues: string[] = (JSON.parse(discreteValuesStr) as (string | number)[]).map(\n (v) => String(v),\n );\n const values = discreteValues.map((v) => ({ value: v, label: v })).sort(sortValuesPredicate);\n return { values, overflow: false };\n } catch {\n console.error(`Parsing error: discrete values annotation ${discreteValuesStr}`);\n return undefined;\n }\n}\n\nasync function getAxisValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n axisSpec: AxisSpec;\n labelsColumnId: PObjectId | undefined;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, axisSpec, labelsColumnId, limit, searchQuery, searchQueryValue } = params;\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n\n let filters: PTableRecordSingleValueFilterV2[] = [];\n\n if (labelsColumnId) {\n if (searchQuery) {\n filters = [createSearchFilter(labelsColumnId, searchQuery)];\n }\n if (searchQueryValue) {\n filters = [createAxisSearchFilter(axisSpec, searchQueryValue)];\n }\n\n const { data: dataValues, axesData } = await getSingleColumnData(\n handle,\n labelsColumnId,\n filters,\n );\n const axisKeys = axesData[strAxisId];\n const values: { value: string; label: string }[] = [];\n\n for (let i = 0; i < Math.min(axisKeys.length, limit ?? axisKeys.length); i++) {\n values.push({ value: String(axisKeys[i]), label: String(dataValues[i]) });\n }\n\n values.sort(sortValuesPredicate);\n return { values, overflow: !(limit === undefined || axisKeys.length < limit) };\n } else {\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n if (searchInLabelsOrValue) {\n filters = [createAxisSearchFilter(axisSpec, searchInLabelsOrValue)];\n }\n\n const response = await getAxisUniqueValues(handle, {\n axisId: getAxisId(axisSpec),\n parentColumnIds: [columnId],\n limit,\n filters,\n });\n\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n }\n}\n\nasync function getColumnValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, limit, searchQuery, searchQueryValue } = params;\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n\n const filters: PTableRecordSingleValueFilterV2[] = searchInLabelsOrValue\n ? [createSearchFilter(columnId, searchInLabelsOrValue)]\n : [];\n\n const response = await getColumnUniqueValues(handle, columnId, limit, filters);\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n}\n\nexport async function getUniqueSourceValuesWithLabels(\n handle: PFrameHandle,\n params: GetUniqueSourceValuesParams,\n): Promise<SuggestionResponse> {\n const { columnId, axisIdx, limit, searchQuery, searchQueryValue } = params;\n\n const selectedSourceSpec = await getColumnSpecById(handle, columnId);\n if (selectedSourceSpec == null || selectedSourceSpec.kind !== \"PColumn\") {\n return { values: [], overflow: false };\n }\n\n // Try to get discrete values from annotation\n const discreteValues = getDiscreteValuesFromAnnotation(selectedSourceSpec);\n if (discreteValues != null) {\n return discreteValues;\n }\n\n // Handle axis values\n if (axisIdx != null) {\n const axisSpec = selectedSourceSpec.axesSpec[axisIdx];\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(handle, strAxisId);\n\n return getAxisValuesWithLabels(handle, {\n columnId,\n axisSpec,\n labelsColumnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n }\n\n // Handle column values\n return getColumnValuesWithLabels(handle, {\n columnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["PColumnName","Annotation"],"sources":["../../src/pframe_utils/index.ts"],"sourcesContent":["import { flatten, uniq } from \"es-toolkit\";\n\nimport type {\n AxisSpec,\n CalculateTableDataRequest,\n PColumnSpec,\n PFrameHandle,\n PTableVector,\n UniqueValuesRequest,\n AxisId,\n CanonicalizedJson,\n FindColumnsRequest,\n FindColumnsResponse,\n FullPTableColumnData,\n PColumnIdAndSpec,\n PObjectId,\n PTableRecordSingleValueFilterV2,\n ValueType,\n} from \"@milaboratories/pl-model-common\";\nimport {\n pTableValue,\n Annotation,\n canonicalizeAxisId,\n getAxisId,\n readAnnotation,\n PColumnName,\n} from \"@milaboratories/pl-model-common\";\n\nexport * from \"./columns\";\n\n// Types\ntype PValue = string | number | null;\n\ntype SuggestionResponse = {\n values: {\n value: string;\n label: string;\n }[];\n overflow: boolean;\n};\n\ntype SingleColumnData = {\n axesData: Record<string, PValue[]>;\n data: PValue[];\n};\n\ntype UniqueValuesResponse = {\n values: string[];\n overflow: boolean;\n};\n\ntype GetUniqueSourceValuesParams = {\n columnId: PObjectId;\n axisIdx?: number;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n};\n\ntype GetAxisUniqueValuesParams = {\n axisId: AxisId;\n parentColumnIds: PObjectId[];\n limit?: number;\n filters?: PTableRecordSingleValueFilterV2[];\n};\n\ntype GetColumnsFullParams = {\n selectedSources: PObjectId[];\n strictlyCompatible: boolean;\n types?: ValueType[];\n names?: string[];\n annotations?: FindColumnsRequest[\"columnFilter\"][\"annotationValue\"];\n annotationsNotEmpty?: string[];\n};\n\n// Constants\nconst UNIQUE_VALUES_LIMIT = 1000000;\n\n// Helper functions\nconst sortValuesPredicate = (a: { label: string }, b: { label: string }) =>\n a.label.localeCompare(b.label, \"en\", { numeric: true });\n\nfunction convertColumnData(type: ValueType, response: PTableVector): PValue[] {\n if (type === \"String\") {\n return response.data as PValue[];\n }\n const res: PValue[] = new Array(response.data.length);\n for (let i = 0; i < response.data.length; i++) {\n res[i] = pTableValue(response, i) as PValue;\n }\n return res;\n}\n\nfunction createSearchFilter(\n columnId: PObjectId,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"column\",\n id: columnId,\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction createAxisSearchFilter(\n axisSpec: AxisSpec,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"axis\",\n id: {\n type: axisSpec.type,\n name: axisSpec.name,\n },\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction mapValuesToSuggestions(values: string[]): { value: string; label: string }[] {\n return values.map((v) => ({ value: String(v), label: String(v) })).sort(sortValuesPredicate);\n}\n\nfunction getPFrameDriver() {\n if (typeof platforma === \"undefined\") {\n throw new Error(\"Platforma instance is not available\");\n }\n if (typeof platforma.pFrameDriver === \"undefined\") {\n throw new Error(\"PFrame driver is not available in the current Platforma instance\");\n }\n return platforma.pFrameDriver;\n}\n\n// Core functions\nexport async function getColumnSpecById(\n handle: PFrameHandle,\n id: PObjectId,\n): Promise<PColumnSpec | null> {\n try {\n const response = await getPFrameDriver().getColumnSpec(handle, id);\n return response ?? null;\n } catch (err) {\n console.error(\"PFrame: get single column error\", err);\n return null;\n }\n}\n\nexport async function getSingleColumnData(\n handle: PFrameHandle,\n id: PObjectId,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<SingleColumnData> {\n try {\n const response: FullPTableColumnData[] = await getPFrameDriver().calculateTableData(handle, {\n src: {\n type: \"column\",\n column: id,\n },\n filters,\n sorting: [],\n } as CalculateTableDataRequest<PObjectId>);\n\n const axes = response.filter((item) => item.spec.type === \"axis\");\n const columns = response.filter((item) => item.spec.type === \"column\");\n\n return {\n axesData: axes.reduce((res: Record<string, PValue[]>, item) => {\n const id = getAxisId(item.spec.spec as AxisSpec);\n res[canonicalizeAxisId(id)] = convertColumnData(id.type, item.data);\n return res;\n }, {}),\n data: columns.length ? convertColumnData(columns[0].data.type, columns[0].data) : [],\n };\n } catch (err) {\n console.error(\"PFrame: calculateTableData error\");\n throw err;\n }\n}\n\nexport async function getColumnUniqueValues(\n handle: PFrameHandle,\n id: PObjectId,\n limit = UNIQUE_VALUES_LIMIT,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<UniqueValuesResponse> {\n const request: UniqueValuesRequest = {\n columnId: id,\n filters,\n limit,\n };\n\n try {\n const response = await getPFrameDriver().getUniqueValues(handle, request);\n if (response.overflow) {\n console.warn(`More than ${limit} values for ${id} column`);\n }\n return {\n values: Array.from(response.values.data as ArrayLike<unknown>).map(String),\n overflow: response.overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for column error\");\n throw err;\n }\n}\n\nexport async function getAxisUniqueValues(\n handle: PFrameHandle,\n params: GetAxisUniqueValuesParams,\n): Promise<UniqueValuesResponse> {\n const { axisId, parentColumnIds, limit = UNIQUE_VALUES_LIMIT, filters = [] } = params;\n const strAxisId = canonicalizeAxisId(axisId);\n\n const parentsSpecs = (await Promise.all(parentColumnIds.map((p) => getColumnSpecById(handle, p))))\n .flatMap((spec, i): [PObjectId, PColumnSpec][] =>\n spec != null && spec.kind === \"PColumn\" ? [[parentColumnIds[i], spec]] : [],\n )\n .filter(([_, spec]) =>\n spec.axesSpec.some((axisSpec) => canonicalizeAxisId(getAxisId(axisSpec)) === strAxisId),\n );\n\n if (parentsSpecs.length === 0) {\n console.warn(\"Axis unique values requested without parent columns\");\n return { values: [], overflow: false };\n }\n\n try {\n const responses = await Promise.all(\n parentsSpecs.map(([id]) =>\n getPFrameDriver().getUniqueValues(handle, {\n columnId: id,\n axis: axisId,\n filters,\n limit,\n }),\n ),\n );\n\n const overflow = responses.some((r) => r.overflow);\n return {\n values: uniq(\n flatten(responses.map((r) => Array.from(r.values.data as ArrayLike<unknown>).map(String))),\n ),\n overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for axis error\", err);\n return { values: [], overflow: false };\n }\n}\n\nexport async function getRequestColumnsFromSelectedSources(\n handle: PFrameHandle,\n sources: PObjectId[],\n): Promise<AxisId[]> {\n const result: AxisId[] = [];\n for (const item of sources) {\n const spec = await getColumnSpecById(handle, item);\n if (spec?.kind === \"PColumn\") {\n result.push(...spec.axesSpec.map((spec) => getAxisId(spec)));\n }\n }\n return result;\n}\n\nexport async function getColumnsFull(\n handle: PFrameHandle,\n params: GetColumnsFullParams,\n): Promise<PColumnIdAndSpec[]> {\n const { selectedSources, strictlyCompatible, types, names, annotations, annotationsNotEmpty } =\n params;\n\n try {\n const request: FindColumnsRequest = {\n columnFilter: {\n type: types,\n name: names,\n annotationValue: annotations,\n annotationPattern: annotationsNotEmpty?.reduce(\n (res, v) => {\n res[v] = \".+\";\n return res;\n },\n {} as Record<string, string>,\n ),\n },\n compatibleWith: await getRequestColumnsFromSelectedSources(handle, selectedSources),\n strictlyCompatible,\n };\n\n const response: FindColumnsResponse = await getPFrameDriver().findColumns(handle, request);\n return response.hits;\n } catch (err) {\n console.error(\"PFrame: findColumns error\");\n throw err;\n }\n}\n\nexport async function getColumnOrAxisValueLabelsId(\n handle: PFrameHandle,\n strAxisId: CanonicalizedJson<AxisId>,\n): Promise<undefined | PObjectId> {\n const labelColumns = await getColumnsFull(handle, {\n selectedSources: [],\n strictlyCompatible: false,\n names: [PColumnName.Label],\n });\n\n const labelColumn = labelColumns.find(({ spec }) => {\n return spec && spec.axesSpec.length === 1 && canonicalizeAxisId(spec.axesSpec[0]) === strAxisId;\n });\n\n return labelColumn?.columnId;\n}\n\nfunction getDiscreteValuesFromAnnotation(columnSpec: PColumnSpec): undefined | SuggestionResponse {\n const discreteValuesStr = readAnnotation(columnSpec, Annotation.DiscreteValues);\n if (!discreteValuesStr) {\n return undefined;\n }\n\n try {\n const discreteValues: string[] = (JSON.parse(discreteValuesStr) as (string | number)[]).map(\n (v) => String(v),\n );\n const values = discreteValues.map((v) => ({ value: v, label: v })).sort(sortValuesPredicate);\n return { values, overflow: false };\n } catch {\n console.error(`Parsing error: discrete values annotation ${discreteValuesStr}`);\n return undefined;\n }\n}\n\nasync function getAxisValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n axisSpec: AxisSpec;\n labelsColumnId: PObjectId | undefined;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, axisSpec, labelsColumnId, limit, searchQuery, searchQueryValue } = params;\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n\n let filters: PTableRecordSingleValueFilterV2[] = [];\n\n if (labelsColumnId) {\n if (searchQuery) {\n filters = [createSearchFilter(labelsColumnId, searchQuery)];\n }\n if (searchQueryValue) {\n filters = [createAxisSearchFilter(axisSpec, searchQueryValue)];\n }\n\n const { data: dataValues, axesData } = await getSingleColumnData(\n handle,\n labelsColumnId,\n filters,\n );\n const axisKeys = axesData[strAxisId];\n const values: { value: string; label: string }[] = [];\n\n for (let i = 0; i < Math.min(axisKeys.length, limit ?? axisKeys.length); i++) {\n values.push({ value: String(axisKeys[i]), label: String(dataValues[i]) });\n }\n\n values.sort(sortValuesPredicate);\n return { values, overflow: !(limit === undefined || axisKeys.length < limit) };\n } else {\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n if (searchInLabelsOrValue) {\n filters = [createAxisSearchFilter(axisSpec, searchInLabelsOrValue)];\n }\n\n const response = await getAxisUniqueValues(handle, {\n axisId: getAxisId(axisSpec),\n parentColumnIds: [columnId],\n limit,\n filters,\n });\n\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n }\n}\n\nasync function getColumnValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, limit, searchQuery, searchQueryValue } = params;\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n\n const filters: PTableRecordSingleValueFilterV2[] = searchInLabelsOrValue\n ? [createSearchFilter(columnId, searchInLabelsOrValue)]\n : [];\n\n const response = await getColumnUniqueValues(handle, columnId, limit, filters);\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n}\n\nexport async function getUniqueSourceValuesWithLabels(\n handle: PFrameHandle,\n params: GetUniqueSourceValuesParams,\n): Promise<SuggestionResponse> {\n const { columnId, axisIdx, limit, searchQuery, searchQueryValue } = params;\n\n const selectedSourceSpec = await getColumnSpecById(handle, columnId);\n if (selectedSourceSpec == null || selectedSourceSpec.kind !== \"PColumn\") {\n return { values: [], overflow: false };\n }\n\n // Try to get discrete values from annotation\n const discreteValues = getDiscreteValuesFromAnnotation(selectedSourceSpec);\n if (discreteValues != null) {\n return discreteValues;\n }\n\n // Handle axis values\n if (axisIdx != null) {\n const axisSpec = selectedSourceSpec.axesSpec[axisIdx];\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(handle, strAxisId);\n\n return getAxisValuesWithLabels(handle, {\n columnId,\n axisSpec,\n labelsColumnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n }\n\n // Handle column values\n return getColumnValuesWithLabels(handle, {\n columnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n}\n"],"mappings":"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"}
|
|
@@ -45,7 +45,7 @@ declare function getColumnUniqueValues(handle: PFrameHandle, id: PObjectId, limi
|
|
|
45
45
|
declare function getAxisUniqueValues(handle: PFrameHandle, params: GetAxisUniqueValuesParams): Promise<UniqueValuesResponse$1>;
|
|
46
46
|
declare function getRequestColumnsFromSelectedSources(handle: PFrameHandle, sources: PObjectId[]): Promise<AxisId[]>;
|
|
47
47
|
declare function getColumnsFull(handle: PFrameHandle, params: GetColumnsFullParams): Promise<PColumnIdAndSpec[]>;
|
|
48
|
-
declare function getColumnOrAxisValueLabelsId(handle: PFrameHandle, strAxisId: CanonicalizedJson<AxisId>): Promise<
|
|
48
|
+
declare function getColumnOrAxisValueLabelsId(handle: PFrameHandle, strAxisId: CanonicalizedJson<AxisId>): Promise<undefined | PObjectId>;
|
|
49
49
|
declare function getUniqueSourceValuesWithLabels(handle: PFrameHandle, params: GetUniqueSourceValuesParams): Promise<SuggestionResponse>;
|
|
50
50
|
//#endregion
|
|
51
51
|
export { getAllRelatedColumns, getAxisUniqueValues, getColumnOrAxisValueLabelsId, getColumnSpecById, getColumnUniqueValues, getColumnsFull, getRelatedColumns, getRequestColumnsFromSelectedSources, getSingleColumnData, getUniqueSourceValuesWithLabels };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/pframe_utils/index.ts"],"mappings":";;;;KA+BK,MAAA;AAAA,KAEA,kBAAA;EACH,MAAA;IACE,KAAA;IACA,KAAA;EAAA;EAEF,QAAA;AAAA;AAAA,KAGG,gBAAA;EACH,QAAA,EAAU,MAAA,SAAe,MAAA;EACzB,IAAA,EAAM,MAAA;AAAA;AAAA,KAGH,sBAAA;EACH,MAAA;EACA,QAAQ;AAAA;AAAA,KAGL,2BAAA;EACH,QAAA,EAAU,SAAS;EACnB,OAAA;EACA,KAAA;EACA,WAAA;EACA,gBAAA;AAAA;AAAA,KAGG,yBAAA;EACH,MAAA,EAAQ,MAAA;EACR,eAAA,EAAiB,SAAA;EACjB,KAAA;EACA,OAAA,GAAU,+BAAA;AAAA;AAAA,KAGP,oBAAA;EACH,eAAA,EAAiB,SAAA;EACjB,kBAAA;EACA,KAAA,GAAQ,SAAA;EACR,KAAA;EACA,WAAA,GAAc,kBAAA;EACd,mBAAA;AAAA;AAAA,iBAyEoB,iBAAA,CACpB,MAAA,EAAQ,YAAA,EACR,EAAA,EAAI,SAAA,GACH,OAAA,CAAQ,WAAA;AAAA,iBAUW,mBAAA,CACpB,MAAA,EAAQ,YAAA,EACR,EAAA,EAAI,SAAA,EACJ,OAAA,GAAS,+BAAA,KACR,OAAA,CAAQ,gBAAA;AAAA,iBA4BW,qBAAA,CACpB,MAAA,EAAQ,YAAA,EACR,EAAA,EAAI,SAAA,EACJ,KAAA,WACA,OAAA,GAAS,+BAAA,KACR,OAAA,CAAQ,sBAAA;AAAA,iBAsBW,mBAAA,CACpB,MAAA,EAAQ,YAAA,EACR,MAAA,EAAQ,yBAAA,GACP,OAAA,CAAQ,sBAAA;AAAA,iBA0CW,oCAAA,CACpB,MAAA,EAAQ,YAAA,EACR,OAAA,EAAS,SAAA,KACR,OAAA,CAAQ,MAAA;AAAA,iBAWW,cAAA,CACpB,MAAA,EAAQ,YAAA,EACR,MAAA,EAAQ,oBAAA,GACP,OAAA,CAAQ,gBAAA;AAAA,iBA8BW,4BAAA,CACpB,MAAA,EAAQ,YAAA,EACR,SAAA,EAAW,iBAAA,CAAkB,MAAA,IAC5B,OAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/pframe_utils/index.ts"],"mappings":";;;;KA+BK,MAAA;AAAA,KAEA,kBAAA;EACH,MAAA;IACE,KAAA;IACA,KAAA;EAAA;EAEF,QAAA;AAAA;AAAA,KAGG,gBAAA;EACH,QAAA,EAAU,MAAA,SAAe,MAAA;EACzB,IAAA,EAAM,MAAA;AAAA;AAAA,KAGH,sBAAA;EACH,MAAA;EACA,QAAQ;AAAA;AAAA,KAGL,2BAAA;EACH,QAAA,EAAU,SAAS;EACnB,OAAA;EACA,KAAA;EACA,WAAA;EACA,gBAAA;AAAA;AAAA,KAGG,yBAAA;EACH,MAAA,EAAQ,MAAA;EACR,eAAA,EAAiB,SAAA;EACjB,KAAA;EACA,OAAA,GAAU,+BAAA;AAAA;AAAA,KAGP,oBAAA;EACH,eAAA,EAAiB,SAAA;EACjB,kBAAA;EACA,KAAA,GAAQ,SAAA;EACR,KAAA;EACA,WAAA,GAAc,kBAAA;EACd,mBAAA;AAAA;AAAA,iBAyEoB,iBAAA,CACpB,MAAA,EAAQ,YAAA,EACR,EAAA,EAAI,SAAA,GACH,OAAA,CAAQ,WAAA;AAAA,iBAUW,mBAAA,CACpB,MAAA,EAAQ,YAAA,EACR,EAAA,EAAI,SAAA,EACJ,OAAA,GAAS,+BAAA,KACR,OAAA,CAAQ,gBAAA;AAAA,iBA4BW,qBAAA,CACpB,MAAA,EAAQ,YAAA,EACR,EAAA,EAAI,SAAA,EACJ,KAAA,WACA,OAAA,GAAS,+BAAA,KACR,OAAA,CAAQ,sBAAA;AAAA,iBAsBW,mBAAA,CACpB,MAAA,EAAQ,YAAA,EACR,MAAA,EAAQ,yBAAA,GACP,OAAA,CAAQ,sBAAA;AAAA,iBA0CW,oCAAA,CACpB,MAAA,EAAQ,YAAA,EACR,OAAA,EAAS,SAAA,KACR,OAAA,CAAQ,MAAA;AAAA,iBAWW,cAAA,CACpB,MAAA,EAAQ,YAAA,EACR,MAAA,EAAQ,oBAAA,GACP,OAAA,CAAQ,gBAAA;AAAA,iBA8BW,4BAAA,CACpB,MAAA,EAAQ,YAAA,EACR,SAAA,EAAW,iBAAA,CAAkB,MAAA,IAC5B,OAAA,aAAoB,SAAA;AAAA,iBA6GD,+BAAA,CACpB,MAAA,EAAQ,YAAA,EACR,MAAA,EAAQ,2BAAA,GACP,OAAA,CAAQ,kBAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/pframe_utils/index.ts"],"sourcesContent":["import { flatten, uniq } from \"es-toolkit\";\n\nimport type {\n AxisSpec,\n CalculateTableDataRequest,\n PColumnSpec,\n PFrameHandle,\n PTableVector,\n UniqueValuesRequest,\n AxisId,\n CanonicalizedJson,\n FindColumnsRequest,\n FindColumnsResponse,\n FullPTableColumnData,\n PColumnIdAndSpec,\n PObjectId,\n PTableRecordSingleValueFilterV2,\n ValueType,\n} from \"@milaboratories/pl-model-common\";\nimport {\n pTableValue,\n Annotation,\n canonicalizeAxisId,\n getAxisId,\n readAnnotation,\n PColumnName,\n} from \"@milaboratories/pl-model-common\";\n\nexport * from \"./columns\";\n\n// Types\ntype PValue = string | number | null;\n\ntype SuggestionResponse = {\n values: {\n value: string;\n label: string;\n }[];\n overflow: boolean;\n};\n\ntype SingleColumnData = {\n axesData: Record<string, PValue[]>;\n data: PValue[];\n};\n\ntype UniqueValuesResponse = {\n values: string[];\n overflow: boolean;\n};\n\ntype GetUniqueSourceValuesParams = {\n columnId: PObjectId;\n axisIdx?: number;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n};\n\ntype GetAxisUniqueValuesParams = {\n axisId: AxisId;\n parentColumnIds: PObjectId[];\n limit?: number;\n filters?: PTableRecordSingleValueFilterV2[];\n};\n\ntype GetColumnsFullParams = {\n selectedSources: PObjectId[];\n strictlyCompatible: boolean;\n types?: ValueType[];\n names?: string[];\n annotations?: FindColumnsRequest[\"columnFilter\"][\"annotationValue\"];\n annotationsNotEmpty?: string[];\n};\n\n// Constants\nconst UNIQUE_VALUES_LIMIT = 1000000;\n\n// Helper functions\nconst sortValuesPredicate = (a: { label: string }, b: { label: string }) =>\n a.label.localeCompare(b.label, \"en\", { numeric: true });\n\nfunction convertColumnData(type: ValueType, response: PTableVector): PValue[] {\n if (type === \"String\") {\n return response.data as PValue[];\n }\n const res: PValue[] = new Array(response.data.length);\n for (let i = 0; i < response.data.length; i++) {\n res[i] = pTableValue(response, i) as PValue;\n }\n return res;\n}\n\nfunction createSearchFilter(\n columnId: PObjectId,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"column\",\n id: columnId,\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction createAxisSearchFilter(\n axisSpec: AxisSpec,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"axis\",\n id: {\n type: axisSpec.type,\n name: axisSpec.name,\n },\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction mapValuesToSuggestions(values: string[]): { value: string; label: string }[] {\n return values.map((v) => ({ value: String(v), label: String(v) })).sort(sortValuesPredicate);\n}\n\nfunction getPFrameDriver() {\n if (typeof platforma === \"undefined\") {\n throw new Error(\"Platforma instance is not available\");\n }\n if (typeof platforma.pFrameDriver === \"undefined\") {\n throw new Error(\"PFrame driver is not available in the current Platforma instance\");\n }\n return platforma.pFrameDriver;\n}\n\n// Core functions\nexport async function getColumnSpecById(\n handle: PFrameHandle,\n id: PObjectId,\n): Promise<PColumnSpec | null> {\n try {\n const response = await getPFrameDriver().getColumnSpec(handle, id);\n return response ?? null;\n } catch (err) {\n console.error(\"PFrame: get single column error\", err);\n return null;\n }\n}\n\nexport async function getSingleColumnData(\n handle: PFrameHandle,\n id: PObjectId,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<SingleColumnData> {\n try {\n const response: FullPTableColumnData[] = await getPFrameDriver().calculateTableData(handle, {\n src: {\n type: \"column\",\n column: id,\n },\n filters,\n sorting: [],\n } as CalculateTableDataRequest<PObjectId>);\n\n const axes = response.filter((item) => item.spec.type === \"axis\");\n const columns = response.filter((item) => item.spec.type === \"column\");\n\n return {\n axesData: axes.reduce((res: Record<string, PValue[]>, item) => {\n const id = getAxisId(item.spec.spec as AxisSpec);\n res[canonicalizeAxisId(id)] = convertColumnData(id.type, item.data);\n return res;\n }, {}),\n data: columns.length ? convertColumnData(columns[0].data.type, columns[0].data) : [],\n };\n } catch (err) {\n console.error(\"PFrame: calculateTableData error\");\n throw err;\n }\n}\n\nexport async function getColumnUniqueValues(\n handle: PFrameHandle,\n id: PObjectId,\n limit = UNIQUE_VALUES_LIMIT,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<UniqueValuesResponse> {\n const request: UniqueValuesRequest = {\n columnId: id,\n filters,\n limit,\n };\n\n try {\n const response = await getPFrameDriver().getUniqueValues(handle, request);\n if (response.overflow) {\n console.warn(`More than ${limit} values for ${id} column`);\n }\n return {\n values: Array.from(response.values.data as ArrayLike<unknown>).map(String),\n overflow: response.overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for column error\");\n throw err;\n }\n}\n\nexport async function getAxisUniqueValues(\n handle: PFrameHandle,\n params: GetAxisUniqueValuesParams,\n): Promise<UniqueValuesResponse> {\n const { axisId, parentColumnIds, limit = UNIQUE_VALUES_LIMIT, filters = [] } = params;\n const strAxisId = canonicalizeAxisId(axisId);\n\n const parentsSpecs = (await Promise.all(parentColumnIds.map((p) => getColumnSpecById(handle, p))))\n .flatMap((spec, i): [PObjectId, PColumnSpec][] =>\n spec != null && spec.kind === \"PColumn\" ? [[parentColumnIds[i], spec]] : [],\n )\n .filter(([_, spec]) =>\n spec.axesSpec.some((axisSpec) => canonicalizeAxisId(getAxisId(axisSpec)) === strAxisId),\n );\n\n if (parentsSpecs.length === 0) {\n console.warn(\"Axis unique values requested without parent columns\");\n return { values: [], overflow: false };\n }\n\n try {\n const responses = await Promise.all(\n parentsSpecs.map(([id]) =>\n getPFrameDriver().getUniqueValues(handle, {\n columnId: id,\n axis: axisId,\n filters,\n limit,\n }),\n ),\n );\n\n const overflow = responses.some((r) => r.overflow);\n return {\n values: uniq(\n flatten(responses.map((r) => Array.from(r.values.data as ArrayLike<unknown>).map(String))),\n ),\n overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for axis error\", err);\n return { values: [], overflow: false };\n }\n}\n\nexport async function getRequestColumnsFromSelectedSources(\n handle: PFrameHandle,\n sources: PObjectId[],\n): Promise<AxisId[]> {\n const result: AxisId[] = [];\n for (const item of sources) {\n const spec = await getColumnSpecById(handle, item);\n if (spec?.kind === \"PColumn\") {\n result.push(...spec.axesSpec.map((spec) => getAxisId(spec)));\n }\n }\n return result;\n}\n\nexport async function getColumnsFull(\n handle: PFrameHandle,\n params: GetColumnsFullParams,\n): Promise<PColumnIdAndSpec[]> {\n const { selectedSources, strictlyCompatible, types, names, annotations, annotationsNotEmpty } =\n params;\n\n try {\n const request: FindColumnsRequest = {\n columnFilter: {\n type: types,\n name: names,\n annotationValue: annotations,\n annotationPattern: annotationsNotEmpty?.reduce(\n (res, v) => {\n res[v] = \".+\";\n return res;\n },\n {} as Record<string, string>,\n ),\n },\n compatibleWith: await getRequestColumnsFromSelectedSources(handle, selectedSources),\n strictlyCompatible,\n };\n\n const response: FindColumnsResponse = await getPFrameDriver().findColumns(handle, request);\n return response.hits;\n } catch (err) {\n console.error(\"PFrame: findColumns error\");\n throw err;\n }\n}\n\nexport async function getColumnOrAxisValueLabelsId(\n handle: PFrameHandle,\n strAxisId: CanonicalizedJson<AxisId>,\n): Promise<PObjectId | undefined> {\n const labelColumns = await getColumnsFull(handle, {\n selectedSources: [],\n strictlyCompatible: false,\n names: [PColumnName.Label],\n });\n\n const labelColumn = labelColumns.find(({ spec }) => {\n return spec && spec.axesSpec.length === 1 && canonicalizeAxisId(spec.axesSpec[0]) === strAxisId;\n });\n\n return labelColumn?.columnId;\n}\n\nfunction getDiscreteValuesFromAnnotation(columnSpec: PColumnSpec): undefined | SuggestionResponse {\n const discreteValuesStr = readAnnotation(columnSpec, Annotation.DiscreteValues);\n if (!discreteValuesStr) {\n return undefined;\n }\n\n try {\n const discreteValues: string[] = (JSON.parse(discreteValuesStr) as (string | number)[]).map(\n (v) => String(v),\n );\n const values = discreteValues.map((v) => ({ value: v, label: v })).sort(sortValuesPredicate);\n return { values, overflow: false };\n } catch {\n console.error(`Parsing error: discrete values annotation ${discreteValuesStr}`);\n return undefined;\n }\n}\n\nasync function getAxisValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n axisSpec: AxisSpec;\n labelsColumnId: PObjectId | undefined;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, axisSpec, labelsColumnId, limit, searchQuery, searchQueryValue } = params;\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n\n let filters: PTableRecordSingleValueFilterV2[] = [];\n\n if (labelsColumnId) {\n if (searchQuery) {\n filters = [createSearchFilter(labelsColumnId, searchQuery)];\n }\n if (searchQueryValue) {\n filters = [createAxisSearchFilter(axisSpec, searchQueryValue)];\n }\n\n const { data: dataValues, axesData } = await getSingleColumnData(\n handle,\n labelsColumnId,\n filters,\n );\n const axisKeys = axesData[strAxisId];\n const values: { value: string; label: string }[] = [];\n\n for (let i = 0; i < Math.min(axisKeys.length, limit ?? axisKeys.length); i++) {\n values.push({ value: String(axisKeys[i]), label: String(dataValues[i]) });\n }\n\n values.sort(sortValuesPredicate);\n return { values, overflow: !(limit === undefined || axisKeys.length < limit) };\n } else {\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n if (searchInLabelsOrValue) {\n filters = [createAxisSearchFilter(axisSpec, searchInLabelsOrValue)];\n }\n\n const response = await getAxisUniqueValues(handle, {\n axisId: getAxisId(axisSpec),\n parentColumnIds: [columnId],\n limit,\n filters,\n });\n\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n }\n}\n\nasync function getColumnValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, limit, searchQuery, searchQueryValue } = params;\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n\n const filters: PTableRecordSingleValueFilterV2[] = searchInLabelsOrValue\n ? [createSearchFilter(columnId, searchInLabelsOrValue)]\n : [];\n\n const response = await getColumnUniqueValues(handle, columnId, limit, filters);\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n}\n\nexport async function getUniqueSourceValuesWithLabels(\n handle: PFrameHandle,\n params: GetUniqueSourceValuesParams,\n): Promise<SuggestionResponse> {\n const { columnId, axisIdx, limit, searchQuery, searchQueryValue } = params;\n\n const selectedSourceSpec = await getColumnSpecById(handle, columnId);\n if (selectedSourceSpec == null || selectedSourceSpec.kind !== \"PColumn\") {\n return { values: [], overflow: false };\n }\n\n // Try to get discrete values from annotation\n const discreteValues = getDiscreteValuesFromAnnotation(selectedSourceSpec);\n if (discreteValues != null) {\n return discreteValues;\n }\n\n // Handle axis values\n if (axisIdx != null) {\n const axisSpec = selectedSourceSpec.axesSpec[axisIdx];\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(handle, strAxisId);\n\n return getAxisValuesWithLabels(handle, {\n columnId,\n axisSpec,\n labelsColumnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n }\n\n // Handle column values\n return getColumnValuesWithLabels(handle, {\n columnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/pframe_utils/index.ts"],"sourcesContent":["import { flatten, uniq } from \"es-toolkit\";\n\nimport type {\n AxisSpec,\n CalculateTableDataRequest,\n PColumnSpec,\n PFrameHandle,\n PTableVector,\n UniqueValuesRequest,\n AxisId,\n CanonicalizedJson,\n FindColumnsRequest,\n FindColumnsResponse,\n FullPTableColumnData,\n PColumnIdAndSpec,\n PObjectId,\n PTableRecordSingleValueFilterV2,\n ValueType,\n} from \"@milaboratories/pl-model-common\";\nimport {\n pTableValue,\n Annotation,\n canonicalizeAxisId,\n getAxisId,\n readAnnotation,\n PColumnName,\n} from \"@milaboratories/pl-model-common\";\n\nexport * from \"./columns\";\n\n// Types\ntype PValue = string | number | null;\n\ntype SuggestionResponse = {\n values: {\n value: string;\n label: string;\n }[];\n overflow: boolean;\n};\n\ntype SingleColumnData = {\n axesData: Record<string, PValue[]>;\n data: PValue[];\n};\n\ntype UniqueValuesResponse = {\n values: string[];\n overflow: boolean;\n};\n\ntype GetUniqueSourceValuesParams = {\n columnId: PObjectId;\n axisIdx?: number;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n};\n\ntype GetAxisUniqueValuesParams = {\n axisId: AxisId;\n parentColumnIds: PObjectId[];\n limit?: number;\n filters?: PTableRecordSingleValueFilterV2[];\n};\n\ntype GetColumnsFullParams = {\n selectedSources: PObjectId[];\n strictlyCompatible: boolean;\n types?: ValueType[];\n names?: string[];\n annotations?: FindColumnsRequest[\"columnFilter\"][\"annotationValue\"];\n annotationsNotEmpty?: string[];\n};\n\n// Constants\nconst UNIQUE_VALUES_LIMIT = 1000000;\n\n// Helper functions\nconst sortValuesPredicate = (a: { label: string }, b: { label: string }) =>\n a.label.localeCompare(b.label, \"en\", { numeric: true });\n\nfunction convertColumnData(type: ValueType, response: PTableVector): PValue[] {\n if (type === \"String\") {\n return response.data as PValue[];\n }\n const res: PValue[] = new Array(response.data.length);\n for (let i = 0; i < response.data.length; i++) {\n res[i] = pTableValue(response, i) as PValue;\n }\n return res;\n}\n\nfunction createSearchFilter(\n columnId: PObjectId,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"column\",\n id: columnId,\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction createAxisSearchFilter(\n axisSpec: AxisSpec,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"axis\",\n id: {\n type: axisSpec.type,\n name: axisSpec.name,\n },\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction mapValuesToSuggestions(values: string[]): { value: string; label: string }[] {\n return values.map((v) => ({ value: String(v), label: String(v) })).sort(sortValuesPredicate);\n}\n\nfunction getPFrameDriver() {\n if (typeof platforma === \"undefined\") {\n throw new Error(\"Platforma instance is not available\");\n }\n if (typeof platforma.pFrameDriver === \"undefined\") {\n throw new Error(\"PFrame driver is not available in the current Platforma instance\");\n }\n return platforma.pFrameDriver;\n}\n\n// Core functions\nexport async function getColumnSpecById(\n handle: PFrameHandle,\n id: PObjectId,\n): Promise<PColumnSpec | null> {\n try {\n const response = await getPFrameDriver().getColumnSpec(handle, id);\n return response ?? null;\n } catch (err) {\n console.error(\"PFrame: get single column error\", err);\n return null;\n }\n}\n\nexport async function getSingleColumnData(\n handle: PFrameHandle,\n id: PObjectId,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<SingleColumnData> {\n try {\n const response: FullPTableColumnData[] = await getPFrameDriver().calculateTableData(handle, {\n src: {\n type: \"column\",\n column: id,\n },\n filters,\n sorting: [],\n } as CalculateTableDataRequest<PObjectId>);\n\n const axes = response.filter((item) => item.spec.type === \"axis\");\n const columns = response.filter((item) => item.spec.type === \"column\");\n\n return {\n axesData: axes.reduce((res: Record<string, PValue[]>, item) => {\n const id = getAxisId(item.spec.spec as AxisSpec);\n res[canonicalizeAxisId(id)] = convertColumnData(id.type, item.data);\n return res;\n }, {}),\n data: columns.length ? convertColumnData(columns[0].data.type, columns[0].data) : [],\n };\n } catch (err) {\n console.error(\"PFrame: calculateTableData error\");\n throw err;\n }\n}\n\nexport async function getColumnUniqueValues(\n handle: PFrameHandle,\n id: PObjectId,\n limit = UNIQUE_VALUES_LIMIT,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<UniqueValuesResponse> {\n const request: UniqueValuesRequest = {\n columnId: id,\n filters,\n limit,\n };\n\n try {\n const response = await getPFrameDriver().getUniqueValues(handle, request);\n if (response.overflow) {\n console.warn(`More than ${limit} values for ${id} column`);\n }\n return {\n values: Array.from(response.values.data as ArrayLike<unknown>).map(String),\n overflow: response.overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for column error\");\n throw err;\n }\n}\n\nexport async function getAxisUniqueValues(\n handle: PFrameHandle,\n params: GetAxisUniqueValuesParams,\n): Promise<UniqueValuesResponse> {\n const { axisId, parentColumnIds, limit = UNIQUE_VALUES_LIMIT, filters = [] } = params;\n const strAxisId = canonicalizeAxisId(axisId);\n\n const parentsSpecs = (await Promise.all(parentColumnIds.map((p) => getColumnSpecById(handle, p))))\n .flatMap((spec, i): [PObjectId, PColumnSpec][] =>\n spec != null && spec.kind === \"PColumn\" ? [[parentColumnIds[i], spec]] : [],\n )\n .filter(([_, spec]) =>\n spec.axesSpec.some((axisSpec) => canonicalizeAxisId(getAxisId(axisSpec)) === strAxisId),\n );\n\n if (parentsSpecs.length === 0) {\n console.warn(\"Axis unique values requested without parent columns\");\n return { values: [], overflow: false };\n }\n\n try {\n const responses = await Promise.all(\n parentsSpecs.map(([id]) =>\n getPFrameDriver().getUniqueValues(handle, {\n columnId: id,\n axis: axisId,\n filters,\n limit,\n }),\n ),\n );\n\n const overflow = responses.some((r) => r.overflow);\n return {\n values: uniq(\n flatten(responses.map((r) => Array.from(r.values.data as ArrayLike<unknown>).map(String))),\n ),\n overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for axis error\", err);\n return { values: [], overflow: false };\n }\n}\n\nexport async function getRequestColumnsFromSelectedSources(\n handle: PFrameHandle,\n sources: PObjectId[],\n): Promise<AxisId[]> {\n const result: AxisId[] = [];\n for (const item of sources) {\n const spec = await getColumnSpecById(handle, item);\n if (spec?.kind === \"PColumn\") {\n result.push(...spec.axesSpec.map((spec) => getAxisId(spec)));\n }\n }\n return result;\n}\n\nexport async function getColumnsFull(\n handle: PFrameHandle,\n params: GetColumnsFullParams,\n): Promise<PColumnIdAndSpec[]> {\n const { selectedSources, strictlyCompatible, types, names, annotations, annotationsNotEmpty } =\n params;\n\n try {\n const request: FindColumnsRequest = {\n columnFilter: {\n type: types,\n name: names,\n annotationValue: annotations,\n annotationPattern: annotationsNotEmpty?.reduce(\n (res, v) => {\n res[v] = \".+\";\n return res;\n },\n {} as Record<string, string>,\n ),\n },\n compatibleWith: await getRequestColumnsFromSelectedSources(handle, selectedSources),\n strictlyCompatible,\n };\n\n const response: FindColumnsResponse = await getPFrameDriver().findColumns(handle, request);\n return response.hits;\n } catch (err) {\n console.error(\"PFrame: findColumns error\");\n throw err;\n }\n}\n\nexport async function getColumnOrAxisValueLabelsId(\n handle: PFrameHandle,\n strAxisId: CanonicalizedJson<AxisId>,\n): Promise<undefined | PObjectId> {\n const labelColumns = await getColumnsFull(handle, {\n selectedSources: [],\n strictlyCompatible: false,\n names: [PColumnName.Label],\n });\n\n const labelColumn = labelColumns.find(({ spec }) => {\n return spec && spec.axesSpec.length === 1 && canonicalizeAxisId(spec.axesSpec[0]) === strAxisId;\n });\n\n return labelColumn?.columnId;\n}\n\nfunction getDiscreteValuesFromAnnotation(columnSpec: PColumnSpec): undefined | SuggestionResponse {\n const discreteValuesStr = readAnnotation(columnSpec, Annotation.DiscreteValues);\n if (!discreteValuesStr) {\n return undefined;\n }\n\n try {\n const discreteValues: string[] = (JSON.parse(discreteValuesStr) as (string | number)[]).map(\n (v) => String(v),\n );\n const values = discreteValues.map((v) => ({ value: v, label: v })).sort(sortValuesPredicate);\n return { values, overflow: false };\n } catch {\n console.error(`Parsing error: discrete values annotation ${discreteValuesStr}`);\n return undefined;\n }\n}\n\nasync function getAxisValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n axisSpec: AxisSpec;\n labelsColumnId: PObjectId | undefined;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, axisSpec, labelsColumnId, limit, searchQuery, searchQueryValue } = params;\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n\n let filters: PTableRecordSingleValueFilterV2[] = [];\n\n if (labelsColumnId) {\n if (searchQuery) {\n filters = [createSearchFilter(labelsColumnId, searchQuery)];\n }\n if (searchQueryValue) {\n filters = [createAxisSearchFilter(axisSpec, searchQueryValue)];\n }\n\n const { data: dataValues, axesData } = await getSingleColumnData(\n handle,\n labelsColumnId,\n filters,\n );\n const axisKeys = axesData[strAxisId];\n const values: { value: string; label: string }[] = [];\n\n for (let i = 0; i < Math.min(axisKeys.length, limit ?? axisKeys.length); i++) {\n values.push({ value: String(axisKeys[i]), label: String(dataValues[i]) });\n }\n\n values.sort(sortValuesPredicate);\n return { values, overflow: !(limit === undefined || axisKeys.length < limit) };\n } else {\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n if (searchInLabelsOrValue) {\n filters = [createAxisSearchFilter(axisSpec, searchInLabelsOrValue)];\n }\n\n const response = await getAxisUniqueValues(handle, {\n axisId: getAxisId(axisSpec),\n parentColumnIds: [columnId],\n limit,\n filters,\n });\n\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n }\n}\n\nasync function getColumnValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, limit, searchQuery, searchQueryValue } = params;\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n\n const filters: PTableRecordSingleValueFilterV2[] = searchInLabelsOrValue\n ? [createSearchFilter(columnId, searchInLabelsOrValue)]\n : [];\n\n const response = await getColumnUniqueValues(handle, columnId, limit, filters);\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n}\n\nexport async function getUniqueSourceValuesWithLabels(\n handle: PFrameHandle,\n params: GetUniqueSourceValuesParams,\n): Promise<SuggestionResponse> {\n const { columnId, axisIdx, limit, searchQuery, searchQueryValue } = params;\n\n const selectedSourceSpec = await getColumnSpecById(handle, columnId);\n if (selectedSourceSpec == null || selectedSourceSpec.kind !== \"PColumn\") {\n return { values: [], overflow: false };\n }\n\n // Try to get discrete values from annotation\n const discreteValues = getDiscreteValuesFromAnnotation(selectedSourceSpec);\n if (discreteValues != null) {\n return discreteValues;\n }\n\n // Handle axis values\n if (axisIdx != null) {\n const axisSpec = selectedSourceSpec.axesSpec[axisIdx];\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(handle, strAxisId);\n\n return getAxisValuesWithLabels(handle, {\n columnId,\n axisSpec,\n labelsColumnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n }\n\n // Handle column values\n return getColumnValuesWithLabels(handle, {\n columnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n}\n"],"mappings":"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"}
|