@milaboratories/pl-model-common 1.46.4 → 1.47.1

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.
Files changed (178) hide show
  1. package/dist/columns/accessor_traversal.cjs +119 -0
  2. package/dist/columns/accessor_traversal.cjs.map +1 -0
  3. package/dist/columns/accessor_traversal.d.ts +52 -0
  4. package/dist/columns/accessor_traversal.d.ts.map +1 -0
  5. package/dist/columns/accessor_traversal.js +114 -0
  6. package/dist/columns/accessor_traversal.js.map +1 -0
  7. package/dist/columns/column_registry.cjs +40 -0
  8. package/dist/columns/column_registry.cjs.map +1 -0
  9. package/dist/columns/column_registry.d.ts +31 -0
  10. package/dist/columns/column_registry.d.ts.map +1 -0
  11. package/dist/columns/column_registry.js +40 -0
  12. package/dist/columns/column_registry.js.map +1 -0
  13. package/dist/columns/column_selector.cjs +49 -0
  14. package/dist/columns/column_selector.cjs.map +1 -0
  15. package/dist/columns/column_selector.d.ts +33 -0
  16. package/dist/columns/column_selector.d.ts.map +1 -0
  17. package/dist/columns/column_selector.js +47 -0
  18. package/dist/columns/column_selector.js.map +1 -0
  19. package/dist/columns/dedup.cjs +47 -0
  20. package/dist/columns/dedup.cjs.map +1 -0
  21. package/dist/columns/dedup.d.ts +27 -0
  22. package/dist/columns/dedup.d.ts.map +1 -0
  23. package/dist/columns/dedup.js +47 -0
  24. package/dist/columns/dedup.js.map +1 -0
  25. package/dist/columns/index.cjs +18 -0
  26. package/dist/columns/index.d.ts +8 -0
  27. package/dist/columns/index.js +6 -0
  28. package/dist/columns/providers.cjs +62 -0
  29. package/dist/columns/providers.cjs.map +1 -0
  30. package/dist/columns/providers.d.ts +39 -0
  31. package/dist/columns/providers.d.ts.map +1 -0
  32. package/dist/columns/providers.js +61 -0
  33. package/dist/columns/providers.js.map +1 -0
  34. package/dist/columns/types.d.ts +108 -0
  35. package/dist/columns/types.d.ts.map +1 -0
  36. package/dist/driver_kit.d.ts +1 -2
  37. package/dist/driver_kit.d.ts.map +1 -1
  38. package/dist/drivers/columns/columns_collection_driver.d.ts +124 -0
  39. package/dist/drivers/columns/columns_collection_driver.d.ts.map +1 -0
  40. package/dist/drivers/columns/discover_columns_options.cjs +28 -0
  41. package/dist/drivers/columns/discover_columns_options.cjs.map +1 -0
  42. package/dist/drivers/columns/discover_columns_options.d.ts +64 -0
  43. package/dist/drivers/columns/discover_columns_options.d.ts.map +1 -0
  44. package/dist/drivers/columns/discover_columns_options.js +28 -0
  45. package/dist/drivers/columns/discover_columns_options.js.map +1 -0
  46. package/dist/drivers/columns/index.d.ts +3 -0
  47. package/dist/drivers/index.cjs +32 -7
  48. package/dist/drivers/index.d.ts +12 -9
  49. package/dist/drivers/index.js +6 -4
  50. package/dist/drivers/pframe/driver.d.ts +1 -2
  51. package/dist/drivers/pframe/driver.d.ts.map +1 -1
  52. package/dist/drivers/pframe/index.cjs +30 -7
  53. package/dist/drivers/pframe/index.d.ts +9 -8
  54. package/dist/drivers/pframe/index.js +5 -4
  55. package/dist/drivers/pframe/query/index.d.ts +2 -2
  56. package/dist/drivers/pframe/query/query_common.d.ts +24 -1
  57. package/dist/drivers/pframe/query/query_common.d.ts.map +1 -1
  58. package/dist/drivers/pframe/query/query_spec.d.ts +25 -24
  59. package/dist/drivers/pframe/query/query_spec.d.ts.map +1 -1
  60. package/dist/drivers/pframe/query/utils.cjs +18 -8
  61. package/dist/drivers/pframe/query/utils.cjs.map +1 -1
  62. package/dist/drivers/pframe/query/utils.d.ts +5 -1
  63. package/dist/drivers/pframe/query/utils.d.ts.map +1 -1
  64. package/dist/drivers/pframe/query/utils.js +18 -8
  65. package/dist/drivers/pframe/query/utils.js.map +1 -1
  66. package/dist/drivers/pframe/spec/anchored.d.ts +2 -2
  67. package/dist/drivers/pframe/spec/discovered_column.cjs +31 -15
  68. package/dist/drivers/pframe/spec/discovered_column.cjs.map +1 -1
  69. package/dist/drivers/pframe/spec/discovered_column.d.ts +23 -13
  70. package/dist/drivers/pframe/spec/discovered_column.d.ts.map +1 -1
  71. package/dist/drivers/pframe/spec/discovered_column.js +26 -12
  72. package/dist/drivers/pframe/spec/discovered_column.js.map +1 -1
  73. package/dist/drivers/pframe/spec/filtered_column.cjs +46 -0
  74. package/dist/drivers/pframe/spec/filtered_column.cjs.map +1 -1
  75. package/dist/drivers/pframe/spec/filtered_column.d.ts +39 -1
  76. package/dist/drivers/pframe/spec/filtered_column.d.ts.map +1 -1
  77. package/dist/drivers/pframe/spec/filtered_column.js +41 -1
  78. package/dist/drivers/pframe/spec/filtered_column.js.map +1 -1
  79. package/dist/drivers/pframe/spec/ids.cjs +62 -10
  80. package/dist/drivers/pframe/spec/ids.cjs.map +1 -1
  81. package/dist/drivers/pframe/spec/ids.d.ts +48 -15
  82. package/dist/drivers/pframe/spec/ids.d.ts.map +1 -1
  83. package/dist/drivers/pframe/spec/ids.js +60 -9
  84. package/dist/drivers/pframe/spec/ids.js.map +1 -1
  85. package/dist/drivers/pframe/spec/index.cjs +30 -7
  86. package/dist/drivers/pframe/spec/index.d.ts +6 -5
  87. package/dist/drivers/pframe/spec/index.js +5 -4
  88. package/dist/drivers/pframe/spec/native_id.cjs +1 -0
  89. package/dist/drivers/pframe/spec/native_id.cjs.map +1 -1
  90. package/dist/drivers/pframe/spec/native_id.js +1 -0
  91. package/dist/drivers/pframe/spec/native_id.js.map +1 -1
  92. package/dist/drivers/pframe/spec/overridden.cjs +212 -0
  93. package/dist/drivers/pframe/spec/overridden.cjs.map +1 -0
  94. package/dist/drivers/pframe/spec/overridden.d.ts +67 -0
  95. package/dist/drivers/pframe/spec/overridden.d.ts.map +1 -0
  96. package/dist/drivers/pframe/spec/overridden.js +202 -0
  97. package/dist/drivers/pframe/spec/overridden.js.map +1 -0
  98. package/dist/drivers/pframe/spec/selectors.cjs +1 -0
  99. package/dist/drivers/pframe/spec/selectors.cjs.map +1 -1
  100. package/dist/drivers/pframe/spec/selectors.d.ts +3 -0
  101. package/dist/drivers/pframe/spec/selectors.d.ts.map +1 -1
  102. package/dist/drivers/pframe/spec/selectors.js +1 -0
  103. package/dist/drivers/pframe/spec/selectors.js.map +1 -1
  104. package/dist/drivers/pframe/spec/spec.cjs.map +1 -1
  105. package/dist/drivers/pframe/spec/spec.d.ts +2 -3
  106. package/dist/drivers/pframe/spec/spec.d.ts.map +1 -1
  107. package/dist/drivers/pframe/spec/spec.js.map +1 -1
  108. package/dist/drivers/pframe/spec_driver.d.ts +2 -2
  109. package/dist/drivers/pframe/spec_driver.d.ts.map +1 -1
  110. package/dist/drivers/pframe/table_calculate.cjs +2 -2
  111. package/dist/drivers/pframe/table_calculate.cjs.map +1 -1
  112. package/dist/drivers/pframe/table_calculate.d.ts +6 -2
  113. package/dist/drivers/pframe/table_calculate.d.ts.map +1 -1
  114. package/dist/drivers/pframe/table_calculate.js +2 -2
  115. package/dist/drivers/pframe/table_calculate.js.map +1 -1
  116. package/dist/drivers/pframe/table_common.cjs.map +1 -1
  117. package/dist/drivers/pframe/table_common.d.ts +11 -4
  118. package/dist/drivers/pframe/table_common.d.ts.map +1 -1
  119. package/dist/drivers/pframe/table_common.js.map +1 -1
  120. package/dist/index.cjs +63 -10
  121. package/dist/index.d.ts +20 -11
  122. package/dist/index.js +15 -6
  123. package/dist/pool/index.cjs +18 -0
  124. package/dist/pool/index.d.ts +2 -2
  125. package/dist/pool/index.js +3 -0
  126. package/dist/pool/spec.cjs +59 -11
  127. package/dist/pool/spec.cjs.map +1 -1
  128. package/dist/pool/spec.d.ts +24 -9
  129. package/dist/pool/spec.d.ts.map +1 -1
  130. package/dist/pool/spec.js +50 -10
  131. package/dist/pool/spec.js.map +1 -1
  132. package/dist/services/index.d.ts +2 -2
  133. package/dist/services/service_declarations.cjs +22 -0
  134. package/dist/services/service_declarations.cjs.map +1 -1
  135. package/dist/services/service_declarations.d.ts +5 -3
  136. package/dist/services/service_declarations.d.ts.map +1 -1
  137. package/dist/services/service_declarations.js +22 -0
  138. package/dist/services/service_declarations.js.map +1 -1
  139. package/dist/services/service_registry.cjs.map +1 -1
  140. package/dist/services/service_registry.d.ts +3 -3
  141. package/dist/services/service_registry.d.ts.map +1 -1
  142. package/dist/services/service_registry.js.map +1 -1
  143. package/dist/services/service_types.cjs.map +1 -1
  144. package/dist/services/service_types.d.ts +25 -9
  145. package/dist/services/service_types.d.ts.map +1 -1
  146. package/dist/services/service_types.js.map +1 -1
  147. package/package.json +5 -4
  148. package/src/columns/accessor_traversal.ts +139 -0
  149. package/src/columns/column_registry.ts +41 -0
  150. package/src/columns/column_selector.ts +100 -0
  151. package/src/columns/dedup.ts +49 -0
  152. package/src/columns/index.ts +6 -0
  153. package/src/columns/providers.ts +74 -0
  154. package/src/columns/types.ts +116 -0
  155. package/src/drivers/columns/columns_collection_driver.ts +146 -0
  156. package/src/drivers/columns/discover_columns_options.ts +91 -0
  157. package/src/drivers/columns/index.ts +2 -0
  158. package/src/drivers/index.ts +1 -0
  159. package/src/drivers/pframe/index.ts +0 -1
  160. package/src/drivers/pframe/query/query_common.ts +24 -0
  161. package/src/drivers/pframe/query/query_spec.ts +38 -25
  162. package/src/drivers/pframe/query/utils.test.ts +6 -6
  163. package/src/drivers/pframe/query/utils.ts +27 -7
  164. package/src/drivers/pframe/spec/discovered_column.ts +43 -28
  165. package/src/drivers/pframe/spec/filtered_column.ts +66 -0
  166. package/src/drivers/pframe/spec/ids.ts +142 -17
  167. package/src/drivers/pframe/spec/index.ts +1 -0
  168. package/src/drivers/pframe/spec/overridden.ts +285 -0
  169. package/src/drivers/pframe/spec/selectors.ts +3 -0
  170. package/src/drivers/pframe/spec/spec.ts +7 -3
  171. package/src/drivers/pframe/spec_driver.ts +3 -3
  172. package/src/drivers/pframe/table_calculate.ts +13 -3
  173. package/src/drivers/pframe/table_common.ts +10 -3
  174. package/src/index.ts +1 -0
  175. package/src/pool/spec.ts +69 -23
  176. package/src/services/service_declarations.ts +31 -0
  177. package/src/services/service_registry.ts +8 -4
  178. 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":";;;;;KAKY,iBAAA;EACV,MAAA,EAAQ,SAAA;EACR,IAAA,GAAO,QAAA;EACP,oBAAA,GAAuB,iBAAA;EACvB,qBAAA,GAAwB,MAAA,CAAO,SAAA,EAAW,iBAAA;AAAA;AAAA,KAGhC,mBAAA,GAAsB,OAAO,CAAC,SAAA;AAAA,KAErC,QAAA;EACH,IAAA;EACA,MAAA,EAAQ,SAAS;AAAA;AAAA,iBAGH,mBAAA,CAAoB,GAAA,YAAe,GAAA,IAAO,iBAAiB;AAAA,iBAW3D,wBAAA,CAAyB,KAAA,EAAO,iBAAA,GAAoB,iBAAiB;AAAA,iBAerE,yBAAA,CAA0B,KAAA;EACxC,MAAA,EAAQ,SAAA;EACR,IAAA,GAAO,QAAA;EACP,oBAAA,GAAuB,iBAAA;EACvB,qBAAA,GAAwB,MAAA,CAAO,SAAA,EAAW,iBAAA;AAAA,IACxC,mBAAA;AAAA,iBAIY,wBAAA,CAAyB,EAAA,EAAI,mBAAA,GAAsB,iBAAiB;AAAA,iBAapE,4BAAA,CAA6B,EAAA,EAAI,iBAAA,GAGhC,mBAAmB"}
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 isDiscoveredPColumn(obj) {
5
- return typeof obj === "object" && obj !== null && "path" in obj && "column" in obj && "columnQualifications" in obj && "queriesQualifications" in obj;
4
+ function isColumnDiscoveredKey(obj) {
5
+ return typeof obj === "object" && obj !== null && "__isDiscovered" in obj;
6
6
  }
7
- function distillDiscoveredPColumn(props) {
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 createDiscoveredPColumnId(props) {
16
- return stringifyDiscoveredPColumnId(props);
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 parseDiscoveredPColumnId(id) {
29
+ function parseColumnDiscoveredId(id) {
19
30
  try {
20
31
  const parsed = JSON.parse(id);
21
- return isDiscoveredPColumn(parsed) ? parsed : throwError("Parsed object is not a valid DiscoveredPColumn");
32
+ return isColumnDiscoveredKey(parsed) ? parsed : throwError("Parsed object is not a valid DiscoveredPColumn");
22
33
  } catch {
23
- throw new Error("Invalid DiscoveredPColumnId: not a valid JSON or does not conform to DiscoveredPColumn structure");
34
+ throw new Error("Invalid ColumnDiscoveredId: not a valid JSON or does not conform to DiscoveredPColumn structure");
24
35
  }
25
36
  }
26
- function stringifyDiscoveredPColumnId(id) {
27
- return canonicalizeJson(distillDiscoveredPColumn(id));
37
+ function stringifyColumnDiscoveredId(id) {
38
+ return canonicalizeJson(distillColumnDiscoveredKey({
39
+ __isDiscovered: true,
40
+ ...id
41
+ }));
28
42
  }
29
43
  //#endregion
30
- export { createDiscoveredPColumnId, distillDiscoveredPColumn, isDiscoveredPColumn, parseDiscoveredPColumnId, stringifyDiscoveredPColumnId };
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 { canonicalizeJson } from \"../../../json\";\n\nexport type DiscoveredPColumn = {\n column: PObjectId;\n path?: PathItem[];\n columnQualifications?: AxisQualification[];\n queriesQualifications?: Record<PObjectId, AxisQualification[]>;\n};\n\nexport type DiscoveredPColumnId = Branded<PObjectId, \"DiscoveredPColumnId\">; // CanonicalizedJson<DiscoveredPColumn>;\n\ntype PathItem = {\n type: \"linker\";\n column: PObjectId;\n};\n\nexport function isDiscoveredPColumn(obj: unknown): obj is DiscoveredPColumn {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"path\" in obj &&\n \"column\" in obj &&\n \"columnQualifications\" in obj &&\n \"queriesQualifications\" in obj\n );\n}\n\nexport function distillDiscoveredPColumn(props: DiscoveredPColumn): DiscoveredPColumn {\n return {\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 createDiscoveredPColumnId(props: {\n column: PObjectId;\n path?: PathItem[];\n columnQualifications?: AxisQualification[];\n queriesQualifications?: Record<PObjectId, AxisQualification[]>;\n}): DiscoveredPColumnId {\n return stringifyDiscoveredPColumnId(props);\n}\n\nexport function parseDiscoveredPColumnId(id: DiscoveredPColumnId): DiscoveredPColumn {\n try {\n const parsed = JSON.parse(id);\n return isDiscoveredPColumn(parsed)\n ? parsed\n : throwError(\"Parsed object is not a valid DiscoveredPColumn\");\n } catch {\n throw new Error(\n \"Invalid DiscoveredPColumnId: not a valid JSON or does not conform to DiscoveredPColumn structure\",\n );\n }\n}\n\nexport function stringifyDiscoveredPColumnId(id: DiscoveredPColumn) {\n return canonicalizeJson<DiscoveredPColumn>(\n distillDiscoveredPColumn(id),\n ) as string as DiscoveredPColumnId;\n}\n"],"mappings":";;;AAmBA,SAAgB,oBAAoB,KAAwC;CAC1E,OACE,OAAO,QAAQ,YACf,QAAQ,QACR,UAAU,OACV,YAAY,OACZ,0BAA0B,OAC1B,2BAA2B;AAE/B;AAEA,SAAgB,yBAAyB,OAA6C;CACpF,OAAO;EACL,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,0BAA0B,OAKlB;CACtB,OAAO,6BAA6B,KAAK;AAC3C;AAEA,SAAgB,yBAAyB,IAA4C;CACnF,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,EAAE;EAC5B,OAAO,oBAAoB,MAAM,IAC7B,SACA,WAAW,gDAAgD;CACjE,QAAQ;EACN,MAAM,IAAI,MACR,kGACF;CACF;AACF;AAEA,SAAgB,6BAA6B,IAAuB;CAClE,OAAO,iBACL,yBAAyB,EAAE,CAC7B;AACF"}
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":";;;;;;AAsCA,SAAgB,kBAAkB,IAAoC;CACpE,OAAO,OAAO,OAAO,YAAY,OAAO,QAAQ,YAAY,MAAM,iBAAiB;AACrF"}
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":";;;;KAGY,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;AAAA,KAGH,iBAAA,GAAoB,eAAA,CAAgB,iBAAA,EAAmB,eAAA;;;;;;iBAOnD,iBAAA,CAAkB,EAAA,YAAc,EAAA,IAAM,eAAe"}
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":";;;;;;AAsCA,SAAgB,kBAAkB,IAAoC;CACpE,OAAO,OAAO,OAAO,YAAY,OAAO,QAAQ,YAAY,MAAM,iBAAiB;AACrF"}
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 require_runtime = require("../../../_virtual/_rolldown/runtime.cjs");
2
- let canonicalize = require("canonicalize");
3
- canonicalize = require_runtime.__toESM(canonicalize, 1);
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 {@link UniversalPColumnId} to a string.
7
- * @param id - The column identifier to serialize
8
- * @returns The canonically serialized string
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 (0, canonicalize.default)(id);
16
+ return require_json.canonicalizeJson(id);
12
17
  }
13
18
  /**
14
- * Parses a canonically serialized {@link UniversalPColumnId} from a string.
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 { Branded } from \"../../../branding\";\nimport type { AnchoredPColumnId } from \"./selectors\";\nimport type { FilteredPColumnId } from \"./filtered_column\";\nimport canonicalize from \"canonicalize\";\nimport type { PObjectId } from \"../../../pool\";\nimport { DiscoveredPColumn } from \"./discovered_column\";\n\n/**\n * Universal column identifier optionally anchored and optionally filtered.\n */\nexport type UniversalPColumnId = AnchoredPColumnId | FilteredPColumnId | DiscoveredPColumn;\n\n/**\n * Canonically serialized {@link UniversalPColumnId}.\n */\nexport type SUniversalPColumnId = Branded<PObjectId, \"SUniversalPColumnId\", \"__pl_model_brand_2__\">;\n\n/**\n * Canonically serializes a {@link UniversalPColumnId} to a string.\n * @param id - The column identifier to serialize\n * @returns The canonically serialized string\n */\nexport function stringifyColumnId(id: UniversalPColumnId): SUniversalPColumnId {\n return canonicalize(id)! as SUniversalPColumnId;\n}\n\n/**\n * Parses a canonically serialized {@link UniversalPColumnId} from a string.\n * @param str - The string to parse\n * @returns The parsed column identifier\n */\nexport function parseColumnId(str: SUniversalPColumnId): UniversalPColumnId {\n return JSON.parse(str) as UniversalPColumnId;\n}\n"],"mappings":";;;;;;;;;AAsBA,SAAgB,kBAAkB,IAA6C;CAC7E,QAAA,GAAA,aAAA,QAAA,CAAoB,EAAE;AACxB;;;;;;AAOA,SAAgB,cAAc,KAA8C;CAC1E,OAAO,KAAK,MAAM,GAAG;AACvB"}
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 { Branded } from "../../../branding.js";
2
- import { FilteredPColumnId } from "./filtered_column.js";
3
- import { DiscoveredPColumn } from "./discovered_column.js";
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 | DiscoveredPColumn;
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
- type SUniversalPColumnId = Branded<PObjectId, "SUniversalPColumnId", "__pl_model_brand_2__">;
39
+ declare function parseColumnId(str: ColumnUniversalId): ColumnUniversalKey;
40
+ declare function parseColumnIdSafely(str: ColumnUniversalId, fallback?: undefined): ColumnUniversalKey | typeof fallback;
15
41
  /**
16
- * Canonically serializes a {@link UniversalPColumnId} to a string.
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 stringifyColumnId(id: UniversalPColumnId): SUniversalPColumnId;
44
+ declare function extractPObjectId(id: ColumnUniversalId | ColumnUniversalKey): PObjectId;
21
45
  /**
22
- * Parses a canonically serialized {@link UniversalPColumnId} from a string.
23
- * @param str - The string to parse
24
- * @returns The parsed column identifier
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 parseColumnId(str: SUniversalPColumnId): UniversalPColumnId;
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":";;;;;;;;;KAUY,kBAAA,GAAqB,iBAAA,GAAoB,iBAAA,GAAoB,iBAAA;;;;KAK7D,mBAAA,GAAsB,OAAO,CAAC,SAAA;;;;;;iBAO1B,iBAAA,CAAkB,EAAA,EAAI,kBAAA,GAAqB,mBAAmB;;AAZY;AAK1F;;;iBAgBgB,aAAA,CAAc,GAAA,EAAK,mBAAA,GAAsB,kBAAkB"}
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 canonicalize from "canonicalize";
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 {@link UniversalPColumnId} to a string.
5
- * @param id - The column identifier to serialize
6
- * @returns The canonically serialized string
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 canonicalize(id);
16
+ return canonicalizeJson(id);
10
17
  }
11
18
  /**
12
- * Parses a canonically serialized {@link UniversalPColumnId} from a string.
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 { Branded } from \"../../../branding\";\nimport type { AnchoredPColumnId } from \"./selectors\";\nimport type { FilteredPColumnId } from \"./filtered_column\";\nimport canonicalize from \"canonicalize\";\nimport type { PObjectId } from \"../../../pool\";\nimport { DiscoveredPColumn } from \"./discovered_column\";\n\n/**\n * Universal column identifier optionally anchored and optionally filtered.\n */\nexport type UniversalPColumnId = AnchoredPColumnId | FilteredPColumnId | DiscoveredPColumn;\n\n/**\n * Canonically serialized {@link UniversalPColumnId}.\n */\nexport type SUniversalPColumnId = Branded<PObjectId, \"SUniversalPColumnId\", \"__pl_model_brand_2__\">;\n\n/**\n * Canonically serializes a {@link UniversalPColumnId} to a string.\n * @param id - The column identifier to serialize\n * @returns The canonically serialized string\n */\nexport function stringifyColumnId(id: UniversalPColumnId): SUniversalPColumnId {\n return canonicalize(id)! as SUniversalPColumnId;\n}\n\n/**\n * Parses a canonically serialized {@link UniversalPColumnId} from a string.\n * @param str - The string to parse\n * @returns The parsed column identifier\n */\nexport function parseColumnId(str: SUniversalPColumnId): UniversalPColumnId {\n return JSON.parse(str) as UniversalPColumnId;\n}\n"],"mappings":";;;;;;;AAsBA,SAAgB,kBAAkB,IAA6C;CAC7E,OAAO,aAAa,EAAE;AACxB;;;;;;AAOA,SAAgB,cAAc,KAA8C;CAC1E,OAAO,KAAK,MAAM,GAAG;AACvB"}
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"}