@platforma-sdk/model 1.23.0 → 1.24.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.
@@ -1,4 +1,4 @@
1
- import { APColumnSelector, AxisId, Option, PColumn, PColumnSelector, PColumnSpec, PColumnValues, PFrameDef, PFrameHandle, PObject, PObjectSpec, PSpecPredicate, PTableDef, PTableHandle, PTableRecordFilter, PTableSorting, PlRef, ResultCollection, ValueOrError, AnchorIdDeriver } from '@milaboratories/pl-model-common';
1
+ import { APColumnSelector, AxisId, CanonicalPColumnId, Option, PColumn, PColumnSelector, PColumnSpec, PColumnValues, PFrameDef, PFrameHandle, PObject, PObjectSpec, PSpecPredicate, PTableDef, PTableHandle, PTableRecordFilter, PTableSorting, PlRef, ResultCollection, ValueOrError, AnchorIdDeriver } from '@milaboratories/pl-model-common';
2
2
  import { Optional } from 'utility-types';
3
3
  import { TreeNodeAccessor } from './accessor';
4
4
  import { FutureRef } from './future';
@@ -12,7 +12,8 @@ export declare class ResultPool {
12
12
  private defaultLabelFn;
13
13
  getOptions(predicateOrSelector: ((spec: PObjectSpec) => boolean) | PColumnSelector | PColumnSelector[], label?: ((spec: PObjectSpec, ref: PlRef) => string) | LabelDerivationOps): Option[];
14
14
  /**
15
- * Calculates anchored identifier options for columns matching a given predicate.
15
+ * Calculates anchored identifier options for columns matching a given predicate and returns their
16
+ * canonicalized representations.
16
17
  *
17
18
  * This function filters column specifications from the result pool that match the provided predicate,
18
19
  * creates a standardized AnchorCtx from the provided anchors, and generates a list of label-value
@@ -36,17 +37,17 @@ export declare class ResultPool {
36
37
  * @returns An array of objects with `label` (display text) and `value` (anchored ID string) properties,
37
38
  * or undefined if any PlRef resolution fails.
38
39
  */
39
- getAnchoredOptions(anchorsOrCtx: AnchorIdDeriver, predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[], labelOps?: LabelDerivationOps): {
40
+ getCanonicalOptions(anchorsOrCtx: AnchorIdDeriver, predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[], labelOps?: LabelDerivationOps): {
40
41
  label: string;
41
- value: string;
42
+ value: CanonicalPColumnId;
42
43
  }[];
43
- getAnchoredOptions(anchorsOrCtx: Record<string, PColumnSpec>, predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[], labelOps?: LabelDerivationOps): {
44
+ getCanonicalOptions(anchorsOrCtx: Record<string, PColumnSpec>, predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[], labelOps?: LabelDerivationOps): {
44
45
  label: string;
45
- value: string;
46
+ value: CanonicalPColumnId;
46
47
  }[];
47
- getAnchoredOptions(anchorsOrCtx: Record<string, PColumnSpec | PlRef>, predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[], labelOps?: LabelDerivationOps): {
48
+ getCanonicalOptions(anchorsOrCtx: Record<string, PColumnSpec | PlRef>, predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[], labelOps?: LabelDerivationOps): {
48
49
  label: string;
49
- value: string;
50
+ value: CanonicalPColumnId;
50
51
  }[] | undefined;
51
52
  /**
52
53
  * @deprecated use getData()
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/render/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/render/api.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const PlatformaSDKVersion = "1.23.0";
1
+ export declare const PlatformaSDKVersion = "1.24.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platforma-sdk/model",
3
- "version": "1.23.0",
3
+ "version": "1.24.0",
4
4
  "description": "Platforma.bio SDK / Block Model",
5
5
  "types": "./dist/index.d.ts",
6
6
  "main": "./dist/index.js",
@@ -20,7 +20,7 @@
20
20
  "dependencies": {
21
21
  "utility-types": "^3.11.0",
22
22
  "zod": "~3.23.8",
23
- "@milaboratories/pl-model-common": "^1.11.0"
23
+ "@milaboratories/pl-model-common": "^1.11.1"
24
24
  },
25
25
  "devDependencies": {
26
26
  "typescript": "~5.5.4",
@@ -1,5 +1,10 @@
1
1
  import {test, expect, describe} from '@jest/globals';
2
- import {enrichColumnsWithCompatible, getAdditionalColumns, IS_VIRTUAL_COLUMN} from './PFrameForGraphs';
2
+ import {
3
+ enrichColumnsWithCompatible,
4
+ getAdditionalColumns,
5
+ IS_VIRTUAL_COLUMN,
6
+ LABEL_ANNOTATION
7
+ } from './PFrameForGraphs';
3
8
  import {PColumn, PColumnSpec, PColumnValues, PObjectId} from "@milaboratories/pl-model-common";
4
9
  import {TreeNodeAccessor} from "../render";
5
10
 
@@ -181,4 +186,31 @@ describe('PFrameForGraph', () => {
181
186
  const enrichedColumns = enrichColumnsWithCompatible(columns, upstream);
182
187
  expect(enrichedColumns.map((c) => c.id)).toEqual(['id1', 'id2', 'id3'])
183
188
  })
189
+
190
+ test('Labels of added columns include added domains, but not include common domains', () => {
191
+ const columnSpec1: PColumnSpec = {
192
+ kind: 'PColumn',
193
+ name: 'column1',
194
+ valueType: 'Int',
195
+ axesSpec: [
196
+ {type: 'String', name: 'axis1', domain: {key0: 'commonDomain', key1: 'a', key2: 'c'}},
197
+ {type: 'String', name: 'axis1', domain: {key0: 'commonDomain', key1: 'b', key2: 'c'}},
198
+ ]
199
+ }
200
+ const columnSpec2: PColumnSpec = {
201
+ kind: 'PColumn',
202
+ name: 'column2',
203
+ valueType: 'Int',
204
+ annotations: {[LABEL_ANNOTATION]: 'Label of column2'},
205
+ axesSpec: [{type: 'String', name: 'axis1', domain: {key0: 'commonDomain'}}]
206
+ }
207
+ const columns: PColumn<TreeNodeAccessor | PColumnValues>[] = [
208
+ {id: 'id1' as PObjectId, spec: columnSpec1, data: []},
209
+ {id: 'id2' as PObjectId, spec: columnSpec2, data: []}
210
+ ] as PColumn<PColumnValues>[]
211
+
212
+ const additionalColumns = getAdditionalColumns(columns);
213
+ expect(additionalColumns[0].spec.annotations?.[LABEL_ANNOTATION]).toEqual('Label of column2 / a');
214
+ expect(additionalColumns[1].spec.annotations?.[LABEL_ANNOTATION]).toEqual('Label of column2 / b');
215
+ })
184
216
  })
@@ -62,6 +62,7 @@ function checkCompatibility(
62
62
  }
63
63
 
64
64
  export const IS_VIRTUAL_COLUMN = 'pl7.app/graph/isVirtual'; // annotation for column duplicates with extended domains
65
+ export const LABEL_ANNOTATION = 'pl7.app/label';
65
66
 
66
67
  /** Main column can have additional domains, if secondary column (meta-column) has all axes match main column axes
67
68
  we can add its copy with missed domain fields for compatibility */
@@ -87,8 +88,52 @@ function getAdditionalColumnsForPair(
87
88
  // all possible combinations of axes with added domains
88
89
  const secondaryIdsVariants = getKeysCombinations(secondaryIdsOptions);
89
90
 
90
- return secondaryIdsVariants.map(idsList => {
91
+ // sets of added to column domain fields
92
+ const allAddedDomainValues = new Set<string>();
93
+ const addedNotToAllVariantsDomainValues = new Set<string>();
94
+ const addedByVariantsDomainValues = secondaryIdsVariants.map(idsList => {
95
+ const addedSet = new Set<string>();
96
+ idsList.map((axisId, idx) => {
97
+ const d1 = secondaryColumn.spec.axesSpec[idx].domain;
98
+ const d2 = axisId.domain;
99
+ Object.entries(d2 ?? {}).forEach(([key, value]) => {
100
+ if (d1?.[key] === undefined) {
101
+ const item = JSON.stringify([key, value]);
102
+ addedSet.add(item);
103
+ allAddedDomainValues.add(item);
104
+ }
105
+ });
106
+ return ({
107
+ ...axisId,
108
+ annotations: secondaryColumn.spec.axesSpec[idx].annotations
109
+ })
110
+ });
111
+ return addedSet;
112
+ });
113
+ [...allAddedDomainValues].forEach(addedPart => {
114
+ if (addedByVariantsDomainValues.some(s => !s.has(addedPart))) {
115
+ addedNotToAllVariantsDomainValues.add(addedPart);
116
+ }
117
+ })
118
+
119
+ return secondaryIdsVariants.map((idsList, idx) => {
91
120
  const id = colId(secondaryColumn.id, idsList.map(id => id.domain));
121
+
122
+ const label = secondaryColumn.spec.annotations?.[LABEL_ANNOTATION] ?? '';
123
+ const labelDomainPart = ([...addedByVariantsDomainValues[idx]])
124
+ .filter(str => addedNotToAllVariantsDomainValues.has(str))
125
+ .sort()
126
+ .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
127
+ .join(' / ');
128
+
129
+ const annotations:Record<string, string> = {
130
+ ...secondaryColumn.spec.annotations,
131
+ [IS_VIRTUAL_COLUMN]: 'true'
132
+ }
133
+ if (label || labelDomainPart) {
134
+ annotations[LABEL_ANNOTATION] = label && labelDomainPart ? label + ' / ' + labelDomainPart : label + labelDomainPart;
135
+ }
136
+
92
137
  return {
93
138
  id: id as PObjectId,
94
139
  spec: {
@@ -97,10 +142,7 @@ function getAdditionalColumnsForPair(
97
142
  ...axisId,
98
143
  annotations: secondaryColumn.spec.axesSpec[idx].annotations
99
144
  })),
100
- annotations: {
101
- ...secondaryColumn.spec.annotations,
102
- [IS_VIRTUAL_COLUMN]: 'true'
103
- }
145
+ annotations
104
146
  },
105
147
  data: secondaryColumn.data
106
148
  };
package/src/render/api.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type {
2
2
  APColumnSelector,
3
3
  AxisId,
4
+ CanonicalPColumnId,
4
5
  Option,
5
6
  PColumn,
6
7
  PColumnSelector,
@@ -75,7 +76,8 @@ export class ResultPool {
75
76
  }
76
77
 
77
78
  /**
78
- * Calculates anchored identifier options for columns matching a given predicate.
79
+ * Calculates anchored identifier options for columns matching a given predicate and returns their
80
+ * canonicalized representations.
79
81
  *
80
82
  * This function filters column specifications from the result pool that match the provided predicate,
81
83
  * creates a standardized AnchorCtx from the provided anchors, and generates a list of label-value
@@ -100,33 +102,33 @@ export class ResultPool {
100
102
  * or undefined if any PlRef resolution fails.
101
103
  */
102
104
  // Overload for AnchorCtx - guaranteed to never return undefined
103
- getAnchoredOptions(
105
+ getCanonicalOptions(
104
106
  anchorsOrCtx: AnchorIdDeriver,
105
107
  predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[],
106
108
  labelOps?: LabelDerivationOps,
107
- ): { label: string; value: string }[];
109
+ ): { label: string; value: CanonicalPColumnId }[];
108
110
 
109
111
  // Overload for Record<string, PColumnSpec> - guaranteed to never return undefined
110
- getAnchoredOptions(
112
+ getCanonicalOptions(
111
113
  anchorsOrCtx: Record<string, PColumnSpec>,
112
114
  predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[],
113
115
  labelOps?: LabelDerivationOps,
114
- ): { label: string; value: string }[];
116
+ ): { label: string; value: CanonicalPColumnId }[];
115
117
 
116
118
  // Overload for Record<string, PColumnSpec | PlRef> - may return undefined if PlRef resolution fails
117
- getAnchoredOptions(
119
+ getCanonicalOptions(
118
120
  anchorsOrCtx: Record<string, PColumnSpec | PlRef>,
119
121
  predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[],
120
122
  labelOps?: LabelDerivationOps,
121
- ): { label: string; value: string }[] | undefined;
123
+ ): { label: string; value: CanonicalPColumnId }[] | undefined;
122
124
 
123
125
  // Implementation
124
- getAnchoredOptions(
126
+ getCanonicalOptions(
125
127
  anchorsOrCtx: AnchorIdDeriver | Record<string, PColumnSpec | PlRef>,
126
128
  predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[],
127
129
  labelOps?: LabelDerivationOps,
128
- ): { label: string; value: string }[] | undefined {
129
- // Handle PlRef objects by resolving them to PColumnSpec
130
+ ): { label: string; value: CanonicalPColumnId }[] | undefined {
131
+ // Handle PlRef objects by resolving them to PColumnSpec
130
132
  const resolvedAnchors: Record<string, PColumnSpec> = {};
131
133
 
132
134
  if (!(anchorsOrCtx instanceof AnchorIdDeriver)) {
@@ -160,7 +162,7 @@ export class ResultPool {
160
162
  : new AnchorIdDeriver(resolvedAnchors);
161
163
 
162
164
  return deriveLabels(filtered, (o) => o.obj, labelOps ?? {}).map(({ value: { obj: spec }, label }) => ({
163
- value: anchorIdDeriver.deriveString(spec as PColumnSpec)!,
165
+ value: anchorIdDeriver.deriveCanonical(spec as PColumnSpec),
164
166
  label,
165
167
  }));
166
168
  }