@platforma-sdk/model 1.53.11 → 1.53.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/annotations/converter.cjs +11 -11
- package/dist/annotations/converter.cjs.map +1 -1
- package/dist/annotations/converter.d.ts +1 -1
- package/dist/annotations/converter.d.ts.map +1 -1
- package/dist/annotations/converter.js +11 -11
- package/dist/annotations/converter.js.map +1 -1
- package/dist/annotations/index.d.ts +2 -2
- package/dist/annotations/types.d.ts +4 -4
- package/dist/bconfig/index.d.ts +5 -5
- package/dist/bconfig/lambdas.d.ts +7 -7
- package/dist/bconfig/lambdas.d.ts.map +1 -1
- package/dist/bconfig/normalization.cjs.map +1 -1
- package/dist/bconfig/normalization.d.ts +3 -3
- package/dist/bconfig/normalization.js.map +1 -1
- package/dist/bconfig/types.cjs.map +1 -1
- package/dist/bconfig/types.d.ts +2 -2
- package/dist/bconfig/types.d.ts.map +1 -1
- package/dist/bconfig/types.js.map +1 -1
- package/dist/bconfig/util.d.ts +4 -4
- package/dist/bconfig/v3.d.ts +3 -3
- package/dist/block_api_v1.d.ts +2 -2
- package/dist/block_api_v1.d.ts.map +1 -1
- package/dist/block_api_v2.d.ts +2 -2
- package/dist/block_api_v2.d.ts.map +1 -1
- package/dist/block_api_v3.d.ts +3 -3
- package/dist/block_migrations.cjs +10 -10
- package/dist/block_migrations.cjs.map +1 -1
- package/dist/block_migrations.d.ts.map +1 -1
- package/dist/block_migrations.js +10 -10
- package/dist/block_migrations.js.map +1 -1
- package/dist/block_model.cjs +11 -11
- package/dist/block_model.cjs.map +1 -1
- package/dist/block_model.d.ts +8 -8
- package/dist/block_model.d.ts.map +1 -1
- package/dist/block_model.js +11 -11
- package/dist/block_model.js.map +1 -1
- package/dist/block_state_patch.d.ts +2 -2
- package/dist/block_state_util.cjs +1 -1
- package/dist/block_state_util.cjs.map +1 -1
- package/dist/block_state_util.d.ts +3 -3
- package/dist/block_state_util.js +1 -1
- package/dist/block_state_util.js.map +1 -1
- package/dist/block_storage.cjs +10 -10
- package/dist/block_storage.cjs.map +1 -1
- package/dist/block_storage.d.ts +2 -2
- package/dist/block_storage.d.ts.map +1 -1
- package/dist/block_storage.js +10 -10
- package/dist/block_storage.js.map +1 -1
- package/dist/block_storage_vm.cjs +22 -22
- package/dist/block_storage_vm.cjs.map +1 -1
- package/dist/block_storage_vm.d.ts +1 -1
- package/dist/block_storage_vm.d.ts.map +1 -1
- package/dist/block_storage_vm.js +22 -22
- package/dist/block_storage_vm.js.map +1 -1
- package/dist/builder.cjs +32 -23
- package/dist/builder.cjs.map +1 -1
- package/dist/builder.d.ts +7 -7
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +32 -23
- package/dist/builder.js.map +1 -1
- package/dist/components/PFrameForGraphs.cjs +7 -6
- package/dist/components/PFrameForGraphs.cjs.map +1 -1
- package/dist/components/PFrameForGraphs.d.ts +4 -4
- package/dist/components/PFrameForGraphs.d.ts.map +1 -1
- package/dist/components/PFrameForGraphs.js +7 -6
- package/dist/components/PFrameForGraphs.js.map +1 -1
- package/dist/components/PlAnnotations/filter.d.ts +14 -14
- package/dist/components/PlAnnotations/filter.d.ts.map +1 -1
- package/dist/components/PlAnnotations/filters_ui.cjs +46 -46
- package/dist/components/PlAnnotations/filters_ui.cjs.map +1 -1
- package/dist/components/PlAnnotations/filters_ui.d.ts +10 -34
- package/dist/components/PlAnnotations/filters_ui.d.ts.map +1 -1
- package/dist/components/PlAnnotations/filters_ui.js +46 -46
- package/dist/components/PlAnnotations/filters_ui.js.map +1 -1
- package/dist/components/PlAnnotations/index.d.ts +2 -2
- package/dist/components/PlAnnotations/types.d.ts +2 -2
- package/dist/components/PlDataTable.cjs +19 -20
- package/dist/components/PlDataTable.cjs.map +1 -1
- package/dist/components/PlDataTable.d.ts +27 -27
- package/dist/components/PlDataTable.d.ts.map +1 -1
- package/dist/components/PlDataTable.js +19 -20
- package/dist/components/PlDataTable.js.map +1 -1
- package/dist/components/PlMultiSequenceAlignment.cjs +2 -2
- package/dist/components/PlMultiSequenceAlignment.cjs.map +1 -1
- package/dist/components/PlMultiSequenceAlignment.d.ts +6 -6
- package/dist/components/PlMultiSequenceAlignment.d.ts.map +1 -1
- package/dist/components/PlMultiSequenceAlignment.js +2 -2
- package/dist/components/PlMultiSequenceAlignment.js.map +1 -1
- package/dist/components/PlSelectionModel.cjs.map +1 -1
- package/dist/components/PlSelectionModel.d.ts +1 -1
- package/dist/components/PlSelectionModel.js.map +1 -1
- package/dist/components/index.d.ts +5 -5
- package/dist/config/actions.cjs +39 -39
- package/dist/config/actions.cjs.map +1 -1
- package/dist/config/actions.d.ts +9 -9
- package/dist/config/actions.d.ts.map +1 -1
- package/dist/config/actions.js +39 -39
- package/dist/config/actions.js.map +1 -1
- package/dist/config/actions_kinds.d.ts +30 -30
- package/dist/config/actions_kinds.d.ts.map +1 -1
- package/dist/config/index.d.ts +6 -6
- package/dist/config/model.d.ts +28 -28
- package/dist/config/model_meta.d.ts +1 -1
- package/dist/config/type_engine.d.ts +3 -3
- package/dist/config/type_util.d.ts +2 -2
- package/dist/env_value.cjs +1 -1
- package/dist/env_value.cjs.map +1 -1
- package/dist/env_value.js +1 -1
- package/dist/env_value.js.map +1 -1
- package/dist/filters/converter.cjs +36 -32
- package/dist/filters/converter.cjs.map +1 -1
- package/dist/filters/converter.d.ts +2 -2
- package/dist/filters/converter.d.ts.map +1 -1
- package/dist/filters/converter.js +36 -32
- package/dist/filters/converter.js.map +1 -1
- package/dist/filters/index.d.ts +2 -2
- package/dist/filters/types.d.ts +33 -33
- package/dist/filters/types.d.ts.map +1 -1
- package/dist/index.d.ts +24 -24
- package/dist/internal.cjs +7 -7
- package/dist/internal.cjs.map +1 -1
- package/dist/internal.d.ts +4 -4
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +7 -7
- package/dist/internal.js.map +1 -1
- package/dist/package.json.cjs +1 -1
- package/dist/package.json.js +1 -1
- package/dist/pframe.cjs +1 -1
- package/dist/pframe.cjs.map +1 -1
- package/dist/pframe.d.ts +1 -1
- package/dist/pframe.js +1 -1
- package/dist/pframe.js.map +1 -1
- package/dist/pframe_utils/columns.cjs +23 -15
- package/dist/pframe_utils/columns.cjs.map +1 -1
- package/dist/pframe_utils/columns.d.ts +3 -3
- package/dist/pframe_utils/columns.d.ts.map +1 -1
- package/dist/pframe_utils/columns.js +23 -15
- package/dist/pframe_utils/columns.js.map +1 -1
- package/dist/pframe_utils/index.cjs +25 -25
- package/dist/pframe_utils/index.cjs.map +1 -1
- package/dist/pframe_utils/index.d.ts +3 -3
- package/dist/pframe_utils/index.d.ts.map +1 -1
- package/dist/pframe_utils/index.js +25 -25
- package/dist/pframe_utils/index.js.map +1 -1
- package/dist/platforma.d.ts +7 -7
- package/dist/platforma.d.ts.map +1 -1
- package/dist/raw_globals.cjs +4 -1
- package/dist/raw_globals.cjs.map +1 -1
- package/dist/raw_globals.d.ts +2 -2
- package/dist/raw_globals.d.ts.map +1 -1
- package/dist/raw_globals.js +4 -1
- package/dist/raw_globals.js.map +1 -1
- package/dist/ref_util.cjs +4 -4
- package/dist/ref_util.cjs.map +1 -1
- package/dist/ref_util.d.ts +1 -1
- package/dist/ref_util.js +4 -4
- package/dist/ref_util.js.map +1 -1
- package/dist/render/accessor.cjs +24 -24
- package/dist/render/accessor.cjs.map +1 -1
- package/dist/render/accessor.d.ts +10 -10
- package/dist/render/accessor.d.ts.map +1 -1
- package/dist/render/accessor.js +24 -24
- package/dist/render/accessor.js.map +1 -1
- package/dist/render/api.cjs +23 -23
- package/dist/render/api.cjs.map +1 -1
- package/dist/render/api.d.ts +11 -11
- package/dist/render/api.d.ts.map +1 -1
- package/dist/render/api.js +23 -23
- package/dist/render/api.js.map +1 -1
- package/dist/render/future.cjs.map +1 -1
- package/dist/render/future.d.ts +1 -1
- package/dist/render/future.js.map +1 -1
- package/dist/render/index.d.ts +6 -6
- package/dist/render/internal.cjs +4 -4
- package/dist/render/internal.cjs.map +1 -1
- package/dist/render/internal.d.ts +7 -7
- package/dist/render/internal.d.ts.map +1 -1
- package/dist/render/internal.js +4 -4
- package/dist/render/internal.js.map +1 -1
- package/dist/render/traversal_ops.d.ts +1 -1
- package/dist/render/util/axis_filtering.cjs +48 -44
- package/dist/render/util/axis_filtering.cjs.map +1 -1
- package/dist/render/util/axis_filtering.d.ts +2 -2
- package/dist/render/util/axis_filtering.js +48 -44
- package/dist/render/util/axis_filtering.js.map +1 -1
- package/dist/render/util/column_collection.cjs +42 -35
- package/dist/render/util/column_collection.cjs.map +1 -1
- package/dist/render/util/column_collection.d.ts +4 -4
- package/dist/render/util/column_collection.d.ts.map +1 -1
- package/dist/render/util/column_collection.js +42 -35
- package/dist/render/util/column_collection.js.map +1 -1
- package/dist/render/util/index.d.ts +4 -4
- package/dist/render/util/label.cjs +15 -21
- package/dist/render/util/label.cjs.map +1 -1
- package/dist/render/util/label.d.ts +2 -2
- package/dist/render/util/label.d.ts.map +1 -1
- package/dist/render/util/label.js +15 -21
- package/dist/render/util/label.js.map +1 -1
- package/dist/render/util/pcolumn_data.cjs +56 -54
- package/dist/render/util/pcolumn_data.cjs.map +1 -1
- package/dist/render/util/pcolumn_data.d.ts +5 -5
- package/dist/render/util/pcolumn_data.d.ts.map +1 -1
- package/dist/render/util/pcolumn_data.js +56 -54
- package/dist/render/util/pcolumn_data.js.map +1 -1
- package/dist/render/util/pframe_upgraders.cjs +6 -6
- package/dist/render/util/pframe_upgraders.cjs.map +1 -1
- package/dist/render/util/pframe_upgraders.d.ts +1 -1
- package/dist/render/util/pframe_upgraders.d.ts.map +1 -1
- package/dist/render/util/pframe_upgraders.js +6 -6
- package/dist/render/util/pframe_upgraders.js.map +1 -1
- package/dist/render/util/split_selectors.d.ts +1 -1
- package/dist/render/util/split_selectors.d.ts.map +1 -1
- package/dist/sdk_info.cjs.map +1 -1
- package/dist/sdk_info.js.map +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +24 -22
- package/src/annotations/converter.test.ts +98 -101
- package/src/annotations/converter.ts +21 -17
- package/src/annotations/index.ts +2 -2
- package/src/annotations/types.ts +4 -4
- package/src/bconfig/index.ts +5 -5
- package/src/bconfig/lambdas.ts +10 -12
- package/src/bconfig/normalization.ts +5 -5
- package/src/bconfig/types.ts +3 -5
- package/src/bconfig/util.ts +3 -3
- package/src/bconfig/v3.ts +3 -3
- package/src/block_api_v1.ts +7 -3
- package/src/block_api_v2.ts +7 -3
- package/src/block_api_v3.ts +3 -3
- package/src/block_migrations.test.ts +66 -67
- package/src/block_migrations.ts +16 -16
- package/src/block_model.ts +76 -140
- package/src/block_state_patch.ts +2 -2
- package/src/block_state_util.ts +4 -4
- package/src/block_storage.test.ts +106 -99
- package/src/block_storage.ts +22 -25
- package/src/block_storage_vm.ts +41 -35
- package/src/builder.ts +107 -95
- package/src/components/PFrameForGraphs.test.ts +261 -255
- package/src/components/PFrameForGraphs.ts +35 -22
- package/src/components/PlAnnotations/filter.ts +21 -15
- package/src/components/PlAnnotations/filters_ui.test.ts +230 -73
- package/src/components/PlAnnotations/filters_ui.ts +138 -105
- package/src/components/PlAnnotations/index.ts +2 -2
- package/src/components/PlAnnotations/types.ts +2 -2
- package/src/components/PlDataTable.ts +177 -164
- package/src/components/PlMultiSequenceAlignment.ts +11 -18
- package/src/components/PlSelectionModel.ts +1 -1
- package/src/components/index.ts +5 -5
- package/src/config/actions.ts +64 -59
- package/src/config/actions_kinds.ts +38 -34
- package/src/config/index.ts +6 -6
- package/src/config/model.ts +28 -28
- package/src/config/model_meta.ts +1 -1
- package/src/config/type_engine.ts +3 -3
- package/src/config/type_util.ts +2 -2
- package/src/env_value.ts +2 -2
- package/src/filters/converter.test.ts +185 -144
- package/src/filters/converter.ts +47 -35
- package/src/filters/index.ts +2 -2
- package/src/filters/types.ts +44 -39
- package/src/global.d.ts +1 -1
- package/src/index.ts +24 -24
- package/src/internal.ts +27 -17
- package/src/pframe.ts +3 -3
- package/src/pframe_utils/columns.ts +81 -31
- package/src/pframe_utils/index.ts +65 -43
- package/src/platforma.ts +44 -21
- package/src/raw_globals.ts +13 -7
- package/src/ref_util.ts +6 -6
- package/src/render/accessor.ts +43 -44
- package/src/render/api.ts +102 -78
- package/src/render/future.ts +2 -2
- package/src/render/index.ts +6 -6
- package/src/render/internal.ts +11 -12
- package/src/render/traversal_ops.ts +1 -1
- package/src/render/util/axis_filtering.ts +67 -52
- package/src/render/util/column_collection.ts +171 -91
- package/src/render/util/index.ts +4 -4
- package/src/render/util/label.test.ts +139 -139
- package/src/render/util/label.ts +42 -33
- package/src/render/util/pcolumn_data.ts +111 -75
- package/src/render/util/pframe_upgraders.ts +24 -13
- package/src/render/util/split_selectors.ts +6 -1
- package/src/sdk_info.ts +1 -1
- package/src/typing.test.ts +56 -56
- package/src/version.ts +1 -1
|
@@ -14,7 +14,7 @@ import type {
|
|
|
14
14
|
PObjectId,
|
|
15
15
|
ResolveAnchorsOptions,
|
|
16
16
|
SUniversalPColumnId,
|
|
17
|
-
} from
|
|
17
|
+
} from "@milaboratories/pl-model-common";
|
|
18
18
|
import {
|
|
19
19
|
Annotation,
|
|
20
20
|
canonicalizeAxisId,
|
|
@@ -29,26 +29,28 @@ import {
|
|
|
29
29
|
matchAxisId,
|
|
30
30
|
resolveAnchors,
|
|
31
31
|
selectorsToPredicate,
|
|
32
|
-
} from
|
|
33
|
-
import canonicalize from
|
|
34
|
-
import type { Optional } from
|
|
35
|
-
import type { TreeNodeAccessor } from
|
|
36
|
-
import type { PColumnDataUniversal } from
|
|
37
|
-
import { filterDataInfoEntries } from
|
|
38
|
-
import type { LabelDerivationOps, TraceEntry } from
|
|
39
|
-
import { deriveLabels } from
|
|
40
|
-
import { convertOrParsePColumnData, getUniquePartitionKeys } from
|
|
41
|
-
import type { APColumnSelectorWithSplit, PColumnSelectorWithSplit } from
|
|
32
|
+
} from "@milaboratories/pl-model-common";
|
|
33
|
+
import canonicalize from "canonicalize";
|
|
34
|
+
import type { Optional } from "utility-types";
|
|
35
|
+
import type { TreeNodeAccessor } from "../accessor";
|
|
36
|
+
import type { PColumnDataUniversal } from "../api";
|
|
37
|
+
import { filterDataInfoEntries } from "./axis_filtering";
|
|
38
|
+
import type { LabelDerivationOps, TraceEntry } from "./label";
|
|
39
|
+
import { deriveLabels } from "./label";
|
|
40
|
+
import { convertOrParsePColumnData, getUniquePartitionKeys } from "./pcolumn_data";
|
|
41
|
+
import type { APColumnSelectorWithSplit, PColumnSelectorWithSplit } from "./split_selectors";
|
|
42
42
|
|
|
43
43
|
function isPColumnValues(value: unknown): value is PColumnValues {
|
|
44
44
|
if (!Array.isArray(value)) return false;
|
|
45
45
|
if (value.length === 0) return true;
|
|
46
46
|
const first = value[0];
|
|
47
|
-
return typeof first ===
|
|
47
|
+
return typeof first === "object" && first !== null && "key" in first && "val" in first;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
export interface ColumnProvider {
|
|
51
|
-
selectColumns(
|
|
51
|
+
selectColumns(
|
|
52
|
+
selectors: ((spec: PColumnSpec) => boolean) | PColumnSelector | PColumnSelector[],
|
|
53
|
+
): PColumn<PColumnDataUniversal | undefined>[];
|
|
52
54
|
}
|
|
53
55
|
|
|
54
56
|
export interface AxisLabelProvider {
|
|
@@ -61,11 +63,14 @@ export interface AxisLabelProvider {
|
|
|
61
63
|
class ArrayColumnProvider implements ColumnProvider {
|
|
62
64
|
constructor(private readonly columns: PColumn<PColumnDataUniversal | undefined>[]) {}
|
|
63
65
|
|
|
64
|
-
selectColumns(
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
selectColumns(
|
|
67
|
+
selectors: ((spec: PColumnSpec) => boolean) | PColumnSelector | PColumnSelector[],
|
|
68
|
+
): PColumn<PColumnDataUniversal | undefined>[] {
|
|
69
|
+
const predicate = typeof selectors === "function" ? selectors : selectorsToPredicate(selectors);
|
|
67
70
|
// Filter based on spec, ignoring data type for now
|
|
68
|
-
return this.columns.filter((column): column is PColumn<PColumnDataUniversal | undefined> =>
|
|
71
|
+
return this.columns.filter((column): column is PColumn<PColumnDataUniversal | undefined> =>
|
|
72
|
+
predicate(column.spec),
|
|
73
|
+
);
|
|
69
74
|
}
|
|
70
75
|
}
|
|
71
76
|
|
|
@@ -99,7 +104,7 @@ type AxisFilterInfo = {
|
|
|
99
104
|
|
|
100
105
|
// Intermediate representation for columns requiring splitting
|
|
101
106
|
type IntermediateSplitEntry = {
|
|
102
|
-
type:
|
|
107
|
+
type: "split";
|
|
103
108
|
originalColumn: PColumn<PColumnDataUniversal | undefined>;
|
|
104
109
|
spec: PColumnSpec;
|
|
105
110
|
/** With splitting axes removed */
|
|
@@ -110,7 +115,7 @@ type IntermediateSplitEntry = {
|
|
|
110
115
|
|
|
111
116
|
// Intermediate representation for columns NOT requiring splitting
|
|
112
117
|
type IntermediateDirectEntry = {
|
|
113
|
-
type:
|
|
118
|
+
type: "direct";
|
|
114
119
|
originalColumn: PColumn<PColumnDataUniversal | undefined>;
|
|
115
120
|
spec: PColumnSpec;
|
|
116
121
|
/** The same as `spec` */
|
|
@@ -142,28 +147,42 @@ function fallbackIdDeriver(originalId: PObjectId, axisFilters?: AxisFilterByIdx[
|
|
|
142
147
|
|
|
143
148
|
/** Checks if a selector object uses any anchor properties */
|
|
144
149
|
function hasAnchors(selector: unknown): selector is AnchoredPColumnSelector {
|
|
145
|
-
if (!selector || typeof selector !==
|
|
150
|
+
if (!selector || typeof selector !== "object") return false;
|
|
146
151
|
const potentialAnchored = selector as Record<string, any>;
|
|
147
|
-
const domainHasAnchors =
|
|
148
|
-
|
|
149
|
-
|
|
152
|
+
const domainHasAnchors =
|
|
153
|
+
potentialAnchored["domain"] &&
|
|
154
|
+
typeof potentialAnchored["domain"] === "object" &&
|
|
155
|
+
Object.values(potentialAnchored["domain"]).some(
|
|
156
|
+
(v: unknown) => typeof v === "object" && v !== null && "anchor" in v,
|
|
157
|
+
);
|
|
158
|
+
const axesHaveAnchors =
|
|
159
|
+
potentialAnchored["axes"] &&
|
|
160
|
+
Array.isArray(potentialAnchored["axes"]) &&
|
|
161
|
+
potentialAnchored["axes"].some(
|
|
162
|
+
(a: unknown) => typeof a === "object" && a !== null && "anchor" in a,
|
|
163
|
+
);
|
|
164
|
+
return !!potentialAnchored["domainAnchor"] || domainHasAnchors || axesHaveAnchors;
|
|
150
165
|
}
|
|
151
166
|
|
|
152
167
|
/**
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
function getSplitAxisIndices(
|
|
157
|
-
|
|
168
|
+
* Derives the indices of axes marked for splitting based on the selector.
|
|
169
|
+
* Throws an error if splitting is requested alongside `partialAxesMatch`.
|
|
170
|
+
*/
|
|
171
|
+
function getSplitAxisIndices(
|
|
172
|
+
selector: APColumnSelectorWithSplit | ((spec: PColumnSpec) => boolean),
|
|
173
|
+
): number[] {
|
|
174
|
+
if (typeof selector !== "object" || !("axes" in selector) || selector.axes === undefined) {
|
|
158
175
|
return []; // No axes specified or not an object selector, no splitting
|
|
159
176
|
}
|
|
160
177
|
|
|
161
178
|
const splitIndices = selector.axes
|
|
162
|
-
.map((axis, index) =>
|
|
179
|
+
.map((axis, index) =>
|
|
180
|
+
typeof axis === "object" && "split" in axis && axis.split === true ? index : -1,
|
|
181
|
+
)
|
|
163
182
|
.filter((index) => index !== -1);
|
|
164
183
|
|
|
165
184
|
if (splitIndices.length > 0 && selector.partialAxesMatch !== undefined) {
|
|
166
|
-
throw new Error(
|
|
185
|
+
throw new Error("Axis splitting is not supported when `partialAxesMatch` is defined.");
|
|
167
186
|
}
|
|
168
187
|
|
|
169
188
|
splitIndices.sort((a, b) => a - b);
|
|
@@ -193,7 +212,9 @@ type UniversalPColumnOpts = UniversalPColumnOptsNoDeriver & {
|
|
|
193
212
|
|
|
194
213
|
export class PColumnCollection {
|
|
195
214
|
private readonly defaultProviderStore: PColumn<PColumnDataUniversal | undefined>[] = [];
|
|
196
|
-
private readonly providers: ColumnProvider[] = [
|
|
215
|
+
private readonly providers: ColumnProvider[] = [
|
|
216
|
+
new ArrayColumnProvider(this.defaultProviderStore),
|
|
217
|
+
];
|
|
197
218
|
private readonly axisLabelProviders: AxisLabelProvider[] = [];
|
|
198
219
|
|
|
199
220
|
constructor() {}
|
|
@@ -229,40 +250,62 @@ export class PColumnCollection {
|
|
|
229
250
|
|
|
230
251
|
// Overload signatures updated to return PColumnEntry types
|
|
231
252
|
public getUniversalEntries(
|
|
232
|
-
predicateOrSelectors:
|
|
233
|
-
|
|
253
|
+
predicateOrSelectors:
|
|
254
|
+
| ((spec: PColumnSpec) => boolean)
|
|
255
|
+
| APColumnSelectorWithSplit
|
|
256
|
+
| APColumnSelectorWithSplit[],
|
|
257
|
+
opts: UniversalPColumnOpts,
|
|
258
|
+
): PColumnEntryUniversal[] | undefined;
|
|
234
259
|
public getUniversalEntries(
|
|
235
|
-
predicateOrSelectors:
|
|
236
|
-
|
|
260
|
+
predicateOrSelectors:
|
|
261
|
+
| ((spec: PColumnSpec) => boolean)
|
|
262
|
+
| PColumnSelectorWithSplit
|
|
263
|
+
| PColumnSelectorWithSplit[],
|
|
264
|
+
opts?: UniversalPColumnOptsNoDeriver,
|
|
265
|
+
): PColumnEntryWithLabel[] | undefined;
|
|
237
266
|
public getUniversalEntries(
|
|
238
|
-
predicateOrSelectors:
|
|
239
|
-
|
|
240
|
-
|
|
267
|
+
predicateOrSelectors:
|
|
268
|
+
| ((spec: PColumnSpec) => boolean)
|
|
269
|
+
| APColumnSelectorWithSplit
|
|
270
|
+
| APColumnSelectorWithSplit[],
|
|
271
|
+
opts?: Optional<UniversalPColumnOpts, "anchorCtx">,
|
|
272
|
+
): (PColumnEntryWithLabel | PColumnEntryUniversal)[] | undefined {
|
|
273
|
+
const {
|
|
274
|
+
anchorCtx,
|
|
275
|
+
labelOps: rawLabelOps,
|
|
276
|
+
dontWaitAllData = false,
|
|
277
|
+
overrideLabelAnnotation = false,
|
|
278
|
+
exclude,
|
|
279
|
+
enrichByLinkers = false,
|
|
280
|
+
} = opts ?? {};
|
|
241
281
|
|
|
242
282
|
const labelOps: LabelDerivationOps = {
|
|
243
|
-
...(overrideLabelAnnotation && rawLabelOps?.includeNativeLabel !== false
|
|
244
|
-
|
|
283
|
+
...(overrideLabelAnnotation && rawLabelOps?.includeNativeLabel !== false
|
|
284
|
+
? { includeNativeLabel: true }
|
|
285
|
+
: {}),
|
|
286
|
+
...rawLabelOps,
|
|
245
287
|
};
|
|
246
288
|
|
|
247
|
-
let excludePredicate: (
|
|
289
|
+
let excludePredicate: (spec: PColumnSpec) => boolean = () => false;
|
|
248
290
|
if (exclude) {
|
|
249
|
-
const excludePredicartes = (Array.isArray(exclude) ? exclude : [exclude])
|
|
250
|
-
|
|
251
|
-
if (
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
291
|
+
const excludePredicartes = (Array.isArray(exclude) ? exclude : [exclude]).map((selector) => {
|
|
292
|
+
if (hasAnchors(selector)) {
|
|
293
|
+
if (!anchorCtx)
|
|
294
|
+
throw new Error(
|
|
295
|
+
"Anchored selectors in exclude require an AnchoredIdDeriver to be provided in options.",
|
|
296
|
+
);
|
|
297
|
+
return selectorsToPredicate(resolveAnchors(anchorCtx.anchors, selector, opts));
|
|
298
|
+
} else return selectorsToPredicate(selector);
|
|
299
|
+
});
|
|
258
300
|
excludePredicate = (spec) => excludePredicartes.some((predicate) => predicate(spec));
|
|
259
301
|
}
|
|
260
302
|
|
|
261
|
-
const selectorsArray =
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
303
|
+
const selectorsArray =
|
|
304
|
+
typeof predicateOrSelectors === "function"
|
|
305
|
+
? [predicateOrSelectors]
|
|
306
|
+
: Array.isArray(predicateOrSelectors)
|
|
307
|
+
? predicateOrSelectors
|
|
308
|
+
: [predicateOrSelectors];
|
|
266
309
|
|
|
267
310
|
const intermediateResults: IntermediateColumnEntry[] = [];
|
|
268
311
|
const selectedNativeIds = new Set<NativePObjectId>();
|
|
@@ -273,10 +316,18 @@ export class PColumnCollection {
|
|
|
273
316
|
let currentSelector: PColumnSelectorWithSplit | ((spec: PColumnSpec) => boolean);
|
|
274
317
|
if (usesAnchors) {
|
|
275
318
|
if (!anchorCtx)
|
|
276
|
-
throw new Error(
|
|
277
|
-
|
|
319
|
+
throw new Error(
|
|
320
|
+
"Anchored selectors require an AnchoredIdDeriver to be provided in options.",
|
|
321
|
+
);
|
|
322
|
+
currentSelector = resolveAnchors(
|
|
323
|
+
anchorCtx.anchors,
|
|
324
|
+
rawSelector as AnchoredPColumnSelector,
|
|
325
|
+
opts,
|
|
326
|
+
);
|
|
278
327
|
} else
|
|
279
|
-
currentSelector = rawSelector as
|
|
328
|
+
currentSelector = rawSelector as
|
|
329
|
+
| PColumnSelectorWithSplit
|
|
330
|
+
| ((spec: PColumnSpec) => boolean);
|
|
280
331
|
|
|
281
332
|
const selectedIds = new Set<PObjectId>();
|
|
282
333
|
const selectedColumns: PColumn<PColumnDataUniversal | undefined>[] = [];
|
|
@@ -285,10 +336,11 @@ export class PColumnCollection {
|
|
|
285
336
|
for (const col of providerColumns) {
|
|
286
337
|
if (excludePredicate(col.spec)) continue;
|
|
287
338
|
if (selectedIds.has(col.id))
|
|
288
|
-
throw new Error(
|
|
339
|
+
throw new Error(
|
|
340
|
+
`Duplicate column id ${col.id} in provider ${provider.constructor.name}`,
|
|
341
|
+
);
|
|
289
342
|
const nativeId = deriveNativeId(col.spec);
|
|
290
|
-
if (selectedNativeIds.has(nativeId))
|
|
291
|
-
continue;
|
|
343
|
+
if (selectedNativeIds.has(nativeId)) continue;
|
|
292
344
|
selectedIds.add(col.id);
|
|
293
345
|
selectedNativeIds.add(nativeId);
|
|
294
346
|
selectedColumns.push(col);
|
|
@@ -307,7 +359,9 @@ export class PColumnCollection {
|
|
|
307
359
|
|
|
308
360
|
if (needsSplitting) {
|
|
309
361
|
if (isPColumnValues(column.data))
|
|
310
|
-
throw new Error(
|
|
362
|
+
throw new Error(
|
|
363
|
+
`Splitting is not supported for PColumns with PColumnValues data format. Column id: ${column.id}`,
|
|
364
|
+
);
|
|
311
365
|
const dataEntries = convertOrParsePColumnData(column.data);
|
|
312
366
|
|
|
313
367
|
if (!dataEntries) {
|
|
@@ -316,28 +370,35 @@ export class PColumnCollection {
|
|
|
316
370
|
}
|
|
317
371
|
|
|
318
372
|
if (!isPartitionedDataInfoEntries(dataEntries))
|
|
319
|
-
throw new Error(
|
|
373
|
+
throw new Error(
|
|
374
|
+
`Splitting requires Partitioned DataInfoEntries, but parsing resulted in ${dataEntries.type} for column ${column.id}`,
|
|
375
|
+
);
|
|
320
376
|
|
|
321
377
|
const uniqueKeys = getUniquePartitionKeys(dataEntries);
|
|
322
378
|
|
|
323
379
|
const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];
|
|
324
380
|
if (maxSplitIdx >= dataEntries.partitionKeyLength)
|
|
325
|
-
throw new Error(
|
|
381
|
+
throw new Error(
|
|
382
|
+
`Not enough partition keys (${dataEntries.partitionKeyLength}) for requested split axes (max index ${maxSplitIdx}) in column ${originalSpec.name}`,
|
|
383
|
+
);
|
|
326
384
|
|
|
327
|
-
const axesLabels: (Record<string | number, string> | undefined)[] = splitAxisIdxs
|
|
328
|
-
|
|
385
|
+
const axesLabels: (Record<string | number, string> | undefined)[] = splitAxisIdxs.map(
|
|
386
|
+
(idx) => this.findLabels(getAxisId(originalSpec.axesSpec[idx])),
|
|
387
|
+
);
|
|
329
388
|
|
|
330
389
|
const keyCombinations: (string | number)[][] = [];
|
|
331
390
|
const generateCombinations = (currentCombo: (string | number)[], sAxisIdx: number) => {
|
|
332
391
|
if (sAxisIdx >= splitAxisIdxs.length) {
|
|
333
392
|
keyCombinations.push([...currentCombo]);
|
|
334
393
|
if (keyCombinations.length > 10000)
|
|
335
|
-
throw new Error(
|
|
394
|
+
throw new Error("Too many key combinations, aborting.");
|
|
336
395
|
return;
|
|
337
396
|
}
|
|
338
397
|
const axisIdx = splitAxisIdxs[sAxisIdx];
|
|
339
398
|
if (axisIdx >= uniqueKeys.length)
|
|
340
|
-
throw new Error(
|
|
399
|
+
throw new Error(
|
|
400
|
+
`Axis index ${axisIdx} out of bounds for unique keys array (length ${uniqueKeys.length}) during split key generation for column ${column.id}`,
|
|
401
|
+
);
|
|
341
402
|
const axisValues = uniqueKeys[axisIdx];
|
|
342
403
|
if (!axisValues || axisValues.length === 0) {
|
|
343
404
|
keyCombinations.length = 0; // No combinations possible if one axis has no keys
|
|
@@ -352,8 +413,7 @@ export class PColumnCollection {
|
|
|
352
413
|
|
|
353
414
|
generateCombinations([], 0);
|
|
354
415
|
|
|
355
|
-
if (keyCombinations.length === 0)
|
|
356
|
-
continue;
|
|
416
|
+
if (keyCombinations.length === 0) continue;
|
|
357
417
|
|
|
358
418
|
const newAxesSpec = [...originalSpec.axesSpec];
|
|
359
419
|
const splitAxisOriginalIdxs = splitAxisIdxs.map((idx) => idx); // Keep original indices for axisId lookup
|
|
@@ -373,7 +433,7 @@ export class PColumnCollection {
|
|
|
373
433
|
});
|
|
374
434
|
|
|
375
435
|
intermediateResults.push({
|
|
376
|
-
type:
|
|
436
|
+
type: "split",
|
|
377
437
|
originalColumn: column,
|
|
378
438
|
spec: originalSpec,
|
|
379
439
|
adjustedSpec,
|
|
@@ -383,7 +443,7 @@ export class PColumnCollection {
|
|
|
383
443
|
}
|
|
384
444
|
} else {
|
|
385
445
|
intermediateResults.push({
|
|
386
|
-
type:
|
|
446
|
+
type: "direct",
|
|
387
447
|
originalColumn: column,
|
|
388
448
|
spec: originalSpec,
|
|
389
449
|
adjustedSpec: originalSpec,
|
|
@@ -398,7 +458,7 @@ export class PColumnCollection {
|
|
|
398
458
|
intermediateResults,
|
|
399
459
|
(entry) => ({
|
|
400
460
|
spec: entry.spec,
|
|
401
|
-
suffixTrace: entry.type ===
|
|
461
|
+
suffixTrace: entry.type === "split" ? splitFiltersToTrace(entry.axisFilters) : undefined,
|
|
402
462
|
}),
|
|
403
463
|
labelOps,
|
|
404
464
|
);
|
|
@@ -408,7 +468,7 @@ export class PColumnCollection {
|
|
|
408
468
|
for (const { value: entry, label } of labeledResults) {
|
|
409
469
|
const { originalColumn, spec: originalSpec } = entry;
|
|
410
470
|
|
|
411
|
-
const axisFilters = entry.type ===
|
|
471
|
+
const axisFilters = entry.type === "split" ? entry.axisFilters : undefined;
|
|
412
472
|
const axisFiltersTuple = splitFiltersToAxisFilter(axisFilters);
|
|
413
473
|
|
|
414
474
|
let finalId: SUniversalPColumnId | PObjectId;
|
|
@@ -421,7 +481,7 @@ export class PColumnCollection {
|
|
|
421
481
|
finalSpec = {
|
|
422
482
|
...finalSpec,
|
|
423
483
|
annotations: {
|
|
424
|
-
...
|
|
484
|
+
...finalSpec.annotations,
|
|
425
485
|
[Annotation.Label]: label,
|
|
426
486
|
} satisfies Annotation,
|
|
427
487
|
};
|
|
@@ -430,9 +490,10 @@ export class PColumnCollection {
|
|
|
430
490
|
result.push({
|
|
431
491
|
id: finalId,
|
|
432
492
|
spec: finalSpec,
|
|
433
|
-
data: () =>
|
|
434
|
-
|
|
435
|
-
|
|
493
|
+
data: () =>
|
|
494
|
+
entry.type === "split"
|
|
495
|
+
? entriesToDataInfo(filterDataInfoEntries(entry.dataEntries, axisFiltersTuple!))
|
|
496
|
+
: entry.originalColumn.data,
|
|
436
497
|
label: label,
|
|
437
498
|
});
|
|
438
499
|
}
|
|
@@ -443,7 +504,7 @@ export class PColumnCollection {
|
|
|
443
504
|
const linkers = result.filter((entry) => isLinkerColumn(entry.spec));
|
|
444
505
|
if (linkers.length === 0) {
|
|
445
506
|
return result;
|
|
446
|
-
}
|
|
507
|
+
}
|
|
447
508
|
|
|
448
509
|
const anchorAxes = Object.values(anchorCtx.anchors).flatMap((anchor) => anchor.axesSpec);
|
|
449
510
|
const linkerMap = LinkerMap.fromColumns(linkers.map(getColumnIdAndSpec));
|
|
@@ -453,14 +514,21 @@ export class PColumnCollection {
|
|
|
453
514
|
return matchAxisId(linkerKeyId, sourceAxisId) || matchAxisId(sourceAxisId, linkerKeyId);
|
|
454
515
|
}
|
|
455
516
|
// search all axes that can be reached by linkers from anchor axes; anchor axes are not in this list;
|
|
456
|
-
const availableByLinkersAxes = linkerMap.getReachableByLinkersAxesFromAxes(
|
|
517
|
+
const availableByLinkersAxes = linkerMap.getReachableByLinkersAxesFromAxes(
|
|
518
|
+
anchorAxes,
|
|
519
|
+
matchAxisIdFn,
|
|
520
|
+
);
|
|
457
521
|
|
|
458
522
|
// search all columns that includes at least one of additional axes;
|
|
459
523
|
const availableByLinkersColumns = this.getUniversalEntries(
|
|
460
|
-
(spec) =>
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
524
|
+
(spec) =>
|
|
525
|
+
!isLinkerColumn(spec) &&
|
|
526
|
+
spec.axesSpec.some((columnAxisSpec) => {
|
|
527
|
+
const columnAxisId = getAxisId(columnAxisSpec);
|
|
528
|
+
return availableByLinkersAxes.some((axis) =>
|
|
529
|
+
matchAxisIdFn(getAxisId(axis), columnAxisId),
|
|
530
|
+
);
|
|
531
|
+
}),
|
|
464
532
|
{ anchorCtx, labelOps, dontWaitAllData, overrideLabelAnnotation, exclude },
|
|
465
533
|
);
|
|
466
534
|
if (availableByLinkersColumns) {
|
|
@@ -472,17 +540,29 @@ export class PColumnCollection {
|
|
|
472
540
|
}
|
|
473
541
|
|
|
474
542
|
public getColumns(
|
|
475
|
-
predicateOrSelectors:
|
|
476
|
-
|
|
543
|
+
predicateOrSelectors:
|
|
544
|
+
| ((spec: PColumnSpec) => boolean)
|
|
545
|
+
| APColumnSelectorWithSplit
|
|
546
|
+
| APColumnSelectorWithSplit[],
|
|
547
|
+
opts: UniversalPColumnOpts,
|
|
548
|
+
): PColumn<PColumnDataUniversal>[] | undefined;
|
|
477
549
|
public getColumns(
|
|
478
|
-
predicateOrSelectors:
|
|
479
|
-
|
|
550
|
+
predicateOrSelectors:
|
|
551
|
+
| ((spec: PColumnSpec) => boolean)
|
|
552
|
+
| PColumnSelectorWithSplit
|
|
553
|
+
| PColumnSelectorWithSplit[],
|
|
554
|
+
opts?: UniversalPColumnOptsNoDeriver,
|
|
555
|
+
): PColumn<PColumnDataUniversal>[] | undefined;
|
|
480
556
|
public getColumns(
|
|
481
|
-
predicateOrSelectors:
|
|
482
|
-
|
|
557
|
+
predicateOrSelectors:
|
|
558
|
+
| ((spec: PColumnSpec) => boolean)
|
|
559
|
+
| APColumnSelectorWithSplit
|
|
560
|
+
| APColumnSelectorWithSplit[],
|
|
561
|
+
opts?: Optional<UniversalPColumnOpts, "anchorCtx">,
|
|
562
|
+
): PColumn<PColumnDataUniversal>[] | undefined {
|
|
483
563
|
const entries = this.getUniversalEntries(predicateOrSelectors, {
|
|
484
564
|
overrideLabelAnnotation: true, // default for getColumns
|
|
485
|
-
...
|
|
565
|
+
...opts,
|
|
486
566
|
} as UniversalPColumnOpts);
|
|
487
567
|
if (!entries) return undefined;
|
|
488
568
|
|
package/src/render/util/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
4
|
-
export * from
|
|
1
|
+
export * from "./pcolumn_data";
|
|
2
|
+
export * from "./label";
|
|
3
|
+
export * from "./axis_filtering";
|
|
4
|
+
export * from "./column_collection";
|