@milaboratories/pl-model-common 1.46.4 → 1.47.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.
- package/dist/columns/accessor_traversal.cjs +119 -0
- package/dist/columns/accessor_traversal.cjs.map +1 -0
- package/dist/columns/accessor_traversal.d.ts +52 -0
- package/dist/columns/accessor_traversal.d.ts.map +1 -0
- package/dist/columns/accessor_traversal.js +114 -0
- package/dist/columns/accessor_traversal.js.map +1 -0
- package/dist/columns/column_registry.cjs +40 -0
- package/dist/columns/column_registry.cjs.map +1 -0
- package/dist/columns/column_registry.d.ts +31 -0
- package/dist/columns/column_registry.d.ts.map +1 -0
- package/dist/columns/column_registry.js +40 -0
- package/dist/columns/column_registry.js.map +1 -0
- package/dist/columns/column_selector.cjs +49 -0
- package/dist/columns/column_selector.cjs.map +1 -0
- package/dist/columns/column_selector.d.ts +33 -0
- package/dist/columns/column_selector.d.ts.map +1 -0
- package/dist/columns/column_selector.js +47 -0
- package/dist/columns/column_selector.js.map +1 -0
- package/dist/columns/dedup.cjs +47 -0
- package/dist/columns/dedup.cjs.map +1 -0
- package/dist/columns/dedup.d.ts +27 -0
- package/dist/columns/dedup.d.ts.map +1 -0
- package/dist/columns/dedup.js +47 -0
- package/dist/columns/dedup.js.map +1 -0
- package/dist/columns/index.cjs +18 -0
- package/dist/columns/index.d.ts +8 -0
- package/dist/columns/index.js +6 -0
- package/dist/columns/providers.cjs +62 -0
- package/dist/columns/providers.cjs.map +1 -0
- package/dist/columns/providers.d.ts +39 -0
- package/dist/columns/providers.d.ts.map +1 -0
- package/dist/columns/providers.js +61 -0
- package/dist/columns/providers.js.map +1 -0
- package/dist/columns/types.d.ts +108 -0
- package/dist/columns/types.d.ts.map +1 -0
- package/dist/driver_kit.d.ts +1 -2
- package/dist/driver_kit.d.ts.map +1 -1
- package/dist/drivers/columns/columns_collection_driver.d.ts +124 -0
- package/dist/drivers/columns/columns_collection_driver.d.ts.map +1 -0
- package/dist/drivers/columns/discover_columns_options.cjs +28 -0
- package/dist/drivers/columns/discover_columns_options.cjs.map +1 -0
- package/dist/drivers/columns/discover_columns_options.d.ts +64 -0
- package/dist/drivers/columns/discover_columns_options.d.ts.map +1 -0
- package/dist/drivers/columns/discover_columns_options.js +28 -0
- package/dist/drivers/columns/discover_columns_options.js.map +1 -0
- package/dist/drivers/columns/index.d.ts +3 -0
- package/dist/drivers/index.cjs +32 -7
- package/dist/drivers/index.d.ts +12 -9
- package/dist/drivers/index.js +6 -4
- package/dist/drivers/pframe/driver.d.ts +1 -2
- package/dist/drivers/pframe/driver.d.ts.map +1 -1
- package/dist/drivers/pframe/index.cjs +30 -7
- package/dist/drivers/pframe/index.d.ts +9 -8
- package/dist/drivers/pframe/index.js +5 -4
- package/dist/drivers/pframe/query/index.d.ts +2 -2
- package/dist/drivers/pframe/query/query_common.d.ts +24 -1
- package/dist/drivers/pframe/query/query_common.d.ts.map +1 -1
- package/dist/drivers/pframe/query/query_spec.d.ts +25 -24
- package/dist/drivers/pframe/query/query_spec.d.ts.map +1 -1
- package/dist/drivers/pframe/query/utils.cjs +18 -8
- package/dist/drivers/pframe/query/utils.cjs.map +1 -1
- package/dist/drivers/pframe/query/utils.d.ts +5 -1
- package/dist/drivers/pframe/query/utils.d.ts.map +1 -1
- package/dist/drivers/pframe/query/utils.js +18 -8
- package/dist/drivers/pframe/query/utils.js.map +1 -1
- package/dist/drivers/pframe/spec/anchored.d.ts +2 -2
- package/dist/drivers/pframe/spec/discovered_column.cjs +31 -15
- package/dist/drivers/pframe/spec/discovered_column.cjs.map +1 -1
- package/dist/drivers/pframe/spec/discovered_column.d.ts +23 -13
- package/dist/drivers/pframe/spec/discovered_column.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/discovered_column.js +26 -12
- package/dist/drivers/pframe/spec/discovered_column.js.map +1 -1
- package/dist/drivers/pframe/spec/filtered_column.cjs +46 -0
- package/dist/drivers/pframe/spec/filtered_column.cjs.map +1 -1
- package/dist/drivers/pframe/spec/filtered_column.d.ts +39 -1
- package/dist/drivers/pframe/spec/filtered_column.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/filtered_column.js +41 -1
- package/dist/drivers/pframe/spec/filtered_column.js.map +1 -1
- package/dist/drivers/pframe/spec/ids.cjs +62 -10
- package/dist/drivers/pframe/spec/ids.cjs.map +1 -1
- package/dist/drivers/pframe/spec/ids.d.ts +48 -15
- package/dist/drivers/pframe/spec/ids.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/ids.js +60 -9
- package/dist/drivers/pframe/spec/ids.js.map +1 -1
- package/dist/drivers/pframe/spec/index.cjs +30 -7
- package/dist/drivers/pframe/spec/index.d.ts +6 -5
- package/dist/drivers/pframe/spec/index.js +5 -4
- package/dist/drivers/pframe/spec/native_id.cjs +1 -0
- package/dist/drivers/pframe/spec/native_id.cjs.map +1 -1
- package/dist/drivers/pframe/spec/native_id.js +1 -0
- package/dist/drivers/pframe/spec/native_id.js.map +1 -1
- package/dist/drivers/pframe/spec/overridden.cjs +212 -0
- package/dist/drivers/pframe/spec/overridden.cjs.map +1 -0
- package/dist/drivers/pframe/spec/overridden.d.ts +67 -0
- package/dist/drivers/pframe/spec/overridden.d.ts.map +1 -0
- package/dist/drivers/pframe/spec/overridden.js +202 -0
- package/dist/drivers/pframe/spec/overridden.js.map +1 -0
- package/dist/drivers/pframe/spec/selectors.cjs +1 -0
- package/dist/drivers/pframe/spec/selectors.cjs.map +1 -1
- package/dist/drivers/pframe/spec/selectors.d.ts +3 -0
- package/dist/drivers/pframe/spec/selectors.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/selectors.js +1 -0
- package/dist/drivers/pframe/spec/selectors.js.map +1 -1
- package/dist/drivers/pframe/spec/spec.cjs.map +1 -1
- package/dist/drivers/pframe/spec/spec.d.ts +2 -3
- package/dist/drivers/pframe/spec/spec.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/spec.js.map +1 -1
- package/dist/drivers/pframe/spec_driver.d.ts +2 -2
- package/dist/drivers/pframe/spec_driver.d.ts.map +1 -1
- package/dist/drivers/pframe/table_calculate.cjs +2 -2
- package/dist/drivers/pframe/table_calculate.cjs.map +1 -1
- package/dist/drivers/pframe/table_calculate.d.ts +6 -2
- package/dist/drivers/pframe/table_calculate.d.ts.map +1 -1
- package/dist/drivers/pframe/table_calculate.js +2 -2
- package/dist/drivers/pframe/table_calculate.js.map +1 -1
- package/dist/drivers/pframe/table_common.cjs.map +1 -1
- package/dist/drivers/pframe/table_common.d.ts +11 -4
- package/dist/drivers/pframe/table_common.d.ts.map +1 -1
- package/dist/drivers/pframe/table_common.js.map +1 -1
- package/dist/index.cjs +63 -10
- package/dist/index.d.ts +20 -11
- package/dist/index.js +15 -6
- package/dist/pool/index.cjs +18 -0
- package/dist/pool/index.d.ts +2 -2
- package/dist/pool/index.js +3 -0
- package/dist/pool/spec.cjs +59 -11
- package/dist/pool/spec.cjs.map +1 -1
- package/dist/pool/spec.d.ts +24 -9
- package/dist/pool/spec.d.ts.map +1 -1
- package/dist/pool/spec.js +50 -10
- package/dist/pool/spec.js.map +1 -1
- package/dist/services/index.d.ts +2 -2
- package/dist/services/service_declarations.cjs +22 -0
- package/dist/services/service_declarations.cjs.map +1 -1
- package/dist/services/service_declarations.d.ts +5 -3
- package/dist/services/service_declarations.d.ts.map +1 -1
- package/dist/services/service_declarations.js +22 -0
- package/dist/services/service_declarations.js.map +1 -1
- package/dist/services/service_registry.cjs.map +1 -1
- package/dist/services/service_registry.d.ts +3 -3
- package/dist/services/service_registry.d.ts.map +1 -1
- package/dist/services/service_registry.js.map +1 -1
- package/dist/services/service_types.cjs.map +1 -1
- package/dist/services/service_types.d.ts +25 -9
- package/dist/services/service_types.d.ts.map +1 -1
- package/dist/services/service_types.js.map +1 -1
- package/package.json +2 -1
- package/src/columns/accessor_traversal.ts +139 -0
- package/src/columns/column_registry.ts +41 -0
- package/src/columns/column_selector.ts +100 -0
- package/src/columns/dedup.ts +49 -0
- package/src/columns/index.ts +6 -0
- package/src/columns/providers.ts +74 -0
- package/src/columns/types.ts +116 -0
- package/src/drivers/columns/columns_collection_driver.ts +146 -0
- package/src/drivers/columns/discover_columns_options.ts +91 -0
- package/src/drivers/columns/index.ts +2 -0
- package/src/drivers/index.ts +1 -0
- package/src/drivers/pframe/index.ts +0 -1
- package/src/drivers/pframe/query/query_common.ts +24 -0
- package/src/drivers/pframe/query/query_spec.ts +38 -25
- package/src/drivers/pframe/query/utils.test.ts +6 -6
- package/src/drivers/pframe/query/utils.ts +27 -7
- package/src/drivers/pframe/spec/discovered_column.ts +43 -28
- package/src/drivers/pframe/spec/filtered_column.ts +66 -0
- package/src/drivers/pframe/spec/ids.ts +142 -17
- package/src/drivers/pframe/spec/index.ts +1 -0
- package/src/drivers/pframe/spec/overridden.ts +285 -0
- package/src/drivers/pframe/spec/selectors.ts +3 -0
- package/src/drivers/pframe/spec/spec.ts +7 -3
- package/src/drivers/pframe/spec_driver.ts +3 -3
- package/src/drivers/pframe/table_calculate.ts +13 -3
- package/src/drivers/pframe/table_common.ts +10 -3
- package/src/index.ts +1 -0
- package/src/pool/spec.ts +69 -23
- package/src/services/service_declarations.ts +31 -0
- package/src/services/service_registry.ts +8 -4
- package/src/services/service_types.ts +35 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovered_column.d.ts","names":[],"sources":["../../../../src/drivers/pframe/spec/discovered_column.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"discovered_column.d.ts","names":[],"sources":["../../../../src/drivers/pframe/spec/discovered_column.ts"],"mappings":";;;;;;;UAMiB,mBAAA;EACf,cAAA;EACA,MAAA,EAAQ,iBAAA;EACR,IAAA,GAAO,QAAA;EACP,oBAAA,GAAuB,iBAAA;EACvB,qBAAA,GAAwB,MAAA,CAAO,SAAA,EAAW,iBAAA;AAAA;AAAA,KAGhC,kBAAA,GAAqB,OAAA,CAC/B,iBAAA,CAAkB,mBAAA;AAAA,KAIf,QAAA;EACH,IAAA;EACA,MAAA,EAAQ,iBAAiB;AAAA;AAAA,iBAGX,qBAAA,CAAsB,GAAA,YAAe,GAAA,IAAO,mBAAmB;AAAA,iBAI/D,oBAAA,CAAqB,GAAA,YAAe,GAAA,IAAO,kBAAkB;AAAA,iBAK7D,0BAAA,CAA2B,KAAA,EAAO,mBAAA,GAAsB,mBAAmB;AAAA,iBAgB3E,wBAAA,CAAyB,KAAA;EACvC,MAAA,EAAQ,iBAAA;EACR,IAAA,GAAO,QAAA;EACP,oBAAA,GAAuB,iBAAA;EACvB,qBAAA,GAAwB,MAAA,CAAO,SAAA,EAAW,iBAAA;AAAA,IACxC,kBAAA;AAAA,iBAIY,yBAAA,CAA0B,KAAA;EACxC,MAAA,EAAQ,iBAAA;EACR,IAAA,GAAO,QAAA;EACP,oBAAA,GAAuB,iBAAA;EACvB,qBAAA,GAAwB,MAAA,CAAO,SAAA,EAAW,iBAAA;AAAA,IACxC,mBAAA;AAAA,iBAIY,uBAAA,CAAwB,EAAA,EAAI,kBAAA,GAAqB,mBAAmB;AAAA,iBAapE,2BAAA,CACd,EAAA,EAAI,IAAA,CAAK,mBAAA,sBACR,kBAAA"}
|
|
@@ -1,32 +1,46 @@
|
|
|
1
|
-
import { canonicalizeJson } from "../../../json.js";
|
|
1
|
+
import { canonicalizeJson, parseJsonSafely } from "../../../json.js";
|
|
2
2
|
import { throwError } from "@milaboratories/helpers";
|
|
3
3
|
//#region src/drivers/pframe/spec/discovered_column.ts
|
|
4
|
-
function
|
|
5
|
-
return typeof obj === "object" && obj !== null && "
|
|
4
|
+
function isColumnDiscoveredKey(obj) {
|
|
5
|
+
return typeof obj === "object" && obj !== null && "__isDiscovered" in obj;
|
|
6
6
|
}
|
|
7
|
-
function
|
|
7
|
+
function isColumnDiscoveredId(str) {
|
|
8
|
+
if (typeof str !== "string") return false;
|
|
9
|
+
return isColumnDiscoveredKey(parseJsonSafely(str));
|
|
10
|
+
}
|
|
11
|
+
function distillColumnDiscoveredKey(props) {
|
|
8
12
|
return {
|
|
13
|
+
__isDiscovered: true,
|
|
9
14
|
column: props.column,
|
|
10
15
|
path: Array.isArray(props.path) && props.path.length > 0 ? props.path : void 0,
|
|
11
16
|
columnQualifications: Array.isArray(props.columnQualifications) && props.columnQualifications.length > 0 ? props.columnQualifications : void 0,
|
|
12
17
|
queriesQualifications: props.queriesQualifications && Object.keys(props.queriesQualifications).length > 0 ? props.queriesQualifications : void 0
|
|
13
18
|
};
|
|
14
19
|
}
|
|
15
|
-
function
|
|
16
|
-
return
|
|
20
|
+
function createColumnDiscoveredId(props) {
|
|
21
|
+
return stringifyColumnDiscoveredId(props);
|
|
22
|
+
}
|
|
23
|
+
function createColumnDiscoveredKey(props) {
|
|
24
|
+
return distillColumnDiscoveredKey({
|
|
25
|
+
__isDiscovered: true,
|
|
26
|
+
...props
|
|
27
|
+
});
|
|
17
28
|
}
|
|
18
|
-
function
|
|
29
|
+
function parseColumnDiscoveredId(id) {
|
|
19
30
|
try {
|
|
20
31
|
const parsed = JSON.parse(id);
|
|
21
|
-
return
|
|
32
|
+
return isColumnDiscoveredKey(parsed) ? parsed : throwError("Parsed object is not a valid DiscoveredPColumn");
|
|
22
33
|
} catch {
|
|
23
|
-
throw new Error("Invalid
|
|
34
|
+
throw new Error("Invalid ColumnDiscoveredId: not a valid JSON or does not conform to DiscoveredPColumn structure");
|
|
24
35
|
}
|
|
25
36
|
}
|
|
26
|
-
function
|
|
27
|
-
return canonicalizeJson(
|
|
37
|
+
function stringifyColumnDiscoveredId(id) {
|
|
38
|
+
return canonicalizeJson(distillColumnDiscoveredKey({
|
|
39
|
+
__isDiscovered: true,
|
|
40
|
+
...id
|
|
41
|
+
}));
|
|
28
42
|
}
|
|
29
43
|
//#endregion
|
|
30
|
-
export {
|
|
44
|
+
export { createColumnDiscoveredId, createColumnDiscoveredKey, distillColumnDiscoveredKey, isColumnDiscoveredId, isColumnDiscoveredKey, parseColumnDiscoveredId, stringifyColumnDiscoveredId };
|
|
31
45
|
|
|
32
46
|
//# sourceMappingURL=discovered_column.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovered_column.js","names":[],"sources":["../../../../src/drivers/pframe/spec/discovered_column.ts"],"sourcesContent":["import { Branded, throwError } from \"@milaboratories/helpers\";\nimport { PObjectId } from \"../../../pool\";\nimport { AxisQualification } from \"./selectors\";\nimport {
|
|
1
|
+
{"version":3,"file":"discovered_column.js","names":[],"sources":["../../../../src/drivers/pframe/spec/discovered_column.ts"],"sourcesContent":["import { type Branded, throwError } from \"@milaboratories/helpers\";\nimport { type CanonicalizedJson, canonicalizeJson, parseJsonSafely } from \"../../../json\";\nimport { PObjectId } from \"../../../pool\";\nimport { AxisQualification } from \"./selectors\";\nimport { ColumnUniversalId } from \"./ids\";\n\nexport interface ColumnDiscoveredKey {\n __isDiscovered: true;\n column: ColumnUniversalId;\n path?: PathItem[];\n columnQualifications?: AxisQualification[];\n queriesQualifications?: Record<PObjectId, AxisQualification[]>;\n}\n\nexport type ColumnDiscoveredId = Branded<\n CanonicalizedJson<ColumnDiscoveredKey>,\n \"ColumnDiscoveredId\"\n>;\n\ntype PathItem = {\n type: \"linker\";\n column: ColumnUniversalId;\n};\n\nexport function isColumnDiscoveredKey(obj: unknown): obj is ColumnDiscoveredKey {\n return typeof obj === \"object\" && obj !== null && \"__isDiscovered\" in obj;\n}\n\nexport function isColumnDiscoveredId(str: unknown): str is ColumnDiscoveredId {\n if (typeof str !== \"string\") return false;\n return isColumnDiscoveredKey(parseJsonSafely(str));\n}\n\nexport function distillColumnDiscoveredKey(props: ColumnDiscoveredKey): ColumnDiscoveredKey {\n return {\n __isDiscovered: true,\n column: props.column,\n path: Array.isArray(props.path) && props.path.length > 0 ? props.path : undefined,\n columnQualifications:\n Array.isArray(props.columnQualifications) && props.columnQualifications.length > 0\n ? props.columnQualifications\n : undefined,\n queriesQualifications:\n props.queriesQualifications && Object.keys(props.queriesQualifications).length > 0\n ? props.queriesQualifications\n : undefined,\n };\n}\n\nexport function createColumnDiscoveredId(props: {\n column: ColumnUniversalId;\n path?: PathItem[];\n columnQualifications?: AxisQualification[];\n queriesQualifications?: Record<PObjectId, AxisQualification[]>;\n}): ColumnDiscoveredId {\n return stringifyColumnDiscoveredId(props);\n}\n\nexport function createColumnDiscoveredKey(props: {\n column: ColumnUniversalId;\n path?: PathItem[];\n columnQualifications?: AxisQualification[];\n queriesQualifications?: Record<PObjectId, AxisQualification[]>;\n}): ColumnDiscoveredKey {\n return distillColumnDiscoveredKey({ __isDiscovered: true, ...props });\n}\n\nexport function parseColumnDiscoveredId(id: ColumnDiscoveredId): ColumnDiscoveredKey {\n try {\n const parsed = JSON.parse(id);\n return isColumnDiscoveredKey(parsed)\n ? parsed\n : throwError(\"Parsed object is not a valid DiscoveredPColumn\");\n } catch {\n throw new Error(\n \"Invalid ColumnDiscoveredId: not a valid JSON or does not conform to DiscoveredPColumn structure\",\n );\n }\n}\n\nexport function stringifyColumnDiscoveredId(\n id: Omit<ColumnDiscoveredKey, \"__isDiscovered\">,\n): ColumnDiscoveredId {\n return canonicalizeJson<ColumnDiscoveredKey>(\n distillColumnDiscoveredKey({ __isDiscovered: true, ...id }),\n ) as ColumnDiscoveredId;\n}\n"],"mappings":";;;AAwBA,SAAgB,sBAAsB,KAA0C;CAC9E,OAAO,OAAO,QAAQ,YAAY,QAAQ,QAAQ,oBAAoB;AACxE;AAEA,SAAgB,qBAAqB,KAAyC;CAC5E,IAAI,OAAO,QAAQ,UAAU,OAAO;CACpC,OAAO,sBAAsB,gBAAgB,GAAG,CAAC;AACnD;AAEA,SAAgB,2BAA2B,OAAiD;CAC1F,OAAO;EACL,gBAAgB;EAChB,QAAQ,MAAM;EACd,MAAM,MAAM,QAAQ,MAAM,IAAI,KAAK,MAAM,KAAK,SAAS,IAAI,MAAM,OAAO,KAAA;EACxE,sBACE,MAAM,QAAQ,MAAM,oBAAoB,KAAK,MAAM,qBAAqB,SAAS,IAC7E,MAAM,uBACN,KAAA;EACN,uBACE,MAAM,yBAAyB,OAAO,KAAK,MAAM,qBAAqB,CAAC,CAAC,SAAS,IAC7E,MAAM,wBACN,KAAA;CACR;AACF;AAEA,SAAgB,yBAAyB,OAKlB;CACrB,OAAO,4BAA4B,KAAK;AAC1C;AAEA,SAAgB,0BAA0B,OAKlB;CACtB,OAAO,2BAA2B;EAAE,gBAAgB;EAAM,GAAG;CAAM,CAAC;AACtE;AAEA,SAAgB,wBAAwB,IAA6C;CACnF,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,EAAE;EAC5B,OAAO,sBAAsB,MAAM,IAC/B,SACA,WAAW,gDAAgD;CACjE,QAAQ;EACN,MAAM,IAAI,MACR,iGACF;CACF;AACF;AAEA,SAAgB,4BACd,IACoB;CACpB,OAAO,iBACL,2BAA2B;EAAE,gBAAgB;EAAM,GAAG;CAAG,CAAC,CAC5D;AACF"}
|
|
@@ -1,13 +1,59 @@
|
|
|
1
|
+
const require_json = require("../../../json.cjs");
|
|
1
2
|
//#region src/drivers/pframe/spec/filtered_column.ts
|
|
2
3
|
/**
|
|
3
4
|
* Checks if a given value is a FilteredPColumn
|
|
4
5
|
* @param id - The value to check
|
|
5
6
|
* @returns True if the value is a FilteredPColumn, false otherwise
|
|
7
|
+
* @deprecated use {@link isColumnFilteredKey} for the key form and `source` checks for the id form
|
|
6
8
|
*/
|
|
7
9
|
function isFilteredPColumn(id) {
|
|
8
10
|
return typeof id === "object" && id !== null && "source" in id && "axisFilters" in id;
|
|
9
11
|
}
|
|
12
|
+
function stringifyColumnFilteredId(key) {
|
|
13
|
+
return require_json.canonicalizeJson(createColumnFilteredKey(key));
|
|
14
|
+
}
|
|
15
|
+
function isColumnFilteredKey(obj) {
|
|
16
|
+
return typeof obj === "object" && obj !== null && "__isFiltered" in obj;
|
|
17
|
+
}
|
|
18
|
+
function isColumnFilteredId(id) {
|
|
19
|
+
if (typeof id !== "string") return false;
|
|
20
|
+
return isColumnFilteredKey(require_json.parseJsonSafely(id));
|
|
21
|
+
}
|
|
22
|
+
function createColumnFilteredId(props) {
|
|
23
|
+
return stringifyColumnFilteredId(props);
|
|
24
|
+
}
|
|
25
|
+
function createColumnFilteredKey(props) {
|
|
26
|
+
const axisFilters = props.axisFilters.toSorted((a, b) => a[0] - b[0]);
|
|
27
|
+
return {
|
|
28
|
+
__isFiltered: true,
|
|
29
|
+
source: props.source,
|
|
30
|
+
axisFilters
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Drop the axes pinned by `axisFilters` from a {@link PColumnSpec}'s
|
|
35
|
+
* `axesSpec`. Indices are positional against `spec.axesSpec`. Returns `spec`
|
|
36
|
+
* unchanged when there are no filters.
|
|
37
|
+
*
|
|
38
|
+
* Single source of the Filtered-layer spec math — shared by
|
|
39
|
+
* `reconstructSpecFromId` (host, id-walking) and `ColumnFilteredRecipe.getSpec`
|
|
40
|
+
* (sandbox, recipe-graph walking).
|
|
41
|
+
*/
|
|
42
|
+
function applyAxisFilters(spec, axisFilters) {
|
|
43
|
+
if (axisFilters.length === 0) return spec;
|
|
44
|
+
const fixed = new Set(axisFilters.map(([i]) => i));
|
|
45
|
+
return {
|
|
46
|
+
...spec,
|
|
47
|
+
axesSpec: spec.axesSpec.filter((_, i) => !fixed.has(i))
|
|
48
|
+
};
|
|
49
|
+
}
|
|
10
50
|
//#endregion
|
|
51
|
+
exports.applyAxisFilters = applyAxisFilters;
|
|
52
|
+
exports.createColumnFilteredId = createColumnFilteredId;
|
|
53
|
+
exports.createColumnFilteredKey = createColumnFilteredKey;
|
|
54
|
+
exports.isColumnFilteredId = isColumnFilteredId;
|
|
55
|
+
exports.isColumnFilteredKey = isColumnFilteredKey;
|
|
11
56
|
exports.isFilteredPColumn = isFilteredPColumn;
|
|
57
|
+
exports.stringifyColumnFilteredId = stringifyColumnFilteredId;
|
|
12
58
|
|
|
13
59
|
//# sourceMappingURL=filtered_column.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filtered_column.cjs","names":[],"sources":["../../../../src/drivers/pframe/spec/filtered_column.ts"],"sourcesContent":["import type { AnchoredPColumnId } from \"./selectors\";\n\n/** Value of an axis filter */\nexport type AxisFilterValue = number | string;\n\n/** Axis filter by index */\nexport type AxisFilterByIdx = [number, AxisFilterValue];\n\n/** Axis filter by name */\nexport type AxisFilterByName = [string, AxisFilterValue];\n\n/** Axis filter */\nexport type AxisFilter = AxisFilterByIdx | AxisFilterByName;\n\n/**\n * Identifies a column derived from a CanonicalPColumnId by fixing values on certain axes,\n * thus effectively reducing the dimensionality of the original column.\n */\nexport type FilteredPColumn<CID = AnchoredPColumnId, AFI = AxisFilter> = {\n /** The original column identifier */\n source: CID;\n\n /**\n * List of fixed axes and their corresponding values.\n * Each entry fixes one axis to a specific value, creating a slice of the multidimensional data.\n * This effectively reduces the dimensionality by one for each fixed axis.\n * Ordered by the axis index in canonical case.\n */\n axisFilters: AFI[];\n};\n\nexport type FilteredPColumnId = FilteredPColumn<AnchoredPColumnId, AxisFilterByIdx>;\n\n/**\n * Checks if a given value is a FilteredPColumn\n * @param id - The value to check\n * @returns True if the value is a FilteredPColumn, false otherwise\n */\nexport function isFilteredPColumn(id: unknown): id is FilteredPColumn {\n return typeof id === \"object\" && id !== null && \"source\" in id && \"axisFilters\" in id;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"filtered_column.cjs","names":["canonicalizeJson","parseJsonSafely"],"sources":["../../../../src/drivers/pframe/spec/filtered_column.ts"],"sourcesContent":["import { type Branded } from \"@milaboratories/helpers\";\nimport { type CanonicalizedJson, canonicalizeJson, parseJsonSafely } from \"../../../json\";\nimport type { AnchoredPColumnId } from \"./selectors\";\nimport { ColumnUniversalId } from \"./ids\";\nimport type { PColumnSpec } from \"./spec\";\n\n/** Value of an axis filter */\nexport type AxisFilterValue = number | string;\n\n/** Axis filter by index */\nexport type AxisFilterByIdx = [number, AxisFilterValue];\n\n/** Axis filter by name */\nexport type AxisFilterByName = [string, AxisFilterValue];\n\n/** Axis filter */\nexport type AxisFilter = AxisFilterByIdx | AxisFilterByName;\n\n/**\n * Identifies a column derived from a CanonicalPColumnId by fixing values on certain axes,\n * thus effectively reducing the dimensionality of the original column.\n */\nexport type FilteredPColumn<CID = AnchoredPColumnId, AFI = AxisFilter> = {\n /** The original column identifier */\n source: CID;\n\n /**\n * List of fixed axes and their corresponding values.\n * Each entry fixes one axis to a specific value, creating a slice of the multidimensional data.\n * This effectively reduces the dimensionality by one for each fixed axis.\n * Ordered by the axis index in canonical case.\n */\n axisFilters: AFI[];\n};\n\n/** @deprecated */\nexport type FilteredPColumnId = FilteredPColumn<AnchoredPColumnId, AxisFilterByIdx>;\n\n/**\n * Checks if a given value is a FilteredPColumn\n * @param id - The value to check\n * @returns True if the value is a FilteredPColumn, false otherwise\n * @deprecated use {@link isColumnFilteredKey} for the key form and `source` checks for the id form\n */\nexport function isFilteredPColumn(id: unknown): id is FilteredPColumn {\n return typeof id === \"object\" && id !== null && \"source\" in id && \"axisFilters\" in id;\n}\n\n/**\n * `source` is either a leaf {@link PObjectId} or a {@link ColumnDiscoveredId}.\n * Filtered never nests inside Filtered (flat-merge invariant), and Filtered is\n * never the outer wrapper around Overridden — Overridden is always outermost.\n */\nexport interface ColumnFilteredKey {\n __isFiltered: true;\n source: ColumnUniversalId;\n axisFilters: AxisFilterByIdx[];\n}\n\nexport type ColumnFilteredId = Branded<CanonicalizedJson<ColumnFilteredKey>, \"ColumnFilteredId\">;\n\nexport function stringifyColumnFilteredId(\n key: Omit<ColumnFilteredKey, \"__isFiltered\">,\n): ColumnFilteredId {\n return canonicalizeJson<ColumnFilteredKey>(createColumnFilteredKey(key)) as ColumnFilteredId;\n}\n\nexport function isColumnFilteredKey(obj: unknown): obj is ColumnFilteredKey {\n return typeof obj === \"object\" && obj !== null && \"__isFiltered\" in obj;\n}\n\nexport function isColumnFilteredId(id: unknown): id is ColumnFilteredId {\n if (typeof id !== \"string\") return false;\n return isColumnFilteredKey(parseJsonSafely(id));\n}\n\nexport function createColumnFilteredId(props: {\n source: ColumnUniversalId;\n axisFilters: AxisFilterByIdx[];\n}): ColumnFilteredId {\n return stringifyColumnFilteredId(props);\n}\n\nexport function createColumnFilteredKey(props: {\n source: ColumnUniversalId;\n axisFilters: AxisFilterByIdx[];\n}): ColumnFilteredKey {\n // `axisFilters` must be ordered by axis index so logically\n // identical filtered columns produce one canonical id.\n const axisFilters = props.axisFilters.toSorted((a, b) => a[0] - b[0]);\n return { __isFiltered: true, source: props.source, axisFilters };\n}\n\n/**\n * Drop the axes pinned by `axisFilters` from a {@link PColumnSpec}'s\n * `axesSpec`. Indices are positional against `spec.axesSpec`. Returns `spec`\n * unchanged when there are no filters.\n *\n * Single source of the Filtered-layer spec math — shared by\n * `reconstructSpecFromId` (host, id-walking) and `ColumnFilteredRecipe.getSpec`\n * (sandbox, recipe-graph walking).\n */\nexport function applyAxisFilters(spec: PColumnSpec, axisFilters: AxisFilterByIdx[]): PColumnSpec {\n if (axisFilters.length === 0) return spec;\n const fixed = new Set(axisFilters.map(([i]) => i));\n return { ...spec, axesSpec: spec.axesSpec.filter((_, i) => !fixed.has(i)) };\n}\n"],"mappings":";;;;;;;;AA4CA,SAAgB,kBAAkB,IAAoC;CACpE,OAAO,OAAO,OAAO,YAAY,OAAO,QAAQ,YAAY,MAAM,iBAAiB;AACrF;AAeA,SAAgB,0BACd,KACkB;CAClB,OAAOA,aAAAA,iBAAoC,wBAAwB,GAAG,CAAC;AACzE;AAEA,SAAgB,oBAAoB,KAAwC;CAC1E,OAAO,OAAO,QAAQ,YAAY,QAAQ,QAAQ,kBAAkB;AACtE;AAEA,SAAgB,mBAAmB,IAAqC;CACtE,IAAI,OAAO,OAAO,UAAU,OAAO;CACnC,OAAO,oBAAoBC,aAAAA,gBAAgB,EAAE,CAAC;AAChD;AAEA,SAAgB,uBAAuB,OAGlB;CACnB,OAAO,0BAA0B,KAAK;AACxC;AAEA,SAAgB,wBAAwB,OAGlB;CAGpB,MAAM,cAAc,MAAM,YAAY,UAAU,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE;CACpE,OAAO;EAAE,cAAc;EAAM,QAAQ,MAAM;EAAQ;CAAY;AACjE;;;;;;;;;;AAWA,SAAgB,iBAAiB,MAAmB,aAA6C;CAC/F,IAAI,YAAY,WAAW,GAAG,OAAO;CACrC,MAAM,QAAQ,IAAI,IAAI,YAAY,KAAK,CAAC,OAAO,CAAC,CAAC;CACjD,OAAO;EAAE,GAAG;EAAM,UAAU,KAAK,SAAS,QAAQ,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;CAAE;AAC5E"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
import { CanonicalizedJson } from "../../../json.js";
|
|
2
|
+
import { PColumnSpec } from "./spec.js";
|
|
3
|
+
import { ColumnUniversalId } from "./ids.js";
|
|
1
4
|
import { AnchoredPColumnId } from "./selectors.js";
|
|
5
|
+
import { Branded } from "@milaboratories/helpers";
|
|
2
6
|
|
|
3
7
|
//#region src/drivers/pframe/spec/filtered_column.d.ts
|
|
4
8
|
/** Value of an axis filter */
|
|
@@ -23,13 +27,47 @@ type FilteredPColumn<CID = AnchoredPColumnId, AFI = AxisFilter> = {
|
|
|
23
27
|
*/
|
|
24
28
|
axisFilters: AFI[];
|
|
25
29
|
};
|
|
30
|
+
/** @deprecated */
|
|
26
31
|
type FilteredPColumnId = FilteredPColumn<AnchoredPColumnId, AxisFilterByIdx>;
|
|
27
32
|
/**
|
|
28
33
|
* Checks if a given value is a FilteredPColumn
|
|
29
34
|
* @param id - The value to check
|
|
30
35
|
* @returns True if the value is a FilteredPColumn, false otherwise
|
|
36
|
+
* @deprecated use {@link isColumnFilteredKey} for the key form and `source` checks for the id form
|
|
31
37
|
*/
|
|
32
38
|
declare function isFilteredPColumn(id: unknown): id is FilteredPColumn;
|
|
39
|
+
/**
|
|
40
|
+
* `source` is either a leaf {@link PObjectId} or a {@link ColumnDiscoveredId}.
|
|
41
|
+
* Filtered never nests inside Filtered (flat-merge invariant), and Filtered is
|
|
42
|
+
* never the outer wrapper around Overridden — Overridden is always outermost.
|
|
43
|
+
*/
|
|
44
|
+
interface ColumnFilteredKey {
|
|
45
|
+
__isFiltered: true;
|
|
46
|
+
source: ColumnUniversalId;
|
|
47
|
+
axisFilters: AxisFilterByIdx[];
|
|
48
|
+
}
|
|
49
|
+
type ColumnFilteredId = Branded<CanonicalizedJson<ColumnFilteredKey>, "ColumnFilteredId">;
|
|
50
|
+
declare function stringifyColumnFilteredId(key: Omit<ColumnFilteredKey, "__isFiltered">): ColumnFilteredId;
|
|
51
|
+
declare function isColumnFilteredKey(obj: unknown): obj is ColumnFilteredKey;
|
|
52
|
+
declare function isColumnFilteredId(id: unknown): id is ColumnFilteredId;
|
|
53
|
+
declare function createColumnFilteredId(props: {
|
|
54
|
+
source: ColumnUniversalId;
|
|
55
|
+
axisFilters: AxisFilterByIdx[];
|
|
56
|
+
}): ColumnFilteredId;
|
|
57
|
+
declare function createColumnFilteredKey(props: {
|
|
58
|
+
source: ColumnUniversalId;
|
|
59
|
+
axisFilters: AxisFilterByIdx[];
|
|
60
|
+
}): ColumnFilteredKey;
|
|
61
|
+
/**
|
|
62
|
+
* Drop the axes pinned by `axisFilters` from a {@link PColumnSpec}'s
|
|
63
|
+
* `axesSpec`. Indices are positional against `spec.axesSpec`. Returns `spec`
|
|
64
|
+
* unchanged when there are no filters.
|
|
65
|
+
*
|
|
66
|
+
* Single source of the Filtered-layer spec math — shared by
|
|
67
|
+
* `reconstructSpecFromId` (host, id-walking) and `ColumnFilteredRecipe.getSpec`
|
|
68
|
+
* (sandbox, recipe-graph walking).
|
|
69
|
+
*/
|
|
70
|
+
declare function applyAxisFilters(spec: PColumnSpec, axisFilters: AxisFilterByIdx[]): PColumnSpec;
|
|
33
71
|
//#endregion
|
|
34
|
-
export { AxisFilter, AxisFilterByIdx, AxisFilterByName, AxisFilterValue, FilteredPColumn, FilteredPColumnId, isFilteredPColumn };
|
|
72
|
+
export { AxisFilter, AxisFilterByIdx, AxisFilterByName, AxisFilterValue, ColumnFilteredId, ColumnFilteredKey, FilteredPColumn, FilteredPColumnId, applyAxisFilters, createColumnFilteredId, createColumnFilteredKey, isColumnFilteredId, isColumnFilteredKey, isFilteredPColumn, stringifyColumnFilteredId };
|
|
35
73
|
//# sourceMappingURL=filtered_column.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filtered_column.d.ts","names":[],"sources":["../../../../src/drivers/pframe/spec/filtered_column.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"filtered_column.d.ts","names":[],"sources":["../../../../src/drivers/pframe/spec/filtered_column.ts"],"mappings":";;;;;;;;KAOY,eAAA;AAAZ;AAAA,KAGY,eAAA,YAA2B,eAAe;;KAG1C,gBAAA,YAA4B,eAAe;AAN5B;AAAA,KASf,UAAA,GAAa,eAAA,GAAkB,gBAAgB;;;;AANL;KAY1C,eAAA,OAAsB,iBAAA,QAAyB,UAAA;EAT/B,qCAW1B,MAAA,EAAQ,GAAA;EAX6C;AAAA;AAGvD;;;;EAgBE,WAAA,EAAa,GAAA;AAAA;;KAIH,iBAAA,GAAoB,eAAA,CAAgB,iBAAA,EAAmB,eAAA;;;;;;;iBAQnD,iBAAA,CAAkB,EAAA,YAAc,EAAA,IAAM,eAAe;;;;;;UASpD,iBAAA;EACf,YAAA;EACA,MAAA,EAAQ,iBAAA;EACR,WAAA,EAAa,eAAe;AAAA;AAAA,KAGlB,gBAAA,GAAmB,OAAA,CAAQ,iBAAA,CAAkB,iBAAA;AAAA,iBAEzC,yBAAA,CACd,GAAA,EAAK,IAAA,CAAK,iBAAA,oBACT,gBAAA;AAAA,iBAIa,mBAAA,CAAoB,GAAA,YAAe,GAAA,IAAO,iBAAiB;AAAA,iBAI3D,kBAAA,CAAmB,EAAA,YAAc,EAAA,IAAM,gBAAgB;AAAA,iBAKvD,sBAAA,CAAuB,KAAA;EACrC,MAAA,EAAQ,iBAAA;EACR,WAAA,EAAa,eAAA;AAAA,IACX,gBAAA;AAAA,iBAIY,uBAAA,CAAwB,KAAA;EACtC,MAAA,EAAQ,iBAAA;EACR,WAAA,EAAa,eAAA;AAAA,IACX,iBAAA;AA1CJ;;;;;;;;AAAqE;AAArE,iBA0DgB,gBAAA,CAAiB,IAAA,EAAM,WAAA,EAAa,WAAA,EAAa,eAAA,KAAoB,WAAA"}
|
|
@@ -1,13 +1,53 @@
|
|
|
1
|
+
import { canonicalizeJson, parseJsonSafely } from "../../../json.js";
|
|
1
2
|
//#region src/drivers/pframe/spec/filtered_column.ts
|
|
2
3
|
/**
|
|
3
4
|
* Checks if a given value is a FilteredPColumn
|
|
4
5
|
* @param id - The value to check
|
|
5
6
|
* @returns True if the value is a FilteredPColumn, false otherwise
|
|
7
|
+
* @deprecated use {@link isColumnFilteredKey} for the key form and `source` checks for the id form
|
|
6
8
|
*/
|
|
7
9
|
function isFilteredPColumn(id) {
|
|
8
10
|
return typeof id === "object" && id !== null && "source" in id && "axisFilters" in id;
|
|
9
11
|
}
|
|
12
|
+
function stringifyColumnFilteredId(key) {
|
|
13
|
+
return canonicalizeJson(createColumnFilteredKey(key));
|
|
14
|
+
}
|
|
15
|
+
function isColumnFilteredKey(obj) {
|
|
16
|
+
return typeof obj === "object" && obj !== null && "__isFiltered" in obj;
|
|
17
|
+
}
|
|
18
|
+
function isColumnFilteredId(id) {
|
|
19
|
+
if (typeof id !== "string") return false;
|
|
20
|
+
return isColumnFilteredKey(parseJsonSafely(id));
|
|
21
|
+
}
|
|
22
|
+
function createColumnFilteredId(props) {
|
|
23
|
+
return stringifyColumnFilteredId(props);
|
|
24
|
+
}
|
|
25
|
+
function createColumnFilteredKey(props) {
|
|
26
|
+
const axisFilters = props.axisFilters.toSorted((a, b) => a[0] - b[0]);
|
|
27
|
+
return {
|
|
28
|
+
__isFiltered: true,
|
|
29
|
+
source: props.source,
|
|
30
|
+
axisFilters
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Drop the axes pinned by `axisFilters` from a {@link PColumnSpec}'s
|
|
35
|
+
* `axesSpec`. Indices are positional against `spec.axesSpec`. Returns `spec`
|
|
36
|
+
* unchanged when there are no filters.
|
|
37
|
+
*
|
|
38
|
+
* Single source of the Filtered-layer spec math — shared by
|
|
39
|
+
* `reconstructSpecFromId` (host, id-walking) and `ColumnFilteredRecipe.getSpec`
|
|
40
|
+
* (sandbox, recipe-graph walking).
|
|
41
|
+
*/
|
|
42
|
+
function applyAxisFilters(spec, axisFilters) {
|
|
43
|
+
if (axisFilters.length === 0) return spec;
|
|
44
|
+
const fixed = new Set(axisFilters.map(([i]) => i));
|
|
45
|
+
return {
|
|
46
|
+
...spec,
|
|
47
|
+
axesSpec: spec.axesSpec.filter((_, i) => !fixed.has(i))
|
|
48
|
+
};
|
|
49
|
+
}
|
|
10
50
|
//#endregion
|
|
11
|
-
export { isFilteredPColumn };
|
|
51
|
+
export { applyAxisFilters, createColumnFilteredId, createColumnFilteredKey, isColumnFilteredId, isColumnFilteredKey, isFilteredPColumn, stringifyColumnFilteredId };
|
|
12
52
|
|
|
13
53
|
//# sourceMappingURL=filtered_column.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filtered_column.js","names":[],"sources":["../../../../src/drivers/pframe/spec/filtered_column.ts"],"sourcesContent":["import type { AnchoredPColumnId } from \"./selectors\";\n\n/** Value of an axis filter */\nexport type AxisFilterValue = number | string;\n\n/** Axis filter by index */\nexport type AxisFilterByIdx = [number, AxisFilterValue];\n\n/** Axis filter by name */\nexport type AxisFilterByName = [string, AxisFilterValue];\n\n/** Axis filter */\nexport type AxisFilter = AxisFilterByIdx | AxisFilterByName;\n\n/**\n * Identifies a column derived from a CanonicalPColumnId by fixing values on certain axes,\n * thus effectively reducing the dimensionality of the original column.\n */\nexport type FilteredPColumn<CID = AnchoredPColumnId, AFI = AxisFilter> = {\n /** The original column identifier */\n source: CID;\n\n /**\n * List of fixed axes and their corresponding values.\n * Each entry fixes one axis to a specific value, creating a slice of the multidimensional data.\n * This effectively reduces the dimensionality by one for each fixed axis.\n * Ordered by the axis index in canonical case.\n */\n axisFilters: AFI[];\n};\n\nexport type FilteredPColumnId = FilteredPColumn<AnchoredPColumnId, AxisFilterByIdx>;\n\n/**\n * Checks if a given value is a FilteredPColumn\n * @param id - The value to check\n * @returns True if the value is a FilteredPColumn, false otherwise\n */\nexport function isFilteredPColumn(id: unknown): id is FilteredPColumn {\n return typeof id === \"object\" && id !== null && \"source\" in id && \"axisFilters\" in id;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"filtered_column.js","names":[],"sources":["../../../../src/drivers/pframe/spec/filtered_column.ts"],"sourcesContent":["import { type Branded } from \"@milaboratories/helpers\";\nimport { type CanonicalizedJson, canonicalizeJson, parseJsonSafely } from \"../../../json\";\nimport type { AnchoredPColumnId } from \"./selectors\";\nimport { ColumnUniversalId } from \"./ids\";\nimport type { PColumnSpec } from \"./spec\";\n\n/** Value of an axis filter */\nexport type AxisFilterValue = number | string;\n\n/** Axis filter by index */\nexport type AxisFilterByIdx = [number, AxisFilterValue];\n\n/** Axis filter by name */\nexport type AxisFilterByName = [string, AxisFilterValue];\n\n/** Axis filter */\nexport type AxisFilter = AxisFilterByIdx | AxisFilterByName;\n\n/**\n * Identifies a column derived from a CanonicalPColumnId by fixing values on certain axes,\n * thus effectively reducing the dimensionality of the original column.\n */\nexport type FilteredPColumn<CID = AnchoredPColumnId, AFI = AxisFilter> = {\n /** The original column identifier */\n source: CID;\n\n /**\n * List of fixed axes and their corresponding values.\n * Each entry fixes one axis to a specific value, creating a slice of the multidimensional data.\n * This effectively reduces the dimensionality by one for each fixed axis.\n * Ordered by the axis index in canonical case.\n */\n axisFilters: AFI[];\n};\n\n/** @deprecated */\nexport type FilteredPColumnId = FilteredPColumn<AnchoredPColumnId, AxisFilterByIdx>;\n\n/**\n * Checks if a given value is a FilteredPColumn\n * @param id - The value to check\n * @returns True if the value is a FilteredPColumn, false otherwise\n * @deprecated use {@link isColumnFilteredKey} for the key form and `source` checks for the id form\n */\nexport function isFilteredPColumn(id: unknown): id is FilteredPColumn {\n return typeof id === \"object\" && id !== null && \"source\" in id && \"axisFilters\" in id;\n}\n\n/**\n * `source` is either a leaf {@link PObjectId} or a {@link ColumnDiscoveredId}.\n * Filtered never nests inside Filtered (flat-merge invariant), and Filtered is\n * never the outer wrapper around Overridden — Overridden is always outermost.\n */\nexport interface ColumnFilteredKey {\n __isFiltered: true;\n source: ColumnUniversalId;\n axisFilters: AxisFilterByIdx[];\n}\n\nexport type ColumnFilteredId = Branded<CanonicalizedJson<ColumnFilteredKey>, \"ColumnFilteredId\">;\n\nexport function stringifyColumnFilteredId(\n key: Omit<ColumnFilteredKey, \"__isFiltered\">,\n): ColumnFilteredId {\n return canonicalizeJson<ColumnFilteredKey>(createColumnFilteredKey(key)) as ColumnFilteredId;\n}\n\nexport function isColumnFilteredKey(obj: unknown): obj is ColumnFilteredKey {\n return typeof obj === \"object\" && obj !== null && \"__isFiltered\" in obj;\n}\n\nexport function isColumnFilteredId(id: unknown): id is ColumnFilteredId {\n if (typeof id !== \"string\") return false;\n return isColumnFilteredKey(parseJsonSafely(id));\n}\n\nexport function createColumnFilteredId(props: {\n source: ColumnUniversalId;\n axisFilters: AxisFilterByIdx[];\n}): ColumnFilteredId {\n return stringifyColumnFilteredId(props);\n}\n\nexport function createColumnFilteredKey(props: {\n source: ColumnUniversalId;\n axisFilters: AxisFilterByIdx[];\n}): ColumnFilteredKey {\n // `axisFilters` must be ordered by axis index so logically\n // identical filtered columns produce one canonical id.\n const axisFilters = props.axisFilters.toSorted((a, b) => a[0] - b[0]);\n return { __isFiltered: true, source: props.source, axisFilters };\n}\n\n/**\n * Drop the axes pinned by `axisFilters` from a {@link PColumnSpec}'s\n * `axesSpec`. Indices are positional against `spec.axesSpec`. Returns `spec`\n * unchanged when there are no filters.\n *\n * Single source of the Filtered-layer spec math — shared by\n * `reconstructSpecFromId` (host, id-walking) and `ColumnFilteredRecipe.getSpec`\n * (sandbox, recipe-graph walking).\n */\nexport function applyAxisFilters(spec: PColumnSpec, axisFilters: AxisFilterByIdx[]): PColumnSpec {\n if (axisFilters.length === 0) return spec;\n const fixed = new Set(axisFilters.map(([i]) => i));\n return { ...spec, axesSpec: spec.axesSpec.filter((_, i) => !fixed.has(i)) };\n}\n"],"mappings":";;;;;;;;AA4CA,SAAgB,kBAAkB,IAAoC;CACpE,OAAO,OAAO,OAAO,YAAY,OAAO,QAAQ,YAAY,MAAM,iBAAiB;AACrF;AAeA,SAAgB,0BACd,KACkB;CAClB,OAAO,iBAAoC,wBAAwB,GAAG,CAAC;AACzE;AAEA,SAAgB,oBAAoB,KAAwC;CAC1E,OAAO,OAAO,QAAQ,YAAY,QAAQ,QAAQ,kBAAkB;AACtE;AAEA,SAAgB,mBAAmB,IAAqC;CACtE,IAAI,OAAO,OAAO,UAAU,OAAO;CACnC,OAAO,oBAAoB,gBAAgB,EAAE,CAAC;AAChD;AAEA,SAAgB,uBAAuB,OAGlB;CACnB,OAAO,0BAA0B,KAAK;AACxC;AAEA,SAAgB,wBAAwB,OAGlB;CAGpB,MAAM,cAAc,MAAM,YAAY,UAAU,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE;CACpE,OAAO;EAAE,cAAc;EAAM,QAAQ,MAAM;EAAQ;CAAY;AACjE;;;;;;;;;;AAWA,SAAgB,iBAAiB,MAAmB,aAA6C;CAC/F,IAAI,YAAY,WAAW,GAAG,OAAO;CACrC,MAAM,QAAQ,IAAI,IAAI,YAAY,KAAK,CAAC,OAAO,CAAC,CAAC;CACjD,OAAO;EAAE,GAAG;EAAM,UAAU,KAAK,SAAS,QAAQ,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;CAAE;AAC5E"}
|
|
@@ -1,25 +1,77 @@
|
|
|
1
|
-
const
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
const require_json = require("../../../json.cjs");
|
|
2
|
+
const require_filtered_column = require("./filtered_column.cjs");
|
|
3
|
+
const require_spec = require("../../../pool/spec.cjs");
|
|
4
|
+
require("../../../pool/index.cjs");
|
|
5
|
+
const require_discovered_column = require("./discovered_column.cjs");
|
|
6
|
+
const require_overridden = require("./overridden.cjs");
|
|
7
|
+
let _milaboratories_helpers = require("@milaboratories/helpers");
|
|
8
|
+
let es_toolkit = require("es-toolkit");
|
|
4
9
|
//#region src/drivers/pframe/spec/ids.ts
|
|
5
10
|
/**
|
|
6
|
-
* Canonically serializes a
|
|
7
|
-
* @
|
|
8
|
-
*
|
|
11
|
+
* Canonically serializes a column key to a branded string id. Accepts both
|
|
12
|
+
* the new {@link ColumnUniversalKey} and the deprecated {@link UniversalPColumnId}
|
|
13
|
+
* (anchored / old filtered object form).
|
|
9
14
|
*/
|
|
10
15
|
function stringifyColumnId(id) {
|
|
11
|
-
return
|
|
16
|
+
return require_json.canonicalizeJson(id);
|
|
12
17
|
}
|
|
13
18
|
/**
|
|
14
|
-
* Parses a canonically serialized
|
|
15
|
-
* @param str - The string to parse
|
|
16
|
-
* @returns The parsed column identifier
|
|
19
|
+
* Parses a canonically serialized column id back to its key form.
|
|
17
20
|
*/
|
|
18
21
|
function parseColumnId(str) {
|
|
19
22
|
return JSON.parse(str);
|
|
20
23
|
}
|
|
24
|
+
function parseColumnIdSafely(str, fallback = void 0) {
|
|
25
|
+
try {
|
|
26
|
+
return JSON.parse(str);
|
|
27
|
+
} catch {
|
|
28
|
+
return fallback;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Walk a rich column id down to its terminal leaf {@link PObjectId}.
|
|
33
|
+
*/
|
|
34
|
+
function extractPObjectId(id) {
|
|
35
|
+
if ((0, es_toolkit.isString)(id)) {
|
|
36
|
+
if (require_spec.isPObjectId(id)) return id;
|
|
37
|
+
return extractPObjectId(parseColumnIdSafely(id) ?? (0, _milaboratories_helpers.throwError)(`extractPObjectId: id "${id}" is not a valid canonical column id`));
|
|
38
|
+
}
|
|
39
|
+
if (require_spec.isPObjectKey(id)) return require_spec.createPObjectId(id);
|
|
40
|
+
if (require_filtered_column.isColumnFilteredKey(id)) return extractPObjectId(id.source);
|
|
41
|
+
if (require_overridden.isColumnOverriddenKey(id)) return extractPObjectId(id.source);
|
|
42
|
+
if (require_discovered_column.isColumnDiscoveredKey(id)) return extractPObjectId(id.column);
|
|
43
|
+
throw new Error(`extractPObjectId: unrecognized column id structure: ${JSON.stringify(id)}`);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Reconstruct the effective {@link PColumnSpec} for a rich column id by walking
|
|
47
|
+
* the id chain from leaf to outermost wrapper, applying each layer's spec
|
|
48
|
+
* transformation in the same order the corresponding recipe would.
|
|
49
|
+
*
|
|
50
|
+
* Layer semantics:
|
|
51
|
+
* - Leaf ({@link LocalPObjectKey} / {@link GlobalPObjectKey}): no transformation.
|
|
52
|
+
* - {@link ColumnDiscoveredKey}: pass-through, descends into `column`.
|
|
53
|
+
* - {@link ColumnFilteredKey}: drops the axes whose positional index appears in
|
|
54
|
+
* `axisFilters[i][0]` from the inner spec's `axesSpec` — mirrors
|
|
55
|
+
* `ColumnFilteredRecipe.getSpec()`.
|
|
56
|
+
* - {@link ColumnOverriddenKey}: applies `specOverrides` via
|
|
57
|
+
* {@link applySpecOverrides} on top of the inner spec.
|
|
58
|
+
*/
|
|
59
|
+
function reconstructSpecFromId(baseSpec, id) {
|
|
60
|
+
if ((0, es_toolkit.isString)(id)) {
|
|
61
|
+
if (require_spec.isPObjectId(id)) return baseSpec;
|
|
62
|
+
return reconstructSpecFromId(baseSpec, parseColumnIdSafely(id) ?? (0, _milaboratories_helpers.throwError)(`reconstructSpecFromId: id "${id}" is not a valid canonical column id`));
|
|
63
|
+
}
|
|
64
|
+
if (require_spec.isPObjectKey(id)) return baseSpec;
|
|
65
|
+
if (require_discovered_column.isColumnDiscoveredKey(id)) return reconstructSpecFromId(baseSpec, id.column);
|
|
66
|
+
if (require_filtered_column.isColumnFilteredKey(id)) return require_filtered_column.applyAxisFilters(reconstructSpecFromId(baseSpec, id.source), id.axisFilters);
|
|
67
|
+
if (require_overridden.isColumnOverriddenKey(id)) return require_overridden.applySpecOverrides(reconstructSpecFromId(baseSpec, id.source), id.specOverrides);
|
|
68
|
+
throw new Error(`reconstructSpecFromId: unrecognized column id structure: ${JSON.stringify(id)}`);
|
|
69
|
+
}
|
|
21
70
|
//#endregion
|
|
71
|
+
exports.extractPObjectId = extractPObjectId;
|
|
22
72
|
exports.parseColumnId = parseColumnId;
|
|
73
|
+
exports.parseColumnIdSafely = parseColumnIdSafely;
|
|
74
|
+
exports.reconstructSpecFromId = reconstructSpecFromId;
|
|
23
75
|
exports.stringifyColumnId = stringifyColumnId;
|
|
24
76
|
|
|
25
77
|
//# sourceMappingURL=ids.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ids.cjs","names":[],"sources":["../../../../src/drivers/pframe/spec/ids.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"ids.cjs","names":["canonicalizeJson","isPObjectId","isPObjectKey","createPObjectId","isColumnFilteredKey","isColumnOverriddenKey","isColumnDiscoveredKey","applyAxisFilters","applySpecOverrides"],"sources":["../../../../src/drivers/pframe/spec/ids.ts"],"sourcesContent":["import type { AnchoredPColumnId } from \"./selectors\";\nimport {\n applyAxisFilters,\n isColumnFilteredKey,\n type ColumnFilteredId,\n type ColumnFilteredKey,\n type FilteredPColumnId,\n} from \"./filtered_column\";\nimport {\n createPObjectId,\n isPObjectId,\n isPObjectKey,\n LocalPObjectKey,\n type GlobalPObjectId,\n type GlobalPObjectKey,\n type LocalPObjectId,\n type PObjectId,\n} from \"../../../pool\";\nimport {\n isColumnDiscoveredKey,\n type ColumnDiscoveredId,\n type ColumnDiscoveredKey,\n} from \"./discovered_column\";\nimport { throwError } from \"@milaboratories/helpers\";\nimport {\n applySpecOverrides,\n isColumnOverriddenKey,\n type ColumnOverriddenId,\n type ColumnOverriddenKey,\n} from \"./overridden\";\nimport { canonicalizeJson } from \"../../../json\";\nimport { AxisSpec, PColumnSpec } from \"./spec\";\nimport { isString } from \"es-toolkit\";\n\n/**\n * Per-axis patches keyed by positional index in the base spec's `axesSpec`.\n *\n * Using position rather than `name` lets us disambiguate linker-style specs\n * that carry multiple axes with the same `name` differentiated by `domain` /\n * `contextDomain` (e.g. a `group`, `group/primary`, `group/secondary` triple).\n *\n * A patch at index `>= base.axesSpec.length` appends a new axis at that slot.\n */\nexport type AxisPatches = Record<number, Partial<AxisSpec>>;\n\n/**\n * Universal column identifier optionally anchored and optionally filtered.\n * @deprecated use {@link ColumnUniversalKey}\n */\nexport type UniversalPColumnId = AnchoredPColumnId | FilteredPColumnId;\n\n/**\n * Canonically serialized {@link UniversalPColumnId}.\n * @deprecated use {@link ColumnUniversalId}\n */\nexport type SUniversalPColumnId = ColumnUniversalId;\n// export type SUniversalPColumnId = Branded<PObjectId, \"SUniversalPColumnId\", \"__pl_model_brand_2__\">;\n\nexport type ColumnUniversalKey =\n | LocalPObjectKey\n | GlobalPObjectKey\n | ColumnFilteredKey\n | ColumnDiscoveredKey\n | ColumnOverriddenKey;\n\nexport type ColumnUniversalId =\n | LocalPObjectId\n | GlobalPObjectId\n | ColumnFilteredId\n | ColumnDiscoveredId\n | ColumnOverriddenId;\n\n/**\n * Canonically serializes a column key to a branded string id. Accepts both\n * the new {@link ColumnUniversalKey} and the deprecated {@link UniversalPColumnId}\n * (anchored / old filtered object form).\n */\nexport function stringifyColumnId(id: ColumnUniversalKey | UniversalPColumnId): ColumnUniversalId {\n return canonicalizeJson(id) as ColumnUniversalId;\n}\n\n/**\n * Parses a canonically serialized column id back to its key form.\n */\nexport function parseColumnId(str: ColumnUniversalId): ColumnUniversalKey {\n return JSON.parse(str) as ColumnUniversalKey;\n}\n\nexport function parseColumnIdSafely(\n str: ColumnUniversalId,\n fallback = undefined,\n): ColumnUniversalKey | typeof fallback {\n try {\n return JSON.parse(str) as ColumnUniversalKey;\n } catch {\n return fallback;\n }\n}\n\n/**\n * Walk a rich column id down to its terminal leaf {@link PObjectId}.\n */\nexport function extractPObjectId(id: ColumnUniversalId | ColumnUniversalKey): PObjectId {\n if (isString(id)) {\n if (isPObjectId(id)) return id;\n\n const parsed =\n parseColumnIdSafely(id) ??\n throwError(`extractPObjectId: id \"${id}\" is not a valid canonical column id`);\n return extractPObjectId(parsed);\n }\n\n if (isPObjectKey(id)) return createPObjectId(id);\n if (isColumnFilteredKey(id)) return extractPObjectId(id.source);\n if (isColumnOverriddenKey(id)) return extractPObjectId(id.source);\n if (isColumnDiscoveredKey(id)) return extractPObjectId(id.column);\n\n throw new Error(`extractPObjectId: unrecognized column id structure: ${JSON.stringify(id)}`);\n}\n\n/**\n * Reconstruct the effective {@link PColumnSpec} for a rich column id by walking\n * the id chain from leaf to outermost wrapper, applying each layer's spec\n * transformation in the same order the corresponding recipe would.\n *\n * Layer semantics:\n * - Leaf ({@link LocalPObjectKey} / {@link GlobalPObjectKey}): no transformation.\n * - {@link ColumnDiscoveredKey}: pass-through, descends into `column`.\n * - {@link ColumnFilteredKey}: drops the axes whose positional index appears in\n * `axisFilters[i][0]` from the inner spec's `axesSpec` — mirrors\n * `ColumnFilteredRecipe.getSpec()`.\n * - {@link ColumnOverriddenKey}: applies `specOverrides` via\n * {@link applySpecOverrides} on top of the inner spec.\n */\nexport function reconstructSpecFromId(\n baseSpec: PColumnSpec,\n id: ColumnUniversalId | ColumnUniversalKey,\n): PColumnSpec {\n if (isString(id)) {\n if (isPObjectId(id)) return baseSpec;\n\n const parsed =\n parseColumnIdSafely(id) ??\n throwError(`reconstructSpecFromId: id \"${id}\" is not a valid canonical column id`);\n return reconstructSpecFromId(baseSpec, parsed);\n }\n\n if (isPObjectKey(id)) return baseSpec;\n if (isColumnDiscoveredKey(id)) return reconstructSpecFromId(baseSpec, id.column);\n if (isColumnFilteredKey(id)) {\n return applyAxisFilters(reconstructSpecFromId(baseSpec, id.source), id.axisFilters);\n }\n if (isColumnOverriddenKey(id)) {\n const inner = reconstructSpecFromId(baseSpec, id.source);\n return applySpecOverrides(inner, id.specOverrides);\n }\n\n throw new Error(`reconstructSpecFromId: unrecognized column id structure: ${JSON.stringify(id)}`);\n}\n"],"mappings":";;;;;;;;;;;;;;AA6EA,SAAgB,kBAAkB,IAAgE;CAChG,OAAOA,aAAAA,iBAAiB,EAAE;AAC5B;;;;AAKA,SAAgB,cAAc,KAA4C;CACxE,OAAO,KAAK,MAAM,GAAG;AACvB;AAEA,SAAgB,oBACd,KACA,WAAW,KAAA,GAC2B;CACtC,IAAI;EACF,OAAO,KAAK,MAAM,GAAG;CACvB,QAAQ;EACN,OAAO;CACT;AACF;;;;AAKA,SAAgB,iBAAiB,IAAuD;CACtF,KAAA,GAAA,WAAA,SAAA,CAAa,EAAE,GAAG;EAChB,IAAIC,aAAAA,YAAY,EAAE,GAAG,OAAO;EAK5B,OAAO,iBAFL,oBAAoB,EAAE,MAAA,GAAA,wBAAA,WAAA,CACX,yBAAyB,GAAG,qCAAqC,CAChD;CAChC;CAEA,IAAIC,aAAAA,aAAa,EAAE,GAAG,OAAOC,aAAAA,gBAAgB,EAAE;CAC/C,IAAIC,wBAAAA,oBAAoB,EAAE,GAAG,OAAO,iBAAiB,GAAG,MAAM;CAC9D,IAAIC,mBAAAA,sBAAsB,EAAE,GAAG,OAAO,iBAAiB,GAAG,MAAM;CAChE,IAAIC,0BAAAA,sBAAsB,EAAE,GAAG,OAAO,iBAAiB,GAAG,MAAM;CAEhE,MAAM,IAAI,MAAM,uDAAuD,KAAK,UAAU,EAAE,GAAG;AAC7F;;;;;;;;;;;;;;;AAgBA,SAAgB,sBACd,UACA,IACa;CACb,KAAA,GAAA,WAAA,SAAA,CAAa,EAAE,GAAG;EAChB,IAAIL,aAAAA,YAAY,EAAE,GAAG,OAAO;EAK5B,OAAO,sBAAsB,UAF3B,oBAAoB,EAAE,MAAA,GAAA,wBAAA,WAAA,CACX,8BAA8B,GAAG,qCAAqC,CACtC;CAC/C;CAEA,IAAIC,aAAAA,aAAa,EAAE,GAAG,OAAO;CAC7B,IAAII,0BAAAA,sBAAsB,EAAE,GAAG,OAAO,sBAAsB,UAAU,GAAG,MAAM;CAC/E,IAAIF,wBAAAA,oBAAoB,EAAE,GACxB,OAAOG,wBAAAA,iBAAiB,sBAAsB,UAAU,GAAG,MAAM,GAAG,GAAG,WAAW;CAEpF,IAAIF,mBAAAA,sBAAsB,EAAE,GAE1B,OAAOG,mBAAAA,mBADO,sBAAsB,UAAU,GAAG,MACnB,GAAG,GAAG,aAAa;CAGnD,MAAM,IAAI,MAAM,4DAA4D,KAAK,UAAU,EAAE,GAAG;AAClG"}
|
|
@@ -1,29 +1,62 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { ColumnDiscoveredId, ColumnDiscoveredKey } from "./discovered_column.js";
|
|
2
|
+
import { AxisSpec, PColumnSpec } from "./spec.js";
|
|
3
|
+
import { ColumnOverriddenId, ColumnOverriddenKey } from "./overridden.js";
|
|
4
|
+
import { ColumnFilteredId, ColumnFilteredKey, FilteredPColumnId } from "./filtered_column.js";
|
|
4
5
|
import { AnchoredPColumnId } from "./selectors.js";
|
|
5
|
-
import { PObjectId } from "../../../pool/spec.js";
|
|
6
|
+
import { GlobalPObjectId, GlobalPObjectKey, LocalPObjectId, LocalPObjectKey, PObjectId } from "../../../pool/spec.js";
|
|
6
7
|
//#region src/drivers/pframe/spec/ids.d.ts
|
|
8
|
+
/**
|
|
9
|
+
* Per-axis patches keyed by positional index in the base spec's `axesSpec`.
|
|
10
|
+
*
|
|
11
|
+
* Using position rather than `name` lets us disambiguate linker-style specs
|
|
12
|
+
* that carry multiple axes with the same `name` differentiated by `domain` /
|
|
13
|
+
* `contextDomain` (e.g. a `group`, `group/primary`, `group/secondary` triple).
|
|
14
|
+
*
|
|
15
|
+
* A patch at index `>= base.axesSpec.length` appends a new axis at that slot.
|
|
16
|
+
*/
|
|
17
|
+
type AxisPatches = Record<number, Partial<AxisSpec>>;
|
|
7
18
|
/**
|
|
8
19
|
* Universal column identifier optionally anchored and optionally filtered.
|
|
20
|
+
* @deprecated use {@link ColumnUniversalKey}
|
|
9
21
|
*/
|
|
10
|
-
type UniversalPColumnId = AnchoredPColumnId | FilteredPColumnId
|
|
22
|
+
type UniversalPColumnId = AnchoredPColumnId | FilteredPColumnId;
|
|
11
23
|
/**
|
|
12
24
|
* Canonically serialized {@link UniversalPColumnId}.
|
|
25
|
+
* @deprecated use {@link ColumnUniversalId}
|
|
26
|
+
*/
|
|
27
|
+
type SUniversalPColumnId = ColumnUniversalId;
|
|
28
|
+
type ColumnUniversalKey = LocalPObjectKey | GlobalPObjectKey | ColumnFilteredKey | ColumnDiscoveredKey | ColumnOverriddenKey;
|
|
29
|
+
type ColumnUniversalId = LocalPObjectId | GlobalPObjectId | ColumnFilteredId | ColumnDiscoveredId | ColumnOverriddenId;
|
|
30
|
+
/**
|
|
31
|
+
* Canonically serializes a column key to a branded string id. Accepts both
|
|
32
|
+
* the new {@link ColumnUniversalKey} and the deprecated {@link UniversalPColumnId}
|
|
33
|
+
* (anchored / old filtered object form).
|
|
34
|
+
*/
|
|
35
|
+
declare function stringifyColumnId(id: ColumnUniversalKey | UniversalPColumnId): ColumnUniversalId;
|
|
36
|
+
/**
|
|
37
|
+
* Parses a canonically serialized column id back to its key form.
|
|
13
38
|
*/
|
|
14
|
-
|
|
39
|
+
declare function parseColumnId(str: ColumnUniversalId): ColumnUniversalKey;
|
|
40
|
+
declare function parseColumnIdSafely(str: ColumnUniversalId, fallback?: undefined): ColumnUniversalKey | typeof fallback;
|
|
15
41
|
/**
|
|
16
|
-
*
|
|
17
|
-
* @param id - The column identifier to serialize
|
|
18
|
-
* @returns The canonically serialized string
|
|
42
|
+
* Walk a rich column id down to its terminal leaf {@link PObjectId}.
|
|
19
43
|
*/
|
|
20
|
-
declare function
|
|
44
|
+
declare function extractPObjectId(id: ColumnUniversalId | ColumnUniversalKey): PObjectId;
|
|
21
45
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
46
|
+
* Reconstruct the effective {@link PColumnSpec} for a rich column id by walking
|
|
47
|
+
* the id chain from leaf to outermost wrapper, applying each layer's spec
|
|
48
|
+
* transformation in the same order the corresponding recipe would.
|
|
49
|
+
*
|
|
50
|
+
* Layer semantics:
|
|
51
|
+
* - Leaf ({@link LocalPObjectKey} / {@link GlobalPObjectKey}): no transformation.
|
|
52
|
+
* - {@link ColumnDiscoveredKey}: pass-through, descends into `column`.
|
|
53
|
+
* - {@link ColumnFilteredKey}: drops the axes whose positional index appears in
|
|
54
|
+
* `axisFilters[i][0]` from the inner spec's `axesSpec` — mirrors
|
|
55
|
+
* `ColumnFilteredRecipe.getSpec()`.
|
|
56
|
+
* - {@link ColumnOverriddenKey}: applies `specOverrides` via
|
|
57
|
+
* {@link applySpecOverrides} on top of the inner spec.
|
|
25
58
|
*/
|
|
26
|
-
declare function
|
|
59
|
+
declare function reconstructSpecFromId(baseSpec: PColumnSpec, id: ColumnUniversalId | ColumnUniversalKey): PColumnSpec;
|
|
27
60
|
//#endregion
|
|
28
|
-
export { SUniversalPColumnId, UniversalPColumnId, parseColumnId, stringifyColumnId };
|
|
61
|
+
export { AxisPatches, ColumnUniversalId, ColumnUniversalKey, SUniversalPColumnId, UniversalPColumnId, extractPObjectId, parseColumnId, parseColumnIdSafely, reconstructSpecFromId, stringifyColumnId };
|
|
29
62
|
//# sourceMappingURL=ids.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ids.d.ts","names":[],"sources":["../../../../src/drivers/pframe/spec/ids.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ids.d.ts","names":[],"sources":["../../../../src/drivers/pframe/spec/ids.ts"],"mappings":";;;;;;;;;;AA2CA;;;;;;KAAY,WAAA,GAAc,MAAA,SAAe,OAAA,CAAQ,QAAA;;;;;KAMrC,kBAAA,GAAqB,iBAAA,GAAoB,iBAAiB;AANb;AAMzD;;;AANyD,KAY7C,mBAAA,GAAsB,iBAAiB;AAAA,KAGvC,kBAAA,GACR,eAAA,GACA,gBAAA,GACA,iBAAA,GACA,mBAAA,GACA,mBAAA;AAAA,KAEQ,iBAAA,GACR,cAAA,GACA,eAAA,GACA,gBAAA,GACA,kBAAA,GACA,kBAAA;;;;AAf+C;AAGnD;iBAmBgB,iBAAA,CAAkB,EAAA,EAAI,kBAAA,GAAqB,kBAAA,GAAqB,iBAAA;;;;iBAOhE,aAAA,CAAc,GAAA,EAAK,iBAAA,GAAoB,kBAAkB;AAAA,iBAIzD,mBAAA,CACd,GAAA,EAAK,iBAAA,EACL,QAAA,eACC,kBAAA,UAA4B,QAAA;;;;iBAWf,gBAAA,CAAiB,EAAA,EAAI,iBAAA,GAAoB,kBAAA,GAAqB,SAAA;;;;;;AAvCvD;AAEvB;;;;;;;;iBAqEgB,qBAAA,CACd,QAAA,EAAU,WAAA,EACV,EAAA,EAAI,iBAAA,GAAoB,kBAAA,GACvB,WAAA"}
|
|
@@ -1,22 +1,73 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { canonicalizeJson } from "../../../json.js";
|
|
2
|
+
import { applyAxisFilters, isColumnFilteredKey } from "./filtered_column.js";
|
|
3
|
+
import { createPObjectId, isPObjectId, isPObjectKey } from "../../../pool/spec.js";
|
|
4
|
+
import "../../../pool/index.js";
|
|
5
|
+
import { isColumnDiscoveredKey } from "./discovered_column.js";
|
|
6
|
+
import { applySpecOverrides, isColumnOverriddenKey } from "./overridden.js";
|
|
7
|
+
import { throwError } from "@milaboratories/helpers";
|
|
8
|
+
import { isString } from "es-toolkit";
|
|
2
9
|
//#region src/drivers/pframe/spec/ids.ts
|
|
3
10
|
/**
|
|
4
|
-
* Canonically serializes a
|
|
5
|
-
* @
|
|
6
|
-
*
|
|
11
|
+
* Canonically serializes a column key to a branded string id. Accepts both
|
|
12
|
+
* the new {@link ColumnUniversalKey} and the deprecated {@link UniversalPColumnId}
|
|
13
|
+
* (anchored / old filtered object form).
|
|
7
14
|
*/
|
|
8
15
|
function stringifyColumnId(id) {
|
|
9
|
-
return
|
|
16
|
+
return canonicalizeJson(id);
|
|
10
17
|
}
|
|
11
18
|
/**
|
|
12
|
-
* Parses a canonically serialized
|
|
13
|
-
* @param str - The string to parse
|
|
14
|
-
* @returns The parsed column identifier
|
|
19
|
+
* Parses a canonically serialized column id back to its key form.
|
|
15
20
|
*/
|
|
16
21
|
function parseColumnId(str) {
|
|
17
22
|
return JSON.parse(str);
|
|
18
23
|
}
|
|
24
|
+
function parseColumnIdSafely(str, fallback = void 0) {
|
|
25
|
+
try {
|
|
26
|
+
return JSON.parse(str);
|
|
27
|
+
} catch {
|
|
28
|
+
return fallback;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Walk a rich column id down to its terminal leaf {@link PObjectId}.
|
|
33
|
+
*/
|
|
34
|
+
function extractPObjectId(id) {
|
|
35
|
+
if (isString(id)) {
|
|
36
|
+
if (isPObjectId(id)) return id;
|
|
37
|
+
return extractPObjectId(parseColumnIdSafely(id) ?? throwError(`extractPObjectId: id "${id}" is not a valid canonical column id`));
|
|
38
|
+
}
|
|
39
|
+
if (isPObjectKey(id)) return createPObjectId(id);
|
|
40
|
+
if (isColumnFilteredKey(id)) return extractPObjectId(id.source);
|
|
41
|
+
if (isColumnOverriddenKey(id)) return extractPObjectId(id.source);
|
|
42
|
+
if (isColumnDiscoveredKey(id)) return extractPObjectId(id.column);
|
|
43
|
+
throw new Error(`extractPObjectId: unrecognized column id structure: ${JSON.stringify(id)}`);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Reconstruct the effective {@link PColumnSpec} for a rich column id by walking
|
|
47
|
+
* the id chain from leaf to outermost wrapper, applying each layer's spec
|
|
48
|
+
* transformation in the same order the corresponding recipe would.
|
|
49
|
+
*
|
|
50
|
+
* Layer semantics:
|
|
51
|
+
* - Leaf ({@link LocalPObjectKey} / {@link GlobalPObjectKey}): no transformation.
|
|
52
|
+
* - {@link ColumnDiscoveredKey}: pass-through, descends into `column`.
|
|
53
|
+
* - {@link ColumnFilteredKey}: drops the axes whose positional index appears in
|
|
54
|
+
* `axisFilters[i][0]` from the inner spec's `axesSpec` — mirrors
|
|
55
|
+
* `ColumnFilteredRecipe.getSpec()`.
|
|
56
|
+
* - {@link ColumnOverriddenKey}: applies `specOverrides` via
|
|
57
|
+
* {@link applySpecOverrides} on top of the inner spec.
|
|
58
|
+
*/
|
|
59
|
+
function reconstructSpecFromId(baseSpec, id) {
|
|
60
|
+
if (isString(id)) {
|
|
61
|
+
if (isPObjectId(id)) return baseSpec;
|
|
62
|
+
return reconstructSpecFromId(baseSpec, parseColumnIdSafely(id) ?? throwError(`reconstructSpecFromId: id "${id}" is not a valid canonical column id`));
|
|
63
|
+
}
|
|
64
|
+
if (isPObjectKey(id)) return baseSpec;
|
|
65
|
+
if (isColumnDiscoveredKey(id)) return reconstructSpecFromId(baseSpec, id.column);
|
|
66
|
+
if (isColumnFilteredKey(id)) return applyAxisFilters(reconstructSpecFromId(baseSpec, id.source), id.axisFilters);
|
|
67
|
+
if (isColumnOverriddenKey(id)) return applySpecOverrides(reconstructSpecFromId(baseSpec, id.source), id.specOverrides);
|
|
68
|
+
throw new Error(`reconstructSpecFromId: unrecognized column id structure: ${JSON.stringify(id)}`);
|
|
69
|
+
}
|
|
19
70
|
//#endregion
|
|
20
|
-
export { parseColumnId, stringifyColumnId };
|
|
71
|
+
export { extractPObjectId, parseColumnId, parseColumnIdSafely, reconstructSpecFromId, stringifyColumnId };
|
|
21
72
|
|
|
22
73
|
//# sourceMappingURL=ids.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ids.js","names":[],"sources":["../../../../src/drivers/pframe/spec/ids.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"ids.js","names":[],"sources":["../../../../src/drivers/pframe/spec/ids.ts"],"sourcesContent":["import type { AnchoredPColumnId } from \"./selectors\";\nimport {\n applyAxisFilters,\n isColumnFilteredKey,\n type ColumnFilteredId,\n type ColumnFilteredKey,\n type FilteredPColumnId,\n} from \"./filtered_column\";\nimport {\n createPObjectId,\n isPObjectId,\n isPObjectKey,\n LocalPObjectKey,\n type GlobalPObjectId,\n type GlobalPObjectKey,\n type LocalPObjectId,\n type PObjectId,\n} from \"../../../pool\";\nimport {\n isColumnDiscoveredKey,\n type ColumnDiscoveredId,\n type ColumnDiscoveredKey,\n} from \"./discovered_column\";\nimport { throwError } from \"@milaboratories/helpers\";\nimport {\n applySpecOverrides,\n isColumnOverriddenKey,\n type ColumnOverriddenId,\n type ColumnOverriddenKey,\n} from \"./overridden\";\nimport { canonicalizeJson } from \"../../../json\";\nimport { AxisSpec, PColumnSpec } from \"./spec\";\nimport { isString } from \"es-toolkit\";\n\n/**\n * Per-axis patches keyed by positional index in the base spec's `axesSpec`.\n *\n * Using position rather than `name` lets us disambiguate linker-style specs\n * that carry multiple axes with the same `name` differentiated by `domain` /\n * `contextDomain` (e.g. a `group`, `group/primary`, `group/secondary` triple).\n *\n * A patch at index `>= base.axesSpec.length` appends a new axis at that slot.\n */\nexport type AxisPatches = Record<number, Partial<AxisSpec>>;\n\n/**\n * Universal column identifier optionally anchored and optionally filtered.\n * @deprecated use {@link ColumnUniversalKey}\n */\nexport type UniversalPColumnId = AnchoredPColumnId | FilteredPColumnId;\n\n/**\n * Canonically serialized {@link UniversalPColumnId}.\n * @deprecated use {@link ColumnUniversalId}\n */\nexport type SUniversalPColumnId = ColumnUniversalId;\n// export type SUniversalPColumnId = Branded<PObjectId, \"SUniversalPColumnId\", \"__pl_model_brand_2__\">;\n\nexport type ColumnUniversalKey =\n | LocalPObjectKey\n | GlobalPObjectKey\n | ColumnFilteredKey\n | ColumnDiscoveredKey\n | ColumnOverriddenKey;\n\nexport type ColumnUniversalId =\n | LocalPObjectId\n | GlobalPObjectId\n | ColumnFilteredId\n | ColumnDiscoveredId\n | ColumnOverriddenId;\n\n/**\n * Canonically serializes a column key to a branded string id. Accepts both\n * the new {@link ColumnUniversalKey} and the deprecated {@link UniversalPColumnId}\n * (anchored / old filtered object form).\n */\nexport function stringifyColumnId(id: ColumnUniversalKey | UniversalPColumnId): ColumnUniversalId {\n return canonicalizeJson(id) as ColumnUniversalId;\n}\n\n/**\n * Parses a canonically serialized column id back to its key form.\n */\nexport function parseColumnId(str: ColumnUniversalId): ColumnUniversalKey {\n return JSON.parse(str) as ColumnUniversalKey;\n}\n\nexport function parseColumnIdSafely(\n str: ColumnUniversalId,\n fallback = undefined,\n): ColumnUniversalKey | typeof fallback {\n try {\n return JSON.parse(str) as ColumnUniversalKey;\n } catch {\n return fallback;\n }\n}\n\n/**\n * Walk a rich column id down to its terminal leaf {@link PObjectId}.\n */\nexport function extractPObjectId(id: ColumnUniversalId | ColumnUniversalKey): PObjectId {\n if (isString(id)) {\n if (isPObjectId(id)) return id;\n\n const parsed =\n parseColumnIdSafely(id) ??\n throwError(`extractPObjectId: id \"${id}\" is not a valid canonical column id`);\n return extractPObjectId(parsed);\n }\n\n if (isPObjectKey(id)) return createPObjectId(id);\n if (isColumnFilteredKey(id)) return extractPObjectId(id.source);\n if (isColumnOverriddenKey(id)) return extractPObjectId(id.source);\n if (isColumnDiscoveredKey(id)) return extractPObjectId(id.column);\n\n throw new Error(`extractPObjectId: unrecognized column id structure: ${JSON.stringify(id)}`);\n}\n\n/**\n * Reconstruct the effective {@link PColumnSpec} for a rich column id by walking\n * the id chain from leaf to outermost wrapper, applying each layer's spec\n * transformation in the same order the corresponding recipe would.\n *\n * Layer semantics:\n * - Leaf ({@link LocalPObjectKey} / {@link GlobalPObjectKey}): no transformation.\n * - {@link ColumnDiscoveredKey}: pass-through, descends into `column`.\n * - {@link ColumnFilteredKey}: drops the axes whose positional index appears in\n * `axisFilters[i][0]` from the inner spec's `axesSpec` — mirrors\n * `ColumnFilteredRecipe.getSpec()`.\n * - {@link ColumnOverriddenKey}: applies `specOverrides` via\n * {@link applySpecOverrides} on top of the inner spec.\n */\nexport function reconstructSpecFromId(\n baseSpec: PColumnSpec,\n id: ColumnUniversalId | ColumnUniversalKey,\n): PColumnSpec {\n if (isString(id)) {\n if (isPObjectId(id)) return baseSpec;\n\n const parsed =\n parseColumnIdSafely(id) ??\n throwError(`reconstructSpecFromId: id \"${id}\" is not a valid canonical column id`);\n return reconstructSpecFromId(baseSpec, parsed);\n }\n\n if (isPObjectKey(id)) return baseSpec;\n if (isColumnDiscoveredKey(id)) return reconstructSpecFromId(baseSpec, id.column);\n if (isColumnFilteredKey(id)) {\n return applyAxisFilters(reconstructSpecFromId(baseSpec, id.source), id.axisFilters);\n }\n if (isColumnOverriddenKey(id)) {\n const inner = reconstructSpecFromId(baseSpec, id.source);\n return applySpecOverrides(inner, id.specOverrides);\n }\n\n throw new Error(`reconstructSpecFromId: unrecognized column id structure: ${JSON.stringify(id)}`);\n}\n"],"mappings":";;;;;;;;;;;;;;AA6EA,SAAgB,kBAAkB,IAAgE;CAChG,OAAO,iBAAiB,EAAE;AAC5B;;;;AAKA,SAAgB,cAAc,KAA4C;CACxE,OAAO,KAAK,MAAM,GAAG;AACvB;AAEA,SAAgB,oBACd,KACA,WAAW,KAAA,GAC2B;CACtC,IAAI;EACF,OAAO,KAAK,MAAM,GAAG;CACvB,QAAQ;EACN,OAAO;CACT;AACF;;;;AAKA,SAAgB,iBAAiB,IAAuD;CACtF,IAAI,SAAS,EAAE,GAAG;EAChB,IAAI,YAAY,EAAE,GAAG,OAAO;EAK5B,OAAO,iBAFL,oBAAoB,EAAE,KACtB,WAAW,yBAAyB,GAAG,qCAAqC,CAChD;CAChC;CAEA,IAAI,aAAa,EAAE,GAAG,OAAO,gBAAgB,EAAE;CAC/C,IAAI,oBAAoB,EAAE,GAAG,OAAO,iBAAiB,GAAG,MAAM;CAC9D,IAAI,sBAAsB,EAAE,GAAG,OAAO,iBAAiB,GAAG,MAAM;CAChE,IAAI,sBAAsB,EAAE,GAAG,OAAO,iBAAiB,GAAG,MAAM;CAEhE,MAAM,IAAI,MAAM,uDAAuD,KAAK,UAAU,EAAE,GAAG;AAC7F;;;;;;;;;;;;;;;AAgBA,SAAgB,sBACd,UACA,IACa;CACb,IAAI,SAAS,EAAE,GAAG;EAChB,IAAI,YAAY,EAAE,GAAG,OAAO;EAK5B,OAAO,sBAAsB,UAF3B,oBAAoB,EAAE,KACtB,WAAW,8BAA8B,GAAG,qCAAqC,CACtC;CAC/C;CAEA,IAAI,aAAa,EAAE,GAAG,OAAO;CAC7B,IAAI,sBAAsB,EAAE,GAAG,OAAO,sBAAsB,UAAU,GAAG,MAAM;CAC/E,IAAI,oBAAoB,EAAE,GACxB,OAAO,iBAAiB,sBAAsB,UAAU,GAAG,MAAM,GAAG,GAAG,WAAW;CAEpF,IAAI,sBAAsB,EAAE,GAE1B,OAAO,mBADO,sBAAsB,UAAU,GAAG,MACnB,GAAG,GAAG,aAAa;CAGnD,MAAM,IAAI,MAAM,4DAA4D,KAAK,UAAU,EAAE,GAAG;AAClG"}
|