@platforma-sdk/model 1.79.24 → 1.80.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/block_model.d.ts +2 -0
- package/dist/block_model.d.ts.map +1 -1
- package/dist/columns/column.cjs +28 -0
- package/dist/columns/column.cjs.map +1 -0
- package/dist/columns/column.d.ts +30 -0
- package/dist/columns/column.d.ts.map +1 -0
- package/dist/columns/column.js +27 -0
- package/dist/columns/column.js.map +1 -0
- package/dist/columns/column_lazy.cjs +248 -0
- package/dist/columns/column_lazy.cjs.map +1 -0
- package/dist/columns/column_lazy.d.ts +137 -0
- package/dist/columns/column_lazy.d.ts.map +1 -0
- package/dist/columns/column_lazy.js +245 -0
- package/dist/columns/column_lazy.js.map +1 -0
- package/dist/columns/column_providers/index.cjs +62 -0
- package/dist/columns/column_providers/index.cjs.map +1 -0
- package/dist/columns/column_providers/index.d.ts +30 -0
- package/dist/columns/column_providers/index.d.ts.map +1 -0
- package/dist/columns/column_providers/index.js +53 -0
- package/dist/columns/column_providers/index.js.map +1 -0
- package/dist/columns/column_providers/providers.cjs +123 -0
- package/dist/columns/column_providers/providers.cjs.map +1 -0
- package/dist/columns/column_providers/providers.d.ts +75 -0
- package/dist/columns/column_providers/providers.d.ts.map +1 -0
- package/dist/columns/column_providers/providers.js +118 -0
- package/dist/columns/column_providers/providers.js.map +1 -0
- package/dist/columns/column_providers/types.d.ts +23 -0
- package/dist/columns/column_providers/types.d.ts.map +1 -0
- package/dist/columns/column_recipes/column_discovered_recipe.cjs +180 -0
- package/dist/columns/column_recipes/column_discovered_recipe.cjs.map +1 -0
- package/dist/columns/column_recipes/column_discovered_recipe.d.ts +120 -0
- package/dist/columns/column_recipes/column_discovered_recipe.d.ts.map +1 -0
- package/dist/columns/column_recipes/column_discovered_recipe.js +180 -0
- package/dist/columns/column_recipes/column_discovered_recipe.js.map +1 -0
- package/dist/columns/column_recipes/column_filtered_recipe.cjs +133 -0
- package/dist/columns/column_recipes/column_filtered_recipe.cjs.map +1 -0
- package/dist/columns/column_recipes/column_filtered_recipe.d.ts +75 -0
- package/dist/columns/column_recipes/column_filtered_recipe.d.ts.map +1 -0
- package/dist/columns/column_recipes/column_filtered_recipe.js +133 -0
- package/dist/columns/column_recipes/column_filtered_recipe.js.map +1 -0
- package/dist/columns/column_recipes/column_overrided_recipe.cjs +101 -0
- package/dist/columns/column_recipes/column_overrided_recipe.cjs.map +1 -0
- package/dist/columns/column_recipes/column_overrided_recipe.d.ts +73 -0
- package/dist/columns/column_recipes/column_overrided_recipe.d.ts.map +1 -0
- package/dist/columns/column_recipes/column_overrided_recipe.js +101 -0
- package/dist/columns/column_recipes/column_overrided_recipe.js.map +1 -0
- package/dist/columns/column_recipes/index.cjs +72 -0
- package/dist/columns/column_recipes/index.cjs.map +1 -0
- package/dist/columns/column_recipes/index.d.ts +52 -0
- package/dist/columns/column_recipes/index.d.ts.map +1 -0
- package/dist/columns/column_recipes/index.js +68 -0
- package/dist/columns/column_recipes/index.js.map +1 -0
- package/dist/columns/column_recipes/leaf_rebrand.cjs +22 -0
- package/dist/columns/column_recipes/leaf_rebrand.cjs.map +1 -0
- package/dist/columns/column_recipes/leaf_rebrand.js +22 -0
- package/dist/columns/column_recipes/leaf_rebrand.js.map +1 -0
- package/dist/columns/column_recipes/types.d.ts +101 -0
- package/dist/columns/column_recipes/types.d.ts.map +1 -0
- package/dist/columns/columns_collection.cjs +124 -0
- package/dist/columns/columns_collection.cjs.map +1 -0
- package/dist/columns/columns_collection.d.ts +64 -0
- package/dist/columns/columns_collection.d.ts.map +1 -0
- package/dist/columns/columns_collection.js +122 -0
- package/dist/columns/columns_collection.js.map +1 -0
- package/dist/columns/derive_axis_values_labels.cjs +76 -0
- package/dist/columns/derive_axis_values_labels.cjs.map +1 -0
- package/dist/columns/derive_axis_values_labels.d.ts +30 -0
- package/dist/columns/derive_axis_values_labels.d.ts.map +1 -0
- package/dist/columns/derive_axis_values_labels.js +76 -0
- package/dist/columns/derive_axis_values_labels.js.map +1 -0
- package/dist/columns/expand_by_partition.cjs +53 -56
- package/dist/columns/expand_by_partition.cjs.map +1 -1
- package/dist/columns/expand_by_partition.d.ts +22 -18
- package/dist/columns/expand_by_partition.d.ts.map +1 -1
- package/dist/columns/expand_by_partition.js +55 -58
- package/dist/columns/expand_by_partition.js.map +1 -1
- package/dist/columns/index.cjs +44 -18
- package/dist/columns/index.d.ts +15 -7
- package/dist/columns/index.js +12 -6
- package/dist/columns/utils.cjs +186 -0
- package/dist/columns/utils.cjs.map +1 -0
- package/dist/columns/utils.d.ts +96 -0
- package/dist/columns/utils.d.ts.map +1 -0
- package/dist/columns/utils.js +179 -0
- package/dist/columns/utils.js.map +1 -0
- package/dist/components/PFrameForGraphs.cjs +1 -0
- package/dist/components/PFrameForGraphs.cjs.map +1 -1
- package/dist/components/PFrameForGraphs.d.ts +1 -1
- package/dist/components/PFrameForGraphs.d.ts.map +1 -1
- package/dist/components/PFrameForGraphs.js +1 -0
- package/dist/components/PFrameForGraphs.js.map +1 -1
- package/dist/components/PlDataTable/columnResolver.cjs +28 -0
- package/dist/components/PlDataTable/columnResolver.cjs.map +1 -0
- package/dist/components/PlDataTable/columnResolver.js +28 -0
- package/dist/components/PlDataTable/columnResolver.js.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs +4 -2
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js +4 -2
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs +20 -25
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js +20 -25
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs +58 -26
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js +60 -28
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs +224 -194
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +13 -16
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js +228 -198
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs +40 -98
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts +17 -8
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js +40 -98
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/index.cjs +1 -1
- package/dist/components/PlDataTable/createPlDataTable/index.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/index.d.ts +2 -2
- package/dist/components/PlDataTable/createPlDataTable/index.js +2 -2
- package/dist/components/PlDataTable/createPlDataTable/index.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.cjs +51 -169
- package/dist/components/PlDataTable/createPlDataTable/utils.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.d.ts +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.js +52 -166
- package/dist/components/PlDataTable/createPlDataTable/utils.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTableSheet.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTableSheet.d.ts +1 -1
- package/dist/components/PlDataTable/createPlDataTableSheet.js.map +1 -1
- package/dist/components/PlDataTable/index.cjs +1 -1
- package/dist/components/PlDataTable/index.d.ts +4 -4
- package/dist/components/PlDataTable/index.js +2 -2
- package/dist/components/PlDataTable/labels.cjs +0 -1
- package/dist/components/PlDataTable/labels.cjs.map +1 -1
- package/dist/components/PlDataTable/labels.js +0 -1
- package/dist/components/PlDataTable/labels.js.map +1 -1
- package/dist/components/PlDataTable/state-migration.cjs +107 -10
- package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
- package/dist/components/PlDataTable/state-migration.d.ts +5 -4
- package/dist/components/PlDataTable/state-migration.d.ts.map +1 -1
- package/dist/components/PlDataTable/state-migration.js +107 -10
- package/dist/components/PlDataTable/state-migration.js.map +1 -1
- package/dist/components/PlDataTable/typesV7.d.ts +1 -36
- package/dist/components/PlDataTable/typesV7.d.ts.map +1 -1
- package/dist/components/PlDataTable/typesV8.d.ts +123 -0
- package/dist/components/PlDataTable/typesV8.d.ts.map +1 -0
- package/dist/components/PlDatasetSelector/build_dataset_options.cjs +27 -34
- package/dist/components/PlDatasetSelector/build_dataset_options.cjs.map +1 -1
- package/dist/components/PlDatasetSelector/build_dataset_options.d.ts.map +1 -1
- package/dist/components/PlDatasetSelector/build_dataset_options.js +27 -34
- package/dist/components/PlDatasetSelector/build_dataset_options.js.map +1 -1
- package/dist/components/PlDatasetSelector/enrichment_discovery.cjs +28 -33
- package/dist/components/PlDatasetSelector/enrichment_discovery.cjs.map +1 -1
- package/dist/components/PlDatasetSelector/enrichment_discovery.js +29 -34
- package/dist/components/PlDatasetSelector/enrichment_discovery.js.map +1 -1
- package/dist/components/PlDatasetSelector/filter_discovery.cjs +27 -17
- package/dist/components/PlDatasetSelector/filter_discovery.cjs.map +1 -1
- package/dist/components/PlDatasetSelector/filter_discovery.d.ts +24 -10
- package/dist/components/PlDatasetSelector/filter_discovery.d.ts.map +1 -1
- package/dist/components/PlDatasetSelector/filter_discovery.js +28 -18
- package/dist/components/PlDatasetSelector/filter_discovery.js.map +1 -1
- package/dist/components/PlDatasetSelector/index.d.ts +2 -2
- package/dist/components/index.cjs +1 -1
- package/dist/components/index.d.ts +5 -5
- package/dist/components/index.js +2 -2
- package/dist/filters/converters/filterToQuery.cjs +5 -6
- package/dist/filters/converters/filterToQuery.cjs.map +1 -1
- package/dist/filters/converters/filterToQuery.d.ts +12 -3
- package/dist/filters/converters/filterToQuery.d.ts.map +1 -1
- package/dist/filters/converters/filterToQuery.js +5 -6
- package/dist/filters/converters/filterToQuery.js.map +1 -1
- package/dist/filters/converters/index.d.ts +2 -2
- package/dist/filters/index.d.ts +2 -2
- package/dist/index.cjs +64 -35
- package/dist/index.d.ts +23 -15
- package/dist/index.js +15 -9
- package/dist/labels/derive_distinct_labels.cjs.map +1 -1
- package/dist/labels/derive_distinct_labels.d.ts +1 -2
- package/dist/labels/derive_distinct_labels.d.ts.map +1 -1
- package/dist/labels/derive_distinct_labels.js.map +1 -1
- package/dist/labels/derive_distinct_tooltips.cjs +1 -1
- package/dist/labels/derive_distinct_tooltips.cjs.map +1 -1
- package/dist/labels/derive_distinct_tooltips.d.ts +6 -3
- package/dist/labels/derive_distinct_tooltips.d.ts.map +1 -1
- package/dist/labels/derive_distinct_tooltips.js +1 -1
- package/dist/labels/derive_distinct_tooltips.js.map +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.js +1 -1
- package/dist/pframe_utils/axes.cjs.map +1 -1
- package/dist/pframe_utils/axes.d.ts +2 -2
- package/dist/pframe_utils/axes.d.ts.map +1 -1
- package/dist/pframe_utils/axes.js.map +1 -1
- package/dist/pframe_utils/columns.cjs +6 -10
- package/dist/pframe_utils/columns.cjs.map +1 -1
- package/dist/pframe_utils/columns.d.ts +4 -4
- package/dist/pframe_utils/columns.d.ts.map +1 -1
- package/dist/pframe_utils/columns.js +7 -11
- package/dist/pframe_utils/columns.js.map +1 -1
- package/dist/pframe_utils/index.cjs.map +1 -1
- package/dist/pframe_utils/index.d.ts +1 -1
- package/dist/pframe_utils/index.d.ts.map +1 -1
- package/dist/pframe_utils/index.js.map +1 -1
- package/dist/render/accessor.cjs +15 -16
- package/dist/render/accessor.cjs.map +1 -1
- package/dist/render/accessor.d.ts +7 -10
- package/dist/render/accessor.d.ts.map +1 -1
- package/dist/render/accessor.js +15 -16
- package/dist/render/accessor.js.map +1 -1
- package/dist/render/api.cjs +34 -36
- package/dist/render/api.cjs.map +1 -1
- package/dist/render/api.d.ts +30 -20
- package/dist/render/api.d.ts.map +1 -1
- package/dist/render/api.js +35 -38
- package/dist/render/api.js.map +1 -1
- package/dist/render/index.cjs +4 -0
- package/dist/render/index.d.ts +4 -4
- package/dist/render/index.js +3 -2
- package/dist/render/internal.cjs +3 -2
- package/dist/render/internal.cjs.map +1 -1
- package/dist/render/internal.d.ts +17 -9
- package/dist/render/internal.d.ts.map +1 -1
- package/dist/render/internal.js +3 -2
- package/dist/render/internal.js.map +1 -1
- package/dist/render/util/axis_filtering.cjs.map +1 -1
- package/dist/render/util/axis_filtering.js.map +1 -1
- package/dist/render/util/column_collection.cjs +6 -4
- package/dist/render/util/column_collection.cjs.map +1 -1
- package/dist/render/util/column_collection.d.ts +9 -9
- package/dist/render/util/column_collection.d.ts.map +1 -1
- package/dist/render/util/column_collection.js +6 -4
- package/dist/render/util/column_collection.js.map +1 -1
- package/dist/render/util/index.d.ts +2 -2
- package/dist/render/util/pcolumn_data.cjs +1 -1
- package/dist/render/util/pcolumn_data.cjs.map +1 -1
- package/dist/render/util/pcolumn_data.d.ts +3 -3
- package/dist/render/util/pcolumn_data.d.ts.map +1 -1
- package/dist/render/util/pcolumn_data.js +1 -1
- package/dist/render/util/pcolumn_data.js.map +1 -1
- package/dist/services/block_services.cjs +2 -1
- package/dist/services/block_services.cjs.map +1 -1
- package/dist/services/block_services.d.ts +1 -0
- package/dist/services/block_services.d.ts.map +1 -1
- package/dist/services/block_services.js +2 -1
- package/dist/services/block_services.js.map +1 -1
- package/dist/services/get_services.cjs +2 -2
- package/dist/services/get_services.cjs.map +1 -1
- package/dist/services/get_services.d.ts +4 -1
- package/dist/services/get_services.d.ts.map +1 -1
- package/dist/services/get_services.js +2 -2
- package/dist/services/get_services.js.map +1 -1
- package/package.json +9 -7
- package/src/columns/__test_helpers__/collection_driver.ts +197 -0
- package/src/columns/__test_helpers__/stub_registry.ts +134 -0
- package/src/columns/column.ts +46 -0
- package/src/columns/column_lazy.test.ts +201 -0
- package/src/columns/column_lazy.ts +311 -0
- package/src/columns/column_providers/index.ts +78 -0
- package/src/columns/column_providers/providers.ts +193 -0
- package/src/columns/column_providers/types.ts +24 -0
- package/src/columns/column_recipes/column_discovered_recipe.ts +231 -0
- package/src/columns/column_recipes/column_filtered_recipe.ts +184 -0
- package/src/columns/column_recipes/column_overrided_recipe.ts +146 -0
- package/src/columns/column_recipes/column_recipes.test.ts +681 -0
- package/src/columns/column_recipes/index.ts +127 -0
- package/src/columns/column_recipes/leaf_rebrand.ts +28 -0
- package/src/columns/column_recipes/types.ts +113 -0
- package/src/columns/columns_collection.test.ts +164 -0
- package/src/columns/columns_collection.ts +170 -0
- package/src/columns/derive_axis_values_labels.ts +98 -0
- package/src/columns/expand_by_partition.test.ts +146 -110
- package/src/columns/expand_by_partition.ts +72 -84
- package/src/columns/index.ts +7 -5
- package/src/columns/utils.test.ts +249 -0
- package/src/columns/utils.ts +226 -0
- package/src/components/PFrameForGraphs.ts +3 -1
- package/src/components/PlAnnotations/filters_ui.test.ts +46 -47
- package/src/components/PlDataTable/columnResolver.test.ts +122 -0
- package/src/components/PlDataTable/columnResolver.ts +57 -0
- package/src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts +9 -9
- package/src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts +31 -63
- package/src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts +85 -58
- package/src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts +316 -354
- package/src/components/PlDataTable/createPlDataTable/discoverColumns.ts +48 -144
- package/src/components/PlDataTable/createPlDataTable/index.ts +2 -2
- package/src/components/PlDataTable/createPlDataTable/utils.test.ts +60 -69
- package/src/components/PlDataTable/createPlDataTable/utils.ts +65 -173
- package/src/components/PlDataTable/createPlDataTableSheet.ts +1 -1
- package/src/components/PlDataTable/index.ts +4 -2
- package/src/components/PlDataTable/labels.ts +4 -33
- package/src/components/PlDataTable/state-migration.ts +151 -22
- package/src/components/PlDataTable/typesV8.ts +188 -0
- package/src/components/PlDatasetSelector/build_dataset_options.ts +35 -60
- package/src/components/PlDatasetSelector/enrichment_discovery.ts +65 -61
- package/src/components/PlDatasetSelector/filter_discovery.test.ts +110 -72
- package/src/components/PlDatasetSelector/filter_discovery.ts +51 -31
- package/src/filters/converters/filterToQuery.test.ts +15 -8
- package/src/filters/converters/filterToQuery.ts +22 -9
- package/src/filters/converters/filterUiToExpressionImpl.test.ts +35 -36
- package/src/labels/derive_distinct_labels.ts +1 -1
- package/src/labels/derive_distinct_tooltips.test.ts +7 -4
- package/src/labels/derive_distinct_tooltips.ts +3 -3
- package/src/pframe_utils/axes.ts +2 -2
- package/src/pframe_utils/columns.ts +14 -23
- package/src/pframe_utils/index.ts +1 -1
- package/src/render/accessor.ts +35 -38
- package/src/render/api.ts +45 -61
- package/src/render/index.ts +2 -1
- package/src/render/internal.ts +43 -10
- package/src/render/util/axis_filtering.ts +0 -1
- package/src/render/util/column_collection.ts +17 -17
- package/src/render/util/pcolumn_data.ts +5 -9
- package/src/services/block_services.ts +1 -0
- package/src/services/get_services.ts +5 -2
- package/dist/columns/column_collection_builder.cjs +0 -241
- package/dist/columns/column_collection_builder.cjs.map +0 -1
- package/dist/columns/column_collection_builder.d.ts +0 -119
- package/dist/columns/column_collection_builder.d.ts.map +0 -1
- package/dist/columns/column_collection_builder.js +0 -241
- package/dist/columns/column_collection_builder.js.map +0 -1
- package/dist/columns/column_selector.cjs +0 -49
- package/dist/columns/column_selector.cjs.map +0 -1
- package/dist/columns/column_selector.d.ts +0 -33
- package/dist/columns/column_selector.d.ts.map +0 -1
- package/dist/columns/column_selector.js +0 -47
- package/dist/columns/column_selector.js.map +0 -1
- package/dist/columns/column_snapshot.cjs +0 -19
- package/dist/columns/column_snapshot.cjs.map +0 -1
- package/dist/columns/column_snapshot.d.ts +0 -39
- package/dist/columns/column_snapshot.d.ts.map +0 -1
- package/dist/columns/column_snapshot.js +0 -18
- package/dist/columns/column_snapshot.js.map +0 -1
- package/dist/columns/column_snapshot_provider.cjs +0 -137
- package/dist/columns/column_snapshot_provider.cjs.map +0 -1
- package/dist/columns/column_snapshot_provider.d.ts +0 -74
- package/dist/columns/column_snapshot_provider.d.ts.map +0 -1
- package/dist/columns/column_snapshot_provider.js +0 -133
- package/dist/columns/column_snapshot_provider.js.map +0 -1
- package/dist/columns/ctx_column_sources.cjs +0 -80
- package/dist/columns/ctx_column_sources.cjs.map +0 -1
- package/dist/columns/ctx_column_sources.d.ts +0 -30
- package/dist/columns/ctx_column_sources.d.ts.map +0 -1
- package/dist/columns/ctx_column_sources.js +0 -79
- package/dist/columns/ctx_column_sources.js.map +0 -1
- package/src/columns/column_collection_builder.test.ts +0 -484
- package/src/columns/column_collection_builder.ts +0 -485
- package/src/columns/column_selector.test.ts +0 -90
- package/src/columns/column_selector.ts +0 -100
- package/src/columns/column_snapshot.ts +0 -58
- package/src/columns/column_snapshot_provider.ts +0 -194
- package/src/columns/ctx_column_sources.ts +0 -99
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { PColumn, type ColumnEntriesProvider } from "@milaboratories/pl-model-common";
|
|
2
|
+
import type { GlobalCfgRenderCtx, PColumnDataUniversal } from "../../render/internal";
|
|
3
|
+
import { getCfgRenderCtx } from "../../internal";
|
|
4
|
+
import { MainAccessorName, StagingAccessorName } from "../../render/internal";
|
|
5
|
+
import { TreeNodeAccessor } from "../../render/accessor";
|
|
6
|
+
import { ColumnLazy } from "../column_lazy";
|
|
7
|
+
import type { ColumnsSource } from "./types";
|
|
8
|
+
import { ArrayColumnsProvider, ColumnsProvider } from "./providers";
|
|
9
|
+
|
|
10
|
+
export * from "./types";
|
|
11
|
+
export * from "./providers";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Build the default set of ColumnsProviders for the ambient render ctx:
|
|
15
|
+
* - `AccessorColumnsProvider` over `outputs` (if present)
|
|
16
|
+
* - `AccessorColumnsProvider` over `prerun` (if present)
|
|
17
|
+
* - `ResultPoolColumnsProvider` over `rawResultPool`
|
|
18
|
+
*
|
|
19
|
+
* Pulls handles directly from the ambient `cfgRenderCtx`. Returns `[]` when
|
|
20
|
+
* called outside a render context.
|
|
21
|
+
*
|
|
22
|
+
* Result is memoised per-ctx (WeakMap → array). Repeated calls within the
|
|
23
|
+
* same render cycle return the same provider triplet — inner providers are
|
|
24
|
+
* also LRU-memoised by their content keys, so even a cache miss here doesn't
|
|
25
|
+
* re-walk the trees.
|
|
26
|
+
*/
|
|
27
|
+
export const _ctxProvidersCache = new WeakMap<
|
|
28
|
+
GlobalCfgRenderCtx,
|
|
29
|
+
(ColumnEntriesProvider<TreeNodeAccessor> & ColumnsProvider)[]
|
|
30
|
+
>();
|
|
31
|
+
|
|
32
|
+
export function getCtxProviders(deps?: {
|
|
33
|
+
ctx?: GlobalCfgRenderCtx;
|
|
34
|
+
}): (ColumnEntriesProvider<TreeNodeAccessor> & ColumnsProvider)[] {
|
|
35
|
+
const ctx = deps?.ctx ?? getCfgRenderCtx();
|
|
36
|
+
|
|
37
|
+
const cached = _ctxProvidersCache.get(ctx);
|
|
38
|
+
if (cached !== undefined) return cached;
|
|
39
|
+
|
|
40
|
+
const providers: (ColumnEntriesProvider<TreeNodeAccessor> & ColumnsProvider)[] = [];
|
|
41
|
+
|
|
42
|
+
const outputs = ctx.getAccessorHandleByName(MainAccessorName);
|
|
43
|
+
if (outputs !== undefined) {
|
|
44
|
+
providers.push(ColumnsProvider(new TreeNodeAccessor(outputs, [MainAccessorName])));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const prerun = ctx.getAccessorHandleByName(StagingAccessorName);
|
|
48
|
+
if (prerun !== undefined) {
|
|
49
|
+
providers.push(ColumnsProvider(new TreeNodeAccessor(prerun, [StagingAccessorName])));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
providers.push(ColumnsProvider(ctx.getUpstreamBlockCtx()));
|
|
53
|
+
|
|
54
|
+
_ctxProvidersCache.set(ctx, providers);
|
|
55
|
+
return providers;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function isColumnProvider(source: unknown): source is ColumnsProvider {
|
|
59
|
+
if (typeof source !== "object" || source === null) return false;
|
|
60
|
+
const p = source as ColumnsProvider;
|
|
61
|
+
return typeof p.getColumns === "function" && typeof p.isFinal === "function";
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function toColumnProvider(source: ColumnsSource): ColumnsProvider {
|
|
65
|
+
if (isColumnArray(source)) return new ArrayColumnsProvider(source.columns, source.isFinal);
|
|
66
|
+
if (isColumnProvider(source)) return source;
|
|
67
|
+
if (source instanceof TreeNodeAccessor) return ColumnsProvider(source);
|
|
68
|
+
throw new Error("Unknown ColumnsSource type");
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function isColumnArray(source: unknown): source is {
|
|
72
|
+
readonly columns: ReadonlyArray<PColumn<undefined | PColumnDataUniversal> | ColumnLazy>;
|
|
73
|
+
readonly isFinal: boolean;
|
|
74
|
+
} {
|
|
75
|
+
if (typeof source !== "object" || source === null) return false;
|
|
76
|
+
const s = source as { columns?: unknown; isFinal?: unknown };
|
|
77
|
+
return Array.isArray(s.columns) && typeof s.isFinal === "boolean";
|
|
78
|
+
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AccessorEntriesProvider,
|
|
3
|
+
ResultPoolEntriesProvider,
|
|
4
|
+
type PColumn,
|
|
5
|
+
type UpstreamBlockCtx,
|
|
6
|
+
} from "@milaboratories/pl-model-common";
|
|
7
|
+
import { AccessorHandle, PColumnDataUniversal, TreeNodeAccessor } from "../../render";
|
|
8
|
+
import { ColumnLazy, ColumnLazyImpl } from "../column_lazy";
|
|
9
|
+
import { getCfgRenderCtx } from "../../internal";
|
|
10
|
+
import { isNil } from "es-toolkit";
|
|
11
|
+
import { LRUCache } from "lru-cache";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Data source for sandbox column-list builders. Has nothing to say about
|
|
15
|
+
* id-resolution — `ColumnRegistry` (in `@milaboratories/pl-model-common`)
|
|
16
|
+
* consumes the separate `ColumnEntriesProvider` interface for that.
|
|
17
|
+
*
|
|
18
|
+
* Same name as the factory function below — they merge into one TS
|
|
19
|
+
* declaration: `ColumnsProvider` is callable AND the interface type.
|
|
20
|
+
*/
|
|
21
|
+
export interface ColumnsProvider {
|
|
22
|
+
/** Returns all currently known PColumn columns as lazy views. */
|
|
23
|
+
getColumns(): ColumnLazy[];
|
|
24
|
+
/** Whether the provider has finished enumerating all its columns. */
|
|
25
|
+
isFinal(): boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Unified memoised factory dispatching to the right provider flavour by the
|
|
30
|
+
* source shape:
|
|
31
|
+
* - `TreeNodeAccessor` → {@link AccessorColumnsProvider}
|
|
32
|
+
* (indexed by `root.handle`, walks the accessor tree once per root).
|
|
33
|
+
* - `UpstreamBlockCtx<AccessorHandle>[]` (or omitted — pulled from the
|
|
34
|
+
* ambient ctx) → {@link ResultPoolColumnsProvider}
|
|
35
|
+
* (indexed by a content-hash of the block list).
|
|
36
|
+
*
|
|
37
|
+
* Both branches return cached instances within their LRU window, so repeated
|
|
38
|
+
* calls with the same source skip re-walking / re-hashing.
|
|
39
|
+
*/
|
|
40
|
+
export function ColumnsProvider(
|
|
41
|
+
source?: TreeNodeAccessor | ReadonlyArray<UpstreamBlockCtx<AccessorHandle>>,
|
|
42
|
+
) {
|
|
43
|
+
if (isNil(source) || Array.isArray(source)) {
|
|
44
|
+
return ResultPoolColumnsProvider(source);
|
|
45
|
+
} else if (source instanceof TreeNodeAccessor) {
|
|
46
|
+
return AccessorColumnsProvider(source);
|
|
47
|
+
} else {
|
|
48
|
+
throw new Error("Unknown columns provider source");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Memoised constructor — same `root.handle` returns the same
|
|
54
|
+
* {@link AccessorColumnsProviderImpl}, so `indexAccessorRoot` runs once per
|
|
55
|
+
* accessor root (within the LRU window).
|
|
56
|
+
*/
|
|
57
|
+
const _accessorProviderCache = new LRUCache<AccessorHandle, AccessorColumnsProviderImpl>({
|
|
58
|
+
max: 64,
|
|
59
|
+
});
|
|
60
|
+
export function AccessorColumnsProvider(root: TreeNodeAccessor): AccessorColumnsProvider {
|
|
61
|
+
let provider = _accessorProviderCache.get(root.handle);
|
|
62
|
+
if (provider === undefined) {
|
|
63
|
+
provider = new AccessorColumnsProviderImpl(root);
|
|
64
|
+
_accessorProviderCache.set(root.handle, provider);
|
|
65
|
+
}
|
|
66
|
+
return provider;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Memoised constructor — same `rawPool` content returns the same
|
|
71
|
+
* {@link ResultPoolColumnsProviderImpl}, so `indexPoolBlock` runs once per
|
|
72
|
+
* pool snapshot (within the LRU window).
|
|
73
|
+
*/
|
|
74
|
+
const _resultPoolProviderCache = new LRUCache<string, ResultPoolColumnsProviderImpl>({ max: 4 });
|
|
75
|
+
export function ResultPoolColumnsProvider(
|
|
76
|
+
rawPool: ReadonlyArray<
|
|
77
|
+
UpstreamBlockCtx<AccessorHandle>
|
|
78
|
+
> = getCfgRenderCtx().getUpstreamBlockCtx(),
|
|
79
|
+
): ResultPoolColumnsProvider {
|
|
80
|
+
const key = hashRawPool(rawPool);
|
|
81
|
+
let provider = _resultPoolProviderCache.get(key);
|
|
82
|
+
if (provider === undefined) {
|
|
83
|
+
provider = new ResultPoolColumnsProviderImpl(rawPool);
|
|
84
|
+
_resultPoolProviderCache.set(key, provider);
|
|
85
|
+
}
|
|
86
|
+
return provider;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Simple provider wrapping an array of PColumns. Sandbox-only —
|
|
91
|
+
* implements {@link ColumnsProvider} (lazy-view enumeration). It is *not* an
|
|
92
|
+
* id-index source — `ColumnRegistry` does not consume it.
|
|
93
|
+
*/
|
|
94
|
+
export class ArrayColumnsProvider implements ColumnsProvider {
|
|
95
|
+
private readonly columns: ColumnLazy[];
|
|
96
|
+
|
|
97
|
+
constructor(
|
|
98
|
+
columns: ReadonlyArray<PColumn<undefined | PColumnDataUniversal> | ColumnLazy>,
|
|
99
|
+
private readonly _isFinal: boolean,
|
|
100
|
+
) {
|
|
101
|
+
this.columns = columns.map((c) => ColumnLazyImpl.fromColumn(c));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
getColumns(): ColumnLazy[] {
|
|
105
|
+
return this.columns;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
isFinal(): boolean {
|
|
109
|
+
return this._isFinal;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Sandbox-specific provider over a {@link TreeNodeAccessor} root. Uses the
|
|
115
|
+
* accessor's own `resolvePath` as the canonical root path for id construction,
|
|
116
|
+
* and adds `getColumns()` returning {@link ColumnLazy}s on top of the generic
|
|
117
|
+
* entries index.
|
|
118
|
+
*/
|
|
119
|
+
export class AccessorColumnsProviderImpl
|
|
120
|
+
extends AccessorEntriesProvider<TreeNodeAccessor>
|
|
121
|
+
implements ColumnsProvider
|
|
122
|
+
{
|
|
123
|
+
private cachedColumns?: ColumnLazy[];
|
|
124
|
+
|
|
125
|
+
constructor(root: TreeNodeAccessor) {
|
|
126
|
+
super(root, root.resolvePath);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
getColumns(): ColumnLazy[] {
|
|
130
|
+
if (this.cachedColumns !== undefined) return this.cachedColumns;
|
|
131
|
+
return (this.cachedColumns = Array.from(this.entries.values())
|
|
132
|
+
.map((e) => ColumnLazyImpl.fromAccessor(e))
|
|
133
|
+
.filter((v): v is ColumnLazy => !isNil(v)));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** Public type alias — value of the same name is the memoised factory above. */
|
|
138
|
+
export type AccessorColumnsProvider = AccessorColumnsProviderImpl;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Sandbox-specific result-pool provider. Accepts the raw handle-shaped blocks
|
|
142
|
+
* returned by {@link GlobalCfgRenderCtxMethods.getUpstreamBlockCtx} and
|
|
143
|
+
* wraps them into {@link TreeNodeAccessor}s, then adds `getColumns()`.
|
|
144
|
+
*/
|
|
145
|
+
export class ResultPoolColumnsProviderImpl
|
|
146
|
+
extends ResultPoolEntriesProvider<TreeNodeAccessor>
|
|
147
|
+
implements ColumnsProvider
|
|
148
|
+
{
|
|
149
|
+
private cachedColumns?: ColumnLazy[];
|
|
150
|
+
|
|
151
|
+
constructor(
|
|
152
|
+
rawPool: ReadonlyArray<
|
|
153
|
+
UpstreamBlockCtx<AccessorHandle>
|
|
154
|
+
> = getCfgRenderCtx().getUpstreamBlockCtx(),
|
|
155
|
+
) {
|
|
156
|
+
const blocks = rawPool.map((b) => ({
|
|
157
|
+
blockId: b.blockId,
|
|
158
|
+
prodCtx:
|
|
159
|
+
b.prodCtx !== undefined
|
|
160
|
+
? new TreeNodeAccessor(b.prodCtx, [b.blockId, "prodCtx"])
|
|
161
|
+
: undefined,
|
|
162
|
+
stagingCtx:
|
|
163
|
+
b.stagingCtx !== undefined
|
|
164
|
+
? new TreeNodeAccessor(b.stagingCtx, [b.blockId, "stagingCtx"])
|
|
165
|
+
: undefined,
|
|
166
|
+
prodIncomplete: b.prodIncomplete,
|
|
167
|
+
stagingIncomplete: b.stagingIncomplete,
|
|
168
|
+
}));
|
|
169
|
+
|
|
170
|
+
super(blocks);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
getColumns(): ColumnLazy[] {
|
|
174
|
+
if (this.cachedColumns !== undefined) return this.cachedColumns;
|
|
175
|
+
return (this.cachedColumns = Array.from(this.getPObjectEntries().values())
|
|
176
|
+
.map((e) => ColumnLazyImpl.fromAccessor(e))
|
|
177
|
+
.filter((v): v is ColumnLazy => !isNil(v)));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/** Public type alias — value of the same name is the memoised factory above. */
|
|
182
|
+
export type ResultPoolColumnsProvider = ResultPoolColumnsProviderImpl;
|
|
183
|
+
|
|
184
|
+
function hashRawPool(rawPool: ReadonlyArray<UpstreamBlockCtx<AccessorHandle>>): string {
|
|
185
|
+
return rawPool
|
|
186
|
+
.map(
|
|
187
|
+
(b) =>
|
|
188
|
+
`${b.blockId}\x1f${b.prodCtx ?? ""}\x1f${b.stagingCtx ?? ""}\x1f${
|
|
189
|
+
b.prodIncomplete ? 1 : 0
|
|
190
|
+
}\x1f${b.stagingIncomplete ? 1 : 0}`,
|
|
191
|
+
)
|
|
192
|
+
.join("\x1e");
|
|
193
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { PColumn } from "@milaboratories/pl-model-common";
|
|
2
|
+
import { TreeNodeAccessor } from "../../render";
|
|
3
|
+
import type { PColumnDataUniversal } from "../../render/internal";
|
|
4
|
+
import type { ColumnLazy } from "../column_lazy";
|
|
5
|
+
import type { ColumnRecipe } from "../column_recipes";
|
|
6
|
+
import type { ColumnsProvider } from "./providers";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Union of types that can serve as column sources for helpers and builders.
|
|
10
|
+
* Includes TreeNodeAccessor, ColumnsProvider, and arrays of columns.
|
|
11
|
+
*
|
|
12
|
+
* The array form accepts plain {@link PColumn}s (materialized snapshots),
|
|
13
|
+
* {@link ColumnLazy} leaves, or any {@link ColumnRecipe} — builders only
|
|
14
|
+
* need each entry's `id` for serialization.
|
|
15
|
+
*/
|
|
16
|
+
export type ColumnsSource =
|
|
17
|
+
| ColumnsProvider
|
|
18
|
+
| TreeNodeAccessor
|
|
19
|
+
| {
|
|
20
|
+
readonly columns: ReadonlyArray<
|
|
21
|
+
PColumn<undefined | PColumnDataUniversal> | ColumnLazy | ColumnRecipe
|
|
22
|
+
>;
|
|
23
|
+
readonly isFinal: boolean;
|
|
24
|
+
};
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import {
|
|
2
|
+
distillColumnDiscoveredKey,
|
|
3
|
+
extractPObjectId,
|
|
4
|
+
stringifyColumnDiscoveredId,
|
|
5
|
+
type AxisQualification,
|
|
6
|
+
type ColumnDiscoveredId,
|
|
7
|
+
type ColumnDiscoveredKey,
|
|
8
|
+
type ColumnUniversalId,
|
|
9
|
+
type PColumnSpec,
|
|
10
|
+
type PObjectId,
|
|
11
|
+
type SpecOverrides,
|
|
12
|
+
type SpecQuery,
|
|
13
|
+
} from "@milaboratories/pl-model-common";
|
|
14
|
+
import type { GlobalCfgRenderCtx } from "../../render/internal";
|
|
15
|
+
import type { ColumnFieldStatus, ColumnResolutionStatus } from "./types";
|
|
16
|
+
import { ColumnRecipe } from "./index";
|
|
17
|
+
import { ColumnOverriddenRecipe } from "./column_overrided_recipe";
|
|
18
|
+
import { Column } from "../column";
|
|
19
|
+
import { rebrandLeafId } from "./leaf_rebrand";
|
|
20
|
+
import { throwError } from "@milaboratories/helpers";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Recipe for columns identified by a {@link ColumnDiscoveredKey}: a base
|
|
24
|
+
* column + a `path` of linkers + qualifications.
|
|
25
|
+
*
|
|
26
|
+
* Specifics:
|
|
27
|
+
* - References more than one column (`column` + each `path[i].column`);
|
|
28
|
+
* {@link getDataStatus} aggregates across the whole set.
|
|
29
|
+
* - {@link getQuery} assembles the {@link SpecQuery} locally
|
|
30
|
+
* ({@link buildSpecQuery}) — the hit is inlined as its own recipe's query
|
|
31
|
+
* tree, linkers fold inside-out into nested `linkerJoin` nodes.
|
|
32
|
+
* - {@link getSpec} passes through to the hit column's own spec: the linker
|
|
33
|
+
* chain only enables co-indexing and does not remap the hit's `axesSpec`, so
|
|
34
|
+
* no engine round-trip is needed (mirrors the Discovered branch of
|
|
35
|
+
* `reconstructSpecFromId` on the host side).
|
|
36
|
+
*/
|
|
37
|
+
export class ColumnDiscoveredRecipe implements ColumnRecipe<ColumnDiscoveredId> {
|
|
38
|
+
/**
|
|
39
|
+
* Validate the key + resolve every referenced column via
|
|
40
|
+
* {@link ColumnLazy.fromId} (which itself checks the leaf accessor reports
|
|
41
|
+
* `hasData()`). Returns `undefined` if the key is malformed or any
|
|
42
|
+
* referenced column is not yet spec-resolvable.
|
|
43
|
+
*
|
|
44
|
+
* Spec JSON is deserialized lazily on first {@link getSpec}/{@link getQuery}.
|
|
45
|
+
*/
|
|
46
|
+
static fromKey(
|
|
47
|
+
key: ColumnDiscoveredKey,
|
|
48
|
+
opts: { ctx?: GlobalCfgRenderCtx } = {},
|
|
49
|
+
): undefined | ColumnDiscoveredRecipe {
|
|
50
|
+
const distilled = distillColumnDiscoveredKey(key);
|
|
51
|
+
const columns: Record<ColumnUniversalId, Column> = {};
|
|
52
|
+
for (const uniId of referencedUniIdsOf(distilled)) {
|
|
53
|
+
const recipe = Column(uniId, opts);
|
|
54
|
+
if (recipe === undefined) return undefined;
|
|
55
|
+
columns[uniId] = recipe;
|
|
56
|
+
}
|
|
57
|
+
return new ColumnDiscoveredRecipe(distilled, columns);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Static counterpart to {@link fromKey}: returns the resolution status of
|
|
62
|
+
* a {@link ColumnDiscoveredKey} without constructing the recipe. Worst-wins
|
|
63
|
+
* across every referenced {@link ColumnUniversalId} (hit + path linkers),
|
|
64
|
+
* each resolved via the top-level {@link ColumnRecipe.getStatus} dispatcher.
|
|
65
|
+
*/
|
|
66
|
+
static getStatusByKey(
|
|
67
|
+
key: ColumnDiscoveredKey,
|
|
68
|
+
opts: { ctx?: GlobalCfgRenderCtx } = {},
|
|
69
|
+
): ColumnResolutionStatus {
|
|
70
|
+
const distilled = distillColumnDiscoveredKey(key);
|
|
71
|
+
let worst: ColumnResolutionStatus = "present";
|
|
72
|
+
for (const uniId of referencedUniIdsOf(distilled)) {
|
|
73
|
+
const s = ColumnRecipe.getStatus(uniId, opts);
|
|
74
|
+
if (s === "absent") return "absent";
|
|
75
|
+
if (s === "resolving") worst = "resolving";
|
|
76
|
+
}
|
|
77
|
+
return worst;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
readonly id: ColumnDiscoveredId;
|
|
81
|
+
private specCache?: { readonly value: PColumnSpec };
|
|
82
|
+
private queryCache?: { readonly value: SpecQuery };
|
|
83
|
+
private dataStatusCache?: { readonly value: ColumnFieldStatus };
|
|
84
|
+
|
|
85
|
+
private constructor(
|
|
86
|
+
private readonly key: ColumnDiscoveredKey,
|
|
87
|
+
private readonly columns: Record<ColumnUniversalId, ColumnRecipe>,
|
|
88
|
+
) {
|
|
89
|
+
this.id = stringifyColumnDiscoveredId(this.key);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Universal id of the hit column (excluding path/qualifications on top).
|
|
94
|
+
* May itself be a wrapped id (Overridden / Filtered / nested Discovered) —
|
|
95
|
+
* preserves projections applied to the underlying column.
|
|
96
|
+
*/
|
|
97
|
+
getHitId(): ColumnUniversalId {
|
|
98
|
+
return this.key.column;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Axis qualifications attached to the hit column itself — applied to the
|
|
103
|
+
* outer-join entry that wraps this column at the consumer boundary.
|
|
104
|
+
*/
|
|
105
|
+
getColumnQualifications(): readonly AxisQualification[] {
|
|
106
|
+
return this.key.columnQualifications ?? [];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Per-primary-column qualifications applied to the primary anchors on
|
|
111
|
+
* this group's side. Keyed by the external primary column id.
|
|
112
|
+
*/
|
|
113
|
+
getQueriesQualifications(): Readonly<Record<PObjectId, AxisQualification[]>> {
|
|
114
|
+
return this.key.queriesQualifications ?? {};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Leaf {@link PObjectId}s the recipe physically depends on: hit column +
|
|
119
|
+
* each linker in `path`, with any projection wrappers unwrapped down to
|
|
120
|
+
* their underlying storage column. Used to track real-data dependencies
|
|
121
|
+
* (e.g. {@link getDataStatus}), not projected identities.
|
|
122
|
+
*/
|
|
123
|
+
getReferencedIds(): PObjectId[] {
|
|
124
|
+
return [...new Set([...referencedUniIdsOf(this.key)].map((uniId) => extractPObjectId(uniId)))];
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Final spec of a discovered hit is just the hit column's own spec: the
|
|
129
|
+
* linker chain only enables co-indexing, it does not remap the hit's
|
|
130
|
+
* `axesSpec`, and axis qualifications live on the outer join entry (see
|
|
131
|
+
* {@link buildSpecQuery}), not in the spec. So pass through to the hit
|
|
132
|
+
* recipe's `getSpec()` — no engine round-trip needed. This mirrors the
|
|
133
|
+
* Discovered branch of `reconstructSpecFromId` on the host side.
|
|
134
|
+
*/
|
|
135
|
+
getSpec(): PColumnSpec {
|
|
136
|
+
if (this.specCache === undefined) {
|
|
137
|
+
const hit =
|
|
138
|
+
this.columns[this.key.column] ??
|
|
139
|
+
throwError(`ColumnDiscoveredRecipe.getSpec: missing column ${this.key.column}`);
|
|
140
|
+
this.specCache = { value: hit.getSpec() };
|
|
141
|
+
}
|
|
142
|
+
return this.specCache.value;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** IR for building the final spec — see {@link buildSpecQuery}. */
|
|
146
|
+
getQuery(): SpecQuery {
|
|
147
|
+
if (this.queryCache === undefined) {
|
|
148
|
+
this.queryCache = { value: this.buildSpecQuery() };
|
|
149
|
+
}
|
|
150
|
+
return this.queryCache.value;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
getDataStatus(): ColumnFieldStatus {
|
|
154
|
+
if (this.dataStatusCache === undefined) {
|
|
155
|
+
this.dataStatusCache = {
|
|
156
|
+
value: Object.values(this.columns).reduce<ColumnFieldStatus>((worst, lazy) => {
|
|
157
|
+
const s = lazy.getDataStatus();
|
|
158
|
+
if (s === "absent" || worst === "absent") return "absent";
|
|
159
|
+
if (s === "resolving") return "resolving";
|
|
160
|
+
return worst;
|
|
161
|
+
}, "present"),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
return this.dataStatusCache.value;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Discovered + overrides → Overridden<Discovered>. Delegates to the
|
|
169
|
+
* flat-merge factory of ColumnOverriddenRecipe; subsequent `withSpecs`
|
|
170
|
+
* calls merge at the Overridden level (one wrapper, no nesting).
|
|
171
|
+
*/
|
|
172
|
+
withSpecs(overrides: SpecOverrides): ColumnRecipe {
|
|
173
|
+
return ColumnOverriddenRecipe.wrap(this, overrides);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Assembles the SpecQuery for this discovered hit by folding `key.path`
|
|
178
|
+
* around the hit column.
|
|
179
|
+
*
|
|
180
|
+
* The hit (innermost) is built by inlining `columns[key.column].getQuery()`
|
|
181
|
+
* — recursing into the hit's own recipe — so wrapping layers on the hit
|
|
182
|
+
* (Overridden / Filtered / nested Discovered) appear in the produced tree.
|
|
183
|
+
* The previous `pframeSpec.buildQuery` path was a flat
|
|
184
|
+
* {@link PObjectId}-only call and could not express that.
|
|
185
|
+
*
|
|
186
|
+
* Linkers stay as plain column references on the linker side of
|
|
187
|
+
* `linkerJoin` (the spec node has no slot for a query-side linker); the
|
|
188
|
+
* linker's recipe id is used directly. The frame registered in
|
|
189
|
+
* {@link getSpec} carries each recipe's final spec under that same id, so
|
|
190
|
+
* the engine resolves linker axes from the post-projection spec.
|
|
191
|
+
*
|
|
192
|
+
* Path ordering matches {@link ColumnDiscoveredKey.path}: `path[0]` is
|
|
193
|
+
* outermost, `path[N-1]` is closest to the hit. We fold from the inside
|
|
194
|
+
* out — innermost wrap first — so the result lines up with that convention.
|
|
195
|
+
*
|
|
196
|
+
* `columnQualifications` / `queriesQualifications` are not emitted here —
|
|
197
|
+
* qualifications live on a {@link SpecQueryJoinEntry} wrapper (lost on
|
|
198
|
+
* unwrapping to {@link SpecQuery}). External consumers apply them at the
|
|
199
|
+
* outer join via {@link getColumnQualifications} / {@link getQueriesQualifications}.
|
|
200
|
+
*/
|
|
201
|
+
private buildSpecQuery(): SpecQuery {
|
|
202
|
+
// Preserve the inner hit recipe's full query tree — it may carry
|
|
203
|
+
// wrappers (specOverride / sliceAxes / nested linkerJoin) that the
|
|
204
|
+
// host needs to apply correctly. We only rebrand the terminal column
|
|
205
|
+
// leaf to this.id so two variants of the same physical hit reached via
|
|
206
|
+
// different linker chains stay distinct columns in the engine output.
|
|
207
|
+
const hitRecipe =
|
|
208
|
+
this.columns[this.key.column] ??
|
|
209
|
+
throwError(`ColumnDiscoveredRecipe.buildSpecQuery: missing column ${this.key.column}`);
|
|
210
|
+
let query: SpecQuery = rebrandLeafId(hitRecipe.getQuery(), hitRecipe.id, this.id);
|
|
211
|
+
const path = this.key.path ?? [];
|
|
212
|
+
|
|
213
|
+
for (let i = path.length - 1; i >= 0; i--) {
|
|
214
|
+
const linker =
|
|
215
|
+
this.columns[path[i].column] ??
|
|
216
|
+
throwError(
|
|
217
|
+
`ColumnDiscoveredRecipe.buildSpecQuery: missing linker column ${path[i].column}`,
|
|
218
|
+
);
|
|
219
|
+
query = {
|
|
220
|
+
type: "linkerJoin",
|
|
221
|
+
linker: linker.getQuery(),
|
|
222
|
+
secondary: [{ entry: query }],
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
return query;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function referencedUniIdsOf(key: ColumnDiscoveredKey): Set<ColumnUniversalId> {
|
|
230
|
+
return new Set<ColumnUniversalId>([key.column, ...(key.path ?? []).map((item) => item.column)]);
|
|
231
|
+
}
|