@milaboratories/pl-model-common 1.25.1 → 1.25.3
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/_virtual/_rolldown/runtime.cjs +29 -0
- package/dist/author_marker.d.ts +9 -6
- package/dist/base32_encode.cjs +40 -46
- package/dist/base32_encode.cjs.map +1 -1
- package/dist/base32_encode.js +40 -45
- package/dist/base32_encode.js.map +1 -1
- package/dist/base64.cjs +5 -4
- package/dist/base64.cjs.map +1 -1
- package/dist/base64.d.ts +10 -6
- package/dist/base64.js +5 -3
- package/dist/base64.js.map +1 -1
- package/dist/block_state.d.ts +21 -23
- package/dist/bmodel/block_config.cjs +9 -10
- package/dist/bmodel/block_config.cjs.map +1 -1
- package/dist/bmodel/block_config.d.ts +53 -72
- package/dist/bmodel/block_config.js +9 -9
- package/dist/bmodel/block_config.js.map +1 -1
- package/dist/bmodel/code.cjs +7 -6
- package/dist/bmodel/code.cjs.map +1 -1
- package/dist/bmodel/code.d.ts +17 -13
- package/dist/bmodel/code.js +6 -4
- package/dist/bmodel/code.js.map +1 -1
- package/dist/bmodel/container.d.ts +46 -44
- package/dist/bmodel/index.cjs +3 -0
- package/dist/bmodel/index.d.ts +5 -6
- package/dist/bmodel/index.js +3 -0
- package/dist/bmodel/normalization.cjs +90 -106
- package/dist/bmodel/normalization.cjs.map +1 -1
- package/dist/bmodel/normalization.d.ts +7 -3
- package/dist/bmodel/normalization.js +90 -105
- package/dist/bmodel/normalization.js.map +1 -1
- package/dist/bmodel/types.d.ts +4 -1
- package/dist/branding.d.ts +5 -5
- package/dist/common_types.d.ts +19 -15
- package/dist/driver_kit.d.ts +25 -17
- package/dist/drivers/ChunkedStreamReader.cjs +168 -203
- package/dist/drivers/ChunkedStreamReader.cjs.map +1 -1
- package/dist/drivers/ChunkedStreamReader.d.ts +104 -100
- package/dist/drivers/ChunkedStreamReader.js +168 -202
- package/dist/drivers/ChunkedStreamReader.js.map +1 -1
- package/dist/drivers/blob.cjs +15 -17
- package/dist/drivers/blob.cjs.map +1 -1
- package/dist/drivers/blob.d.ts +35 -35
- package/dist/drivers/blob.js +14 -15
- package/dist/drivers/blob.js.map +1 -1
- package/dist/drivers/index.cjs +18 -0
- package/dist/drivers/index.d.ts +29 -9
- package/dist/drivers/index.js +18 -0
- package/dist/drivers/interfaces.d.ts +17 -14
- package/dist/drivers/log.cjs +4 -3
- package/dist/drivers/log.cjs.map +1 -1
- package/dist/drivers/log.d.ts +52 -49
- package/dist/drivers/log.js +4 -2
- package/dist/drivers/log.js.map +1 -1
- package/dist/drivers/ls.cjs +16 -19
- package/dist/drivers/ls.cjs.map +1 -1
- package/dist/drivers/ls.d.ts +73 -76
- package/dist/drivers/ls.js +16 -17
- package/dist/drivers/ls.js.map +1 -1
- package/dist/drivers/pframe/column_filter.d.ts +19 -15
- package/dist/drivers/pframe/data_info.cjs +201 -252
- package/dist/drivers/pframe/data_info.cjs.map +1 -1
- package/dist/drivers/pframe/data_info.d.ts +84 -109
- package/dist/drivers/pframe/data_info.js +201 -250
- package/dist/drivers/pframe/data_info.js.map +1 -1
- package/dist/drivers/pframe/data_types.cjs +38 -63
- package/dist/drivers/pframe/data_types.cjs.map +1 -1
- package/dist/drivers/pframe/data_types.d.ts +91 -93
- package/dist/drivers/pframe/data_types.js +38 -61
- package/dist/drivers/pframe/data_types.js.map +1 -1
- package/dist/drivers/pframe/driver.cjs +7 -0
- package/dist/drivers/pframe/driver.cjs.map +1 -0
- package/dist/drivers/pframe/driver.d.ts +50 -45
- package/dist/drivers/pframe/driver.js +6 -0
- package/dist/drivers/pframe/driver.js.map +1 -0
- package/dist/drivers/pframe/filter_spec.d.ts +127 -123
- package/dist/drivers/pframe/find_columns.d.ts +21 -17
- package/dist/drivers/pframe/index.cjs +15 -0
- package/dist/drivers/pframe/index.d.ts +23 -16
- package/dist/drivers/pframe/index.js +15 -0
- package/dist/drivers/pframe/linker_columns.cjs +184 -238
- package/dist/drivers/pframe/linker_columns.cjs.map +1 -1
- package/dist/drivers/pframe/linker_columns.d.ts +45 -38
- package/dist/drivers/pframe/linker_columns.js +184 -236
- package/dist/drivers/pframe/linker_columns.js.map +1 -1
- package/dist/drivers/pframe/pframe.d.ts +26 -21
- package/dist/drivers/pframe/query/index.cjs +1 -0
- package/dist/drivers/pframe/query/index.d.ts +3 -4
- package/dist/drivers/pframe/query/index.js +1 -0
- package/dist/drivers/pframe/query/query_common.d.ts +205 -247
- package/dist/drivers/pframe/query/query_data.d.ts +25 -23
- package/dist/drivers/pframe/query/query_spec.d.ts +30 -29
- package/dist/drivers/pframe/query/utils.cjs +164 -183
- package/dist/drivers/pframe/query/utils.cjs.map +1 -1
- package/dist/drivers/pframe/query/utils.d.ts +13 -12
- package/dist/drivers/pframe/query/utils.js +164 -181
- package/dist/drivers/pframe/query/utils.js.map +1 -1
- package/dist/drivers/pframe/spec/anchored.cjs +178 -216
- package/dist/drivers/pframe/spec/anchored.cjs.map +1 -1
- package/dist/drivers/pframe/spec/anchored.d.ts +53 -49
- package/dist/drivers/pframe/spec/anchored.js +176 -214
- package/dist/drivers/pframe/spec/anchored.js.map +1 -1
- package/dist/drivers/pframe/spec/filtered_column.cjs +8 -7
- package/dist/drivers/pframe/spec/filtered_column.cjs.map +1 -1
- package/dist/drivers/pframe/spec/filtered_column.d.ts +20 -17
- package/dist/drivers/pframe/spec/filtered_column.js +8 -6
- package/dist/drivers/pframe/spec/filtered_column.js.map +1 -1
- package/dist/drivers/pframe/spec/ids.cjs +16 -14
- package/dist/drivers/pframe/spec/ids.cjs.map +1 -1
- package/dist/drivers/pframe/spec/ids.d.ts +13 -8
- package/dist/drivers/pframe/spec/ids.js +14 -12
- package/dist/drivers/pframe/spec/ids.js.map +1 -1
- package/dist/drivers/pframe/spec/index.cjs +6 -0
- package/dist/drivers/pframe/spec/index.d.ts +6 -7
- package/dist/drivers/pframe/spec/index.js +6 -0
- package/dist/drivers/pframe/spec/native_id.cjs +16 -16
- package/dist/drivers/pframe/spec/native_id.cjs.map +1 -1
- package/dist/drivers/pframe/spec/native_id.d.ts +9 -4
- package/dist/drivers/pframe/spec/native_id.js +13 -13
- package/dist/drivers/pframe/spec/native_id.js.map +1 -1
- package/dist/drivers/pframe/spec/selectors.cjs +72 -112
- package/dist/drivers/pframe/spec/selectors.cjs.map +1 -1
- package/dist/drivers/pframe/spec/selectors.d.ts +99 -94
- package/dist/drivers/pframe/spec/selectors.js +72 -110
- package/dist/drivers/pframe/spec/selectors.js.map +1 -1
- package/dist/drivers/pframe/spec/spec.cjs +282 -324
- package/dist/drivers/pframe/spec/spec.cjs.map +1 -1
- package/dist/drivers/pframe/spec/spec.d.ts +263 -272
- package/dist/drivers/pframe/spec/spec.js +281 -322
- package/dist/drivers/pframe/spec/spec.js.map +1 -1
- package/dist/drivers/pframe/table.d.ts +28 -24
- package/dist/drivers/pframe/table_calculate.cjs +117 -147
- package/dist/drivers/pframe/table_calculate.cjs.map +1 -1
- package/dist/drivers/pframe/table_calculate.d.ts +219 -220
- package/dist/drivers/pframe/table_calculate.js +117 -145
- package/dist/drivers/pframe/table_calculate.js.map +1 -1
- package/dist/drivers/pframe/table_common.cjs +13 -14
- package/dist/drivers/pframe/table_common.cjs.map +1 -1
- package/dist/drivers/pframe/table_common.d.ts +24 -19
- package/dist/drivers/pframe/table_common.js +13 -13
- package/dist/drivers/pframe/table_common.js.map +1 -1
- package/dist/drivers/pframe/unique_values.d.ts +23 -18
- package/dist/drivers/upload.d.ts +21 -18
- package/dist/drivers/urls.cjs +5 -6
- package/dist/drivers/urls.cjs.map +1 -1
- package/dist/drivers/urls.d.ts +12 -9
- package/dist/drivers/urls.js +5 -5
- package/dist/drivers/urls.js.map +1 -1
- package/dist/errors.cjs +65 -86
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts +36 -33
- package/dist/errors.js +65 -85
- package/dist/errors.js.map +1 -1
- package/dist/flags/block_flags.cjs +7 -6
- package/dist/flags/block_flags.cjs.map +1 -1
- package/dist/flags/block_flags.d.ts +12 -8
- package/dist/flags/block_flags.js +7 -5
- package/dist/flags/block_flags.js.map +1 -1
- package/dist/flags/flag_utils.cjs +69 -108
- package/dist/flags/flag_utils.cjs.map +1 -1
- package/dist/flags/flag_utils.d.ts +40 -42
- package/dist/flags/flag_utils.js +70 -107
- package/dist/flags/flag_utils.js.map +1 -1
- package/dist/flags/type_utils.d.ts +12 -11
- package/dist/httpAuth.cjs +16 -20
- package/dist/httpAuth.cjs.map +1 -1
- package/dist/httpAuth.d.ts +10 -7
- package/dist/httpAuth.js +16 -19
- package/dist/httpAuth.js.map +1 -1
- package/dist/index.cjs +176 -179
- package/dist/index.d.ts +58 -20
- package/dist/index.js +37 -34
- package/dist/json.cjs +10 -8
- package/dist/json.cjs.map +1 -1
- package/dist/json.d.ts +18 -18
- package/dist/json.js +8 -6
- package/dist/json.js.map +1 -1
- package/dist/navigation.cjs +3 -2
- package/dist/navigation.cjs.map +1 -1
- package/dist/navigation.d.ts +18 -21
- package/dist/navigation.js +3 -1
- package/dist/navigation.js.map +1 -1
- package/dist/plid.cjs +16 -20
- package/dist/plid.cjs.map +1 -1
- package/dist/plid.d.ts +11 -7
- package/dist/plid.js +15 -18
- package/dist/plid.js.map +1 -1
- package/dist/pool/entry.d.ts +11 -11
- package/dist/pool/index.d.ts +3 -4
- package/dist/pool/query.cjs +21 -43
- package/dist/pool/query.cjs.map +1 -1
- package/dist/pool/query.d.ts +25 -20
- package/dist/pool/query.js +20 -40
- package/dist/pool/query.js.map +1 -1
- package/dist/pool/spec.cjs +40 -47
- package/dist/pool/spec.cjs.map +1 -1
- package/dist/pool/spec.d.ts +33 -31
- package/dist/pool/spec.js +40 -45
- package/dist/pool/spec.js.map +1 -1
- package/dist/ref.cjs +51 -71
- package/dist/ref.cjs.map +1 -1
- package/dist/ref.d.ts +36 -33
- package/dist/ref.js +50 -69
- package/dist/ref.js.map +1 -1
- package/dist/utag.d.ts +18 -14
- package/dist/util.cjs +8 -7
- package/dist/util.cjs.map +1 -1
- package/dist/util.d.ts +5 -2
- package/dist/util.js +8 -6
- package/dist/util.js.map +1 -1
- package/dist/value_or_error.cjs +7 -3
- package/dist/value_or_error.cjs.map +1 -1
- package/dist/value_or_error.d.ts +9 -6
- package/dist/value_or_error.js +7 -2
- package/dist/value_or_error.js.map +1 -1
- package/package.json +6 -6
- package/src/flags/block_flags.ts +2 -1
- package/src/flags/flag_utils.ts +0 -22
- package/dist/author_marker.d.ts.map +0 -1
- package/dist/base32_encode.d.ts +0 -8
- package/dist/base32_encode.d.ts.map +0 -1
- package/dist/base64.d.ts.map +0 -1
- package/dist/block_state.d.ts.map +0 -1
- package/dist/bmodel/block_config.d.ts.map +0 -1
- package/dist/bmodel/code.d.ts.map +0 -1
- package/dist/bmodel/container.d.ts.map +0 -1
- package/dist/bmodel/index.d.ts.map +0 -1
- package/dist/bmodel/normalization.d.ts.map +0 -1
- package/dist/bmodel/types.d.ts.map +0 -1
- package/dist/branding.d.ts.map +0 -1
- package/dist/common_types.d.ts.map +0 -1
- package/dist/driver_kit.d.ts.map +0 -1
- package/dist/drivers/ChunkedStreamReader.d.ts.map +0 -1
- package/dist/drivers/blob.d.ts.map +0 -1
- package/dist/drivers/index.d.ts.map +0 -1
- package/dist/drivers/interfaces.d.ts.map +0 -1
- package/dist/drivers/log.d.ts.map +0 -1
- package/dist/drivers/ls.d.ts.map +0 -1
- package/dist/drivers/pframe/column_filter.d.ts.map +0 -1
- package/dist/drivers/pframe/data_info.d.ts.map +0 -1
- package/dist/drivers/pframe/data_types.d.ts.map +0 -1
- package/dist/drivers/pframe/driver.d.ts.map +0 -1
- package/dist/drivers/pframe/filter_spec.d.ts.map +0 -1
- package/dist/drivers/pframe/find_columns.d.ts.map +0 -1
- package/dist/drivers/pframe/index.d.ts.map +0 -1
- package/dist/drivers/pframe/linker_columns.d.ts.map +0 -1
- package/dist/drivers/pframe/pframe.d.ts.map +0 -1
- package/dist/drivers/pframe/query/index.d.ts.map +0 -1
- package/dist/drivers/pframe/query/query_common.d.ts.map +0 -1
- package/dist/drivers/pframe/query/query_data.d.ts.map +0 -1
- package/dist/drivers/pframe/query/query_spec.d.ts.map +0 -1
- package/dist/drivers/pframe/query/utils.d.ts.map +0 -1
- package/dist/drivers/pframe/spec/anchored.d.ts.map +0 -1
- package/dist/drivers/pframe/spec/filtered_column.d.ts.map +0 -1
- package/dist/drivers/pframe/spec/ids.d.ts.map +0 -1
- package/dist/drivers/pframe/spec/index.d.ts.map +0 -1
- package/dist/drivers/pframe/spec/native_id.d.ts.map +0 -1
- package/dist/drivers/pframe/spec/selectors.d.ts.map +0 -1
- package/dist/drivers/pframe/spec/spec.d.ts.map +0 -1
- package/dist/drivers/pframe/table.d.ts.map +0 -1
- package/dist/drivers/pframe/table_calculate.d.ts.map +0 -1
- package/dist/drivers/pframe/table_common.d.ts.map +0 -1
- package/dist/drivers/pframe/type_util.d.ts +0 -5
- package/dist/drivers/pframe/type_util.d.ts.map +0 -1
- package/dist/drivers/pframe/unique_values.d.ts.map +0 -1
- package/dist/drivers/upload.d.ts.map +0 -1
- package/dist/drivers/urls.d.ts.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/flags/block_flags.d.ts.map +0 -1
- package/dist/flags/flag_utils.d.ts.map +0 -1
- package/dist/flags/index.d.ts +0 -4
- package/dist/flags/index.d.ts.map +0 -1
- package/dist/flags/type_utils.d.ts.map +0 -1
- package/dist/httpAuth.d.ts.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/json.d.ts.map +0 -1
- package/dist/navigation.d.ts.map +0 -1
- package/dist/plid.d.ts.map +0 -1
- package/dist/pool/entry.d.ts.map +0 -1
- package/dist/pool/index.d.ts.map +0 -1
- package/dist/pool/query.d.ts.map +0 -1
- package/dist/pool/spec.d.ts.map +0 -1
- package/dist/ref.d.ts.map +0 -1
- package/dist/utag.d.ts.map +0 -1
- package/dist/util.d.ts.map +0 -1
- package/dist/value_or_error.d.ts.map +0 -1
|
@@ -1,234 +1,196 @@
|
|
|
1
|
-
|
|
1
|
+
const require_runtime = require('../../../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
const require_spec = require('./spec.cjs');
|
|
3
|
+
const require_ids = require('./ids.cjs');
|
|
4
|
+
let canonicalize = require("canonicalize");
|
|
5
|
+
canonicalize = require_runtime.__toESM(canonicalize);
|
|
2
6
|
|
|
3
|
-
|
|
4
|
-
var ids = require('./ids.cjs');
|
|
5
|
-
var spec = require('./spec.cjs');
|
|
6
|
-
|
|
7
|
-
//
|
|
8
|
-
// Helper functions
|
|
9
|
-
//
|
|
7
|
+
//#region src/drivers/pframe/spec/anchored.ts
|
|
10
8
|
function axisKey(axis) {
|
|
11
|
-
|
|
9
|
+
return (0, canonicalize.default)(require_spec.getAxisId(axis));
|
|
12
10
|
}
|
|
13
11
|
function domainKey(key, value) {
|
|
14
|
-
|
|
12
|
+
return JSON.stringify([key, value]);
|
|
15
13
|
}
|
|
16
14
|
/**
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
// Sort filters by axis index to ensure consistency
|
|
127
|
-
resolvedFilters.sort((a, b) => a[0] - b[0]);
|
|
128
|
-
return {
|
|
129
|
-
source: result,
|
|
130
|
-
axisFilters: resolvedFilters,
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Derives a canonicalized string representation of an anchored column identifier, can be used as a unique identifier for the column
|
|
135
|
-
* @param spec Column specification to anchor
|
|
136
|
-
* @param axisFilters Optional axis filters to apply to the column
|
|
137
|
-
* @returns A canonicalized string representation of the anchored column identifier
|
|
138
|
-
*/
|
|
139
|
-
deriveS(spec, axisFilters) {
|
|
140
|
-
return ids.stringifyColumnId(this.derive(spec, axisFilters));
|
|
141
|
-
}
|
|
142
|
-
}
|
|
15
|
+
* Context for resolving and generating anchored references to columns and axes
|
|
16
|
+
* Maintains maps of known domain values and axes that can be referenced by anchors
|
|
17
|
+
*/
|
|
18
|
+
var AnchoredIdDeriver = class {
|
|
19
|
+
domains = /* @__PURE__ */ new Map();
|
|
20
|
+
axes = /* @__PURE__ */ new Map();
|
|
21
|
+
/**
|
|
22
|
+
* Domain packs are used to group domain keys that can be anchored to the same anchor
|
|
23
|
+
* This is used to optimize the lookup of domain anchors
|
|
24
|
+
*/
|
|
25
|
+
domainPacks = [];
|
|
26
|
+
/**
|
|
27
|
+
* Maps domain packs to anchors
|
|
28
|
+
*/
|
|
29
|
+
domainPackToAnchor = /* @__PURE__ */ new Map();
|
|
30
|
+
/**
|
|
31
|
+
* Creates a new anchor context from a set of anchor column specifications
|
|
32
|
+
* @param anchors Record of anchor column specifications indexed by anchor ID
|
|
33
|
+
*/
|
|
34
|
+
constructor(anchors) {
|
|
35
|
+
this.anchors = anchors;
|
|
36
|
+
const anchorEntries = Object.entries(anchors);
|
|
37
|
+
anchorEntries.sort((a, b) => a[0].localeCompare(b[0]));
|
|
38
|
+
for (const [anchorId, spec] of anchorEntries) {
|
|
39
|
+
for (let axisIdx = 0; axisIdx < spec.axesSpec.length; axisIdx++) {
|
|
40
|
+
const axis = spec.axesSpec[axisIdx];
|
|
41
|
+
const key = axisKey(axis);
|
|
42
|
+
this.axes.set(key, {
|
|
43
|
+
anchor: anchorId,
|
|
44
|
+
idx: axisIdx
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
if (spec.domain !== void 0) {
|
|
48
|
+
const domainEntries = Object.entries(spec.domain);
|
|
49
|
+
domainEntries.sort((a, b) => a[0].localeCompare(b[0]));
|
|
50
|
+
this.domainPackToAnchor.set(JSON.stringify(domainEntries), anchorId);
|
|
51
|
+
this.domainPacks.push(domainEntries.map(([dKey]) => dKey));
|
|
52
|
+
for (const [dKey, dValue] of domainEntries) {
|
|
53
|
+
const key = domainKey(dKey, dValue);
|
|
54
|
+
this.domains.set(key, anchorId);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Implementation of derive method
|
|
61
|
+
*/
|
|
62
|
+
derive(spec, axisFilters) {
|
|
63
|
+
const result = {
|
|
64
|
+
name: spec.name,
|
|
65
|
+
axes: []
|
|
66
|
+
};
|
|
67
|
+
let skipDomains = void 0;
|
|
68
|
+
if (spec.domain !== void 0) outer: for (const domainPack of this.domainPacks) {
|
|
69
|
+
const dAnchor = [];
|
|
70
|
+
for (const domainKey of domainPack) {
|
|
71
|
+
const dValue = spec.domain[domainKey];
|
|
72
|
+
if (dValue !== void 0) dAnchor.push([domainKey, dValue]);
|
|
73
|
+
else break outer;
|
|
74
|
+
}
|
|
75
|
+
const domainAnchor = this.domainPackToAnchor.get(JSON.stringify(dAnchor));
|
|
76
|
+
if (domainAnchor !== void 0) {
|
|
77
|
+
result.domainAnchor = domainAnchor;
|
|
78
|
+
skipDomains = new Set(domainPack);
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
for (const [dKey, dValue] of Object.entries(spec.domain ?? {})) {
|
|
83
|
+
if (skipDomains !== void 0 && skipDomains.has(dKey)) continue;
|
|
84
|
+
const key = domainKey(dKey, dValue);
|
|
85
|
+
const anchorId = this.domains.get(key);
|
|
86
|
+
result.domain ??= {};
|
|
87
|
+
result.domain[dKey] = anchorId ? { anchor: anchorId } : dValue;
|
|
88
|
+
}
|
|
89
|
+
result.axes = spec.axesSpec.map((axis) => {
|
|
90
|
+
const key = axisKey(axis);
|
|
91
|
+
const anchorAxisRef = this.axes.get(key);
|
|
92
|
+
if (anchorAxisRef === void 0) return require_spec.getAxisId(axis);
|
|
93
|
+
else return anchorAxisRef;
|
|
94
|
+
});
|
|
95
|
+
if (!axisFilters || axisFilters.length === 0) return result;
|
|
96
|
+
const resolvedFilters = [];
|
|
97
|
+
for (const filter of axisFilters) {
|
|
98
|
+
const [axisIdOrIndex, value] = filter;
|
|
99
|
+
if (typeof axisIdOrIndex === "number") {
|
|
100
|
+
if (axisIdOrIndex < 0 || axisIdOrIndex >= spec.axesSpec.length) throw new Error(`Axis index ${axisIdOrIndex} is out of bounds (0-${spec.axesSpec.length - 1})`);
|
|
101
|
+
resolvedFilters.push([axisIdOrIndex, value]);
|
|
102
|
+
} else {
|
|
103
|
+
const axisIndex = spec.axesSpec.findIndex((axis) => axis.name === axisIdOrIndex);
|
|
104
|
+
if (axisIndex === -1) throw new Error(`Axis with name "${axisIdOrIndex}" not found in the column specification`);
|
|
105
|
+
resolvedFilters.push([axisIndex, value]);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
resolvedFilters.sort((a, b) => a[0] - b[0]);
|
|
109
|
+
return {
|
|
110
|
+
source: result,
|
|
111
|
+
axisFilters: resolvedFilters
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Derives a canonicalized string representation of an anchored column identifier, can be used as a unique identifier for the column
|
|
116
|
+
* @param spec Column specification to anchor
|
|
117
|
+
* @param axisFilters Optional axis filters to apply to the column
|
|
118
|
+
* @returns A canonicalized string representation of the anchored column identifier
|
|
119
|
+
*/
|
|
120
|
+
deriveS(spec, axisFilters) {
|
|
121
|
+
return require_ids.stringifyColumnId(this.derive(spec, axisFilters));
|
|
122
|
+
}
|
|
123
|
+
};
|
|
143
124
|
/**
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
125
|
+
* Resolves anchored references in a column matcher to create a non-anchored matcher.
|
|
126
|
+
* Doing an opposite operation to {@link AnchorIdDeriver.derive()}.
|
|
127
|
+
*
|
|
128
|
+
* @param anchors - Record of anchor column specifications indexed by anchor id
|
|
129
|
+
* @param matcher - An anchored column matcher (or id, which is subtype of it) containing references that need to be resolved
|
|
130
|
+
* @param options - Options for resolving anchors
|
|
131
|
+
* @returns A non-anchored column matcher with all references resolved to actual values
|
|
132
|
+
*/
|
|
152
133
|
function resolveAnchors(anchors, matcher, options) {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
result.domain = resolvedDomain;
|
|
183
|
-
}
|
|
184
|
-
if (result.axes)
|
|
185
|
-
result.axes = result.axes.map((axis) => resolveAxisReference(anchors, axis));
|
|
186
|
-
return result;
|
|
134
|
+
const result = { ...matcher };
|
|
135
|
+
const ignoreMissingDomains = options?.ignoreMissingDomains ?? false;
|
|
136
|
+
if (result.domainAnchor !== void 0) {
|
|
137
|
+
const anchorSpec = anchors[result.domainAnchor];
|
|
138
|
+
if (!anchorSpec) throw new Error(`Anchor "${result.domainAnchor}" not found`);
|
|
139
|
+
result.domain = {
|
|
140
|
+
...anchorSpec.domain || {},
|
|
141
|
+
...result.domain
|
|
142
|
+
};
|
|
143
|
+
delete result.domainAnchor;
|
|
144
|
+
}
|
|
145
|
+
if (result.domain) {
|
|
146
|
+
const resolvedDomain = {};
|
|
147
|
+
for (const [key, value] of Object.entries(result.domain)) if (typeof value === "string") resolvedDomain[key] = value;
|
|
148
|
+
else {
|
|
149
|
+
const anchorSpec = anchors[value.anchor];
|
|
150
|
+
if (!anchorSpec) throw new Error(`Anchor "${value.anchor}" not found for domain key "${key}"`);
|
|
151
|
+
if (!anchorSpec.domain || anchorSpec.domain[key] === void 0) {
|
|
152
|
+
if (!ignoreMissingDomains) throw new Error(`Domain key "${key}" not found in anchor "${value.anchor}"`);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
resolvedDomain[key] = anchorSpec.domain[key];
|
|
156
|
+
}
|
|
157
|
+
result.domain = resolvedDomain;
|
|
158
|
+
}
|
|
159
|
+
if (result.axes) result.axes = result.axes.map((axis) => resolveAxisReference(anchors, axis));
|
|
160
|
+
return result;
|
|
187
161
|
}
|
|
188
162
|
/**
|
|
189
|
-
|
|
190
|
-
|
|
163
|
+
* Resolves an anchored axis reference to a concrete AxisId
|
|
164
|
+
*/
|
|
191
165
|
function resolveAxisReference(anchors, axisRef) {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
throw new Error(`Axis with name "${axisRef.name}" not found in anchor "${anchorId}"`);
|
|
212
|
-
return matches[0];
|
|
213
|
-
}
|
|
214
|
-
else if ("id" in axisRef) {
|
|
215
|
-
// AnchorAxisRefByMatcher
|
|
216
|
-
const matches = anchorSpec.axesSpec.filter((axis) => spec.matchAxisId(axisRef.id, spec.getAxisId(axis)));
|
|
217
|
-
if (matches.length > 1)
|
|
218
|
-
throw new Error(`Multiple matching axes found for matcher in anchor "${anchorId}"`);
|
|
219
|
-
if (matches.length === 0)
|
|
220
|
-
throw new Error(`No matching axis found for matcher in anchor "${anchorId}"`);
|
|
221
|
-
return matches[0];
|
|
222
|
-
}
|
|
223
|
-
throw new Error(`Unsupported axis reference type`);
|
|
166
|
+
if (!isAnchorAxisRef(axisRef)) return axisRef;
|
|
167
|
+
const anchorId = axisRef.anchor;
|
|
168
|
+
const anchorSpec = anchors[anchorId];
|
|
169
|
+
if (!anchorSpec) throw new Error(`Anchor "${anchorId}" not found for axis reference`);
|
|
170
|
+
if ("idx" in axisRef) {
|
|
171
|
+
if (axisRef.idx < 0 || axisRef.idx >= anchorSpec.axesSpec.length) throw new Error(`Axis index ${axisRef.idx} out of bounds for anchor "${anchorId}"`);
|
|
172
|
+
return anchorSpec.axesSpec[axisRef.idx];
|
|
173
|
+
} else if ("name" in axisRef) {
|
|
174
|
+
const matches = anchorSpec.axesSpec.filter((axis) => axis.name === axisRef.name);
|
|
175
|
+
if (matches.length > 1) throw new Error(`Multiple axes with name "${axisRef.name}" found in anchor "${anchorId}"`);
|
|
176
|
+
if (matches.length === 0) throw new Error(`Axis with name "${axisRef.name}" not found in anchor "${anchorId}"`);
|
|
177
|
+
return matches[0];
|
|
178
|
+
} else if ("id" in axisRef) {
|
|
179
|
+
const matches = anchorSpec.axesSpec.filter((axis) => require_spec.matchAxisId(axisRef.id, require_spec.getAxisId(axis)));
|
|
180
|
+
if (matches.length > 1) throw new Error(`Multiple matching axes found for matcher in anchor "${anchorId}"`);
|
|
181
|
+
if (matches.length === 0) throw new Error(`No matching axis found for matcher in anchor "${anchorId}"`);
|
|
182
|
+
return matches[0];
|
|
183
|
+
}
|
|
184
|
+
throw new Error(`Unsupported axis reference type`);
|
|
224
185
|
}
|
|
225
186
|
/**
|
|
226
|
-
|
|
227
|
-
|
|
187
|
+
* Type guard to check if a value is an anchored axis reference
|
|
188
|
+
*/
|
|
228
189
|
function isAnchorAxisRef(value) {
|
|
229
|
-
|
|
190
|
+
return typeof value === "object" && "anchor" in value;
|
|
230
191
|
}
|
|
231
192
|
|
|
193
|
+
//#endregion
|
|
232
194
|
exports.AnchoredIdDeriver = AnchoredIdDeriver;
|
|
233
195
|
exports.resolveAnchors = resolveAnchors;
|
|
234
|
-
//# sourceMappingURL=anchored.cjs.map
|
|
196
|
+
//# sourceMappingURL=anchored.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anchored.cjs","sources":["../../../../src/drivers/pframe/spec/anchored.ts"],"sourcesContent":["import canonicalize from \"canonicalize\";\nimport type { AxisFilter, AxisFilterValue } from \"./filtered_column\";\nimport type { SUniversalPColumnId, UniversalPColumnId } from \"./ids\";\nimport { stringifyColumnId } from \"./ids\";\nimport type {\n AAxisSelector,\n AnchorAxisRef,\n AnchorAxisRefByIdx,\n AnchoredPColumnId,\n AnchoredPColumnSelector,\n AxisSelector,\n PColumnSelector,\n} from \"./selectors\";\nimport type { AxisId, PColumnSpec } from \"./spec\";\nimport { getAxisId, matchAxisId } from \"./spec\";\n\n//\n// Helper functions\n//\n\nfunction axisKey(axis: AxisId): string {\n return canonicalize(getAxisId(axis))!;\n}\n\nfunction domainKey(key: string, value: string): string {\n return JSON.stringify([key, value]);\n}\n\n/**\n * Context for resolving and generating anchored references to columns and axes\n * Maintains maps of known domain values and axes that can be referenced by anchors\n */\nexport class AnchoredIdDeriver {\n private readonly domains = new Map<string, string>();\n private readonly axes = new Map<string, AnchorAxisRefByIdx>();\n /**\n * Domain packs are used to group domain keys that can be anchored to the same anchor\n * This is used to optimize the lookup of domain anchors\n */\n private readonly domainPacks: string[][] = [];\n /**\n * Maps domain packs to anchors\n */\n private readonly domainPackToAnchor = new Map<string, string>();\n\n /**\n * Creates a new anchor context from a set of anchor column specifications\n * @param anchors Record of anchor column specifications indexed by anchor ID\n */\n constructor(public readonly anchors: Record<string, PColumnSpec>) {\n const anchorEntries = Object.entries(anchors);\n anchorEntries.sort((a, b) => a[0].localeCompare(b[0]));\n for (const [anchorId, spec] of anchorEntries) {\n for (let axisIdx = 0; axisIdx < spec.axesSpec.length; axisIdx++) {\n const axis = spec.axesSpec[axisIdx];\n const key = axisKey(axis);\n this.axes.set(key, { anchor: anchorId, idx: axisIdx });\n }\n if (spec.domain !== undefined) {\n const domainEntries = Object.entries(spec.domain);\n domainEntries.sort((a, b) => a[0].localeCompare(b[0]));\n\n this.domainPackToAnchor.set(JSON.stringify(domainEntries), anchorId);\n this.domainPacks.push(domainEntries.map(([dKey]) => dKey));\n\n for (const [dKey, dValue] of domainEntries) {\n const key = domainKey(dKey, dValue);\n this.domains.set(key, anchorId);\n }\n }\n }\n }\n\n /**\n * Derives an anchored column identifier from a column specification\n * @param spec Column specification to anchor\n * @returns An anchored column identifier that can be used to identify columns similar to the input specification\n */\n derive(spec: PColumnSpec): AnchoredPColumnId;\n\n /**\n * Derives an anchored column identifier from a column specification\n * @param spec Column specification to anchor\n * @param axisFilters Axis filters to apply to the column\n * @returns An anchored and sliced column identifier that can be used to identify columns similar to the input specification\n */\n derive(spec: PColumnSpec, axisFilters?: AxisFilter[]): UniversalPColumnId;\n\n /**\n * Implementation of derive method\n */\n derive(spec: PColumnSpec, axisFilters?: AxisFilter[]): UniversalPColumnId {\n const result: AnchoredPColumnId = {\n name: spec.name,\n axes: [],\n };\n\n let skipDomains: Set<string> | undefined = undefined;\n if (spec.domain !== undefined) {\n outer: for (const domainPack of this.domainPacks) {\n const dAnchor: string[][] = [];\n for (const domainKey of domainPack) {\n const dValue = spec.domain[domainKey];\n if (dValue !== undefined) dAnchor.push([domainKey, dValue]);\n else break outer;\n }\n const domainAnchor = this.domainPackToAnchor.get(JSON.stringify(dAnchor));\n if (domainAnchor !== undefined) {\n result.domainAnchor = domainAnchor;\n skipDomains = new Set(domainPack);\n break;\n }\n }\n }\n\n for (const [dKey, dValue] of Object.entries(spec.domain ?? {})) {\n if (skipDomains !== undefined && skipDomains.has(dKey)) continue;\n const key = domainKey(dKey, dValue);\n const anchorId = this.domains.get(key);\n result.domain ??= {};\n result.domain[dKey] = anchorId ? { anchor: anchorId } : dValue;\n }\n\n result.axes = spec.axesSpec.map((axis) => {\n const key = axisKey(axis);\n const anchorAxisRef = this.axes.get(key);\n if (anchorAxisRef === undefined) return getAxisId(axis);\n else return anchorAxisRef;\n });\n\n // If no axis filters are provided, return the anchored ID as is\n if (!axisFilters || axisFilters.length === 0) {\n return result;\n }\n\n // Process axis filters and create a sliced column ID\n const resolvedFilters: [number, AxisFilterValue][] = [];\n\n for (const filter of axisFilters) {\n const [axisIdOrIndex, value] = filter;\n\n // If it's already a numeric index, validate it\n if (typeof axisIdOrIndex === \"number\") {\n if (axisIdOrIndex < 0 || axisIdOrIndex >= spec.axesSpec.length) {\n throw new Error(\n `Axis index ${axisIdOrIndex} is out of bounds (0-${spec.axesSpec.length - 1})`,\n );\n }\n resolvedFilters.push([axisIdOrIndex, value]);\n } else {\n // If it's a string (axis name), resolve it to an index\n const axisIndex = spec.axesSpec.findIndex((axis) => axis.name === axisIdOrIndex);\n if (axisIndex === -1) {\n throw new Error(\n `Axis with name \"${axisIdOrIndex}\" not found in the column specification`,\n );\n }\n resolvedFilters.push([axisIndex, value]);\n }\n }\n\n // Sort filters by axis index to ensure consistency\n resolvedFilters.sort((a, b) => a[0] - b[0]);\n\n return {\n source: result,\n axisFilters: resolvedFilters,\n };\n }\n\n /**\n * Derives a canonicalized string representation of an anchored column identifier, can be used as a unique identifier for the column\n * @param spec Column specification to anchor\n * @param axisFilters Optional axis filters to apply to the column\n * @returns A canonicalized string representation of the anchored column identifier\n */\n deriveS(spec: PColumnSpec, axisFilters?: AxisFilter[]): SUniversalPColumnId {\n return stringifyColumnId(this.derive(spec, axisFilters));\n }\n}\n\n/**\n * Options for the resolveAnchors function\n */\nexport type ResolveAnchorsOptions = {\n /**\n * If true, missing domain keys in anchors will be ignored.\n * If false (default), an error will be thrown.\n */\n ignoreMissingDomains?: boolean;\n};\n\n/**\n * Resolves anchored references in a column matcher to create a non-anchored matcher.\n * Doing an opposite operation to {@link AnchorIdDeriver.derive()}.\n *\n * @param anchors - Record of anchor column specifications indexed by anchor id\n * @param matcher - An anchored column matcher (or id, which is subtype of it) containing references that need to be resolved\n * @param options - Options for resolving anchors\n * @returns A non-anchored column matcher with all references resolved to actual values\n */\nexport function resolveAnchors(\n anchors: Record<string, PColumnSpec>,\n matcher: AnchoredPColumnSelector,\n options?: ResolveAnchorsOptions,\n): PColumnSelector {\n const result = { ...matcher };\n const ignoreMissingDomains = options?.ignoreMissingDomains ?? false;\n\n if (result.domainAnchor !== undefined) {\n const anchorSpec = anchors[result.domainAnchor];\n if (!anchorSpec) throw new Error(`Anchor \"${result.domainAnchor}\" not found`);\n\n const anchorDomains = anchorSpec.domain || {};\n result.domain = { ...anchorDomains, ...result.domain };\n delete result.domainAnchor;\n }\n\n if (result.domain) {\n const resolvedDomain: Record<string, string> = {};\n for (const [key, value] of Object.entries(result.domain)) {\n if (typeof value === \"string\") {\n resolvedDomain[key] = value;\n } else {\n // It's an AnchorDomainRef\n const anchorSpec = anchors[value.anchor];\n if (!anchorSpec)\n throw new Error(`Anchor \"${value.anchor}\" not found for domain key \"${key}\"`);\n\n if (!anchorSpec.domain || anchorSpec.domain[key] === undefined) {\n if (!ignoreMissingDomains)\n throw new Error(`Domain key \"${key}\" not found in anchor \"${value.anchor}\"`);\n continue;\n }\n\n resolvedDomain[key] = anchorSpec.domain[key];\n }\n }\n result.domain = resolvedDomain;\n }\n\n if (result.axes) result.axes = result.axes.map((axis) => resolveAxisReference(anchors, axis));\n\n return result as PColumnSelector;\n}\n\n/**\n * Resolves an anchored axis reference to a concrete AxisId\n */\nfunction resolveAxisReference(\n anchors: Record<string, PColumnSpec>,\n axisRef: AAxisSelector,\n): AxisSelector {\n if (!isAnchorAxisRef(axisRef)) return axisRef;\n\n // It's an anchored reference\n const anchorId = axisRef.anchor;\n const anchorSpec = anchors[anchorId];\n if (!anchorSpec) throw new Error(`Anchor \"${anchorId}\" not found for axis reference`);\n\n if (\"idx\" in axisRef) {\n // AnchorAxisRefByIdx\n if (axisRef.idx < 0 || axisRef.idx >= anchorSpec.axesSpec.length)\n throw new Error(`Axis index ${axisRef.idx} out of bounds for anchor \"${anchorId}\"`);\n return anchorSpec.axesSpec[axisRef.idx];\n } else if (\"name\" in axisRef) {\n // AnchorAxisRefByName\n const matches = anchorSpec.axesSpec.filter((axis) => axis.name === axisRef.name);\n if (matches.length > 1)\n throw new Error(`Multiple axes with name \"${axisRef.name}\" found in anchor \"${anchorId}\"`);\n if (matches.length === 0)\n throw new Error(`Axis with name \"${axisRef.name}\" not found in anchor \"${anchorId}\"`);\n return matches[0];\n } else if (\"id\" in axisRef) {\n // AnchorAxisRefByMatcher\n const matches = anchorSpec.axesSpec.filter((axis) => matchAxisId(axisRef.id, getAxisId(axis)));\n if (matches.length > 1)\n throw new Error(`Multiple matching axes found for matcher in anchor \"${anchorId}\"`);\n if (matches.length === 0)\n throw new Error(`No matching axis found for matcher in anchor \"${anchorId}\"`);\n return matches[0];\n }\n\n throw new Error(`Unsupported axis reference type`);\n}\n\n/**\n * Type guard to check if a value is an anchored axis reference\n */\nfunction isAnchorAxisRef(value: AAxisSelector): value is AnchorAxisRef {\n return typeof value === \"object\" && \"anchor\" in value;\n}\n"],"names":["getAxisId","spec","stringifyColumnId","matchAxisId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"anchored.cjs","names":["getAxisId","stringifyColumnId","matchAxisId"],"sources":["../../../../src/drivers/pframe/spec/anchored.ts"],"sourcesContent":["import canonicalize from \"canonicalize\";\nimport type { AxisFilter, AxisFilterValue } from \"./filtered_column\";\nimport type { SUniversalPColumnId, UniversalPColumnId } from \"./ids\";\nimport { stringifyColumnId } from \"./ids\";\nimport type {\n AAxisSelector,\n AnchorAxisRef,\n AnchorAxisRefByIdx,\n AnchoredPColumnId,\n AnchoredPColumnSelector,\n AxisSelector,\n PColumnSelector,\n} from \"./selectors\";\nimport type { AxisId, PColumnSpec } from \"./spec\";\nimport { getAxisId, matchAxisId } from \"./spec\";\n\n//\n// Helper functions\n//\n\nfunction axisKey(axis: AxisId): string {\n return canonicalize(getAxisId(axis))!;\n}\n\nfunction domainKey(key: string, value: string): string {\n return JSON.stringify([key, value]);\n}\n\n/**\n * Context for resolving and generating anchored references to columns and axes\n * Maintains maps of known domain values and axes that can be referenced by anchors\n */\nexport class AnchoredIdDeriver {\n private readonly domains = new Map<string, string>();\n private readonly axes = new Map<string, AnchorAxisRefByIdx>();\n /**\n * Domain packs are used to group domain keys that can be anchored to the same anchor\n * This is used to optimize the lookup of domain anchors\n */\n private readonly domainPacks: string[][] = [];\n /**\n * Maps domain packs to anchors\n */\n private readonly domainPackToAnchor = new Map<string, string>();\n\n /**\n * Creates a new anchor context from a set of anchor column specifications\n * @param anchors Record of anchor column specifications indexed by anchor ID\n */\n constructor(public readonly anchors: Record<string, PColumnSpec>) {\n const anchorEntries = Object.entries(anchors);\n anchorEntries.sort((a, b) => a[0].localeCompare(b[0]));\n for (const [anchorId, spec] of anchorEntries) {\n for (let axisIdx = 0; axisIdx < spec.axesSpec.length; axisIdx++) {\n const axis = spec.axesSpec[axisIdx];\n const key = axisKey(axis);\n this.axes.set(key, { anchor: anchorId, idx: axisIdx });\n }\n if (spec.domain !== undefined) {\n const domainEntries = Object.entries(spec.domain);\n domainEntries.sort((a, b) => a[0].localeCompare(b[0]));\n\n this.domainPackToAnchor.set(JSON.stringify(domainEntries), anchorId);\n this.domainPacks.push(domainEntries.map(([dKey]) => dKey));\n\n for (const [dKey, dValue] of domainEntries) {\n const key = domainKey(dKey, dValue);\n this.domains.set(key, anchorId);\n }\n }\n }\n }\n\n /**\n * Derives an anchored column identifier from a column specification\n * @param spec Column specification to anchor\n * @returns An anchored column identifier that can be used to identify columns similar to the input specification\n */\n derive(spec: PColumnSpec): AnchoredPColumnId;\n\n /**\n * Derives an anchored column identifier from a column specification\n * @param spec Column specification to anchor\n * @param axisFilters Axis filters to apply to the column\n * @returns An anchored and sliced column identifier that can be used to identify columns similar to the input specification\n */\n derive(spec: PColumnSpec, axisFilters?: AxisFilter[]): UniversalPColumnId;\n\n /**\n * Implementation of derive method\n */\n derive(spec: PColumnSpec, axisFilters?: AxisFilter[]): UniversalPColumnId {\n const result: AnchoredPColumnId = {\n name: spec.name,\n axes: [],\n };\n\n let skipDomains: Set<string> | undefined = undefined;\n if (spec.domain !== undefined) {\n outer: for (const domainPack of this.domainPacks) {\n const dAnchor: string[][] = [];\n for (const domainKey of domainPack) {\n const dValue = spec.domain[domainKey];\n if (dValue !== undefined) dAnchor.push([domainKey, dValue]);\n else break outer;\n }\n const domainAnchor = this.domainPackToAnchor.get(JSON.stringify(dAnchor));\n if (domainAnchor !== undefined) {\n result.domainAnchor = domainAnchor;\n skipDomains = new Set(domainPack);\n break;\n }\n }\n }\n\n for (const [dKey, dValue] of Object.entries(spec.domain ?? {})) {\n if (skipDomains !== undefined && skipDomains.has(dKey)) continue;\n const key = domainKey(dKey, dValue);\n const anchorId = this.domains.get(key);\n result.domain ??= {};\n result.domain[dKey] = anchorId ? { anchor: anchorId } : dValue;\n }\n\n result.axes = spec.axesSpec.map((axis) => {\n const key = axisKey(axis);\n const anchorAxisRef = this.axes.get(key);\n if (anchorAxisRef === undefined) return getAxisId(axis);\n else return anchorAxisRef;\n });\n\n // If no axis filters are provided, return the anchored ID as is\n if (!axisFilters || axisFilters.length === 0) {\n return result;\n }\n\n // Process axis filters and create a sliced column ID\n const resolvedFilters: [number, AxisFilterValue][] = [];\n\n for (const filter of axisFilters) {\n const [axisIdOrIndex, value] = filter;\n\n // If it's already a numeric index, validate it\n if (typeof axisIdOrIndex === \"number\") {\n if (axisIdOrIndex < 0 || axisIdOrIndex >= spec.axesSpec.length) {\n throw new Error(\n `Axis index ${axisIdOrIndex} is out of bounds (0-${spec.axesSpec.length - 1})`,\n );\n }\n resolvedFilters.push([axisIdOrIndex, value]);\n } else {\n // If it's a string (axis name), resolve it to an index\n const axisIndex = spec.axesSpec.findIndex((axis) => axis.name === axisIdOrIndex);\n if (axisIndex === -1) {\n throw new Error(\n `Axis with name \"${axisIdOrIndex}\" not found in the column specification`,\n );\n }\n resolvedFilters.push([axisIndex, value]);\n }\n }\n\n // Sort filters by axis index to ensure consistency\n resolvedFilters.sort((a, b) => a[0] - b[0]);\n\n return {\n source: result,\n axisFilters: resolvedFilters,\n };\n }\n\n /**\n * Derives a canonicalized string representation of an anchored column identifier, can be used as a unique identifier for the column\n * @param spec Column specification to anchor\n * @param axisFilters Optional axis filters to apply to the column\n * @returns A canonicalized string representation of the anchored column identifier\n */\n deriveS(spec: PColumnSpec, axisFilters?: AxisFilter[]): SUniversalPColumnId {\n return stringifyColumnId(this.derive(spec, axisFilters));\n }\n}\n\n/**\n * Options for the resolveAnchors function\n */\nexport type ResolveAnchorsOptions = {\n /**\n * If true, missing domain keys in anchors will be ignored.\n * If false (default), an error will be thrown.\n */\n ignoreMissingDomains?: boolean;\n};\n\n/**\n * Resolves anchored references in a column matcher to create a non-anchored matcher.\n * Doing an opposite operation to {@link AnchorIdDeriver.derive()}.\n *\n * @param anchors - Record of anchor column specifications indexed by anchor id\n * @param matcher - An anchored column matcher (or id, which is subtype of it) containing references that need to be resolved\n * @param options - Options for resolving anchors\n * @returns A non-anchored column matcher with all references resolved to actual values\n */\nexport function resolveAnchors(\n anchors: Record<string, PColumnSpec>,\n matcher: AnchoredPColumnSelector,\n options?: ResolveAnchorsOptions,\n): PColumnSelector {\n const result = { ...matcher };\n const ignoreMissingDomains = options?.ignoreMissingDomains ?? false;\n\n if (result.domainAnchor !== undefined) {\n const anchorSpec = anchors[result.domainAnchor];\n if (!anchorSpec) throw new Error(`Anchor \"${result.domainAnchor}\" not found`);\n\n const anchorDomains = anchorSpec.domain || {};\n result.domain = { ...anchorDomains, ...result.domain };\n delete result.domainAnchor;\n }\n\n if (result.domain) {\n const resolvedDomain: Record<string, string> = {};\n for (const [key, value] of Object.entries(result.domain)) {\n if (typeof value === \"string\") {\n resolvedDomain[key] = value;\n } else {\n // It's an AnchorDomainRef\n const anchorSpec = anchors[value.anchor];\n if (!anchorSpec)\n throw new Error(`Anchor \"${value.anchor}\" not found for domain key \"${key}\"`);\n\n if (!anchorSpec.domain || anchorSpec.domain[key] === undefined) {\n if (!ignoreMissingDomains)\n throw new Error(`Domain key \"${key}\" not found in anchor \"${value.anchor}\"`);\n continue;\n }\n\n resolvedDomain[key] = anchorSpec.domain[key];\n }\n }\n result.domain = resolvedDomain;\n }\n\n if (result.axes) result.axes = result.axes.map((axis) => resolveAxisReference(anchors, axis));\n\n return result as PColumnSelector;\n}\n\n/**\n * Resolves an anchored axis reference to a concrete AxisId\n */\nfunction resolveAxisReference(\n anchors: Record<string, PColumnSpec>,\n axisRef: AAxisSelector,\n): AxisSelector {\n if (!isAnchorAxisRef(axisRef)) return axisRef;\n\n // It's an anchored reference\n const anchorId = axisRef.anchor;\n const anchorSpec = anchors[anchorId];\n if (!anchorSpec) throw new Error(`Anchor \"${anchorId}\" not found for axis reference`);\n\n if (\"idx\" in axisRef) {\n // AnchorAxisRefByIdx\n if (axisRef.idx < 0 || axisRef.idx >= anchorSpec.axesSpec.length)\n throw new Error(`Axis index ${axisRef.idx} out of bounds for anchor \"${anchorId}\"`);\n return anchorSpec.axesSpec[axisRef.idx];\n } else if (\"name\" in axisRef) {\n // AnchorAxisRefByName\n const matches = anchorSpec.axesSpec.filter((axis) => axis.name === axisRef.name);\n if (matches.length > 1)\n throw new Error(`Multiple axes with name \"${axisRef.name}\" found in anchor \"${anchorId}\"`);\n if (matches.length === 0)\n throw new Error(`Axis with name \"${axisRef.name}\" not found in anchor \"${anchorId}\"`);\n return matches[0];\n } else if (\"id\" in axisRef) {\n // AnchorAxisRefByMatcher\n const matches = anchorSpec.axesSpec.filter((axis) => matchAxisId(axisRef.id, getAxisId(axis)));\n if (matches.length > 1)\n throw new Error(`Multiple matching axes found for matcher in anchor \"${anchorId}\"`);\n if (matches.length === 0)\n throw new Error(`No matching axis found for matcher in anchor \"${anchorId}\"`);\n return matches[0];\n }\n\n throw new Error(`Unsupported axis reference type`);\n}\n\n/**\n * Type guard to check if a value is an anchored axis reference\n */\nfunction isAnchorAxisRef(value: AAxisSelector): value is AnchorAxisRef {\n return typeof value === \"object\" && \"anchor\" in value;\n}\n"],"mappings":"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"}
|
|
@@ -1,59 +1,61 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
1
|
+
import { PColumnSpec } from "./spec.js";
|
|
2
|
+
import { AnchoredPColumnId, AnchoredPColumnSelector, PColumnSelector } from "./selectors.js";
|
|
3
|
+
import { AxisFilter } from "./filtered_column.js";
|
|
4
|
+
import { SUniversalPColumnId, UniversalPColumnId } from "./ids.js";
|
|
5
|
+
|
|
6
|
+
//#region src/drivers/pframe/spec/anchored.d.ts
|
|
5
7
|
/**
|
|
6
8
|
* Context for resolving and generating anchored references to columns and axes
|
|
7
9
|
* Maintains maps of known domain values and axes that can be referenced by anchors
|
|
8
10
|
*/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
11
|
+
declare class AnchoredIdDeriver {
|
|
12
|
+
readonly anchors: Record<string, PColumnSpec>;
|
|
13
|
+
private readonly domains;
|
|
14
|
+
private readonly axes;
|
|
15
|
+
/**
|
|
16
|
+
* Domain packs are used to group domain keys that can be anchored to the same anchor
|
|
17
|
+
* This is used to optimize the lookup of domain anchors
|
|
18
|
+
*/
|
|
19
|
+
private readonly domainPacks;
|
|
20
|
+
/**
|
|
21
|
+
* Maps domain packs to anchors
|
|
22
|
+
*/
|
|
23
|
+
private readonly domainPackToAnchor;
|
|
24
|
+
/**
|
|
25
|
+
* Creates a new anchor context from a set of anchor column specifications
|
|
26
|
+
* @param anchors Record of anchor column specifications indexed by anchor ID
|
|
27
|
+
*/
|
|
28
|
+
constructor(anchors: Record<string, PColumnSpec>);
|
|
29
|
+
/**
|
|
30
|
+
* Derives an anchored column identifier from a column specification
|
|
31
|
+
* @param spec Column specification to anchor
|
|
32
|
+
* @returns An anchored column identifier that can be used to identify columns similar to the input specification
|
|
33
|
+
*/
|
|
34
|
+
derive(spec: PColumnSpec): AnchoredPColumnId;
|
|
35
|
+
/**
|
|
36
|
+
* Derives an anchored column identifier from a column specification
|
|
37
|
+
* @param spec Column specification to anchor
|
|
38
|
+
* @param axisFilters Axis filters to apply to the column
|
|
39
|
+
* @returns An anchored and sliced column identifier that can be used to identify columns similar to the input specification
|
|
40
|
+
*/
|
|
41
|
+
derive(spec: PColumnSpec, axisFilters?: AxisFilter[]): UniversalPColumnId;
|
|
42
|
+
/**
|
|
43
|
+
* Derives a canonicalized string representation of an anchored column identifier, can be used as a unique identifier for the column
|
|
44
|
+
* @param spec Column specification to anchor
|
|
45
|
+
* @param axisFilters Optional axis filters to apply to the column
|
|
46
|
+
* @returns A canonicalized string representation of the anchored column identifier
|
|
47
|
+
*/
|
|
48
|
+
deriveS(spec: PColumnSpec, axisFilters?: AxisFilter[]): SUniversalPColumnId;
|
|
47
49
|
}
|
|
48
50
|
/**
|
|
49
51
|
* Options for the resolveAnchors function
|
|
50
52
|
*/
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
type ResolveAnchorsOptions = {
|
|
54
|
+
/**
|
|
55
|
+
* If true, missing domain keys in anchors will be ignored.
|
|
56
|
+
* If false (default), an error will be thrown.
|
|
57
|
+
*/
|
|
58
|
+
ignoreMissingDomains?: boolean;
|
|
57
59
|
};
|
|
58
60
|
/**
|
|
59
61
|
* Resolves anchored references in a column matcher to create a non-anchored matcher.
|
|
@@ -64,5 +66,7 @@ export type ResolveAnchorsOptions = {
|
|
|
64
66
|
* @param options - Options for resolving anchors
|
|
65
67
|
* @returns A non-anchored column matcher with all references resolved to actual values
|
|
66
68
|
*/
|
|
67
|
-
|
|
69
|
+
declare function resolveAnchors(anchors: Record<string, PColumnSpec>, matcher: AnchoredPColumnSelector, options?: ResolveAnchorsOptions): PColumnSelector;
|
|
70
|
+
//#endregion
|
|
71
|
+
export { AnchoredIdDeriver, ResolveAnchorsOptions, resolveAnchors };
|
|
68
72
|
//# sourceMappingURL=anchored.d.ts.map
|