@platforma-sdk/model 1.58.3 → 1.58.9
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/_virtual/_rolldown/runtime.cjs +43 -0
- package/dist/_virtual/_rolldown/runtime.js +18 -0
- package/dist/annotations/converter.cjs +15 -20
- package/dist/annotations/converter.cjs.map +1 -1
- package/dist/annotations/converter.d.ts +6 -2
- package/dist/annotations/converter.js +14 -18
- package/dist/annotations/converter.js.map +1 -1
- package/dist/annotations/index.cjs +1 -0
- package/dist/annotations/index.d.ts +2 -3
- package/dist/annotations/index.js +1 -0
- package/dist/annotations/types.d.ts +21 -16
- package/dist/bconfig/index.cjs +2 -0
- package/dist/bconfig/index.d.ts +5 -6
- package/dist/bconfig/index.js +2 -0
- package/dist/bconfig/lambdas.d.ts +52 -52
- package/dist/bconfig/normalization.cjs +13 -18
- package/dist/bconfig/normalization.cjs.map +1 -1
- package/dist/bconfig/normalization.d.ts +10 -6
- package/dist/bconfig/normalization.js +12 -16
- package/dist/bconfig/normalization.js.map +1 -1
- package/dist/bconfig/types.cjs +4 -3
- package/dist/bconfig/types.cjs.map +1 -1
- package/dist/bconfig/types.d.ts +10 -5
- package/dist/bconfig/types.js +4 -2
- package/dist/bconfig/types.js.map +1 -1
- package/dist/bconfig/util.d.ts +7 -4
- package/dist/bconfig/v3.d.ts +10 -6
- package/dist/block_api_v1.d.ts +62 -58
- package/dist/block_api_v2.d.ts +51 -47
- package/dist/block_api_v3.d.ts +33 -29
- package/dist/block_migrations.cjs +481 -413
- package/dist/block_migrations.cjs.map +1 -1
- package/dist/block_migrations.d.ts +258 -204
- package/dist/block_migrations.js +482 -408
- package/dist/block_migrations.js.map +1 -1
- package/dist/block_model.cjs +312 -343
- package/dist/block_model.cjs.map +1 -1
- package/dist/block_model.d.ts +143 -147
- package/dist/block_model.js +312 -341
- package/dist/block_model.js.map +1 -1
- package/dist/block_model_legacy.cjs +231 -255
- package/dist/block_model_legacy.cjs.map +1 -1
- package/dist/block_model_legacy.d.ts +108 -106
- package/dist/block_model_legacy.js +231 -253
- package/dist/block_model_legacy.js.map +1 -1
- package/dist/block_state_patch.d.ts +10 -10
- package/dist/block_state_util.cjs +15 -19
- package/dist/block_state_util.cjs.map +1 -1
- package/dist/block_state_util.d.ts +14 -13
- package/dist/block_state_util.js +15 -18
- package/dist/block_state_util.js.map +1 -1
- package/dist/block_storage.cjs +233 -238
- package/dist/block_storage.cjs.map +1 -1
- package/dist/block_storage.d.ts +62 -78
- package/dist/block_storage.js +234 -237
- package/dist/block_storage.js.map +1 -1
- package/dist/block_storage_callbacks.cjs +156 -195
- package/dist/block_storage_callbacks.cjs.map +1 -1
- package/dist/block_storage_callbacks.js +156 -192
- package/dist/block_storage_callbacks.js.map +1 -1
- package/dist/block_storage_facade.cjs +29 -85
- package/dist/block_storage_facade.cjs.map +1 -1
- package/dist/block_storage_facade.d.ts +83 -126
- package/dist/block_storage_facade.js +29 -83
- package/dist/block_storage_facade.js.map +1 -1
- package/dist/components/PFrameForGraphs.cjs +26 -24
- package/dist/components/PFrameForGraphs.cjs.map +1 -1
- package/dist/components/PFrameForGraphs.d.ts +12 -7
- package/dist/components/PFrameForGraphs.js +25 -22
- package/dist/components/PFrameForGraphs.js.map +1 -1
- package/dist/components/PlAnnotations/filter.d.ts +62 -79
- package/dist/components/PlAnnotations/filters_ui.cjs +135 -171
- package/dist/components/PlAnnotations/filters_ui.cjs.map +1 -1
- package/dist/components/PlAnnotations/filters_ui.d.ts +48 -46
- package/dist/components/PlAnnotations/filters_ui.js +135 -170
- package/dist/components/PlAnnotations/filters_ui.js.map +1 -1
- package/dist/components/PlAnnotations/index.d.ts +2 -3
- package/dist/components/PlDataTable/index.cjs +2 -0
- package/dist/components/PlDataTable/index.d.ts +3 -5
- package/dist/components/PlDataTable/index.js +2 -0
- package/dist/components/PlDataTable/labels.cjs +59 -81
- package/dist/components/PlDataTable/labels.cjs.map +1 -1
- package/dist/components/PlDataTable/labels.js +58 -79
- package/dist/components/PlDataTable/labels.js.map +1 -1
- package/dist/components/PlDataTable/state-migration.cjs +186 -144
- package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
- package/dist/components/PlDataTable/state-migration.d.ts +85 -82
- package/dist/components/PlDataTable/state-migration.js +185 -142
- package/dist/components/PlDataTable/state-migration.js.map +1 -1
- package/dist/components/PlDataTable/table.cjs +172 -194
- package/dist/components/PlDataTable/table.cjs.map +1 -1
- package/dist/components/PlDataTable/table.d.ts +16 -12
- package/dist/components/PlDataTable/table.js +171 -192
- package/dist/components/PlDataTable/table.js.map +1 -1
- package/dist/components/PlDataTable/v4.d.ts +84 -119
- package/dist/components/PlDataTable/v5.d.ts +80 -103
- package/dist/components/PlMultiSequenceAlignment.cjs +27 -29
- package/dist/components/PlMultiSequenceAlignment.cjs.map +1 -1
- package/dist/components/PlMultiSequenceAlignment.d.ts +36 -27
- package/dist/components/PlMultiSequenceAlignment.js +26 -27
- package/dist/components/PlMultiSequenceAlignment.js.map +1 -1
- package/dist/components/PlSelectionModel.cjs +7 -6
- package/dist/components/PlSelectionModel.cjs.map +1 -1
- package/dist/components/PlSelectionModel.d.ts +10 -8
- package/dist/components/PlSelectionModel.js +7 -5
- package/dist/components/PlSelectionModel.js.map +1 -1
- package/dist/components/index.cjs +8 -0
- package/dist/components/index.d.ts +11 -6
- package/dist/components/index.js +8 -0
- package/dist/config/actions.cjs +138 -171
- package/dist/config/actions.cjs.map +1 -1
- package/dist/config/actions.d.ts +47 -47
- package/dist/config/actions.js +146 -178
- package/dist/config/actions.js.map +1 -1
- package/dist/config/actions_kinds.d.ts +114 -121
- package/dist/config/index.cjs +1 -0
- package/dist/config/index.d.ts +6 -7
- package/dist/config/index.js +1 -0
- package/dist/config/model.d.ts +131 -127
- package/dist/config/model_meta.d.ts +4 -1
- package/dist/config/type_engine.d.ts +22 -21
- package/dist/config/type_util.d.ts +12 -10
- package/dist/env_value.cjs +5 -6
- package/dist/env_value.cjs.map +1 -1
- package/dist/env_value.d.ts +4 -1
- package/dist/env_value.js +5 -5
- package/dist/env_value.js.map +1 -1
- package/dist/filters/converters/filterToQuery.cjs +273 -239
- package/dist/filters/converters/filterToQuery.cjs.map +1 -1
- package/dist/filters/converters/filterToQuery.d.ts +6 -2
- package/dist/filters/converters/filterToQuery.js +272 -237
- package/dist/filters/converters/filterToQuery.js.map +1 -1
- package/dist/filters/converters/filterUiToExpressionImpl.cjs +56 -85
- package/dist/filters/converters/filterUiToExpressionImpl.cjs.map +1 -1
- package/dist/filters/converters/filterUiToExpressionImpl.d.ts +8 -4
- package/dist/filters/converters/filterUiToExpressionImpl.js +55 -83
- package/dist/filters/converters/filterUiToExpressionImpl.js.map +1 -1
- package/dist/filters/converters/index.cjs +2 -0
- package/dist/filters/converters/index.d.ts +2 -3
- package/dist/filters/converters/index.js +2 -0
- package/dist/filters/distill.cjs +59 -50
- package/dist/filters/distill.cjs.map +1 -1
- package/dist/filters/distill.d.ts +6 -3
- package/dist/filters/distill.js +58 -48
- package/dist/filters/distill.js.map +1 -1
- package/dist/filters/index.cjs +4 -0
- package/dist/filters/index.d.ts +5 -4
- package/dist/filters/index.js +4 -0
- package/dist/filters/traverse.cjs +31 -40
- package/dist/filters/traverse.cjs.map +1 -1
- package/dist/filters/traverse.js +31 -39
- package/dist/filters/traverse.js.map +1 -1
- package/dist/filters/types.d.ts +10 -7
- package/dist/index.cjs +193 -187
- package/dist/index.d.ts +61 -28
- package/dist/index.js +49 -41
- package/dist/internal.cjs +48 -62
- package/dist/internal.cjs.map +1 -1
- package/dist/internal.js +49 -60
- package/dist/internal.js.map +1 -1
- package/dist/package.cjs +12 -0
- package/dist/package.cjs.map +1 -0
- package/dist/package.js +6 -0
- package/dist/package.js.map +1 -0
- package/dist/pframe.cjs +32 -37
- package/dist/pframe.cjs.map +1 -1
- package/dist/pframe.d.ts +14 -10
- package/dist/pframe.js +32 -35
- package/dist/pframe.js.map +1 -1
- package/dist/pframe_utils/axes.cjs +81 -114
- package/dist/pframe_utils/axes.cjs.map +1 -1
- package/dist/pframe_utils/axes.d.ts +10 -13
- package/dist/pframe_utils/axes.js +80 -112
- package/dist/pframe_utils/axes.js.map +1 -1
- package/dist/pframe_utils/columns.cjs +61 -81
- package/dist/pframe_utils/columns.cjs.map +1 -1
- package/dist/pframe_utils/columns.d.ts +15 -6
- package/dist/pframe_utils/columns.js +60 -79
- package/dist/pframe_utils/columns.js.map +1 -1
- package/dist/pframe_utils/index.cjs +232 -253
- package/dist/pframe_utils/index.cjs.map +1 -1
- package/dist/pframe_utils/index.d.ts +39 -35
- package/dist/pframe_utils/index.js +231 -251
- package/dist/pframe_utils/index.js.map +1 -1
- package/dist/platforma.d.ts +48 -46
- package/dist/plugin_handle.cjs +6 -14
- package/dist/plugin_handle.cjs.map +1 -1
- package/dist/plugin_handle.d.ts +20 -25
- package/dist/plugin_handle.js +6 -13
- package/dist/plugin_handle.js.map +1 -1
- package/dist/plugin_model.cjs +364 -163
- package/dist/plugin_model.cjs.map +1 -1
- package/dist/plugin_model.d.ts +280 -129
- package/dist/plugin_model.js +362 -163
- package/dist/plugin_model.js.map +1 -1
- package/dist/raw_globals.cjs +10 -22
- package/dist/raw_globals.cjs.map +1 -1
- package/dist/raw_globals.d.ts +8 -5
- package/dist/raw_globals.js +10 -20
- package/dist/raw_globals.js.map +1 -1
- package/dist/ref_util.cjs +14 -13
- package/dist/ref_util.cjs.map +1 -1
- package/dist/ref_util.d.ts +18 -12
- package/dist/ref_util.js +14 -11
- package/dist/ref_util.js.map +1 -1
- package/dist/render/accessor.cjs +213 -226
- package/dist/render/accessor.cjs.map +1 -1
- package/dist/render/accessor.d.ts +115 -120
- package/dist/render/accessor.js +212 -224
- package/dist/render/accessor.js.map +1 -1
- package/dist/render/api.cjs +478 -580
- package/dist/render/api.cjs.map +1 -1
- package/dist/render/api.d.ts +207 -209
- package/dist/render/api.js +476 -578
- package/dist/render/api.js.map +1 -1
- package/dist/render/future.cjs +28 -32
- package/dist/render/future.cjs.map +1 -1
- package/dist/render/future.d.ts +15 -11
- package/dist/render/future.js +28 -30
- package/dist/render/future.js.map +1 -1
- package/dist/render/index.cjs +8 -0
- package/dist/render/index.d.ts +10 -8
- package/dist/render/index.js +8 -0
- package/dist/render/internal.cjs +33 -29
- package/dist/render/internal.cjs.map +1 -1
- package/dist/render/internal.d.ts +78 -72
- package/dist/render/internal.js +29 -26
- package/dist/render/internal.js.map +1 -1
- package/dist/render/traversal_ops.d.ts +42 -43
- package/dist/render/util/axis_filtering.cjs +63 -86
- package/dist/render/util/axis_filtering.cjs.map +1 -1
- package/dist/render/util/axis_filtering.d.ts +10 -7
- package/dist/render/util/axis_filtering.js +63 -85
- package/dist/render/util/axis_filtering.js.map +1 -1
- package/dist/render/util/column_collection.cjs +266 -321
- package/dist/render/util/column_collection.cjs.map +1 -1
- package/dist/render/util/column_collection.d.ts +47 -47
- package/dist/render/util/column_collection.js +264 -319
- package/dist/render/util/column_collection.js.map +1 -1
- package/dist/render/util/index.cjs +4 -0
- package/dist/render/util/index.d.ts +4 -5
- package/dist/render/util/index.js +4 -0
- package/dist/render/util/label.cjs +129 -163
- package/dist/render/util/label.cjs.map +1 -1
- package/dist/render/util/label.d.ts +45 -46
- package/dist/render/util/label.js +128 -161
- package/dist/render/util/label.js.map +1 -1
- package/dist/render/util/pcolumn_data.cjs +315 -375
- package/dist/render/util/pcolumn_data.cjs.map +1 -1
- package/dist/render/util/pcolumn_data.d.ts +33 -32
- package/dist/render/util/pcolumn_data.js +314 -373
- package/dist/render/util/pcolumn_data.js.map +1 -1
- package/dist/render/util/pframe_upgraders.cjs +37 -42
- package/dist/render/util/pframe_upgraders.cjs.map +1 -1
- package/dist/render/util/pframe_upgraders.js +37 -41
- package/dist/render/util/pframe_upgraders.js.map +1 -1
- package/dist/render/util/split_selectors.d.ts +13 -9
- package/dist/version.cjs +6 -8
- package/dist/version.cjs.map +1 -1
- package/dist/version.d.ts +7 -4
- package/dist/version.js +5 -5
- package/dist/version.js.map +1 -1
- package/package.json +9 -3
- package/src/block_migrations.test.ts +184 -14
- package/src/block_migrations.ts +185 -30
- package/src/block_model.ts +111 -66
- package/src/block_storage.test.ts +147 -3
- package/src/block_storage.ts +43 -8
- package/src/block_storage_callbacks.ts +9 -4
- package/src/env_value.ts +0 -2
- package/src/filters/distill.ts +17 -6
- package/src/index.ts +12 -11
- package/src/internal.ts +0 -1
- package/src/platforma.ts +4 -4
- package/src/plugin_handle.ts +1 -1
- package/src/plugin_model.test.ts +217 -21
- package/src/plugin_model.ts +450 -55
- package/src/raw_globals.ts +0 -1
- package/dist/annotations/converter.d.ts.map +0 -1
- package/dist/annotations/index.d.ts.map +0 -1
- package/dist/annotations/types.d.ts.map +0 -1
- package/dist/bconfig/index.d.ts.map +0 -1
- package/dist/bconfig/lambdas.d.ts.map +0 -1
- package/dist/bconfig/normalization.d.ts.map +0 -1
- package/dist/bconfig/types.d.ts.map +0 -1
- package/dist/bconfig/util.d.ts.map +0 -1
- package/dist/bconfig/v3.d.ts.map +0 -1
- package/dist/block_api_v1.d.ts.map +0 -1
- package/dist/block_api_v2.d.ts.map +0 -1
- package/dist/block_api_v3.d.ts.map +0 -1
- package/dist/block_migrations.d.ts.map +0 -1
- package/dist/block_model.d.ts.map +0 -1
- package/dist/block_model_legacy.d.ts.map +0 -1
- package/dist/block_state_patch.d.ts.map +0 -1
- package/dist/block_state_util.d.ts.map +0 -1
- package/dist/block_storage.d.ts.map +0 -1
- package/dist/block_storage_callbacks.d.ts +0 -115
- package/dist/block_storage_callbacks.d.ts.map +0 -1
- package/dist/block_storage_facade.d.ts.map +0 -1
- package/dist/components/PFrameForGraphs.d.ts.map +0 -1
- package/dist/components/PlAnnotations/filter.d.ts.map +0 -1
- package/dist/components/PlAnnotations/filters_ui.d.ts.map +0 -1
- package/dist/components/PlAnnotations/index.d.ts.map +0 -1
- package/dist/components/PlAnnotations/types.d.ts +0 -3
- package/dist/components/PlAnnotations/types.d.ts.map +0 -1
- package/dist/components/PlDataTable/index.d.ts.map +0 -1
- package/dist/components/PlDataTable/labels.d.ts +0 -7
- package/dist/components/PlDataTable/labels.d.ts.map +0 -1
- package/dist/components/PlDataTable/state-migration.d.ts.map +0 -1
- package/dist/components/PlDataTable/table.d.ts.map +0 -1
- package/dist/components/PlDataTable/v4.d.ts.map +0 -1
- package/dist/components/PlDataTable/v5.d.ts.map +0 -1
- package/dist/components/PlMultiSequenceAlignment.d.ts.map +0 -1
- package/dist/components/PlSelectionModel.d.ts.map +0 -1
- package/dist/components/index.d.ts.map +0 -1
- package/dist/config/actions.d.ts.map +0 -1
- package/dist/config/actions_kinds.d.ts.map +0 -1
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/model.d.ts.map +0 -1
- package/dist/config/model_meta.d.ts.map +0 -1
- package/dist/config/type_engine.d.ts.map +0 -1
- package/dist/config/type_util.d.ts.map +0 -1
- package/dist/env_value.d.ts.map +0 -1
- package/dist/filters/converters/filterToQuery.d.ts.map +0 -1
- package/dist/filters/converters/filterUiToExpressionImpl.d.ts.map +0 -1
- package/dist/filters/converters/index.d.ts.map +0 -1
- package/dist/filters/distill.d.ts.map +0 -1
- package/dist/filters/index.d.ts.map +0 -1
- package/dist/filters/traverse.d.ts +0 -27
- package/dist/filters/traverse.d.ts.map +0 -1
- package/dist/filters/types.d.ts.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/internal.d.ts +0 -36
- package/dist/internal.d.ts.map +0 -1
- package/dist/package.json.cjs +0 -6
- package/dist/package.json.cjs.map +0 -1
- package/dist/package.json.js +0 -4
- package/dist/package.json.js.map +0 -1
- package/dist/pframe.d.ts.map +0 -1
- package/dist/pframe_utils/axes.d.ts.map +0 -1
- package/dist/pframe_utils/columns.d.ts.map +0 -1
- package/dist/pframe_utils/index.d.ts.map +0 -1
- package/dist/pframe_utils/querySpec.d.ts +0 -2
- package/dist/pframe_utils/querySpec.d.ts.map +0 -1
- package/dist/platforma.d.ts.map +0 -1
- package/dist/plugin_handle.d.ts.map +0 -1
- package/dist/plugin_model.d.ts.map +0 -1
- package/dist/raw_globals.d.ts.map +0 -1
- package/dist/ref_util.d.ts.map +0 -1
- package/dist/render/accessor.d.ts.map +0 -1
- package/dist/render/api.d.ts.map +0 -1
- package/dist/render/future.d.ts.map +0 -1
- package/dist/render/index.d.ts.map +0 -1
- package/dist/render/internal.d.ts.map +0 -1
- package/dist/render/traversal_ops.d.ts.map +0 -1
- package/dist/render/util/axis_filtering.d.ts.map +0 -1
- package/dist/render/util/column_collection.d.ts.map +0 -1
- package/dist/render/util/index.d.ts.map +0 -1
- package/dist/render/util/label.d.ts.map +0 -1
- package/dist/render/util/pcolumn_data.d.ts.map +0 -1
- package/dist/render/util/pframe_upgraders.d.ts +0 -3
- package/dist/render/util/pframe_upgraders.d.ts.map +0 -1
- package/dist/render/util/split_selectors.d.ts.map +0 -1
- package/dist/version.d.ts.map +0 -1
|
@@ -1,131 +1,98 @@
|
|
|
1
|
-
|
|
1
|
+
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Axes utilities for PFrame graph operations.
|
|
7
|
-
*
|
|
8
|
-
* Extracted from PFrameForGraphs to break circular dependency
|
|
9
|
-
* between PFrameForGraphs and columns modules.
|
|
10
|
-
*
|
|
11
|
-
* @module pframe_utils/axes
|
|
12
|
-
*/
|
|
4
|
+
//#region src/pframe_utils/axes.ts
|
|
13
5
|
/** Create id for column copy with added keys in axes domains */
|
|
14
6
|
const colId = (id, domains) => {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
});
|
|
24
|
-
return wid;
|
|
7
|
+
let wid = id.toString();
|
|
8
|
+
domains?.forEach((domain) => {
|
|
9
|
+
if (domain) for (const [k, v] of Object.entries(domain)) {
|
|
10
|
+
wid += k;
|
|
11
|
+
wid += v;
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
return wid;
|
|
25
15
|
};
|
|
26
16
|
/** All combinations with 1 key from each list */
|
|
27
17
|
function getKeysCombinations(idsLists) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
});
|
|
39
|
-
return result;
|
|
18
|
+
if (!idsLists.length) return [];
|
|
19
|
+
let result = [[]];
|
|
20
|
+
idsLists.forEach((list) => {
|
|
21
|
+
const nextResult = [];
|
|
22
|
+
list.forEach((key) => {
|
|
23
|
+
nextResult.push(...result.map((resultItem) => [...resultItem, key]));
|
|
24
|
+
});
|
|
25
|
+
result = nextResult;
|
|
26
|
+
});
|
|
27
|
+
return result;
|
|
40
28
|
}
|
|
41
29
|
function getAvailableWithLinkersAxes(linkerColumns, blockAxes) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return [plModelCommon.canonicalizeJson(id), axisSpec];
|
|
47
|
-
}));
|
|
30
|
+
const availableAxes = _milaboratories_pl_model_common.LinkerMap.fromColumns(linkerColumns.map(_milaboratories_pl_model_common.getColumnIdAndSpec)).getReachableByLinkersAxesFromAxesNormalized([...blockAxes.values()], (linkerKeyId, sourceAxisId) => (0, _milaboratories_pl_model_common.matchAxisId)(sourceAxisId, linkerKeyId));
|
|
31
|
+
return new Map(availableAxes.map((axisSpec) => {
|
|
32
|
+
return [(0, _milaboratories_pl_model_common.canonicalizeJson)((0, _milaboratories_pl_model_common.getAxisId)(axisSpec)), axisSpec];
|
|
33
|
+
}));
|
|
48
34
|
}
|
|
49
35
|
/** Add columns with fully compatible axes created from partial compatible ones */
|
|
50
36
|
function enrichCompatible(blockAxes, columns) {
|
|
51
|
-
|
|
37
|
+
return columns.flatMap((column) => getAdditionalColumnsForColumn(blockAxes, column));
|
|
52
38
|
}
|
|
53
39
|
function getAdditionalColumnsForColumn(blockAxes, column) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
[plModelCommon.Annotation.Graph.IsVirtual]: plModelCommon.stringifyJson(true),
|
|
108
|
-
};
|
|
109
|
-
if (label || labelDomainPart) {
|
|
110
|
-
annotations[plModelCommon.Annotation.Label] =
|
|
111
|
-
label && labelDomainPart ? label + " / " + labelDomainPart : label + labelDomainPart;
|
|
112
|
-
}
|
|
113
|
-
return {
|
|
114
|
-
...column,
|
|
115
|
-
id: id,
|
|
116
|
-
spec: {
|
|
117
|
-
...column.spec,
|
|
118
|
-
axesSpec: idsList.map((axisId, idx) => ({
|
|
119
|
-
...axisId,
|
|
120
|
-
annotations: column.spec.axesSpec[idx].annotations,
|
|
121
|
-
})),
|
|
122
|
-
annotations,
|
|
123
|
-
},
|
|
124
|
-
};
|
|
125
|
-
});
|
|
126
|
-
return [column, ...additionalColumns];
|
|
40
|
+
const columnAxesIds = column.spec.axesSpec.map(_milaboratories_pl_model_common.getAxisId);
|
|
41
|
+
if (columnAxesIds.every((id) => blockAxes.has((0, _milaboratories_pl_model_common.canonicalizeJson)(id)))) return [column];
|
|
42
|
+
const secondaryIdsVariants = getKeysCombinations(columnAxesIds.map((id) => {
|
|
43
|
+
const result = [];
|
|
44
|
+
for (const [_, mainId] of blockAxes) if ((0, _milaboratories_pl_model_common.matchAxisId)(mainId, id) && !(0, _milaboratories_pl_model_common.matchAxisId)(id, mainId)) result.push(mainId);
|
|
45
|
+
return result;
|
|
46
|
+
}));
|
|
47
|
+
const allAddedDomainValues = /* @__PURE__ */ new Set();
|
|
48
|
+
const addedNotToAllVariantsDomainValues = /* @__PURE__ */ new Set();
|
|
49
|
+
const addedByVariantsDomainValues = secondaryIdsVariants.map((idsList) => {
|
|
50
|
+
const addedSet = /* @__PURE__ */ new Set();
|
|
51
|
+
idsList.map((axisId, idx) => {
|
|
52
|
+
const d1 = column.spec.axesSpec[idx].domain;
|
|
53
|
+
const d2 = axisId.domain;
|
|
54
|
+
Object.entries(d2 ?? {}).forEach(([key, value]) => {
|
|
55
|
+
if (d1?.[key] === void 0) {
|
|
56
|
+
const item = JSON.stringify([key, value]);
|
|
57
|
+
addedSet.add(item);
|
|
58
|
+
allAddedDomainValues.add(item);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
...axisId,
|
|
63
|
+
annotations: column.spec.axesSpec[idx].annotations
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
return addedSet;
|
|
67
|
+
});
|
|
68
|
+
[...allAddedDomainValues].forEach((addedPart) => {
|
|
69
|
+
if (addedByVariantsDomainValues.some((s) => !s.has(addedPart))) addedNotToAllVariantsDomainValues.add(addedPart);
|
|
70
|
+
});
|
|
71
|
+
return [column, ...secondaryIdsVariants.map((idsList, idx) => {
|
|
72
|
+
const id = colId(column.id, idsList.map((id) => id.domain));
|
|
73
|
+
const label = (0, _milaboratories_pl_model_common.readAnnotation)(column.spec, _milaboratories_pl_model_common.Annotation.Label) ?? "";
|
|
74
|
+
const labelDomainPart = [...addedByVariantsDomainValues[idx]].filter((str) => addedNotToAllVariantsDomainValues.has(str)).sort().map((v) => JSON.parse(v)?.[1]).join(" / ");
|
|
75
|
+
const annotations = {
|
|
76
|
+
...column.spec.annotations,
|
|
77
|
+
[_milaboratories_pl_model_common.Annotation.Graph.IsVirtual]: (0, _milaboratories_pl_model_common.stringifyJson)(true)
|
|
78
|
+
};
|
|
79
|
+
if (label || labelDomainPart) annotations[_milaboratories_pl_model_common.Annotation.Label] = label && labelDomainPart ? label + " / " + labelDomainPart : label + labelDomainPart;
|
|
80
|
+
return {
|
|
81
|
+
...column,
|
|
82
|
+
id,
|
|
83
|
+
spec: {
|
|
84
|
+
...column.spec,
|
|
85
|
+
axesSpec: idsList.map((axisId, idx) => ({
|
|
86
|
+
...axisId,
|
|
87
|
+
annotations: column.spec.axesSpec[idx].annotations
|
|
88
|
+
})),
|
|
89
|
+
annotations
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
})];
|
|
127
93
|
}
|
|
128
94
|
|
|
95
|
+
//#endregion
|
|
129
96
|
exports.enrichCompatible = enrichCompatible;
|
|
130
97
|
exports.getAvailableWithLinkersAxes = getAvailableWithLinkersAxes;
|
|
131
|
-
//# sourceMappingURL=axes.cjs.map
|
|
98
|
+
//# sourceMappingURL=axes.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axes.cjs","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 = (id: PObjectId, domains: (Record<string, string> | undefined)[]) => {\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 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 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 );\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"],"names":["LinkerMap","getColumnIdAndSpec","matchAxisId","getAxisId","canonicalizeJson","readAnnotation","Annotation","stringifyJson"],"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 = (id: PObjectId, domains: (Record<string, string> | undefined)[]) => {\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 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 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 );\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,15 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
*/
|
|
9
|
-
import type { AxisId, AxisSpecNormalized, CanonicalizedJson, PColumn } from "@milaboratories/pl-model-common";
|
|
10
|
-
import type { PColumnDataUniversal } from "../render";
|
|
11
|
-
export type AxesVault = Map<CanonicalizedJson<AxisId>, AxisSpecNormalized>;
|
|
12
|
-
export declare function getAvailableWithLinkersAxes(linkerColumns: PColumn<PColumnDataUniversal>[], blockAxes: AxesVault): AxesVault;
|
|
1
|
+
import { PColumnDataUniversal } from "../render/internal.js";
|
|
2
|
+
import "../render/index.js";
|
|
3
|
+
import { AxisId, AxisSpecNormalized, CanonicalizedJson, PColumn } from "@milaboratories/pl-model-common";
|
|
4
|
+
|
|
5
|
+
//#region src/pframe_utils/axes.d.ts
|
|
6
|
+
type AxesVault = Map<CanonicalizedJson<AxisId>, AxisSpecNormalized>;
|
|
7
|
+
declare function getAvailableWithLinkersAxes(linkerColumns: PColumn<PColumnDataUniversal>[], blockAxes: AxesVault): AxesVault;
|
|
13
8
|
/** Add columns with fully compatible axes created from partial compatible ones */
|
|
14
|
-
|
|
9
|
+
declare function enrichCompatible<T extends Omit<PColumn<PColumnDataUniversal>, "data">>(blockAxes: AxesVault, columns: T[]): T[];
|
|
10
|
+
//#endregion
|
|
11
|
+
export { AxesVault, enrichCompatible, getAvailableWithLinkersAxes };
|
|
15
12
|
//# sourceMappingURL=axes.d.ts.map
|
|
@@ -1,128 +1,96 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Annotation, LinkerMap, canonicalizeJson, getAxisId, getColumnIdAndSpec, matchAxisId, readAnnotation, stringifyJson } from "@milaboratories/pl-model-common";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
* Axes utilities for PFrame graph operations.
|
|
5
|
-
*
|
|
6
|
-
* Extracted from PFrameForGraphs to break circular dependency
|
|
7
|
-
* between PFrameForGraphs and columns modules.
|
|
8
|
-
*
|
|
9
|
-
* @module pframe_utils/axes
|
|
10
|
-
*/
|
|
3
|
+
//#region src/pframe_utils/axes.ts
|
|
11
4
|
/** Create id for column copy with added keys in axes domains */
|
|
12
5
|
const colId = (id, domains) => {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
});
|
|
22
|
-
return wid;
|
|
6
|
+
let wid = id.toString();
|
|
7
|
+
domains?.forEach((domain) => {
|
|
8
|
+
if (domain) for (const [k, v] of Object.entries(domain)) {
|
|
9
|
+
wid += k;
|
|
10
|
+
wid += v;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
return wid;
|
|
23
14
|
};
|
|
24
15
|
/** All combinations with 1 key from each list */
|
|
25
16
|
function getKeysCombinations(idsLists) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
});
|
|
37
|
-
return result;
|
|
17
|
+
if (!idsLists.length) return [];
|
|
18
|
+
let result = [[]];
|
|
19
|
+
idsLists.forEach((list) => {
|
|
20
|
+
const nextResult = [];
|
|
21
|
+
list.forEach((key) => {
|
|
22
|
+
nextResult.push(...result.map((resultItem) => [...resultItem, key]));
|
|
23
|
+
});
|
|
24
|
+
result = nextResult;
|
|
25
|
+
});
|
|
26
|
+
return result;
|
|
38
27
|
}
|
|
39
28
|
function getAvailableWithLinkersAxes(linkerColumns, blockAxes) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
return [canonicalizeJson(id), axisSpec];
|
|
45
|
-
}));
|
|
29
|
+
const availableAxes = LinkerMap.fromColumns(linkerColumns.map(getColumnIdAndSpec)).getReachableByLinkersAxesFromAxesNormalized([...blockAxes.values()], (linkerKeyId, sourceAxisId) => matchAxisId(sourceAxisId, linkerKeyId));
|
|
30
|
+
return new Map(availableAxes.map((axisSpec) => {
|
|
31
|
+
return [canonicalizeJson(getAxisId(axisSpec)), axisSpec];
|
|
32
|
+
}));
|
|
46
33
|
}
|
|
47
34
|
/** Add columns with fully compatible axes created from partial compatible ones */
|
|
48
35
|
function enrichCompatible(blockAxes, columns) {
|
|
49
|
-
|
|
36
|
+
return columns.flatMap((column) => getAdditionalColumnsForColumn(blockAxes, column));
|
|
50
37
|
}
|
|
51
38
|
function getAdditionalColumnsForColumn(blockAxes, column) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
[Annotation.Graph.IsVirtual]: stringifyJson(true),
|
|
106
|
-
};
|
|
107
|
-
if (label || labelDomainPart) {
|
|
108
|
-
annotations[Annotation.Label] =
|
|
109
|
-
label && labelDomainPart ? label + " / " + labelDomainPart : label + labelDomainPart;
|
|
110
|
-
}
|
|
111
|
-
return {
|
|
112
|
-
...column,
|
|
113
|
-
id: id,
|
|
114
|
-
spec: {
|
|
115
|
-
...column.spec,
|
|
116
|
-
axesSpec: idsList.map((axisId, idx) => ({
|
|
117
|
-
...axisId,
|
|
118
|
-
annotations: column.spec.axesSpec[idx].annotations,
|
|
119
|
-
})),
|
|
120
|
-
annotations,
|
|
121
|
-
},
|
|
122
|
-
};
|
|
123
|
-
});
|
|
124
|
-
return [column, ...additionalColumns];
|
|
39
|
+
const columnAxesIds = column.spec.axesSpec.map(getAxisId);
|
|
40
|
+
if (columnAxesIds.every((id) => blockAxes.has(canonicalizeJson(id)))) return [column];
|
|
41
|
+
const secondaryIdsVariants = getKeysCombinations(columnAxesIds.map((id) => {
|
|
42
|
+
const result = [];
|
|
43
|
+
for (const [_, mainId] of blockAxes) if (matchAxisId(mainId, id) && !matchAxisId(id, mainId)) result.push(mainId);
|
|
44
|
+
return result;
|
|
45
|
+
}));
|
|
46
|
+
const allAddedDomainValues = /* @__PURE__ */ new Set();
|
|
47
|
+
const addedNotToAllVariantsDomainValues = /* @__PURE__ */ new Set();
|
|
48
|
+
const addedByVariantsDomainValues = secondaryIdsVariants.map((idsList) => {
|
|
49
|
+
const addedSet = /* @__PURE__ */ new Set();
|
|
50
|
+
idsList.map((axisId, idx) => {
|
|
51
|
+
const d1 = column.spec.axesSpec[idx].domain;
|
|
52
|
+
const d2 = axisId.domain;
|
|
53
|
+
Object.entries(d2 ?? {}).forEach(([key, value]) => {
|
|
54
|
+
if (d1?.[key] === void 0) {
|
|
55
|
+
const item = JSON.stringify([key, value]);
|
|
56
|
+
addedSet.add(item);
|
|
57
|
+
allAddedDomainValues.add(item);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
...axisId,
|
|
62
|
+
annotations: column.spec.axesSpec[idx].annotations
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
return addedSet;
|
|
66
|
+
});
|
|
67
|
+
[...allAddedDomainValues].forEach((addedPart) => {
|
|
68
|
+
if (addedByVariantsDomainValues.some((s) => !s.has(addedPart))) addedNotToAllVariantsDomainValues.add(addedPart);
|
|
69
|
+
});
|
|
70
|
+
return [column, ...secondaryIdsVariants.map((idsList, idx) => {
|
|
71
|
+
const id = colId(column.id, idsList.map((id) => id.domain));
|
|
72
|
+
const label = readAnnotation(column.spec, Annotation.Label) ?? "";
|
|
73
|
+
const labelDomainPart = [...addedByVariantsDomainValues[idx]].filter((str) => addedNotToAllVariantsDomainValues.has(str)).sort().map((v) => JSON.parse(v)?.[1]).join(" / ");
|
|
74
|
+
const annotations = {
|
|
75
|
+
...column.spec.annotations,
|
|
76
|
+
[Annotation.Graph.IsVirtual]: stringifyJson(true)
|
|
77
|
+
};
|
|
78
|
+
if (label || labelDomainPart) annotations[Annotation.Label] = label && labelDomainPart ? label + " / " + labelDomainPart : label + labelDomainPart;
|
|
79
|
+
return {
|
|
80
|
+
...column,
|
|
81
|
+
id,
|
|
82
|
+
spec: {
|
|
83
|
+
...column.spec,
|
|
84
|
+
axesSpec: idsList.map((axisId, idx) => ({
|
|
85
|
+
...axisId,
|
|
86
|
+
annotations: column.spec.axesSpec[idx].annotations
|
|
87
|
+
})),
|
|
88
|
+
annotations
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
})];
|
|
125
92
|
}
|
|
126
93
|
|
|
94
|
+
//#endregion
|
|
127
95
|
export { enrichCompatible, getAvailableWithLinkersAxes };
|
|
128
|
-
//# sourceMappingURL=axes.js.map
|
|
96
|
+
//# sourceMappingURL=axes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axes.js","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 = (id: PObjectId, domains: (Record<string, string> | undefined)[]) => {\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 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 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 );\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"],"
|
|
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 = (id: PObjectId, domains: (Record<string, string> | undefined)[]) => {\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 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 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 );\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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"}
|