@platforma-sdk/model 1.57.2 → 1.58.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.
Files changed (85) hide show
  1. package/dist/block_model.cjs +17 -13
  2. package/dist/block_model.cjs.map +1 -1
  3. package/dist/block_model.d.ts +4 -4
  4. package/dist/block_model.d.ts.map +1 -1
  5. package/dist/block_model.js +17 -13
  6. package/dist/block_model.js.map +1 -1
  7. package/dist/block_model_legacy.cjs +1 -0
  8. package/dist/block_model_legacy.cjs.map +1 -1
  9. package/dist/block_model_legacy.d.ts.map +1 -1
  10. package/dist/block_model_legacy.js +1 -0
  11. package/dist/block_model_legacy.js.map +1 -1
  12. package/dist/block_storage.cjs +18 -14
  13. package/dist/block_storage.cjs.map +1 -1
  14. package/dist/block_storage.d.ts +14 -10
  15. package/dist/block_storage.d.ts.map +1 -1
  16. package/dist/block_storage.js +18 -14
  17. package/dist/block_storage.js.map +1 -1
  18. package/dist/block_storage_callbacks.cjs +3 -3
  19. package/dist/block_storage_callbacks.cjs.map +1 -1
  20. package/dist/block_storage_callbacks.d.ts +4 -3
  21. package/dist/block_storage_callbacks.d.ts.map +1 -1
  22. package/dist/block_storage_callbacks.js +3 -3
  23. package/dist/block_storage_callbacks.js.map +1 -1
  24. package/dist/components/PFrameForGraphs.cjs +0 -117
  25. package/dist/components/PFrameForGraphs.cjs.map +1 -1
  26. package/dist/components/PFrameForGraphs.d.ts +3 -5
  27. package/dist/components/PFrameForGraphs.d.ts.map +1 -1
  28. package/dist/components/PFrameForGraphs.js +2 -117
  29. package/dist/components/PFrameForGraphs.js.map +1 -1
  30. package/dist/index.cjs +7 -2
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.d.ts +2 -1
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +3 -1
  35. package/dist/index.js.map +1 -1
  36. package/dist/package.json.cjs +1 -1
  37. package/dist/package.json.js +1 -1
  38. package/dist/pframe_utils/axes.cjs +131 -0
  39. package/dist/pframe_utils/axes.cjs.map +1 -0
  40. package/dist/pframe_utils/axes.d.ts +15 -0
  41. package/dist/pframe_utils/axes.d.ts.map +1 -0
  42. package/dist/pframe_utils/axes.js +128 -0
  43. package/dist/pframe_utils/axes.js.map +1 -0
  44. package/dist/pframe_utils/columns.cjs +4 -8
  45. package/dist/pframe_utils/columns.cjs.map +1 -1
  46. package/dist/pframe_utils/columns.js +1 -5
  47. package/dist/pframe_utils/columns.js.map +1 -1
  48. package/dist/pframe_utils/index.cjs +0 -3
  49. package/dist/pframe_utils/index.cjs.map +1 -1
  50. package/dist/pframe_utils/index.js +0 -3
  51. package/dist/pframe_utils/index.js.map +1 -1
  52. package/dist/platforma.d.ts +12 -2
  53. package/dist/platforma.d.ts.map +1 -1
  54. package/dist/plugin_handle.cjs +29 -0
  55. package/dist/plugin_handle.cjs.map +1 -0
  56. package/dist/plugin_handle.d.ts +51 -0
  57. package/dist/plugin_handle.d.ts.map +1 -0
  58. package/dist/plugin_handle.js +25 -0
  59. package/dist/plugin_handle.js.map +1 -0
  60. package/dist/plugin_model.cjs +27 -27
  61. package/dist/plugin_model.cjs.map +1 -1
  62. package/dist/plugin_model.d.ts +41 -33
  63. package/dist/plugin_model.d.ts.map +1 -1
  64. package/dist/plugin_model.js +27 -27
  65. package/dist/plugin_model.js.map +1 -1
  66. package/dist/render/api.cjs +9 -5
  67. package/dist/render/api.cjs.map +1 -1
  68. package/dist/render/api.d.ts +11 -5
  69. package/dist/render/api.d.ts.map +1 -1
  70. package/dist/render/api.js +9 -5
  71. package/dist/render/api.js.map +1 -1
  72. package/package.json +5 -5
  73. package/src/block_model.ts +33 -19
  74. package/src/block_model_legacy.ts +1 -0
  75. package/src/block_storage.test.ts +3 -2
  76. package/src/block_storage.ts +30 -22
  77. package/src/block_storage_callbacks.ts +8 -7
  78. package/src/components/PFrameForGraphs.ts +4 -167
  79. package/src/index.ts +2 -1
  80. package/src/pframe_utils/axes.ts +175 -0
  81. package/src/pframe_utils/columns.ts +2 -2
  82. package/src/platforma.ts +17 -2
  83. package/src/plugin_handle.ts +85 -0
  84. package/src/plugin_model.ts +118 -56
  85. package/src/render/api.ts +21 -11
@@ -1,127 +1,12 @@
1
- import { readAnnotationJson, Annotation, LinkerMap, getColumnIdAndSpec, matchAxisId, getAxisId, canonicalizeJson, readAnnotation, stringifyJson } from '@milaboratories/pl-model-common';
1
+ import { readAnnotationJson, Annotation } from '@milaboratories/pl-model-common';
2
2
  import { getAllRelatedColumns, getRelatedColumns } from '../pframe_utils/columns.js';
3
3
 
4
- /** Create id for column copy with added keys in axes domains */
5
- const colId = (id, domains) => {
6
- let wid = id.toString();
7
- domains?.forEach((domain) => {
8
- if (domain) {
9
- for (const [k, v] of Object.entries(domain)) {
10
- wid += k;
11
- wid += v;
12
- }
13
- }
14
- });
15
- return wid;
16
- };
17
- /** All combinations with 1 key from each list */
18
- function getKeysCombinations(idsLists) {
19
- if (!idsLists.length) {
20
- return [];
21
- }
22
- let result = [[]];
23
- idsLists.forEach((list) => {
24
- const nextResult = [];
25
- list.forEach((key) => {
26
- nextResult.push(...result.map((resultItem) => [...resultItem, key]));
27
- });
28
- result = nextResult;
29
- });
30
- return result;
31
- }
32
4
  function isHiddenFromGraphColumn(column) {
33
5
  return !!readAnnotationJson(column, Annotation.HideDataFromGraphs);
34
6
  }
35
7
  function isHiddenFromUIColumn(column) {
36
8
  return !!readAnnotationJson(column, Annotation.HideDataFromUi);
37
9
  }
38
- function getAvailableWithLinkersAxes(linkerColumns, blockAxes) {
39
- const linkerMap = LinkerMap.fromColumns(linkerColumns.map(getColumnIdAndSpec));
40
- const availableAxes = linkerMap.getReachableByLinkersAxesFromAxesNormalized([...blockAxes.values()], (linkerKeyId, sourceAxisId) => matchAxisId(sourceAxisId, linkerKeyId));
41
- return new Map(availableAxes.map((axisSpec) => {
42
- const id = getAxisId(axisSpec);
43
- return [canonicalizeJson(id), axisSpec];
44
- }));
45
- }
46
- /** Add columns with fully compatible axes created from partial compatible ones */
47
- function enrichCompatible(blockAxes, columns) {
48
- return columns.flatMap((column) => getAdditionalColumnsForColumn(blockAxes, column));
49
- }
50
- function getAdditionalColumnsForColumn(blockAxes, column) {
51
- const columnAxesIds = column.spec.axesSpec.map(getAxisId);
52
- if (columnAxesIds.every((id) => blockAxes.has(canonicalizeJson(id)))) {
53
- return [column]; // the column is compatible with its own domains without modifications
54
- }
55
- // options with different possible domains for every axis of secondary column
56
- const secondaryIdsOptions = columnAxesIds.map((id) => {
57
- const result = [];
58
- for (const [_, mainId] of blockAxes) {
59
- if (matchAxisId(mainId, id) && !matchAxisId(id, mainId)) {
60
- result.push(mainId);
61
- }
62
- }
63
- return result;
64
- });
65
- // all possible combinations of axes with added domains
66
- const secondaryIdsVariants = getKeysCombinations(secondaryIdsOptions);
67
- // sets of added to column domain fields
68
- const allAddedDomainValues = new Set();
69
- const addedNotToAllVariantsDomainValues = new Set();
70
- const addedByVariantsDomainValues = secondaryIdsVariants.map((idsList) => {
71
- const addedSet = new Set();
72
- idsList.map((axisId, idx) => {
73
- const d1 = column.spec.axesSpec[idx].domain;
74
- const d2 = axisId.domain;
75
- Object.entries(d2 ?? {}).forEach(([key, value]) => {
76
- if (d1?.[key] === undefined) {
77
- const item = JSON.stringify([key, value]);
78
- addedSet.add(item);
79
- allAddedDomainValues.add(item);
80
- }
81
- });
82
- return {
83
- ...axisId,
84
- annotations: column.spec.axesSpec[idx].annotations,
85
- };
86
- });
87
- return addedSet;
88
- });
89
- [...allAddedDomainValues].forEach((addedPart) => {
90
- if (addedByVariantsDomainValues.some((s) => !s.has(addedPart))) {
91
- addedNotToAllVariantsDomainValues.add(addedPart);
92
- }
93
- });
94
- const additionalColumns = secondaryIdsVariants.map((idsList, idx) => {
95
- const id = colId(column.id, idsList.map((id) => id.domain));
96
- const label = readAnnotation(column.spec, Annotation.Label) ?? "";
97
- const labelDomainPart = [...addedByVariantsDomainValues[idx]]
98
- .filter((str) => addedNotToAllVariantsDomainValues.has(str))
99
- .sort()
100
- .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
101
- .join(" / ");
102
- const annotations = {
103
- ...column.spec.annotations,
104
- [Annotation.Graph.IsVirtual]: stringifyJson(true),
105
- };
106
- if (label || labelDomainPart) {
107
- annotations[Annotation.Label] =
108
- label && labelDomainPart ? label + " / " + labelDomainPart : label + labelDomainPart;
109
- }
110
- return {
111
- ...column,
112
- id: id,
113
- spec: {
114
- ...column.spec,
115
- axesSpec: idsList.map((axisId, idx) => ({
116
- ...axisId,
117
- annotations: column.spec.axesSpec[idx].annotations,
118
- })),
119
- annotations,
120
- },
121
- };
122
- });
123
- return [column, ...additionalColumns];
124
- }
125
10
  /**
126
11
  The aim of createPFrameForGraphs: to create pframe with block’s columns and all compatible columns from result pool
127
12
  (including linker columns and all label columns).
@@ -143,5 +28,5 @@ function createPFrameForGraphs(ctx, blockColumns) {
143
28
  return ctx.createPFrame(getRelatedColumns(ctx, { columns: blockColumns, predicate: suitableSpec }));
144
29
  }
145
30
 
146
- export { createPFrameForGraphs, enrichCompatible, getAvailableWithLinkersAxes, isHiddenFromGraphColumn, isHiddenFromUIColumn };
31
+ export { createPFrameForGraphs, isHiddenFromGraphColumn, isHiddenFromUIColumn };
147
32
  //# sourceMappingURL=PFrameForGraphs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PFrameForGraphs.js","sources":["../../src/components/PFrameForGraphs.ts"],"sourcesContent":["import type {\n AxisId,\n AxisSpecNormalized,\n CanonicalizedJson,\n PColumn,\n PColumnSpec,\n PFrameHandle,\n PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n LinkerMap,\n matchAxisId,\n readAnnotation,\n readAnnotationJson,\n stringifyJson,\n} from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal, RenderCtxBase } from \"../render\";\nimport { getAllRelatedColumns, getRelatedColumns } from \"../pframe_utils/columns\";\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 isHiddenFromGraphColumn(column: PColumnSpec): boolean {\n return !!readAnnotationJson(column, Annotation.HideDataFromGraphs);\n}\n\nexport function isHiddenFromUIColumn(column: PColumnSpec): boolean {\n return !!readAnnotationJson(column, Annotation.HideDataFromUi);\n}\n\nexport type AxesVault = Map<CanonicalizedJson<AxisId>, AxisSpecNormalized>;\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/** 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\n/**\n The aim of createPFrameForGraphs: to create pframe with block’s columns and all compatible columns from result pool\n (including linker columns and all label columns).\n Block’s columns are added to pframe as is.\n Other columns are added basing on set of axes of block’s columns, considering available with linker columns.\n Compatible columns must have at least one axis from block’s axes set. This axis of the compatible column from\n result pool must satisfy matchAxisId (it can have less domain keys than in block’s axis, but without conflicting values\n among existing ones).\n In requests to pframe (calculateTableData) columns must have strictly the same axes. For compatibility in case\n of partially matched axis we add to pframe a copy of this column with modified axis (with filled missed domains)\n and modified label (with added domain values in case if more than one copy with different domains exist).\n */\nexport function createPFrameForGraphs<A, U>(\n ctx: RenderCtxBase<A, U>,\n blockColumns?: PColumn<PColumnDataUniversal>[],\n): PFrameHandle | undefined {\n const suitableSpec = (spec: PColumnSpec) =>\n !isHiddenFromUIColumn(spec) && !isHiddenFromGraphColumn(spec);\n // if current block doesn't produce own columns then use all columns from result pool\n if (!blockColumns) {\n return ctx.createPFrame(getAllRelatedColumns(ctx, suitableSpec));\n }\n\n return ctx.createPFrame(\n getRelatedColumns(ctx, { columns: blockColumns, predicate: suitableSpec }),\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PFrameForGraphs.js","sources":["../../src/components/PFrameForGraphs.ts"],"sourcesContent":["import type { PColumn, PColumnSpec, PFrameHandle } from \"@milaboratories/pl-model-common\";\nimport { Annotation, readAnnotationJson } from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal, RenderCtxBase } from \"../render\";\nimport { getAllRelatedColumns, getRelatedColumns } from \"../pframe_utils/columns\";\nexport type { AxesVault } from \"../pframe_utils/axes\";\nexport { enrichCompatible, getAvailableWithLinkersAxes } from \"../pframe_utils/axes\";\n\nexport function isHiddenFromGraphColumn(column: PColumnSpec): boolean {\n return !!readAnnotationJson(column, Annotation.HideDataFromGraphs);\n}\n\nexport function isHiddenFromUIColumn(column: PColumnSpec): boolean {\n return !!readAnnotationJson(column, Annotation.HideDataFromUi);\n}\n\n/**\n The aim of createPFrameForGraphs: to create pframe with block’s columns and all compatible columns from result pool\n (including linker columns and all label columns).\n Block’s columns are added to pframe as is.\n Other columns are added basing on set of axes of block’s columns, considering available with linker columns.\n Compatible columns must have at least one axis from block’s axes set. This axis of the compatible column from\n result pool must satisfy matchAxisId (it can have less domain keys than in block’s axis, but without conflicting values\n among existing ones).\n In requests to pframe (calculateTableData) columns must have strictly the same axes. For compatibility in case\n of partially matched axis we add to pframe a copy of this column with modified axis (with filled missed domains)\n and modified label (with added domain values in case if more than one copy with different domains exist).\n */\nexport function createPFrameForGraphs<A, U>(\n ctx: RenderCtxBase<A, U>,\n blockColumns?: PColumn<PColumnDataUniversal>[],\n): PFrameHandle | undefined {\n const suitableSpec = (spec: PColumnSpec) =>\n !isHiddenFromUIColumn(spec) && !isHiddenFromGraphColumn(spec);\n // if current block doesn't produce own columns then use all columns from result pool\n if (!blockColumns) {\n return ctx.createPFrame(getAllRelatedColumns(ctx, suitableSpec));\n }\n\n return ctx.createPFrame(\n getRelatedColumns(ctx, { columns: blockColumns, predicate: suitableSpec }),\n );\n}\n"],"names":[],"mappings":";;;AAOM,SAAU,uBAAuB,CAAC,MAAmB,EAAA;IACzD,OAAO,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,UAAU,CAAC,kBAAkB,CAAC;AACpE;AAEM,SAAU,oBAAoB,CAAC,MAAmB,EAAA;IACtD,OAAO,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,UAAU,CAAC,cAAc,CAAC;AAChE;AAEA;;;;;;;;;;;AAWG;AACG,SAAU,qBAAqB,CACnC,GAAwB,EACxB,YAA8C,EAAA;AAE9C,IAAA,MAAM,YAAY,GAAG,CAAC,IAAiB,KACrC,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC;;IAE/D,IAAI,CAAC,YAAY,EAAE;QACjB,OAAO,GAAG,CAAC,YAAY,CAAC,oBAAoB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAClE;AAEA,IAAA,OAAO,GAAG,CAAC,YAAY,CACrB,iBAAiB,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAC3E;AACH;;;;"}
package/dist/index.cjs CHANGED
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var block_state_util = require('./block_state_util.cjs');
4
+ var plugin_handle = require('./plugin_handle.cjs');
4
5
  var block_storage = require('./block_storage.cjs');
5
6
  var block_storage_facade = require('./block_storage_facade.cjs');
6
7
  var block_model_legacy = require('./block_model_legacy.cjs');
@@ -36,6 +37,7 @@ var plModelCommon = require('@milaboratories/pl-model-common');
36
37
  var plErrorLike = require('@milaboratories/pl-error-like');
37
38
  var internal = require('./render/internal.cjs');
38
39
  var env_value = require('./env_value.cjs');
40
+ var axes = require('./pframe_utils/axes.cjs');
39
41
  var columns = require('./pframe_utils/columns.cjs');
40
42
 
41
43
 
@@ -43,6 +45,9 @@ var columns = require('./pframe_utils/columns.cjs');
43
45
  exports.OutputError = block_state_util.OutputError;
44
46
  exports.readOutput = block_state_util.readOutput;
45
47
  exports.wrapOutputs = block_state_util.wrapOutputs;
48
+ exports.isPluginOutputKey = plugin_handle.isPluginOutputKey;
49
+ exports.pluginOutputKey = plugin_handle.pluginOutputKey;
50
+ exports.pluginOutputPrefix = plugin_handle.pluginOutputPrefix;
46
51
  exports.BLOCK_STORAGE_KEY = block_storage.BLOCK_STORAGE_KEY;
47
52
  exports.BLOCK_STORAGE_SCHEMA_VERSION = block_storage.BLOCK_STORAGE_SCHEMA_VERSION;
48
53
  exports.DATA_MODEL_DEFAULT_VERSION = block_storage.DATA_MODEL_DEFAULT_VERSION;
@@ -71,8 +76,6 @@ exports.downgradeCfgOrLambda = normalization.downgradeCfgOrLambda;
71
76
  exports.extractConfig = normalization.extractConfig;
72
77
  exports.isConfigLambda = types.isConfigLambda;
73
78
  exports.createPFrameForGraphs = PFrameForGraphs.createPFrameForGraphs;
74
- exports.enrichCompatible = PFrameForGraphs.enrichCompatible;
75
- exports.getAvailableWithLinkersAxes = PFrameForGraphs.getAvailableWithLinkersAxes;
76
79
  exports.isHiddenFromGraphColumn = PFrameForGraphs.isHiddenFromGraphColumn;
77
80
  exports.isHiddenFromUIColumn = PFrameForGraphs.isHiddenFromUIColumn;
78
81
  exports.compileAnnotationScript = filters_ui.compileAnnotationScript;
@@ -170,6 +173,8 @@ exports.getSingleColumnData = index.getSingleColumnData;
170
173
  exports.getUniqueSourceValuesWithLabels = index.getUniqueSourceValuesWithLabels;
171
174
  exports.JsRenderInternal = internal;
172
175
  exports.getEnvironmentValue = env_value.getEnvironmentValue;
176
+ exports.enrichCompatible = axes.enrichCompatible;
177
+ exports.getAvailableWithLinkersAxes = axes.getAvailableWithLinkersAxes;
173
178
  exports.getAllRelatedColumns = columns.getAllRelatedColumns;
174
179
  exports.getRelatedColumns = columns.getRelatedColumns;
175
180
  Object.keys(plModelCommon).forEach(function (k) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from "./block_state_patch";
2
2
  export * from "./block_state_util";
3
+ export * from "./plugin_handle";
3
4
  export * from "./block_storage";
4
5
  export * from "./block_storage_facade";
5
6
  export * from "./block_model_legacy";
@@ -7,7 +8,7 @@ export { BlockModelV3 } from "./block_model";
7
8
  export type { PluginInstance, ParamsInput } from "./block_model";
8
9
  export { DataModel, DataModelBuilder, DataUnrecoverableError, isDataUnrecoverableError, defaultRecover, makeDataVersioned, } from "./block_migrations";
9
10
  export type { LegacyV1State } from "./block_migrations";
10
- export { PluginModel } from "./plugin_model";
11
+ export * from "./plugin_model";
11
12
  export * from "./bconfig";
12
13
  export * from "./components";
13
14
  export * from "./config";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,sBAAsB,EACtB,wBAAwB,EACxB,cAAc,EACd,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAE9C,OAAO,KAAK,gBAAgB,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,sBAAsB,EACtB,wBAAwB,EACxB,cAAc,EACd,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAE9C,OAAO,KAAK,gBAAgB,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { OutputError, readOutput, wrapOutputs } from './block_state_util.js';
2
+ export { isPluginOutputKey, pluginOutputKey, pluginOutputPrefix } from './plugin_handle.js';
2
3
  export { BLOCK_STORAGE_KEY, BLOCK_STORAGE_SCHEMA_VERSION, DATA_MODEL_DEFAULT_VERSION, createBlockStorage, deriveDataFromStorage, getPluginData, getStorageData, isBlockStorage, migrateBlockStorage, normalizeBlockStorage, updateStorageData } from './block_storage.js';
3
4
  export { BLOCK_STORAGE_FACADE_VERSION, BlockStorageFacadeCallbacks, BlockStorageFacadeHandles, registerFacadeCallbacks } from './block_storage_facade.js';
4
5
  export { BlockModel } from './block_model_legacy.js';
@@ -7,7 +8,7 @@ export { DataModel, DataModelBuilder, DataUnrecoverableError, defaultRecover, is
7
8
  export { PluginModel } from './plugin_model.js';
8
9
  export { downgradeCfgOrLambda, extractConfig } from './bconfig/normalization.js';
9
10
  export { isConfigLambda } from './bconfig/types.js';
10
- export { createPFrameForGraphs, enrichCompatible, getAvailableWithLinkersAxes, isHiddenFromGraphColumn, isHiddenFromUIColumn } from './components/PFrameForGraphs.js';
11
+ export { createPFrameForGraphs, isHiddenFromGraphColumn, isHiddenFromUIColumn } from './components/PFrameForGraphs.js';
11
12
  export { compileAnnotationScript, compileFilter, compileFilters, unreachable } from './components/PlAnnotations/filters_ui.js';
12
13
  export { createDefaultPTableParams, createPlDataTableStateV2, upgradePlDataTableStateV2 } from './components/PlDataTable/state-migration.js';
13
14
  export { createPlDataTableSheet, createPlDataTableV2, isColumnHidden, isColumnOptional } from './components/PlDataTable/table.js';
@@ -35,5 +36,6 @@ export * from '@milaboratories/pl-error-like';
35
36
  import * as internal from './render/internal.js';
36
37
  export { internal as JsRenderInternal };
37
38
  export { getEnvironmentValue } from './env_value.js';
39
+ export { enrichCompatible, getAvailableWithLinkersAxes } from './pframe_utils/axes.js';
38
40
  export { getAllRelatedColumns, getRelatedColumns } from './pframe_utils/columns.js';
39
41
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "1.57.2";
3
+ var version = "1.58.0";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.map
@@ -1,4 +1,4 @@
1
- var version = "1.57.2";
1
+ var version = "1.58.0";
2
2
 
3
3
  export { version };
4
4
  //# sourceMappingURL=package.json.js.map
@@ -0,0 +1,131 @@
1
+ 'use strict';
2
+
3
+ var plModelCommon = require('@milaboratories/pl-model-common');
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
+ */
13
+ /** Create id for column copy with added keys in axes domains */
14
+ const colId = (id, domains) => {
15
+ let wid = id.toString();
16
+ domains?.forEach((domain) => {
17
+ if (domain) {
18
+ for (const [k, v] of Object.entries(domain)) {
19
+ wid += k;
20
+ wid += v;
21
+ }
22
+ }
23
+ });
24
+ return wid;
25
+ };
26
+ /** All combinations with 1 key from each list */
27
+ function getKeysCombinations(idsLists) {
28
+ if (!idsLists.length) {
29
+ return [];
30
+ }
31
+ let result = [[]];
32
+ idsLists.forEach((list) => {
33
+ const nextResult = [];
34
+ list.forEach((key) => {
35
+ nextResult.push(...result.map((resultItem) => [...resultItem, key]));
36
+ });
37
+ result = nextResult;
38
+ });
39
+ return result;
40
+ }
41
+ function getAvailableWithLinkersAxes(linkerColumns, blockAxes) {
42
+ const linkerMap = plModelCommon.LinkerMap.fromColumns(linkerColumns.map(plModelCommon.getColumnIdAndSpec));
43
+ const availableAxes = linkerMap.getReachableByLinkersAxesFromAxesNormalized([...blockAxes.values()], (linkerKeyId, sourceAxisId) => plModelCommon.matchAxisId(sourceAxisId, linkerKeyId));
44
+ return new Map(availableAxes.map((axisSpec) => {
45
+ const id = plModelCommon.getAxisId(axisSpec);
46
+ return [plModelCommon.canonicalizeJson(id), axisSpec];
47
+ }));
48
+ }
49
+ /** Add columns with fully compatible axes created from partial compatible ones */
50
+ function enrichCompatible(blockAxes, columns) {
51
+ return columns.flatMap((column) => getAdditionalColumnsForColumn(blockAxes, column));
52
+ }
53
+ function getAdditionalColumnsForColumn(blockAxes, column) {
54
+ const columnAxesIds = column.spec.axesSpec.map(plModelCommon.getAxisId);
55
+ if (columnAxesIds.every((id) => blockAxes.has(plModelCommon.canonicalizeJson(id)))) {
56
+ return [column]; // the column is compatible with its own domains without modifications
57
+ }
58
+ // options with different possible domains for every axis of secondary column
59
+ const secondaryIdsOptions = columnAxesIds.map((id) => {
60
+ const result = [];
61
+ for (const [_, mainId] of blockAxes) {
62
+ if (plModelCommon.matchAxisId(mainId, id) && !plModelCommon.matchAxisId(id, mainId)) {
63
+ result.push(mainId);
64
+ }
65
+ }
66
+ return result;
67
+ });
68
+ // all possible combinations of axes with added domains
69
+ const secondaryIdsVariants = getKeysCombinations(secondaryIdsOptions);
70
+ // sets of added to column domain fields
71
+ const allAddedDomainValues = new Set();
72
+ const addedNotToAllVariantsDomainValues = new Set();
73
+ const addedByVariantsDomainValues = secondaryIdsVariants.map((idsList) => {
74
+ const addedSet = new Set();
75
+ idsList.map((axisId, idx) => {
76
+ const d1 = column.spec.axesSpec[idx].domain;
77
+ const d2 = axisId.domain;
78
+ Object.entries(d2 ?? {}).forEach(([key, value]) => {
79
+ if (d1?.[key] === undefined) {
80
+ const item = JSON.stringify([key, value]);
81
+ addedSet.add(item);
82
+ allAddedDomainValues.add(item);
83
+ }
84
+ });
85
+ return {
86
+ ...axisId,
87
+ annotations: column.spec.axesSpec[idx].annotations,
88
+ };
89
+ });
90
+ return addedSet;
91
+ });
92
+ [...allAddedDomainValues].forEach((addedPart) => {
93
+ if (addedByVariantsDomainValues.some((s) => !s.has(addedPart))) {
94
+ addedNotToAllVariantsDomainValues.add(addedPart);
95
+ }
96
+ });
97
+ const additionalColumns = secondaryIdsVariants.map((idsList, idx) => {
98
+ const id = colId(column.id, idsList.map((id) => id.domain));
99
+ const label = plModelCommon.readAnnotation(column.spec, plModelCommon.Annotation.Label) ?? "";
100
+ const labelDomainPart = [...addedByVariantsDomainValues[idx]]
101
+ .filter((str) => addedNotToAllVariantsDomainValues.has(str))
102
+ .sort()
103
+ .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
104
+ .join(" / ");
105
+ const annotations = {
106
+ ...column.spec.annotations,
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];
127
+ }
128
+
129
+ exports.enrichCompatible = enrichCompatible;
130
+ exports.getAvailableWithLinkersAxes = getAvailableWithLinkersAxes;
131
+ //# sourceMappingURL=axes.cjs.map
@@ -0,0 +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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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Axes utilities for PFrame graph operations.
3
+ *
4
+ * Extracted from PFrameForGraphs to break circular dependency
5
+ * between PFrameForGraphs and columns modules.
6
+ *
7
+ * @module pframe_utils/axes
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;
13
+ /** Add columns with fully compatible axes created from partial compatible ones */
14
+ export declare function enrichCompatible<T extends Omit<PColumn<PColumnDataUniversal>, "data">>(blockAxes: AxesVault, columns: T[]): T[];
15
+ //# sourceMappingURL=axes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axes.d.ts","sourceRoot":"","sources":["../../src/pframe_utils/axes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,MAAM,EACN,kBAAkB,EAClB,iBAAiB,EACjB,OAAO,EAER,MAAM,iCAAiC,CAAC;AAWzC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEtD,MAAM,MAAM,SAAS,GAAG,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC;AAgC3E,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,OAAO,CAAC,oBAAoB,CAAC,EAAE,EAC9C,SAAS,EAAE,SAAS,GACnB,SAAS,CAaX;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC,EACpF,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,CAAC,EAAE,GACX,CAAC,EAAE,CAEL"}
@@ -0,0 +1,128 @@
1
+ import { LinkerMap, getColumnIdAndSpec, matchAxisId, getAxisId, canonicalizeJson, readAnnotation, Annotation, stringifyJson } from '@milaboratories/pl-model-common';
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
+ */
11
+ /** Create id for column copy with added keys in axes domains */
12
+ const colId = (id, domains) => {
13
+ let wid = id.toString();
14
+ domains?.forEach((domain) => {
15
+ if (domain) {
16
+ for (const [k, v] of Object.entries(domain)) {
17
+ wid += k;
18
+ wid += v;
19
+ }
20
+ }
21
+ });
22
+ return wid;
23
+ };
24
+ /** All combinations with 1 key from each list */
25
+ function getKeysCombinations(idsLists) {
26
+ if (!idsLists.length) {
27
+ return [];
28
+ }
29
+ let result = [[]];
30
+ idsLists.forEach((list) => {
31
+ const nextResult = [];
32
+ list.forEach((key) => {
33
+ nextResult.push(...result.map((resultItem) => [...resultItem, key]));
34
+ });
35
+ result = nextResult;
36
+ });
37
+ return result;
38
+ }
39
+ function getAvailableWithLinkersAxes(linkerColumns, blockAxes) {
40
+ const linkerMap = LinkerMap.fromColumns(linkerColumns.map(getColumnIdAndSpec));
41
+ const availableAxes = linkerMap.getReachableByLinkersAxesFromAxesNormalized([...blockAxes.values()], (linkerKeyId, sourceAxisId) => matchAxisId(sourceAxisId, linkerKeyId));
42
+ return new Map(availableAxes.map((axisSpec) => {
43
+ const id = getAxisId(axisSpec);
44
+ return [canonicalizeJson(id), axisSpec];
45
+ }));
46
+ }
47
+ /** Add columns with fully compatible axes created from partial compatible ones */
48
+ function enrichCompatible(blockAxes, columns) {
49
+ return columns.flatMap((column) => getAdditionalColumnsForColumn(blockAxes, column));
50
+ }
51
+ function getAdditionalColumnsForColumn(blockAxes, column) {
52
+ const columnAxesIds = column.spec.axesSpec.map(getAxisId);
53
+ if (columnAxesIds.every((id) => blockAxes.has(canonicalizeJson(id)))) {
54
+ return [column]; // the column is compatible with its own domains without modifications
55
+ }
56
+ // options with different possible domains for every axis of secondary column
57
+ const secondaryIdsOptions = columnAxesIds.map((id) => {
58
+ const result = [];
59
+ for (const [_, mainId] of blockAxes) {
60
+ if (matchAxisId(mainId, id) && !matchAxisId(id, mainId)) {
61
+ result.push(mainId);
62
+ }
63
+ }
64
+ return result;
65
+ });
66
+ // all possible combinations of axes with added domains
67
+ const secondaryIdsVariants = getKeysCombinations(secondaryIdsOptions);
68
+ // sets of added to column domain fields
69
+ const allAddedDomainValues = new Set();
70
+ const addedNotToAllVariantsDomainValues = new Set();
71
+ const addedByVariantsDomainValues = secondaryIdsVariants.map((idsList) => {
72
+ const addedSet = new Set();
73
+ idsList.map((axisId, idx) => {
74
+ const d1 = column.spec.axesSpec[idx].domain;
75
+ const d2 = axisId.domain;
76
+ Object.entries(d2 ?? {}).forEach(([key, value]) => {
77
+ if (d1?.[key] === undefined) {
78
+ const item = JSON.stringify([key, value]);
79
+ addedSet.add(item);
80
+ allAddedDomainValues.add(item);
81
+ }
82
+ });
83
+ return {
84
+ ...axisId,
85
+ annotations: column.spec.axesSpec[idx].annotations,
86
+ };
87
+ });
88
+ return addedSet;
89
+ });
90
+ [...allAddedDomainValues].forEach((addedPart) => {
91
+ if (addedByVariantsDomainValues.some((s) => !s.has(addedPart))) {
92
+ addedNotToAllVariantsDomainValues.add(addedPart);
93
+ }
94
+ });
95
+ const additionalColumns = secondaryIdsVariants.map((idsList, idx) => {
96
+ const id = colId(column.id, idsList.map((id) => id.domain));
97
+ const label = readAnnotation(column.spec, Annotation.Label) ?? "";
98
+ const labelDomainPart = [...addedByVariantsDomainValues[idx]]
99
+ .filter((str) => addedNotToAllVariantsDomainValues.has(str))
100
+ .sort()
101
+ .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
102
+ .join(" / ");
103
+ const annotations = {
104
+ ...column.spec.annotations,
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];
125
+ }
126
+
127
+ export { enrichCompatible, getAvailableWithLinkersAxes };
128
+ //# sourceMappingURL=axes.js.map
@@ -0,0 +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"],"names":[],"mappings":"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"}