@platforma-sdk/model 1.9.0 → 1.10.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platforma-sdk/model",
3
- "version": "1.9.0",
3
+ "version": "1.10.2",
4
4
  "description": "Platforma.bio SDK / Block Model",
5
5
  "types": "./dist/index.d.ts",
6
6
  "main": "./dist/index.js",
@@ -28,7 +28,9 @@ export type PlDataTableGridState = {
28
28
  sort: 'asc' | 'desc';
29
29
  }[];
30
30
  };
31
+ /** Includes column visibility */
31
32
  columnVisibility?: {
33
+ /** All colIds which were hidden */
32
34
  hiddenColIds: string[];
33
35
  };
34
36
 
@@ -52,11 +54,201 @@ export type PTableParams = {
52
54
  export type PlDataTableState = {
53
55
  // internal ag-grid state
54
56
  gridState: PlDataTableGridState;
55
-
56
57
  // mapping of gridState onto the p-table data structures
57
58
  pTableParams?: PTableParams;
58
59
  };
59
60
 
61
+ /** PlTableFilters filter entry */
62
+ export type PlTableFilterIsNotNA = {
63
+ /** Predicate type */
64
+ type: 'isNotNA';
65
+ };
66
+
67
+ /** PlTableFilters filter entry */
68
+ export type PlTableFilterIsNA = {
69
+ /** Predicate type */
70
+ type: 'isNA';
71
+ };
72
+
73
+ /** PlTableFilters filter entries applicable to both string and number values */
74
+ export type PlTableFilterCommon = PlTableFilterIsNotNA | PlTableFilterIsNA;
75
+
76
+ /** PlTableFilters numeric filter entry */
77
+ export type PlTableFilterNumberEquals = {
78
+ /** Predicate type */
79
+ type: 'number_equals';
80
+ /** Referense value */
81
+ reference: number;
82
+ };
83
+
84
+ /** PlTableFilters numeric filter entry */
85
+ export type PlTableFilterNumberNotEquals = {
86
+ /** Predicate type */
87
+ type: 'number_notEquals';
88
+ /** Referense value */
89
+ reference: number;
90
+ };
91
+
92
+ /** PlTableFilters numeric filter entry */
93
+ export type PlTableFilterNumberGreaterThen = {
94
+ /** Predicate type */
95
+ type: 'number_greaterThen';
96
+ /** Referense value */
97
+ reference: number;
98
+ };
99
+
100
+ /** PlTableFilters numeric filter entry */
101
+ export type PlTableFilterNumberGreaterThenOrEqualTo = {
102
+ /** Predicate type */
103
+ type: 'number_greaterThenOrEqualTo';
104
+ /** Referense value */
105
+ reference: number;
106
+ };
107
+
108
+ /** PlTableFilters numeric filter entry */
109
+ export type PlTableFilterNumberLessThen = {
110
+ /** Predicate type */
111
+ type: 'number_lessThen';
112
+ /** Referense value */
113
+ reference: number;
114
+ };
115
+
116
+ /** PlTableFilters numeric filter entry */
117
+ export type PlTableFilterNumberLessThenOrEqualTo = {
118
+ /** Predicate type */
119
+ type: 'number_lessThenOrEqualTo';
120
+ /** Referense value */
121
+ reference: number;
122
+ };
123
+
124
+ /** PlTableFilters numeric filter entry */
125
+ export type PlTableFilterNumberBetween = {
126
+ /** Predicate type */
127
+ type: 'number_between';
128
+ /** Referense value for the lower bound */
129
+ lowerBound: number;
130
+ /** Defines whether values equal to lower bound reference value should be matched */
131
+ includeLowerBound: boolean;
132
+ /** Referense value for the upper bound */
133
+ upperBound: number;
134
+ /** Defines whether values equal to upper bound reference value should be matched */
135
+ includeUpperBound: boolean;
136
+ };
137
+
138
+ /** All PlTableFilters numeric filter entries */
139
+ export type PlTableFilterNumber =
140
+ | PlTableFilterCommon
141
+ | PlTableFilterNumberEquals
142
+ | PlTableFilterNumberNotEquals
143
+ | PlTableFilterNumberGreaterThen
144
+ | PlTableFilterNumberGreaterThenOrEqualTo
145
+ | PlTableFilterNumberLessThen
146
+ | PlTableFilterNumberLessThenOrEqualTo
147
+ | PlTableFilterNumberBetween;
148
+ /** All types of PlTableFilters numeric filter entries */
149
+ export type PlTableFilterNumberType = PlTableFilterNumber['type'];
150
+
151
+ /** PlTableFilters string filter entry */
152
+ export type PlTableFilterStringEquals = {
153
+ /** Predicate type */
154
+ type: 'string_equals';
155
+ /** Referense value */
156
+ reference: string;
157
+ };
158
+
159
+ /** PlTableFilters string filter entry */
160
+ export type PlTableFilterStringNotEquals = {
161
+ /** Predicate type */
162
+ type: 'string_notEquals';
163
+ /** Referense value */
164
+ reference: string;
165
+ };
166
+
167
+ /** PlTableFilters string filter entry */
168
+ export type PlTableFilterStringContains = {
169
+ /** Predicate type */
170
+ type: 'string_contains';
171
+ /** Referense value */
172
+ reference: string;
173
+ };
174
+
175
+ /** PlTableFilters string filter entry */
176
+ export type PlTableFilterStringDoesNotContain = {
177
+ /** Predicate type */
178
+ type: 'string_doesNotContain';
179
+ /** Referense value */
180
+ reference: string;
181
+ };
182
+
183
+ /** PlTableFilters string filter entry */
184
+ export type PlTableFilterStringMatches = {
185
+ /** Predicate type */
186
+ type: 'string_matches';
187
+ /** Referense value */
188
+ reference: string;
189
+ };
190
+
191
+ /** PlTableFilters string filter entry */
192
+ export type PlTableFilterStringDoesNotMatch = {
193
+ /** Predicate type */
194
+ type: 'string_doesNotMatch';
195
+ /** Referense value */
196
+ reference: string;
197
+ };
198
+
199
+ /** PlTableFilters string filter entry */
200
+ export type PlTableFilterStringContainsFuzzyMatch = {
201
+ /** Predicate type */
202
+ type: 'string_containsFuzzyMatch';
203
+ /** Referense value */
204
+ reference: string;
205
+ /**
206
+ * Maximum acceptable edit distance between reference value and matched substring
207
+ * @see https://en.wikipedia.org/wiki/Edit_distance
208
+ */
209
+ maxEdits: number;
210
+ /**
211
+ * When {@link substitutionsOnly} is set to false
212
+ * Levenshtein distance is used as edit distance (substitutions and indels)
213
+ * @see https://en.wikipedia.org/wiki/Levenshtein_distance
214
+ * When {@link substitutionsOnly} is set to true
215
+ * Hamming distance is used as edit distance (substitutions only)
216
+ * @see https://en.wikipedia.org/wiki/Hamming_distance
217
+ */
218
+ substitutionsOnly: boolean;
219
+ /**
220
+ * Single character in {@link reference} that will match any
221
+ * single character in searched text.
222
+ */
223
+ wildcard?: string;
224
+ };
225
+
226
+ /** All PlTableFilters string filter entries */
227
+ export type PlTableFilterString =
228
+ | PlTableFilterCommon
229
+ | PlTableFilterStringEquals
230
+ | PlTableFilterStringNotEquals
231
+ | PlTableFilterStringContains
232
+ | PlTableFilterStringDoesNotContain
233
+ | PlTableFilterStringMatches
234
+ | PlTableFilterStringDoesNotMatch
235
+ | PlTableFilterStringContainsFuzzyMatch;
236
+ /** All types of PlTableFilters string filter entries */
237
+ export type PlTableFilterStringType = PlTableFilterString['type'];
238
+
239
+ /** All PlTableFilters filter entries */
240
+ export type PlTableFilter = PlTableFilterNumber | PlTableFilterString;
241
+ /** All types of PlTableFilters filter entries */
242
+ export type PlTableFilterType = PlTableFilter['type'];
243
+
244
+ /** PlTableFilters model */
245
+ export type PlTableFiltersModel = {
246
+ /** Internal PlTableFilters component state, do not change! */
247
+ state?: Record<string, PlTableFilter>;
248
+ /** Resulting filters which should be used in Join */
249
+ filters?: PTableRecordFilter[];
250
+ };
251
+
60
252
  /**
61
253
  * Create p-table handle given ui table state
62
254
  *
@@ -47,6 +47,7 @@ type FieldMapOps = {
47
47
  export class TreeNodeAccessor {
48
48
  constructor(public readonly handle: AccessorHandle) {}
49
49
 
50
+ /** Shortcut for {@link resolveInput} */
50
51
  public resolve(
51
52
  ...steps: [
52
53
  Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {
@@ -54,8 +55,70 @@ export class TreeNodeAccessor {
54
55
  }
55
56
  ]
56
57
  ): TreeNodeAccessor;
58
+ /** Shortcut for {@link resolveInput} */
57
59
  public resolve(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;
58
60
  public resolve(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {
61
+ const transformedSteps = steps.map(
62
+ (s) =>
63
+ ({
64
+ assertFieldType: 'Input',
65
+ ...(typeof s === 'string' ? { field: s } : s)
66
+ }) satisfies FieldTraversalStep
67
+ );
68
+ return this.resolveWithCommon({}, ...transformedSteps);
69
+ }
70
+
71
+ /** If field type assertion is not specified for the step, default is Output. */
72
+ public resolveOutput(
73
+ ...steps: [
74
+ Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {
75
+ errorIfFieldNotAssigned: true;
76
+ }
77
+ ]
78
+ ): TreeNodeAccessor;
79
+ /** If field type assertion is not specified for the step, default is Output. */
80
+ public resolveOutput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;
81
+ public resolveOutput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {
82
+ const transformedSteps = steps.map(
83
+ (s) =>
84
+ ({
85
+ assertFieldType: 'Output',
86
+ ...(typeof s === 'string' ? { field: s } : s)
87
+ }) satisfies FieldTraversalStep
88
+ );
89
+ return this.resolveWithCommon({}, ...transformedSteps);
90
+ }
91
+
92
+ /** If field type assertion is not specified for the step, default is Input. */
93
+ public resolveInput(
94
+ ...steps: [
95
+ Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {
96
+ errorIfFieldNotAssigned: true;
97
+ }
98
+ ]
99
+ ): TreeNodeAccessor;
100
+ /** If field type assertion is not specified for the step, default is Input. */
101
+ public resolveInput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;
102
+ public resolveInput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {
103
+ const transformedSteps = steps.map(
104
+ (s) =>
105
+ ({
106
+ assertFieldType: 'Input',
107
+ ...(typeof s === 'string' ? { field: s } : s)
108
+ }) satisfies FieldTraversalStep
109
+ );
110
+ return this.resolveWithCommon({}, ...transformedSteps);
111
+ }
112
+
113
+ public resolveAny(
114
+ ...steps: [
115
+ Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {
116
+ errorIfFieldNotAssigned: true;
117
+ }
118
+ ]
119
+ ): TreeNodeAccessor;
120
+ public resolveAny(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;
121
+ public resolveAny(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {
59
122
  return this.resolveWithCommon({}, ...steps);
60
123
  }
61
124
 
@@ -1,5 +1,6 @@
1
1
  export * from './api';
2
2
  export * from './traversal_ops';
3
3
  export * from './accessor';
4
+ export * from './util';
4
5
  export { type ExtractFutureRefType } from './future';
5
6
  export { FutureRef } from './future';
@@ -46,8 +46,11 @@ export type GetFieldStep = CommonFieldTraverseOps & {
46
46
  errorIfFieldNotSet?: true;
47
47
 
48
48
  /**
49
- * Assert field type. Call will fail with exception if this assertion is not
50
- * fulfilled
49
+ * Assert field type.
50
+ * Call will fail with exception if this assertion is not fulfilled.
51
+ * The information about expectedFieldType is also used for stability
52
+ * calculation and field absence error generation, so it is always a good
53
+ * ide to specify it.
51
54
  * */
52
55
  assertFieldType?: FieldType;
53
56
  };
@@ -0,0 +1 @@
1
+ export * from './resource_map'
@@ -0,0 +1,74 @@
1
+ import { TreeNodeAccessor } from "../accessor";
2
+
3
+ export const ResourceMapResourceTypeName = 'PColumnData/ResourceMap';
4
+ export const ResourceMapResourcePartitionedTypeName = 'PColumnData/Partitioned/ResourceMap';
5
+
6
+ export type PColumnKey = (string | number)[];
7
+
8
+ export type PColumnResourceMapEntry<T> = {
9
+ key: PColumnKey;
10
+ value: T;
11
+ };
12
+
13
+ export type PColumnResourceMapData<T> = {
14
+ isComplete: boolean;
15
+ data: PColumnResourceMapEntry<T>[];
16
+ };
17
+
18
+ function populateResourceMapData<T>(
19
+ acc: TreeNodeAccessor | undefined,
20
+ resourceParser: (acc: TreeNodeAccessor) => T | undefined,
21
+ data: PColumnResourceMapEntry<T | undefined>[],
22
+ keyPrefix: PColumnKey = [],
23
+ addEntriesWithNoData: boolean
24
+ ): boolean {
25
+ if (acc === undefined) return false;
26
+ switch (acc.resourceType.name) {
27
+ case ResourceMapResourceTypeName: {
28
+ let isComplete = acc.getInputsLocked();
29
+ for (const keyStr of acc.listInputFields()) {
30
+ const value = acc.resolve({ field: keyStr, assertFieldType: 'Input' });
31
+ const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;
32
+ const converted = value === undefined ? undefined : resourceParser(value);
33
+ if (converted === undefined) isComplete = false;
34
+ if (converted !== undefined || addEntriesWithNoData) data.push({ key, value: converted });
35
+ }
36
+ return isComplete;
37
+ }
38
+ case ResourceMapResourcePartitionedTypeName: {
39
+ let isComplete = acc.getInputsLocked();
40
+ for (const keyStr of acc.listInputFields()) {
41
+ const value = acc.resolve({ field: keyStr, assertFieldType: 'Input' });
42
+ if (value === undefined) isComplete = false;
43
+ else {
44
+ const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;
45
+ const populateResult = populateResourceMapData(value, resourceParser, data, key, addEntriesWithNoData)
46
+ isComplete = isComplete && populateResult;
47
+ }
48
+ }
49
+ return isComplete;
50
+ }
51
+ default:
52
+ throw new Error(`Unknown resource type: ${acc.resourceType.name}`);
53
+ }
54
+ }
55
+
56
+ export function parseResourceMap<T>(
57
+ acc: TreeNodeAccessor | undefined,
58
+ resourceParser: (acc: TreeNodeAccessor) => T | undefined,
59
+ addEntriesWithNoData: false
60
+ ): PColumnResourceMapData<NonNullable<T>>;
61
+ export function parseResourceMap<T>(
62
+ acc: TreeNodeAccessor | undefined,
63
+ resourceParser: (acc: TreeNodeAccessor) => T | undefined,
64
+ addEntriesWithNoData: true
65
+ ): PColumnResourceMapData<T | undefined>;
66
+ export function parseResourceMap<T>(
67
+ acc: TreeNodeAccessor | undefined,
68
+ resourceParser: (acc: TreeNodeAccessor) => T | undefined,
69
+ addEntriesWithNoData: boolean = false
70
+ ): PColumnResourceMapData<T | undefined> {
71
+ const data: PColumnResourceMapEntry<T | undefined>[] = [];
72
+ const isComplete = populateResourceMapData(acc, resourceParser, data, [], addEntriesWithNoData);
73
+ return { isComplete, data };
74
+ }