@platforma-sdk/model 1.24.11 → 1.25.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,8 +1,13 @@
1
- import { APColumnSelector, AxisId, CanonicalPColumnId, Option, PColumn, PColumnSelector, PColumnSpec, PColumnValues, PFrameDef, PFrameHandle, PObject, PObjectSpec, PSpecPredicate, PTableDef, PTableHandle, PTableRecordFilter, PTableSorting, PlRef, ResultCollection, ValueOrError, AnyFunction, AnchorIdDeriver } from '@milaboratories/pl-model-common';
1
+ import { AxisId, Option, PColumn, PColumnSelector, PColumnSpec, PColumnValues, PFrameDef, PFrameHandle, PObject, PObjectSpec, PSpecPredicate, PTableDef, PTableHandle, PTableRecordFilter, PTableSorting, PlRef, ResultCollection, ValueOrError, SUniversalPColumnId, AnchoredPColumnSelector, AnchoredIdDeriver, AnyFunction } from '@milaboratories/pl-model-common';
2
2
  import { Optional } from 'utility-types';
3
3
  import { TreeNodeAccessor } from './accessor';
4
4
  import { FutureRef } from './future';
5
5
  import { LabelDerivationOps } from './util/label';
6
+ import { APColumnSelectorWithSplit } from './split_selectors';
7
+ export type UniversalOption = {
8
+ label: string;
9
+ value: SUniversalPColumnId;
10
+ };
6
11
  export declare class ResultPool {
7
12
  private readonly ctx;
8
13
  /**
@@ -37,17 +42,17 @@ export declare class ResultPool {
37
42
  * @returns An array of objects with `label` (display text) and `value` (anchored ID string) properties,
38
43
  * or undefined if any PlRef resolution fails.
39
44
  */
40
- getCanonicalOptions(anchorsOrCtx: AnchorIdDeriver, predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[], labelOps?: LabelDerivationOps): {
45
+ getCanonicalOptions(anchorsOrCtx: AnchoredIdDeriver, predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | AnchoredPColumnSelector[], labelOps?: LabelDerivationOps): {
41
46
  label: string;
42
- value: CanonicalPColumnId;
47
+ value: SUniversalPColumnId;
43
48
  }[];
44
- getCanonicalOptions(anchorsOrCtx: Record<string, PColumnSpec>, predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[], labelOps?: LabelDerivationOps): {
49
+ getCanonicalOptions(anchorsOrCtx: Record<string, PColumnSpec>, predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | AnchoredPColumnSelector[], labelOps?: LabelDerivationOps): {
45
50
  label: string;
46
- value: CanonicalPColumnId;
51
+ value: SUniversalPColumnId;
47
52
  }[];
48
- getCanonicalOptions(anchorsOrCtx: Record<string, PColumnSpec | PlRef>, predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[], labelOps?: LabelDerivationOps): {
53
+ getCanonicalOptions(anchorsOrCtx: Record<string, PColumnSpec | PlRef>, predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | AnchoredPColumnSelector[], labelOps?: LabelDerivationOps): {
49
54
  label: string;
50
- value: CanonicalPColumnId;
55
+ value: SUniversalPColumnId;
51
56
  }[] | undefined;
52
57
  /**
53
58
  * @deprecated use getData()
@@ -92,6 +97,11 @@ export declare class ResultPool {
92
97
  * @deprecated delete this method after Jan 1, 2025
93
98
  */
94
99
  findDataWithCompatibleSpec(spec: PColumnSpec): PObject<TreeNodeAccessor>[];
100
+ /**
101
+ * Find labels data for a given axis id. It will search for a label column and return its data as a map.
102
+ * @returns a map of axis value => label
103
+ */
104
+ findLabels(axis: AxisId): Record<string | number, string> | undefined;
95
105
  }
96
106
  /** Main entry point to the API available within model lambdas (like outputs, sections, etc..) */
97
107
  export declare class RenderCtx<Args, UiState> {
@@ -112,6 +122,7 @@ export declare class RenderCtx<Args, UiState> {
112
122
  /**
113
123
  * Find labels data for a given axis id. It will search for a label column and return its data as a map.
114
124
  * @returns a map of axis value => label
125
+ * @deprecated Use resultPool.findLabels instead
115
126
  */
116
127
  findLabels(axis: AxisId): Record<string | number, string> | undefined;
117
128
  private verifyInlineColumnsSupport;
@@ -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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"}
@@ -0,0 +1,14 @@
1
+ import { AAxisSelector, AnchoredPColumnSelector } from '@milaboratories/pl-model-common';
2
+ /**
3
+ * AAxisSelector with an optional split flag
4
+ */
5
+ export type AAxisSelectorWithSplit = AAxisSelector & {
6
+ split?: boolean;
7
+ };
8
+ /**
9
+ * APColumnSelector with an optional split flag for each axis
10
+ */
11
+ export type APColumnSelectorWithSplit = AnchoredPColumnSelector & {
12
+ axes?: AAxisSelectorWithSplit[];
13
+ };
14
+ //# sourceMappingURL=split_selectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split_selectors.d.ts","sourceRoot":"","sources":["../../src/render/split_selectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAE9F;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,aAAa,GAAG;IACnD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG,uBAAuB,GAAG;IAChE,IAAI,CAAC,EAAE,sBAAsB,EAAE,CAAC;CACjC,CAAC"}
@@ -1,3 +1,3 @@
1
- export * from './resource_map';
1
+ export * from './pcolumn_data';
2
2
  export * from './label';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -48,5 +48,11 @@ export declare const Trace: z.ZodArray<z.ZodObject<{
48
48
  importance?: number | undefined;
49
49
  }>, "many">;
50
50
  export type Trace = z.infer<typeof Trace>;
51
- export declare function deriveLabels<T>(values: T[], specExtractor: (obj: T) => PObjectSpec, ops?: LabelDerivationOps): RecordsWithLabel<T>[];
51
+ type SpecExtractorResult = PObjectSpec | {
52
+ spec: PObjectSpec;
53
+ prefixTrace?: TraceEntry[];
54
+ suffixTrace?: TraceEntry[];
55
+ };
56
+ export declare function deriveLabels<T>(values: T[], specExtractor: (obj: T) => SpecExtractorResult, ops?: LabelDerivationOps): RecordsWithLabel<T>[];
57
+ export {};
52
58
  //# sourceMappingURL=label.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../../src/render/util/label.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAChD,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAEhD,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI;IAChC,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,6CAA6C;IAC7C,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sHAAsH;IACtH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;EAKrB,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAGpD,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;WAAsB,CAAC;AACzC,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC;AAQ1C,wBAAgB,YAAY,CAAC,CAAC,EAC5B,MAAM,EAAE,CAAC,EAAE,EACX,aAAa,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,WAAW,EACtC,GAAG,GAAE,kBAAuB,GAC3B,gBAAgB,CAAC,CAAC,CAAC,EAAE,CA4GvB"}
1
+ {"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../../src/render/util/label.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAChD,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAEhD,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI;IAChC,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,6CAA6C;IAC7C,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sHAAsH;IACtH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;EAKrB,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAGpD,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;WAAsB,CAAC;AACzC,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC;AAI1C,KAAK,mBAAmB,GAAG,WAAW,GAAG;IACvC,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B,CAAC;AAOF,wBAAgB,YAAY,CAAC,CAAC,EAC5B,MAAM,EAAE,CAAC,EAAE,EACX,aAAa,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,mBAAmB,EAC9C,GAAG,GAAE,kBAAuB,GAC3B,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAiIvB"}
@@ -26,4 +26,4 @@ export type PColumnKeyList = {
26
26
  export declare function getPartitionKeysList(acc: TreeNodeAccessor | undefined): PColumnKeyList | undefined;
27
27
  /** Returns an array of unique partition keys for each column: the i-th element in the resulting 2d array contains all unique values of i-th partition axis. */
28
28
  export declare function getUniquePartitionKeys(acc: TreeNodeAccessor | undefined): (string | number)[][] | undefined;
29
- //# sourceMappingURL=resource_map.d.ts.map
29
+ //# sourceMappingURL=pcolumn_data.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resource_map.d.ts","sourceRoot":"","sources":["../../../src/render/util/resource_map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,eAAO,MAAM,eAAe,QAA6B,CAAC;AAC1D,eAAO,MAAM,2BAA2B,QAAyC,CAAC;AAElF,eAAO,MAAM,mBAAmB,QAAiC,CAAC;AAClE,eAAO,MAAM,qBAAqB,QAAmC,CAAC;AAGtE,eAAO,MAAM,yBAAyB,QAAqC,CAAC;AAC5E,eAAO,MAAM,2BAA2B,QAAuC,CAAC;AAEhF,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;AAE7C,MAAM,MAAM,uBAAuB,CAAC,CAAC,IAAI;IACvC,GAAG,EAAE,UAAU,CAAC;IAChB,KAAK,EAAE,CAAC,CAAC;CACV,CAAC;AAEF,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI;IACtC,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;CACpC,CAAC;AA8CF,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,GAAG,EAAE,gBAAgB,GAAG,SAAS,EACjC,cAAc,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,CAAC,GAAG,SAAS,EACxD,oBAAoB,EAAE,KAAK,GAC1B,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,GAAG,EAAE,gBAAgB,GAAG,SAAS,EACjC,cAAc,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,CAAC,GAAG,SAAS,EACxD,oBAAoB,EAAE,IAAI,GACzB,sBAAsB,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;AAWzC,MAAM,MAAM,cAAc,GAAG;IAC3B,oBAAoB;IACpB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAaF,oEAAoE;AACpE,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,gBAAgB,GAAG,SAAS,GAChC,cAAc,GAAG,SAAS,CAoE5B;AAED,+JAA+J;AAE/J,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,gBAAgB,GAAG,SAAS,GAChC,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,GAAG,SAAS,CAsBnC"}
1
+ {"version":3,"file":"pcolumn_data.d.ts","sourceRoot":"","sources":["../../../src/render/util/pcolumn_data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,eAAO,MAAM,eAAe,QAA6B,CAAC;AAC1D,eAAO,MAAM,2BAA2B,QAAyC,CAAC;AAElF,eAAO,MAAM,mBAAmB,QAAiC,CAAC;AAClE,eAAO,MAAM,qBAAqB,QAAmC,CAAC;AAGtE,eAAO,MAAM,yBAAyB,QAAqC,CAAC;AAC5E,eAAO,MAAM,2BAA2B,QAAuC,CAAC;AAEhF,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;AAE7C,MAAM,MAAM,uBAAuB,CAAC,CAAC,IAAI;IACvC,GAAG,EAAE,UAAU,CAAC;IAChB,KAAK,EAAE,CAAC,CAAC;CACV,CAAC;AAEF,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI;IACtC,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;CACpC,CAAC;AA8CF,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,GAAG,EAAE,gBAAgB,GAAG,SAAS,EACjC,cAAc,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,CAAC,GAAG,SAAS,EACxD,oBAAoB,EAAE,KAAK,GAC1B,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,GAAG,EAAE,gBAAgB,GAAG,SAAS,EACjC,cAAc,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,CAAC,GAAG,SAAS,EACxD,oBAAoB,EAAE,IAAI,GACzB,sBAAsB,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;AAWzC,MAAM,MAAM,cAAc,GAAG;IAC3B,oBAAoB;IACpB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAaF,oEAAoE;AACpE,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,gBAAgB,GAAG,SAAS,GAChC,cAAc,GAAG,SAAS,CAoE5B;AAED,+JAA+J;AAE/J,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,gBAAgB,GAAG,SAAS,GAChC,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,GAAG,SAAS,CAsBnC"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const PlatformaSDKVersion = "1.24.11";
1
+ export declare const PlatformaSDKVersion = "1.25.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,YAAY,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,WAAW,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platforma-sdk/model",
3
- "version": "1.24.11",
3
+ "version": "1.25.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.4"
23
+ "@milaboratories/pl-model-common": "^1.12.0"
24
24
  },
25
25
  "devDependencies": {
26
26
  "typescript": "~5.5.4",
package/src/render/api.ts CHANGED
@@ -1,7 +1,5 @@
1
1
  import type {
2
- APColumnSelector,
3
2
  AxisId,
4
- CanonicalPColumnId,
5
3
  Option,
6
4
  PColumn,
7
5
  PColumnSelector,
@@ -19,10 +17,14 @@ import type {
19
17
  PlRef,
20
18
  ResultCollection,
21
19
  ValueOrError,
22
- AnyFunction,
23
- } from '@milaboratories/pl-model-common';
20
+ AxisFilter,
21
+ PValue,
22
+ SUniversalPColumnId,
23
+ AnchoredPColumnSelector } from '@milaboratories/pl-model-common';
24
24
  import {
25
- AnchorIdDeriver,
25
+ AnchoredIdDeriver,
26
+ getAxisId,
27
+ AnyFunction,
26
28
  resolveAnchors,
27
29
  } from '@milaboratories/pl-model-common';
28
30
  import {
@@ -44,6 +46,26 @@ import type { GlobalCfgRenderCtx } from './internal';
44
46
  import { MainAccessorName, StagingAccessorName } from './internal';
45
47
  import type { LabelDerivationOps } from './util/label';
46
48
  import { deriveLabels } from './util/label';
49
+ import type { APColumnSelectorWithSplit } from './split_selectors';
50
+ import { getUniquePartitionKeys } from './util/pcolumn_data';
51
+ import type { TraceEntry } from './util/label';
52
+ import { canonicalizeAxisId } from '@milaboratories/pl-model-common';
53
+ /**
54
+ * Helper function to match domain objects
55
+ * @param query Optional domain to match against
56
+ * @param target Optional domain to match
57
+ * @returns true if domains match, false otherwise
58
+ */
59
+ function matchDomain(query?: Record<string, string>, target?: Record<string, string>) {
60
+ if (query === undefined) return target === undefined;
61
+ if (target === undefined) return true;
62
+ for (const k in target) {
63
+ if (query[k] !== target[k]) return false;
64
+ }
65
+ return true;
66
+ }
67
+
68
+ export type UniversalOption = { label: string; value: SUniversalPColumnId };
47
69
 
48
70
  export class ResultPool {
49
71
  private readonly ctx: GlobalCfgRenderCtx = getCfgRenderCtx();
@@ -107,35 +129,35 @@ export class ResultPool {
107
129
  */
108
130
  // Overload for AnchorCtx - guaranteed to never return undefined
109
131
  getCanonicalOptions(
110
- anchorsOrCtx: AnchorIdDeriver,
111
- predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[],
132
+ anchorsOrCtx: AnchoredIdDeriver,
133
+ predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | AnchoredPColumnSelector[],
112
134
  labelOps?: LabelDerivationOps,
113
- ): { label: string; value: CanonicalPColumnId }[];
135
+ ): { label: string; value: SUniversalPColumnId }[];
114
136
 
115
137
  // Overload for Record<string, PColumnSpec> - guaranteed to never return undefined
116
138
  getCanonicalOptions(
117
139
  anchorsOrCtx: Record<string, PColumnSpec>,
118
- predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[],
140
+ predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | AnchoredPColumnSelector[],
119
141
  labelOps?: LabelDerivationOps,
120
- ): { label: string; value: CanonicalPColumnId }[];
142
+ ): { label: string; value: SUniversalPColumnId }[];
121
143
 
122
144
  // Overload for Record<string, PColumnSpec | PlRef> - may return undefined if PlRef resolution fails
123
145
  getCanonicalOptions(
124
146
  anchorsOrCtx: Record<string, PColumnSpec | PlRef>,
125
- predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[],
147
+ predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | AnchoredPColumnSelector[],
126
148
  labelOps?: LabelDerivationOps,
127
- ): { label: string; value: CanonicalPColumnId }[] | undefined;
149
+ ): { label: string; value: SUniversalPColumnId }[] | undefined;
128
150
 
129
151
  // Implementation
130
152
  getCanonicalOptions(
131
- anchorsOrCtx: AnchorIdDeriver | Record<string, PColumnSpec | PlRef>,
132
- predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelector | APColumnSelector[],
153
+ anchorsOrCtx: AnchoredIdDeriver | Record<string, PColumnSpec | PlRef>,
154
+ predicateOrSelectors: ((spec: PColumnSpec) => boolean) | APColumnSelectorWithSplit | AnchoredPColumnSelector[],
133
155
  labelOps?: LabelDerivationOps,
134
- ): { label: string; value: CanonicalPColumnId }[] | undefined {
156
+ ): { label: string; value: SUniversalPColumnId }[] | undefined {
135
157
  // Handle PlRef objects by resolving them to PColumnSpec
136
158
  const resolvedAnchors: Record<string, PColumnSpec> = {};
137
159
 
138
- if (!(anchorsOrCtx instanceof AnchorIdDeriver)) {
160
+ if (!(anchorsOrCtx instanceof AnchoredIdDeriver)) {
139
161
  for (const [key, value] of Object.entries(anchorsOrCtx)) {
140
162
  if (isPlRef(value)) {
141
163
  const resolvedSpec = this.getPColumnSpecByRef(value);
@@ -161,12 +183,100 @@ export class ResultPool {
161
183
  return predicate(spec);
162
184
  });
163
185
 
164
- const anchorIdDeriver = anchorsOrCtx instanceof AnchorIdDeriver
186
+ if (filtered.length === 0)
187
+ return [];
188
+
189
+ const anchorIdDeriver = anchorsOrCtx instanceof AnchoredIdDeriver
165
190
  ? anchorsOrCtx
166
- : new AnchorIdDeriver(resolvedAnchors);
191
+ : new AnchoredIdDeriver(resolvedAnchors);
192
+
193
+ const splitAxisIdxs = typeof predicateOrSelectors === 'object'
194
+ && !Array.isArray(predicateOrSelectors)
195
+ && 'axes' in predicateOrSelectors
196
+ && predicateOrSelectors.axes !== undefined
197
+ && predicateOrSelectors.partialAxesMatch === undefined
198
+ ? predicateOrSelectors.axes
199
+ .map((axis, index) => ('split' in axis && axis.split === true) ? index : -1)
200
+ .filter((index) => index !== -1)
201
+ : [];
202
+ splitAxisIdxs.sort((a, b) => a - b);
203
+
204
+ if (splitAxisIdxs.length > 0) {
205
+ const result: { obj: PColumnSpec; ref: PlRef; filteringTrace: TraceEntry[]; filters: AxisFilter[] }[] = [];
206
+
207
+ const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1]; // Last one is max since they're sorted
208
+
209
+ for (const { ref, obj: spec } of filtered) {
210
+ if (!isPColumnSpec(spec)) continue;
211
+
212
+ const columnData = this.getDataByRef(ref);
213
+ if (!columnData || !isPColumn(columnData)) continue;
214
+
215
+ const uniqueKeys = getUniquePartitionKeys(columnData.data);
216
+ if (!uniqueKeys) continue; // data not fully initialized yet
217
+
218
+ if (maxSplitIdx >= uniqueKeys.length)
219
+ throw new Error(`Not enough partition keys for the requested split axes in column ${spec.name}`);
220
+
221
+ const axesLabels: (Record<string | number, string> | undefined)[] = splitAxisIdxs
222
+ .map((idx) => this.findLabels(getAxisId(spec.axesSpec[idx])));
223
+
224
+ const keyCombinations: (string | number)[][] = [];
225
+ const generateCombinations = (currentCombo: (string | number)[], sAxisIdx: number) => {
226
+ if (sAxisIdx >= splitAxisIdxs.length) {
227
+ keyCombinations.push([...currentCombo]);
228
+ return;
229
+ }
230
+ const axisIdx = splitAxisIdxs[sAxisIdx];
231
+ const axisValues = uniqueKeys[axisIdx];
232
+ for (const val of axisValues) {
233
+ currentCombo.push(val);
234
+ generateCombinations(currentCombo, sAxisIdx + 1);
235
+ currentCombo.pop();
236
+ }
237
+ };
238
+ generateCombinations([], 0);
239
+
240
+ for (const keyCombo of keyCombinations) {
241
+ const filteringTrace: TraceEntry[] = keyCombo.map((value, sAxisIdx) => {
242
+ const axisIdx = splitAxisIdxs[sAxisIdx];
243
+ const canonicalAxisId = canonicalizeAxisId(getAxisId(spec.axesSpec[axisIdx]));
244
+ const axisLabels = axesLabels[sAxisIdx];
245
+ const label = axisLabels?.[value] ?? String(value);
246
+ return {
247
+ type: `split:${canonicalAxisId}`,
248
+ label,
249
+ importance: 1_000_000,
250
+ };
251
+ });
252
+
253
+ const filters: AxisFilter[] = splitAxisIdxs.map((idx, i) => [idx, keyCombo[i] as PValue]);
254
+ result.push({
255
+ obj: spec,
256
+ ref,
257
+ filteringTrace: filteringTrace,
258
+ filters,
259
+ });
260
+ }
261
+ }
262
+
263
+ const labelResults = deriveLabels(
264
+ result,
265
+ (o) => ({
266
+ spec: o.obj,
267
+ suffixTrace: o.filteringTrace,
268
+ }),
269
+ labelOps ?? {},
270
+ );
271
+
272
+ return labelResults.map((item) => ({
273
+ value: anchorIdDeriver.deriveS(item.value.obj as PColumnSpec, item.value.filters),
274
+ label: item.label,
275
+ }));
276
+ }
167
277
 
168
278
  return deriveLabels(filtered, (o) => o.obj, labelOps ?? {}).map(({ value: { obj: spec }, label }) => ({
169
- value: anchorIdDeriver.deriveCanonical(spec as PColumnSpec),
279
+ value: anchorIdDeriver.deriveS(spec as PColumnSpec),
170
280
  label,
171
281
  }));
172
282
  }
@@ -327,15 +437,40 @@ export class ResultPool {
327
437
  }
328
438
  return result;
329
439
  }
330
- }
331
440
 
332
- function matchDomain(query?: Record<string, string>, target?: Record<string, string>) {
333
- if (query === undefined) return target === undefined;
334
- if (target === undefined) return true;
335
- for (const k in target) {
336
- if (query[k] !== target[k]) return false;
441
+ /**
442
+ * Find labels data for a given axis id. It will search for a label column and return its data as a map.
443
+ * @returns a map of axis value => label
444
+ */
445
+ public findLabels(axis: AxisId): Record<string | number, string> | undefined {
446
+ const dataPool = this.getData();
447
+ for (const column of dataPool.entries) {
448
+ if (!isPColumn(column.obj)) continue;
449
+
450
+ const spec = column.obj.spec;
451
+ if (
452
+ spec.name === 'pl7.app/label'
453
+ && spec.axesSpec.length === 1
454
+ && spec.axesSpec[0].name === axis.name
455
+ && spec.axesSpec[0].type === axis.type
456
+ && matchDomain(axis.domain, spec.axesSpec[0].domain)
457
+ ) {
458
+ if (column.obj.data.resourceType.name !== 'PColumnData/Json') {
459
+ throw Error(`Expected JSON column for labels, got: ${column.obj.data.resourceType.name}`);
460
+ }
461
+ const labels: Record<string | number, string> = Object.fromEntries(
462
+ Object.entries(
463
+ column.obj.data.getDataAsJson<{
464
+ data: Record<string | number, string>;
465
+ }>().data,
466
+ ).map((e) => [JSON.parse(e[0])[0], e[1]]),
467
+ );
468
+
469
+ return labels;
470
+ }
471
+ }
472
+ return undefined;
337
473
  }
338
- return true;
339
474
  }
340
475
 
341
476
  /** Main entry point to the API available within model lambdas (like outputs, sections, etc..) */
@@ -391,35 +526,10 @@ export class RenderCtx<Args, UiState> {
391
526
  /**
392
527
  * Find labels data for a given axis id. It will search for a label column and return its data as a map.
393
528
  * @returns a map of axis value => label
529
+ * @deprecated Use resultPool.findLabels instead
394
530
  */
395
531
  public findLabels(axis: AxisId): Record<string | number, string> | undefined {
396
- const dataPool = this.resultPool.getData();
397
- for (const column of dataPool.entries) {
398
- if (!isPColumn(column.obj)) continue;
399
-
400
- const spec = column.obj.spec;
401
- if (
402
- spec.name === 'pl7.app/label'
403
- && spec.axesSpec.length === 1
404
- && spec.axesSpec[0].name === axis.name
405
- && spec.axesSpec[0].type === axis.type
406
- && matchDomain(axis.domain, spec.axesSpec[0].domain)
407
- ) {
408
- if (column.obj.data.resourceType.name !== 'PColumnData/Json') {
409
- throw Error(`Expected JSON column for labels, got: ${column.obj.data.resourceType.name}`);
410
- }
411
- const labels: Record<string | number, string> = Object.fromEntries(
412
- Object.entries(
413
- column.obj.data.getDataAsJson<{
414
- data: Record<string | number, string>;
415
- }>().data,
416
- ).map((e) => [JSON.parse(e[0])[0], e[1]]),
417
- );
418
-
419
- return labels;
420
- }
421
- }
422
- return undefined;
532
+ return this.resultPool.findLabels(axis);
423
533
  }
424
534
 
425
535
  private verifyInlineColumnsSupport(columns: PColumn<TreeNodeAccessor | PColumnValues>[]) {
@@ -0,0 +1,15 @@
1
+ import type { AAxisSelector, AnchoredPColumnSelector } from '@milaboratories/pl-model-common';
2
+
3
+ /**
4
+ * AAxisSelector with an optional split flag
5
+ */
6
+ export type AAxisSelectorWithSplit = AAxisSelector & {
7
+ split?: boolean;
8
+ };
9
+
10
+ /**
11
+ * APColumnSelector with an optional split flag for each axis
12
+ */
13
+ export type APColumnSelectorWithSplit = AnchoredPColumnSelector & {
14
+ axes?: AAxisSelectorWithSplit[];
15
+ };
@@ -1,2 +1,2 @@
1
- export * from './resource_map';
1
+ export * from './pcolumn_data';
2
2
  export * from './label';
@@ -31,6 +31,13 @@ export const Trace = z.array(TraceEntry);
31
31
  export type Trace = z.infer<typeof Trace>;
32
32
  type FullTrace = FullTraceEntry[];
33
33
 
34
+ // Define the possible return types for the specExtractor function
35
+ type SpecExtractorResult = PObjectSpec | {
36
+ spec: PObjectSpec;
37
+ prefixTrace?: TraceEntry[];
38
+ suffixTrace?: TraceEntry[];
39
+ };
40
+
34
41
  const DistancePenalty = 0.001;
35
42
 
36
43
  const LabelType = '__LABEL__';
@@ -38,7 +45,7 @@ const LabelTypeFull = '__LABEL__@1';
38
45
 
39
46
  export function deriveLabels<T>(
40
47
  values: T[],
41
- specExtractor: (obj: T) => PObjectSpec,
48
+ specExtractor: (obj: T) => SpecExtractorResult,
42
49
  ops: LabelDerivationOps = {},
43
50
  ): RecordsWithLabel<T>[] {
44
51
  const importances = new Map<string, number>();
@@ -47,10 +54,31 @@ export function deriveLabels<T>(
47
54
  const numberOfRecordsWithType = new Map<string, number>();
48
55
 
49
56
  const enrichedRecords = values.map((value) => {
50
- const spec = specExtractor(value);
57
+ const extractorResult = specExtractor(value);
58
+ let spec: PObjectSpec;
59
+ let prefixTrace: TraceEntry[] | undefined;
60
+ let suffixTrace: TraceEntry[] | undefined;
61
+
62
+ // Check if the result is the new structure or just PObjectSpec
63
+ if ('spec' in extractorResult && typeof extractorResult.spec === 'object') {
64
+ // It's the new structure { spec, prefixTrace?, suffixTrace? }
65
+ spec = extractorResult.spec;
66
+ prefixTrace = extractorResult.prefixTrace;
67
+ suffixTrace = extractorResult.suffixTrace;
68
+ } else {
69
+ // It's just PObjectSpec
70
+ spec = extractorResult as PObjectSpec;
71
+ }
72
+
51
73
  const label = spec.annotations?.[PAnnotationLabel];
52
74
  const traceStr = spec.annotations?.[PAnnotationTrace];
53
- const trace = (traceStr ? Trace.safeParse(JSON.parse(traceStr)).data : undefined) ?? [];
75
+ const baseTrace = (traceStr ? Trace.safeParse(JSON.parse(traceStr)).data : undefined) ?? [];
76
+
77
+ const trace = [
78
+ ...(prefixTrace ?? []),
79
+ ...baseTrace,
80
+ ...(suffixTrace ?? []),
81
+ ];
54
82
 
55
83
  if (label) {
56
84
  const labelEntry = { label, type: LabelType, importance: -2 };