@milaboratories/pl-model-common 1.31.1 → 1.32.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.
Files changed (279) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +7 -13
  2. package/dist/author_marker.d.ts.map +1 -0
  3. package/dist/base32_encode.cjs +1 -2
  4. package/dist/base32_encode.cjs.map +1 -1
  5. package/dist/base32_encode.js +1 -1
  6. package/dist/base32_encode.js.map +1 -1
  7. package/dist/base64.cjs +1 -2
  8. package/dist/base64.cjs.map +1 -1
  9. package/dist/base64.d.ts.map +1 -0
  10. package/dist/base64.js +1 -1
  11. package/dist/block_state.d.ts.map +1 -0
  12. package/dist/bmodel/block_config.cjs +1 -2
  13. package/dist/bmodel/block_config.cjs.map +1 -1
  14. package/dist/bmodel/block_config.d.ts +0 -1
  15. package/dist/bmodel/block_config.d.ts.map +1 -0
  16. package/dist/bmodel/block_config.js +1 -1
  17. package/dist/bmodel/block_config.js.map +1 -1
  18. package/dist/bmodel/code.cjs +2 -3
  19. package/dist/bmodel/code.cjs.map +1 -1
  20. package/dist/bmodel/code.d.ts +0 -1
  21. package/dist/bmodel/code.d.ts.map +1 -0
  22. package/dist/bmodel/code.js +1 -2
  23. package/dist/bmodel/code.js.map +1 -1
  24. package/dist/bmodel/container.d.ts.map +1 -0
  25. package/dist/bmodel/index.cjs +3 -3
  26. package/dist/bmodel/index.js +3 -3
  27. package/dist/bmodel/normalization.cjs +2 -4
  28. package/dist/bmodel/normalization.cjs.map +1 -1
  29. package/dist/bmodel/normalization.d.ts.map +1 -0
  30. package/dist/bmodel/normalization.js +2 -3
  31. package/dist/bmodel/normalization.js.map +1 -1
  32. package/dist/bmodel/types.d.ts.map +1 -0
  33. package/dist/branding.d.ts.map +1 -0
  34. package/dist/common_types.d.ts.map +1 -0
  35. package/dist/driver_kit.d.ts +0 -1
  36. package/dist/driver_kit.d.ts.map +1 -0
  37. package/dist/drivers/ChunkedStreamReader.cjs +1 -2
  38. package/dist/drivers/ChunkedStreamReader.cjs.map +1 -1
  39. package/dist/drivers/ChunkedStreamReader.d.ts.map +1 -0
  40. package/dist/drivers/ChunkedStreamReader.js +1 -1
  41. package/dist/drivers/ChunkedStreamReader.js.map +1 -1
  42. package/dist/drivers/blob.cjs +2 -3
  43. package/dist/drivers/blob.cjs.map +1 -1
  44. package/dist/drivers/blob.d.ts.map +1 -0
  45. package/dist/drivers/blob.js +1 -2
  46. package/dist/drivers/blob.js.map +1 -1
  47. package/dist/drivers/index.cjs +18 -18
  48. package/dist/drivers/index.d.ts +5 -6
  49. package/dist/drivers/index.js +17 -17
  50. package/dist/drivers/interfaces.d.ts.map +1 -0
  51. package/dist/drivers/log.cjs +11 -4
  52. package/dist/drivers/log.cjs.map +1 -1
  53. package/dist/drivers/log.d.ts +14 -7
  54. package/dist/drivers/log.d.ts.map +1 -0
  55. package/dist/drivers/log.js +11 -4
  56. package/dist/drivers/log.js.map +1 -1
  57. package/dist/drivers/ls.cjs +2 -3
  58. package/dist/drivers/ls.cjs.map +1 -1
  59. package/dist/drivers/ls.d.ts +0 -2
  60. package/dist/drivers/ls.d.ts.map +1 -0
  61. package/dist/drivers/ls.js +1 -2
  62. package/dist/drivers/ls.js.map +1 -1
  63. package/dist/drivers/pframe/column_filter.d.ts.map +1 -0
  64. package/dist/drivers/pframe/data_info.cjs +2 -3
  65. package/dist/drivers/pframe/data_info.cjs.map +1 -1
  66. package/dist/drivers/pframe/data_info.d.ts.map +1 -0
  67. package/dist/drivers/pframe/data_info.js +1 -2
  68. package/dist/drivers/pframe/data_info.js.map +1 -1
  69. package/dist/drivers/pframe/data_types.cjs +4 -5
  70. package/dist/drivers/pframe/data_types.cjs.map +1 -1
  71. package/dist/drivers/pframe/data_types.d.ts.map +1 -0
  72. package/dist/drivers/pframe/data_types.js +3 -4
  73. package/dist/drivers/pframe/data_types.js.map +1 -1
  74. package/dist/drivers/pframe/driver.cjs +1 -2
  75. package/dist/drivers/pframe/driver.cjs.map +1 -1
  76. package/dist/drivers/pframe/driver.d.ts +0 -1
  77. package/dist/drivers/pframe/driver.d.ts.map +1 -0
  78. package/dist/drivers/pframe/driver.js +1 -1
  79. package/dist/drivers/pframe/filter_spec.d.ts.map +1 -0
  80. package/dist/drivers/pframe/find_columns.d.ts.map +1 -0
  81. package/dist/drivers/pframe/index.cjs +15 -15
  82. package/dist/drivers/pframe/index.d.ts +4 -6
  83. package/dist/drivers/pframe/index.js +12 -12
  84. package/dist/drivers/pframe/linker_columns.cjs +3 -4
  85. package/dist/drivers/pframe/linker_columns.cjs.map +1 -1
  86. package/dist/drivers/pframe/linker_columns.d.ts.map +1 -0
  87. package/dist/drivers/pframe/linker_columns.js +1 -2
  88. package/dist/drivers/pframe/linker_columns.js.map +1 -1
  89. package/dist/drivers/pframe/pframe.d.ts +0 -2
  90. package/dist/drivers/pframe/pframe.d.ts.map +1 -0
  91. package/dist/drivers/pframe/query/index.cjs +1 -1
  92. package/dist/drivers/pframe/query/index.d.ts +2 -2
  93. package/dist/drivers/pframe/query/index.js +1 -1
  94. package/dist/drivers/pframe/query/query_common.d.ts +39 -4
  95. package/dist/drivers/pframe/query/query_common.d.ts.map +1 -0
  96. package/dist/drivers/pframe/query/query_data.d.ts +18 -5
  97. package/dist/drivers/pframe/query/query_data.d.ts.map +1 -0
  98. package/dist/drivers/pframe/query/query_spec.d.ts +14 -6
  99. package/dist/drivers/pframe/query/query_spec.d.ts.map +1 -0
  100. package/dist/drivers/pframe/query/utils.cjs +30 -4
  101. package/dist/drivers/pframe/query/utils.cjs.map +1 -1
  102. package/dist/drivers/pframe/query/utils.d.ts.map +1 -0
  103. package/dist/drivers/pframe/query/utils.js +28 -2
  104. package/dist/drivers/pframe/query/utils.js.map +1 -1
  105. package/dist/drivers/pframe/spec/anchored.cjs +4 -5
  106. package/dist/drivers/pframe/spec/anchored.cjs.map +1 -1
  107. package/dist/drivers/pframe/spec/anchored.d.ts +3 -3
  108. package/dist/drivers/pframe/spec/anchored.d.ts.map +1 -0
  109. package/dist/drivers/pframe/spec/anchored.js +1 -2
  110. package/dist/drivers/pframe/spec/anchored.js.map +1 -1
  111. package/dist/drivers/pframe/spec/filtered_column.cjs +1 -2
  112. package/dist/drivers/pframe/spec/filtered_column.cjs.map +1 -1
  113. package/dist/drivers/pframe/spec/filtered_column.d.ts.map +1 -0
  114. package/dist/drivers/pframe/spec/filtered_column.js +1 -1
  115. package/dist/drivers/pframe/spec/ids.cjs +2 -3
  116. package/dist/drivers/pframe/spec/ids.cjs.map +1 -1
  117. package/dist/drivers/pframe/spec/ids.d.ts +0 -2
  118. package/dist/drivers/pframe/spec/ids.d.ts.map +1 -0
  119. package/dist/drivers/pframe/spec/ids.js +1 -2
  120. package/dist/drivers/pframe/spec/ids.js.map +1 -1
  121. package/dist/drivers/pframe/spec/index.cjs +6 -6
  122. package/dist/drivers/pframe/spec/index.d.ts +1 -1
  123. package/dist/drivers/pframe/spec/index.js +6 -6
  124. package/dist/drivers/pframe/spec/native_id.cjs +4 -5
  125. package/dist/drivers/pframe/spec/native_id.cjs.map +1 -1
  126. package/dist/drivers/pframe/spec/native_id.d.ts +0 -2
  127. package/dist/drivers/pframe/spec/native_id.d.ts.map +1 -0
  128. package/dist/drivers/pframe/spec/native_id.js +1 -2
  129. package/dist/drivers/pframe/spec/native_id.js.map +1 -1
  130. package/dist/drivers/pframe/spec/selectors.cjs +3 -4
  131. package/dist/drivers/pframe/spec/selectors.cjs.map +1 -1
  132. package/dist/drivers/pframe/spec/selectors.d.ts +0 -2
  133. package/dist/drivers/pframe/spec/selectors.d.ts.map +1 -0
  134. package/dist/drivers/pframe/spec/selectors.js +1 -2
  135. package/dist/drivers/pframe/spec/selectors.js.map +1 -1
  136. package/dist/drivers/pframe/spec/spec.cjs +12 -8
  137. package/dist/drivers/pframe/spec/spec.cjs.map +1 -1
  138. package/dist/drivers/pframe/spec/spec.d.ts +15 -3
  139. package/dist/drivers/pframe/spec/spec.d.ts.map +1 -0
  140. package/dist/drivers/pframe/spec/spec.js +9 -5
  141. package/dist/drivers/pframe/spec/spec.js.map +1 -1
  142. package/dist/drivers/pframe/spec_driver.d.ts +37 -4
  143. package/dist/drivers/pframe/spec_driver.d.ts.map +1 -0
  144. package/dist/drivers/pframe/table.d.ts.map +1 -0
  145. package/dist/drivers/pframe/table_calculate.cjs +6 -7
  146. package/dist/drivers/pframe/table_calculate.cjs.map +1 -1
  147. package/dist/drivers/pframe/table_calculate.d.ts +0 -2
  148. package/dist/drivers/pframe/table_calculate.d.ts.map +1 -0
  149. package/dist/drivers/pframe/table_calculate.js +1 -2
  150. package/dist/drivers/pframe/table_calculate.js.map +1 -1
  151. package/dist/drivers/pframe/table_common.cjs +1 -2
  152. package/dist/drivers/pframe/table_common.cjs.map +1 -1
  153. package/dist/drivers/pframe/table_common.d.ts +0 -2
  154. package/dist/drivers/pframe/table_common.d.ts.map +1 -0
  155. package/dist/drivers/pframe/table_common.js +1 -1
  156. package/dist/drivers/pframe/unique_values.d.ts +0 -2
  157. package/dist/drivers/pframe/unique_values.d.ts.map +1 -0
  158. package/dist/drivers/upload.d.ts.map +1 -0
  159. package/dist/drivers/urls.cjs +1 -2
  160. package/dist/drivers/urls.cjs.map +1 -1
  161. package/dist/drivers/urls.d.ts.map +1 -0
  162. package/dist/drivers/urls.js +1 -1
  163. package/dist/errors.cjs +1 -2
  164. package/dist/errors.cjs.map +1 -1
  165. package/dist/errors.d.ts.map +1 -0
  166. package/dist/errors.js +1 -1
  167. package/dist/errors.js.map +1 -1
  168. package/dist/flags/block_flags.cjs +1 -2
  169. package/dist/flags/block_flags.cjs.map +1 -1
  170. package/dist/flags/block_flags.d.ts +0 -2
  171. package/dist/flags/block_flags.d.ts.map +1 -0
  172. package/dist/flags/block_flags.js +1 -1
  173. package/dist/flags/flag_utils.cjs +1 -2
  174. package/dist/flags/flag_utils.cjs.map +1 -1
  175. package/dist/flags/flag_utils.d.ts.map +1 -0
  176. package/dist/flags/flag_utils.js +1 -1
  177. package/dist/flags/flag_utils.js.map +1 -1
  178. package/dist/flags/type_utils.d.ts.map +1 -0
  179. package/dist/httpAuth.cjs +1 -2
  180. package/dist/httpAuth.cjs.map +1 -1
  181. package/dist/httpAuth.d.ts.map +1 -0
  182. package/dist/httpAuth.js +1 -1
  183. package/dist/index.cjs +47 -47
  184. package/dist/index.d.ts +6 -11
  185. package/dist/index.js +2 -3
  186. package/dist/json.cjs +2 -3
  187. package/dist/json.cjs.map +1 -1
  188. package/dist/json.d.ts.map +1 -0
  189. package/dist/json.js +1 -2
  190. package/dist/json.js.map +1 -1
  191. package/dist/navigation.cjs +1 -2
  192. package/dist/navigation.cjs.map +1 -1
  193. package/dist/navigation.d.ts.map +1 -0
  194. package/dist/navigation.js +1 -1
  195. package/dist/plid.cjs +6 -7
  196. package/dist/plid.cjs.map +1 -1
  197. package/dist/plid.d.ts.map +1 -0
  198. package/dist/plid.js +4 -5
  199. package/dist/plid.js.map +1 -1
  200. package/dist/pool/entry.d.ts.map +1 -0
  201. package/dist/pool/query.cjs +2 -3
  202. package/dist/pool/query.cjs.map +1 -1
  203. package/dist/pool/query.d.ts +0 -1
  204. package/dist/pool/query.d.ts.map +1 -0
  205. package/dist/pool/query.js +1 -2
  206. package/dist/pool/query.js.map +1 -1
  207. package/dist/pool/spec.cjs +2 -3
  208. package/dist/pool/spec.cjs.map +1 -1
  209. package/dist/pool/spec.d.ts +0 -2
  210. package/dist/pool/spec.d.ts.map +1 -0
  211. package/dist/pool/spec.js +1 -2
  212. package/dist/pool/spec.js.map +1 -1
  213. package/dist/pool_entry.cjs +1 -2
  214. package/dist/pool_entry.cjs.map +1 -1
  215. package/dist/pool_entry.d.ts.map +1 -0
  216. package/dist/pool_entry.js +1 -1
  217. package/dist/pool_entry.js.map +1 -1
  218. package/dist/ref.cjs +2 -3
  219. package/dist/ref.cjs.map +1 -1
  220. package/dist/ref.d.ts.map +1 -0
  221. package/dist/ref.js +1 -2
  222. package/dist/ref.js.map +1 -1
  223. package/dist/resource_types.cjs +1 -2
  224. package/dist/resource_types.cjs.map +1 -1
  225. package/dist/resource_types.d.ts.map +1 -0
  226. package/dist/resource_types.js +1 -1
  227. package/dist/services/index.cjs +6 -6
  228. package/dist/services/index.js +6 -6
  229. package/dist/services/service_capabilities.cjs +2 -3
  230. package/dist/services/service_capabilities.cjs.map +1 -1
  231. package/dist/services/service_capabilities.d.ts.map +1 -0
  232. package/dist/services/service_capabilities.js +1 -2
  233. package/dist/services/service_capabilities.js.map +1 -1
  234. package/dist/services/service_declarations.cjs +2 -3
  235. package/dist/services/service_declarations.cjs.map +1 -1
  236. package/dist/services/service_declarations.d.ts +0 -2
  237. package/dist/services/service_declarations.d.ts.map +1 -0
  238. package/dist/services/service_declarations.js +1 -2
  239. package/dist/services/service_declarations.js.map +1 -1
  240. package/dist/services/service_injector_factory.cjs +1 -2
  241. package/dist/services/service_injector_factory.cjs.map +1 -1
  242. package/dist/services/service_injector_factory.d.ts.map +1 -0
  243. package/dist/services/service_injector_factory.js +1 -1
  244. package/dist/services/service_injectors.cjs +4 -5
  245. package/dist/services/service_injectors.cjs.map +1 -1
  246. package/dist/services/service_injectors.d.ts.map +1 -0
  247. package/dist/services/service_injectors.js +1 -2
  248. package/dist/services/service_injectors.js.map +1 -1
  249. package/dist/services/service_registry.cjs +2 -3
  250. package/dist/services/service_registry.cjs.map +1 -1
  251. package/dist/services/service_registry.d.ts.map +1 -0
  252. package/dist/services/service_registry.js +1 -2
  253. package/dist/services/service_registry.js.map +1 -1
  254. package/dist/services/service_types.cjs +2 -3
  255. package/dist/services/service_types.cjs.map +1 -1
  256. package/dist/services/service_types.d.ts +7 -7
  257. package/dist/services/service_types.d.ts.map +1 -0
  258. package/dist/services/service_types.js +1 -2
  259. package/dist/services/service_types.js.map +1 -1
  260. package/dist/utag.d.ts.map +1 -0
  261. package/dist/util.cjs +1 -2
  262. package/dist/util.cjs.map +1 -1
  263. package/dist/util.d.ts.map +1 -0
  264. package/dist/util.js +1 -1
  265. package/dist/value_or_error.cjs +1 -2
  266. package/dist/value_or_error.cjs.map +1 -1
  267. package/dist/value_or_error.d.ts.map +1 -0
  268. package/dist/value_or_error.js +1 -1
  269. package/package.json +9 -9
  270. package/src/drivers/log.ts +21 -7
  271. package/src/drivers/pframe/query/query_common.ts +39 -0
  272. package/src/drivers/pframe/query/query_data.ts +20 -0
  273. package/src/drivers/pframe/query/query_spec.ts +17 -0
  274. package/src/drivers/pframe/query/utils.test.ts +37 -0
  275. package/src/drivers/pframe/query/utils.ts +25 -0
  276. package/src/drivers/pframe/spec/anchored.ts +8 -3
  277. package/src/drivers/pframe/spec/spec.ts +19 -6
  278. package/src/drivers/pframe/spec_driver.ts +42 -1
  279. package/src/services/service_types.ts +1 -6
@@ -1 +1 @@
1
- {"version":3,"file":"linker_columns.js","names":[],"sources":["../../../src/drivers/pframe/linker_columns.ts"],"sourcesContent":["import { canonicalizeJson, parseJson, type CanonicalizedJson } from \"../../json\";\nimport {\n Annotation,\n readAnnotationJson,\n type AxisSpec,\n type PColumnIdAndSpec,\n type AxisSpecNormalized,\n type AxisId,\n getAxisId,\n getNormalizedAxesList,\n getArrayFromAxisTree,\n getAxesTree,\n} from \"./spec/spec\";\n\ntype LinkerKey = CanonicalizedJson<AxisId[]>;\nexport type CompositeLinkerMap = Map<\n LinkerKey,\n {\n keyAxesSpec: AxisSpecNormalized[]; // axis specs - source for the key\n linkWith: Map<LinkerKey, PColumnIdAndSpec>; // for every axis (possibly in group with parents - available by linkers another axes and corresponding linkers)\n }\n>;\n\ninterface LinkersData {\n data: CompositeLinkerMap;\n}\nexport class LinkerMap implements LinkersData {\n /** Graph of linkers connected by axes (single or grouped by parents) */\n readonly data: CompositeLinkerMap;\n\n constructor(linkerMap: CompositeLinkerMap) {\n this.data = linkerMap;\n }\n\n get keys() {\n return this.data.keys();\n }\n\n get keyAxesIds() {\n return [...this.data.keys()].map(parseJson);\n }\n\n static fromColumns(columns: PColumnIdAndSpec[]) {\n const result: CompositeLinkerMap = new Map();\n for (const linker of columns.filter(\n (l) => !!readAnnotationJson(l.spec, Annotation.IsLinkerColumn),\n )) {\n const groups = LinkerMap.getAxesGroups(getNormalizedAxesList(linker.spec.axesSpec)); // split input axes into groups by parent links from annotation\n\n if (groups.length !== 2) {\n continue; // not a valid linker column\n }\n const [left, right] = groups;\n\n // In case of group:\n // A - C\n // \\_ B _ D\n // E/\n // put 2 variants as keys:\n // A - C\n // \\_ B _ D\n // and\n // E - B - D\n const leftKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(left).map(\n (axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n },\n );\n const rightKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(\n right,\n ).map((axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n });\n\n for (const [keyLeft, spec] of leftKeyVariants) {\n if (!result.has(keyLeft)) {\n result.set(keyLeft, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyRight, spec] of rightKeyVariants) {\n if (!result.has(keyRight)) {\n result.set(keyRight, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyLeft] of leftKeyVariants) {\n for (const [keyRight] of rightKeyVariants) {\n result.get(keyLeft)?.linkWith.set(keyRight, linker);\n }\n }\n }\n return new this(result);\n }\n\n /** Get all available nodes of linker graphs if start from sourceAxesKeys */\n searchAvailableAxesKeys(sourceAxesKeys: LinkerKey[]): Set<LinkerKey> {\n const startKeys = new Set(sourceAxesKeys);\n const allAvailableKeys = new Set<LinkerKey>();\n let nextKeys = sourceAxesKeys;\n while (nextKeys.length) {\n const next: LinkerKey[] = [];\n for (const key of nextKeys) {\n const node = this.data.get(key);\n if (!node) continue;\n for (const availableKey of node.linkWith.keys()) {\n if (!allAvailableKeys.has(availableKey) && !startKeys.has(availableKey)) {\n next.push(availableKey);\n allAvailableKeys.add(availableKey);\n }\n }\n }\n nextKeys = next;\n }\n return allAvailableKeys;\n }\n\n /** Get all linker columns that are necessary to reach endKey from startKey */\n searchLinkerPath(startKey: LinkerKey, endKey: LinkerKey): PColumnIdAndSpec[] {\n const previous: Record<LinkerKey, LinkerKey> = {};\n let nextIds = new Set([startKey]);\n const visited = new Set([startKey]);\n while (nextIds.size) {\n const next = new Set<LinkerKey>();\n for (const nextId of nextIds) {\n const node = this.data.get(nextId);\n if (!node) continue;\n for (const availableId of node.linkWith.keys()) {\n previous[availableId] = nextId;\n if (availableId === endKey) {\n const ids: LinkerKey[] = [];\n let current = endKey;\n while (previous[current] !== startKey) {\n ids.push(current);\n current = previous[current];\n }\n ids.push(current);\n // Edge (previous[id] -> id) is stored at the \"from\" node in one-directional map\n return ids.map((id: LinkerKey) => this.data.get(previous[id])!.linkWith.get(id)!);\n } else if (!visited.has(availableId)) {\n next.add(availableId);\n visited.add(availableId);\n }\n }\n }\n nextIds = next;\n }\n return [];\n }\n\n getLinkerColumnsForAxes({\n from: sourceAxes,\n to: targetAxes,\n throwWhenNoLinkExists = true,\n }: {\n from: AxisSpecNormalized[];\n to: AxisSpecNormalized[];\n throwWhenNoLinkExists?: boolean;\n }): PColumnIdAndSpec[] {\n // start keys - all possible keys in linker map using sourceAxes (for example, all axes of block's columns or all axes of columns in data-inputs)\n const startKeys: LinkerKey[] = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n return Array.from(\n new Map(\n LinkerMap.getAxesRoots(targetAxes)\n .map(LinkerMap.getLinkerKeyFromAxisSpec) // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n .flatMap((targetKey) => {\n const linkers = startKeys\n .map((startKey) => this.searchLinkerPath(startKey, targetKey))\n .reduce(\n (shortestPath, path) =>\n (shortestPath.length && shortestPath.length < path.length) || !path.length\n ? shortestPath\n : path,\n [] as PColumnIdAndSpec[],\n )\n .map((linker) => [linker.columnId, linker] as const);\n if (!linkers.length && throwWhenNoLinkExists) {\n throw Error(`Unable to find linker column for ${targetKey}`);\n }\n return linkers;\n }),\n ).values(),\n );\n }\n\n /** Get list of axisSpecs from keys of linker columns map */\n getAxesListFromKeysList(keys: LinkerKey[]): AxisSpecNormalized[] {\n return Array.from(\n new Map(\n keys\n .flatMap((key) => this.data.get(key)?.keyAxesSpec ?? [])\n .map((axis) => [canonicalizeJson(getAxisId(axis)), axis]),\n ).values(),\n );\n }\n\n /** Get axes of target axes that are impossible to be linked to source axes with current linker map */\n getNonLinkableAxes(\n sourceAxes: AxisSpecNormalized[],\n targetAxes: AxisSpecNormalized[],\n ): AxisSpecNormalized[] {\n const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n const targetKeys = targetAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n const axes = Array.from(\n new Map(\n targetAxes\n .filter((_targetAxis, idx) => {\n const targetKey = targetKeys[idx];\n return !startKeys.some((startKey) => this.searchLinkerPath(startKey, targetKey).length);\n })\n .flatMap((axis) =>\n getArrayFromAxisTree(getAxesTree(axis)).map((axis) => [\n canonicalizeJson(getAxisId(axis)),\n axis,\n ]),\n ),\n ).values(),\n );\n return axes;\n }\n\n /** Get all axes that can be connected to sourceAxes by linkers */\n getReachableByLinkersAxesFromAxesNormalized(\n sourceAxes: AxisSpecNormalized[],\n matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean,\n ): AxisSpecNormalized[] {\n let startKeys: CanonicalizedJson<AxisId[]>[] = [];\n\n if (matchAxisIdFn) {\n const sourceAxisIdsGrouped: AxisId[][] = sourceAxes.map((axis) =>\n getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId),\n );\n for (const sourceAxisIdsGroup of sourceAxisIdsGrouped) {\n const matched = this.keyAxesIds.find((keyIds: AxisId[]) =>\n keyIds.every((linkerKeyAxisId) =>\n sourceAxisIdsGroup.find((sourceAxisId) => matchAxisIdFn(linkerKeyAxisId, sourceAxisId)),\n ),\n );\n if (matched) {\n startKeys.push(canonicalizeJson(matched));\n }\n }\n } else {\n startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n }\n\n const availableKeys = this.searchAvailableAxesKeys(startKeys);\n return this.getAxesListFromKeysList([...availableKeys]);\n }\n\n getReachableByLinkersAxesFromAxes(\n sourceAxes: AxisSpec[],\n matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean,\n ): AxisSpecNormalized[] {\n return this.getReachableByLinkersAxesFromAxesNormalized(\n getNormalizedAxesList(sourceAxes),\n matchAxisIdFn,\n );\n }\n\n static getLinkerKeyFromAxisSpec(axis: AxisSpecNormalized): LinkerKey {\n return canonicalizeJson(getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));\n }\n\n /** Split array of axes into several arrays by parents: axes of one group are parents for each other.\n There are no order inside every group. */\n static getAxesGroups(axesSpec: AxisSpecNormalized[]): AxisSpecNormalized[][] {\n switch (axesSpec.length) {\n case 0:\n return [];\n case 1:\n return [[axesSpec[0]]];\n default:\n break;\n }\n\n const axisKeys = axesSpec.map((spec) => canonicalizeJson(getAxisId(spec)));\n const axisParentsIdxs = axesSpec.map(\n (spec) =>\n new Set(\n spec.parentAxesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)))\n .map((el) => {\n const idx = axisKeys.indexOf(el);\n if (idx === -1) {\n throw new Error(\n `malformed axesSpec: ${JSON.stringify(axesSpec)}, unable to locate parent ${el}`,\n );\n }\n return idx;\n }),\n ),\n );\n\n const allIdxs = [...axesSpec.keys()];\n const groups: number[][] = []; // groups of axis indexes\n\n const usedIdxs = new Set<number>();\n let nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n while (nextFreeEl !== undefined) {\n const currentGroup = [nextFreeEl];\n usedIdxs.add(nextFreeEl);\n\n let nextElsOfCurrentGroup = [nextFreeEl];\n while (nextElsOfCurrentGroup.length) {\n const next = new Set<number>();\n for (const groupIdx of nextElsOfCurrentGroup) {\n const groupElementParents = axisParentsIdxs[groupIdx];\n allIdxs.forEach((idx) => {\n if (idx === groupIdx || usedIdxs.has(idx)) {\n return;\n }\n const parents = axisParentsIdxs[idx];\n if (parents.has(groupIdx) || groupElementParents.has(idx)) {\n currentGroup.push(idx);\n next.add(idx);\n usedIdxs.add(idx);\n }\n });\n }\n nextElsOfCurrentGroup = [...next];\n }\n\n groups.push([...currentGroup]);\n nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n }\n\n return groups.map((group) => group.map((idx) => axesSpec[idx]));\n }\n\n /** Get all axes that are not parents of any other axis */\n static getAxesRoots(axes: AxisSpecNormalized[]): AxisSpecNormalized[] {\n const parentsSet = new Set(\n axes.flatMap((axis) => axis.parentAxesSpec).map((spec) => canonicalizeJson(getAxisId(spec))),\n );\n return axes.filter((axis) => !parentsSet.has(canonicalizeJson(getAxisId(axis))));\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"linker_columns.js","names":[],"sources":["../../../src/drivers/pframe/linker_columns.ts"],"sourcesContent":["import { canonicalizeJson, parseJson, type CanonicalizedJson } from \"../../json\";\nimport {\n Annotation,\n readAnnotationJson,\n type AxisSpec,\n type PColumnIdAndSpec,\n type AxisSpecNormalized,\n type AxisId,\n getAxisId,\n getNormalizedAxesList,\n getArrayFromAxisTree,\n getAxesTree,\n} from \"./spec/spec\";\n\ntype LinkerKey = CanonicalizedJson<AxisId[]>;\nexport type CompositeLinkerMap = Map<\n LinkerKey,\n {\n keyAxesSpec: AxisSpecNormalized[]; // axis specs - source for the key\n linkWith: Map<LinkerKey, PColumnIdAndSpec>; // for every axis (possibly in group with parents - available by linkers another axes and corresponding linkers)\n }\n>;\n\ninterface LinkersData {\n data: CompositeLinkerMap;\n}\nexport class LinkerMap implements LinkersData {\n /** Graph of linkers connected by axes (single or grouped by parents) */\n readonly data: CompositeLinkerMap;\n\n constructor(linkerMap: CompositeLinkerMap) {\n this.data = linkerMap;\n }\n\n get keys() {\n return this.data.keys();\n }\n\n get keyAxesIds() {\n return [...this.data.keys()].map(parseJson);\n }\n\n static fromColumns(columns: PColumnIdAndSpec[]) {\n const result: CompositeLinkerMap = new Map();\n for (const linker of columns.filter(\n (l) => !!readAnnotationJson(l.spec, Annotation.IsLinkerColumn),\n )) {\n const groups = LinkerMap.getAxesGroups(getNormalizedAxesList(linker.spec.axesSpec)); // split input axes into groups by parent links from annotation\n\n if (groups.length !== 2) {\n continue; // not a valid linker column\n }\n const [left, right] = groups;\n\n // In case of group:\n // A - C\n // \\_ B _ D\n // E/\n // put 2 variants as keys:\n // A - C\n // \\_ B _ D\n // and\n // E - B - D\n const leftKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(left).map(\n (axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n },\n );\n const rightKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(\n right,\n ).map((axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n });\n\n for (const [keyLeft, spec] of leftKeyVariants) {\n if (!result.has(keyLeft)) {\n result.set(keyLeft, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyRight, spec] of rightKeyVariants) {\n if (!result.has(keyRight)) {\n result.set(keyRight, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyLeft] of leftKeyVariants) {\n for (const [keyRight] of rightKeyVariants) {\n result.get(keyLeft)?.linkWith.set(keyRight, linker);\n }\n }\n }\n return new this(result);\n }\n\n /** Get all available nodes of linker graphs if start from sourceAxesKeys */\n searchAvailableAxesKeys(sourceAxesKeys: LinkerKey[]): Set<LinkerKey> {\n const startKeys = new Set(sourceAxesKeys);\n const allAvailableKeys = new Set<LinkerKey>();\n let nextKeys = sourceAxesKeys;\n while (nextKeys.length) {\n const next: LinkerKey[] = [];\n for (const key of nextKeys) {\n const node = this.data.get(key);\n if (!node) continue;\n for (const availableKey of node.linkWith.keys()) {\n if (!allAvailableKeys.has(availableKey) && !startKeys.has(availableKey)) {\n next.push(availableKey);\n allAvailableKeys.add(availableKey);\n }\n }\n }\n nextKeys = next;\n }\n return allAvailableKeys;\n }\n\n /** Get all linker columns that are necessary to reach endKey from startKey */\n searchLinkerPath(startKey: LinkerKey, endKey: LinkerKey): PColumnIdAndSpec[] {\n const previous: Record<LinkerKey, LinkerKey> = {};\n let nextIds = new Set([startKey]);\n const visited = new Set([startKey]);\n while (nextIds.size) {\n const next = new Set<LinkerKey>();\n for (const nextId of nextIds) {\n const node = this.data.get(nextId);\n if (!node) continue;\n for (const availableId of node.linkWith.keys()) {\n previous[availableId] = nextId;\n if (availableId === endKey) {\n const ids: LinkerKey[] = [];\n let current = endKey;\n while (previous[current] !== startKey) {\n ids.push(current);\n current = previous[current];\n }\n ids.push(current);\n // Edge (previous[id] -> id) is stored at the \"from\" node in one-directional map\n return ids.map((id: LinkerKey) => this.data.get(previous[id])!.linkWith.get(id)!);\n } else if (!visited.has(availableId)) {\n next.add(availableId);\n visited.add(availableId);\n }\n }\n }\n nextIds = next;\n }\n return [];\n }\n\n getLinkerColumnsForAxes({\n from: sourceAxes,\n to: targetAxes,\n throwWhenNoLinkExists = true,\n }: {\n from: AxisSpecNormalized[];\n to: AxisSpecNormalized[];\n throwWhenNoLinkExists?: boolean;\n }): PColumnIdAndSpec[] {\n // start keys - all possible keys in linker map using sourceAxes (for example, all axes of block's columns or all axes of columns in data-inputs)\n const startKeys: LinkerKey[] = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n return Array.from(\n new Map(\n LinkerMap.getAxesRoots(targetAxes)\n .map(LinkerMap.getLinkerKeyFromAxisSpec) // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n .flatMap((targetKey) => {\n const linkers = startKeys\n .map((startKey) => this.searchLinkerPath(startKey, targetKey))\n .reduce(\n (shortestPath, path) =>\n (shortestPath.length && shortestPath.length < path.length) || !path.length\n ? shortestPath\n : path,\n [] as PColumnIdAndSpec[],\n )\n .map((linker) => [linker.columnId, linker] as const);\n if (!linkers.length && throwWhenNoLinkExists) {\n throw Error(`Unable to find linker column for ${targetKey}`);\n }\n return linkers;\n }),\n ).values(),\n );\n }\n\n /** Get list of axisSpecs from keys of linker columns map */\n getAxesListFromKeysList(keys: LinkerKey[]): AxisSpecNormalized[] {\n return Array.from(\n new Map(\n keys\n .flatMap((key) => this.data.get(key)?.keyAxesSpec ?? [])\n .map((axis) => [canonicalizeJson(getAxisId(axis)), axis]),\n ).values(),\n );\n }\n\n /** Get axes of target axes that are impossible to be linked to source axes with current linker map */\n getNonLinkableAxes(\n sourceAxes: AxisSpecNormalized[],\n targetAxes: AxisSpecNormalized[],\n ): AxisSpecNormalized[] {\n const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n const targetKeys = targetAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n const axes = Array.from(\n new Map(\n targetAxes\n .filter((_targetAxis, idx) => {\n const targetKey = targetKeys[idx];\n return !startKeys.some((startKey) => this.searchLinkerPath(startKey, targetKey).length);\n })\n .flatMap((axis) =>\n getArrayFromAxisTree(getAxesTree(axis)).map((axis) => [\n canonicalizeJson(getAxisId(axis)),\n axis,\n ]),\n ),\n ).values(),\n );\n return axes;\n }\n\n /** Get all axes that can be connected to sourceAxes by linkers */\n getReachableByLinkersAxesFromAxesNormalized(\n sourceAxes: AxisSpecNormalized[],\n matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean,\n ): AxisSpecNormalized[] {\n let startKeys: CanonicalizedJson<AxisId[]>[] = [];\n\n if (matchAxisIdFn) {\n const sourceAxisIdsGrouped: AxisId[][] = sourceAxes.map((axis) =>\n getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId),\n );\n for (const sourceAxisIdsGroup of sourceAxisIdsGrouped) {\n const matched = this.keyAxesIds.find((keyIds: AxisId[]) =>\n keyIds.every((linkerKeyAxisId) =>\n sourceAxisIdsGroup.find((sourceAxisId) => matchAxisIdFn(linkerKeyAxisId, sourceAxisId)),\n ),\n );\n if (matched) {\n startKeys.push(canonicalizeJson(matched));\n }\n }\n } else {\n startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n }\n\n const availableKeys = this.searchAvailableAxesKeys(startKeys);\n return this.getAxesListFromKeysList([...availableKeys]);\n }\n\n getReachableByLinkersAxesFromAxes(\n sourceAxes: AxisSpec[],\n matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean,\n ): AxisSpecNormalized[] {\n return this.getReachableByLinkersAxesFromAxesNormalized(\n getNormalizedAxesList(sourceAxes),\n matchAxisIdFn,\n );\n }\n\n static getLinkerKeyFromAxisSpec(axis: AxisSpecNormalized): LinkerKey {\n return canonicalizeJson(getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));\n }\n\n /** Split array of axes into several arrays by parents: axes of one group are parents for each other.\n There are no order inside every group. */\n static getAxesGroups(axesSpec: AxisSpecNormalized[]): AxisSpecNormalized[][] {\n switch (axesSpec.length) {\n case 0:\n return [];\n case 1:\n return [[axesSpec[0]]];\n default:\n break;\n }\n\n const axisKeys = axesSpec.map((spec) => canonicalizeJson(getAxisId(spec)));\n const axisParentsIdxs = axesSpec.map(\n (spec) =>\n new Set(\n spec.parentAxesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)))\n .map((el) => {\n const idx = axisKeys.indexOf(el);\n if (idx === -1) {\n throw new Error(\n `malformed axesSpec: ${JSON.stringify(axesSpec)}, unable to locate parent ${el}`,\n );\n }\n return idx;\n }),\n ),\n );\n\n const allIdxs = [...axesSpec.keys()];\n const groups: number[][] = []; // groups of axis indexes\n\n const usedIdxs = new Set<number>();\n let nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n while (nextFreeEl !== undefined) {\n const currentGroup = [nextFreeEl];\n usedIdxs.add(nextFreeEl);\n\n let nextElsOfCurrentGroup = [nextFreeEl];\n while (nextElsOfCurrentGroup.length) {\n const next = new Set<number>();\n for (const groupIdx of nextElsOfCurrentGroup) {\n const groupElementParents = axisParentsIdxs[groupIdx];\n allIdxs.forEach((idx) => {\n if (idx === groupIdx || usedIdxs.has(idx)) {\n return;\n }\n const parents = axisParentsIdxs[idx];\n if (parents.has(groupIdx) || groupElementParents.has(idx)) {\n currentGroup.push(idx);\n next.add(idx);\n usedIdxs.add(idx);\n }\n });\n }\n nextElsOfCurrentGroup = [...next];\n }\n\n groups.push([...currentGroup]);\n nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n }\n\n return groups.map((group) => group.map((idx) => axesSpec[idx]));\n }\n\n /** Get all axes that are not parents of any other axis */\n static getAxesRoots(axes: AxisSpecNormalized[]): AxisSpecNormalized[] {\n const parentsSet = new Set(\n axes.flatMap((axis) => axis.parentAxesSpec).map((spec) => canonicalizeJson(getAxisId(spec))),\n );\n return axes.filter((axis) => !parentsSet.has(canonicalizeJson(getAxisId(axis))));\n }\n}\n"],"mappings":"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"}
@@ -4,8 +4,6 @@ import { FindColumnsRequest, FindColumnsResponse } from "./find_columns.js";
4
4
  import { CalculateTableDataRequest, CalculateTableDataResponse } from "./table_calculate.js";
5
5
  import { UniqueValuesRequest, UniqueValuesResponse } from "./unique_values.js";
6
6
  import { PObjectId } from "../../pool/spec.js";
7
- import "../../pool/index.js";
8
-
9
7
  //#region src/drivers/pframe/pframe.d.ts
10
8
  /** Read interface exposed by PFrames library */
11
9
  interface PFrame {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pframe.d.ts","names":[],"sources":["../../../src/drivers/pframe/pframe.ts"],"mappings":";;;;;;;;UAQiB,MAAA;;AAAjB;;;EAKE,WAAA,CAAY,OAAA,EAAS,kBAAA,GAAqB,OAAA,CAAQ,mBAAA;EAAA;EAGlD,aAAA,CAAc,QAAA,EAAU,SAAA,GAAY,OAAA,CAAQ,WAAA;EAApB;EAGxB,WAAA,IAAe,OAAA,CAAQ,gBAAA;EAHa;EAMpC,kBAAA,CACE,OAAA,EAAS,yBAAA,CAA0B,SAAA,GACnC,KAAA,GAAQ,UAAA,GACP,OAAA,CAAQ,0BAAA;EANI;EASf,eAAA,CAAgB,OAAA,EAAS,mBAAA,GAAsB,OAAA,CAAQ,oBAAA;AAAA;;KAI7C,SAAA,QAAiB,GAAA"}
@@ -1 +1 @@
1
- const require_utils = require('./utils.cjs');
1
+ require("./utils.cjs");
@@ -1,3 +1,3 @@
1
- import { SpecExprAxisRef, SpecExprColumnRef, SpecQuery, SpecQueryBooleanExpression, SpecQueryColumn, SpecQueryExpression, SpecQueryFilter, SpecQueryInlineColumn, SpecQueryJoinEntry, SpecQueryOuterJoin, SpecQuerySliceAxes, SpecQuerySort, SpecQuerySparseToDenseColumn, SpecQuerySymmetricJoin } from "./query_spec.js";
2
- import { DataExprAxisRef, DataExprColumnRef, DataQuery, DataQueryBooleanExpression, DataQueryColumn, DataQueryExpression, DataQueryFilter, DataQueryInlineColumn, DataQueryJoinEntry, DataQueryOuterJoin, DataQuerySliceAxes, DataQuerySort, DataQuerySparseToDenseColumn, DataQuerySymmetricJoin } from "./query_data.js";
1
+ import { SpecExprAxisRef, SpecExprColumnRef, SpecQuery, SpecQueryBooleanExpression, SpecQueryColumn, SpecQueryExpression, SpecQueryFilter, SpecQueryInlineColumn, SpecQueryJoinEntry, SpecQueryLinkerJoin, SpecQueryLinkerJoinLinker, SpecQueryOuterJoin, SpecQuerySliceAxes, SpecQuerySort, SpecQuerySparseToDenseColumn, SpecQuerySymmetricJoin } from "./query_spec.js";
2
+ import { DataExprAxisRef, DataExprColumnRef, DataQuery, DataQueryBooleanExpression, DataQueryColumn, DataQueryExpression, DataQueryFilter, DataQueryInlineColumn, DataQueryJoinEntry, DataQueryLinkerJoin, DataQueryLinkerJoinLinker, DataQueryOuterJoin, DataQuerySliceAxes, DataQuerySort, DataQuerySparseToDenseColumn, DataQuerySymmetricJoin } from "./query_data.js";
3
3
  import { collectSpecQueryColumns, isBooleanExpression, mapSpecQueryColumns, sortSpecQuery, traverseQuerySpec } from "./utils.js";
@@ -1 +1 @@
1
- import { collectSpecQueryColumns, isBooleanExpression, mapSpecQueryColumns, sortSpecQuery, traverseQuerySpec } from "./utils.js";
1
+ import "./utils.js";
@@ -1,9 +1,6 @@
1
1
  import { AxisValueType, ColumnValueType } from "../spec/spec.js";
2
2
  import { JsonDataInfo } from "../data_info.js";
3
- import "../spec/index.js";
4
3
  import { PObjectId } from "../../../pool/spec.js";
5
- import "../../../pool/index.js";
6
-
7
4
  //#region src/drivers/pframe/query/query_common.d.ts
8
5
  /**
9
6
  * Specification of column/frame structure.
@@ -796,6 +793,44 @@ interface QueryJoinEntry<Q> {
796
793
  /** The query to be joined */
797
794
  entry: Q;
798
795
  }
796
+ /**
797
+ * Linker-join query operation.
798
+ *
799
+ * Inner-joins a linker column (`linker`) with one or more secondary subqueries,
800
+ * then projects out the linker's one-side axes from the joined result. Used to
801
+ * traverse a linker relationship: rows on the secondary side are "lifted" onto
802
+ * the linker's many-side axes, with one-side axes collapsed away.
803
+ *
804
+ * Mirrors {@link QueryOuterJoin}'s `{ primary, secondary }` shape (with
805
+ * `secondary` as an array), but the linker side is a specialized sub-struct —
806
+ * a plain column reference rather than a full join entry.
807
+ *
808
+ * **Join behavior**:
809
+ * - The linker column is inner-joined with all `secondary` entries
810
+ * - After the join, the linker's one-side axes are projected out
811
+ * - Result axes = joined axes minus the linker's one-side axes
812
+ *
813
+ * **Note**: `secondary` must contain at least one entry (empty has no
814
+ * well-defined meaning for linker-join).
815
+ *
816
+ * @template L - Linker sub-struct type (layer-specific)
817
+ * @template JE - Join entry type for the secondary side
818
+ *
819
+ * @example
820
+ * // Traverse linker l1 and read rest data lifted onto l1's many-side
821
+ * {
822
+ * type: 'linkerJoin',
823
+ * linker: { column: 'l1' },
824
+ * secondary: [{ entry: restQuery, ... }]
825
+ * }
826
+ */
827
+ interface QueryLinkerJoin<L, JE extends QueryJoinEntry<unknown>> {
828
+ type: "linkerJoin";
829
+ /** Linker side — column reference plus layer-specific integration data. */
830
+ linker: L;
831
+ /** Rest side — one or more subqueries joined with the linker (at least one). */
832
+ secondary: JE[];
833
+ }
799
834
  //#endregion
800
- export { ExprAxisRef, ExprColumnRef, ExprConstant, ExprIfNull, ExprIsIn, ExprIsNull, ExprLogicalUnary, ExprLogicalVariadic, ExprNumericBinary, ExprNumericComparison, ExprNumericUnary, ExprStringContains, ExprStringContainsFuzzy, ExprStringEquals, ExprStringRegex, InferBooleanExpressionUnion, QueryAxisSelector, QueryColumn, QueryFilter, QueryInlineColumn, QueryJoinEntry, QueryOuterJoin, QuerySliceAxes, QuerySort, QuerySparseToDenseColumn, QuerySymmetricJoin, TypeSpec };
835
+ export { ExprAxisRef, ExprColumnRef, ExprConstant, ExprIfNull, ExprIsIn, ExprIsNull, ExprLogicalUnary, ExprLogicalVariadic, ExprNumericBinary, ExprNumericComparison, ExprNumericUnary, ExprStringContains, ExprStringContainsFuzzy, ExprStringEquals, ExprStringRegex, InferBooleanExpressionUnion, QueryAxisSelector, QueryColumn, QueryFilter, QueryInlineColumn, QueryJoinEntry, QueryLinkerJoin, QueryOuterJoin, QuerySliceAxes, QuerySort, QuerySparseToDenseColumn, QuerySymmetricJoin, TypeSpec };
801
836
  //# sourceMappingURL=query_common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query_common.d.ts","names":[],"sources":["../../../../src/drivers/pframe/query/query_common.ts"],"mappings":"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"}
@@ -1,7 +1,5 @@
1
- import { ExprAxisRef, ExprColumnRef, ExprConstant, ExprIfNull, ExprIsIn, ExprIsNull, ExprLogicalUnary, ExprLogicalVariadic, ExprNumericBinary, ExprNumericComparison, ExprNumericUnary, ExprStringContains, ExprStringContainsFuzzy, ExprStringEquals, ExprStringRegex, InferBooleanExpressionUnion, QueryAxisSelector, QueryColumn, QueryFilter, QueryInlineColumn, QueryJoinEntry, QueryOuterJoin, QuerySliceAxes, QuerySort, QuerySparseToDenseColumn, QuerySymmetricJoin, TypeSpec } from "./query_common.js";
1
+ import { ExprAxisRef, ExprColumnRef, ExprConstant, ExprIfNull, ExprIsIn, ExprIsNull, ExprLogicalUnary, ExprLogicalVariadic, ExprNumericBinary, ExprNumericComparison, ExprNumericUnary, ExprStringContains, ExprStringContainsFuzzy, ExprStringEquals, ExprStringRegex, InferBooleanExpressionUnion, QueryAxisSelector, QueryColumn, QueryFilter, QueryInlineColumn, QueryJoinEntry, QueryLinkerJoin, QueryOuterJoin, QuerySliceAxes, QuerySort, QuerySparseToDenseColumn, QuerySymmetricJoin, TypeSpec } from "./query_common.js";
2
2
  import { PObjectId } from "../../../pool/spec.js";
3
- import "../../../pool/index.js";
4
-
5
3
  //#region src/drivers/pframe/query/query_data.d.ts
6
4
  /**
7
5
  * Column identifier with type specification.
@@ -39,6 +37,21 @@ type DataQuerySparseToDenseColumn = QuerySparseToDenseColumn<PObjectId, ColumnId
39
37
  type DataQuerySymmetricJoin = QuerySymmetricJoin<DataQueryJoinEntry>;
40
38
  /** @see QueryOuterJoin */
41
39
  type DataQueryOuterJoin = QueryOuterJoin<DataQueryJoinEntry>;
40
+ /**
41
+ * Linker side of a data-layer linker-join.
42
+ *
43
+ * Carries the linker column id along with integration-derived artifacts needed
44
+ * for execution:
45
+ * - `axesMapping` — how the linker's axes map into the joined result
46
+ * - `oneSideAxesIndices` — which axis indices in the joined result to project out
47
+ */
48
+ type DataQueryLinkerJoinLinker = {
49
+ /** Linker column reference. */column: PObjectId; /** Linker's axes mapped into the joined result. */
50
+ axesMapping: number[]; /** Axis indices (in the joined result) to project out — the linker's one-side axes. */
51
+ oneSideAxesIndices: number[];
52
+ };
53
+ /** @see QueryLinkerJoin */
54
+ type DataQueryLinkerJoin = QueryLinkerJoin<DataQueryLinkerJoinLinker, DataQueryJoinEntry>;
42
55
  /** @see QuerySliceAxes */
43
56
  type DataQuerySliceAxes = QuerySliceAxes<DataQuery, QueryAxisSelector<number>>;
44
57
  /** @see QuerySort */
@@ -56,7 +69,7 @@ type DataQueryFilter = QueryFilter<DataQuery, DataQueryBooleanExpression>;
56
69
  * - Join operations: innerJoin, fullJoin, outerJoin
57
70
  * - Transformations: sliceAxes, sort, filter
58
71
  */
59
- type DataQuery = DataQueryColumn | DataQueryInlineColumn | DataQuerySparseToDenseColumn | DataQuerySymmetricJoin | DataQueryOuterJoin | DataQuerySliceAxes | DataQuerySort | DataQueryFilter;
72
+ type DataQuery = DataQueryColumn | DataQueryInlineColumn | DataQuerySparseToDenseColumn | DataQuerySymmetricJoin | DataQueryOuterJoin | DataQueryLinkerJoin | DataQuerySliceAxes | DataQuerySort | DataQueryFilter;
60
73
  /** @see ExprAxisRef */
61
74
  type DataExprAxisRef = ExprAxisRef<number>;
62
75
  /** @see ExprColumnRef */
@@ -64,5 +77,5 @@ type DataExprColumnRef = ExprColumnRef<number>;
64
77
  type DataQueryExpression = DataExprColumnRef | DataExprAxisRef | ExprConstant | ExprNumericBinary<DataQueryExpression> | ExprNumericComparison<DataQueryExpression> | ExprNumericUnary<DataQueryExpression> | ExprStringEquals<DataQueryExpression> | ExprStringContains<DataQueryExpression> | ExprStringRegex<DataQueryExpression> | ExprStringContainsFuzzy<DataQueryExpression> | ExprIsNull<DataQueryExpression> | ExprIfNull<DataQueryExpression> | ExprLogicalUnary<DataQueryExpression> | ExprLogicalVariadic<DataQueryExpression> | ExprIsIn<DataQueryExpression, string> | ExprIsIn<DataQueryExpression, number>;
65
78
  type DataQueryBooleanExpression = InferBooleanExpressionUnion<DataQueryExpression>;
66
79
  //#endregion
67
- export { DataExprAxisRef, DataExprColumnRef, DataQuery, DataQueryBooleanExpression, DataQueryColumn, DataQueryExpression, DataQueryFilter, DataQueryInlineColumn, DataQueryJoinEntry, DataQueryOuterJoin, DataQuerySliceAxes, DataQuerySort, DataQuerySparseToDenseColumn, DataQuerySymmetricJoin };
80
+ export { DataExprAxisRef, DataExprColumnRef, DataQuery, DataQueryBooleanExpression, DataQueryColumn, DataQueryExpression, DataQueryFilter, DataQueryInlineColumn, DataQueryJoinEntry, DataQueryLinkerJoin, DataQueryLinkerJoinLinker, DataQueryOuterJoin, DataQuerySliceAxes, DataQuerySort, DataQuerySparseToDenseColumn, DataQuerySymmetricJoin };
68
81
  //# sourceMappingURL=query_data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query_data.d.ts","names":[],"sources":["../../../../src/drivers/pframe/query/query_data.ts"],"mappings":";;;;;;AA8BwB;;;KAQnB,mBAAA;EAEH,sCAAA,EAAA,EAAI,SAAA,EAEJ;EAAA,QAAA,EAAU,QAAA;AAAA;;AAeZ;;;;;;;;;AAMA;;UANiB,kBAAA,SAA2B,cAAA,CAAe,SAAA;EAM7B;EAJ5B,WAAA;AAAA;;KAIU,eAAA,GAAkB,WAAA;;KAElB,qBAAA,GAAwB,iBAAA,CAAkB,mBAAA;AAEtD;AAAA,KAAY,4BAAA,GAA+B,wBAAA,CAAyB,SAAA,EAAW,mBAAA;;KAEnE,sBAAA,GAAyB,kBAAA,CAAmB,kBAAA;;KAE5C,kBAAA,GAAqB,cAAA,CAAe,kBAAA;;;;;;;;AAFhD;KAWY,yBAAA;iCAEV,MAAA,EAAQ,SAAA,EAbgE;EAexE,WAAA,YAb4B;EAe5B,kBAAA;AAAA;;KAGU,mBAAA,GAAsB,eAAA,CAAgB,yBAAA,EAA2B,kBAAA;;KAEjE,kBAAA,GAAqB,cAAA,CAAe,SAAA,EAAW,iBAAA;;KAE/C,aAAA,GAAgB,SAAA,CAAU,SAAA,EAAW,mBAAA;;KAErC,eAAA,GAAkB,WAAA,CAAY,SAAA,EAAW,0BAAA;;;;AANrD;;;;;;;;KAmBY,SAAA,GACR,eAAA,GACA,qBAAA,GACA,4BAAA,GACA,sBAAA,GACA,kBAAA,GACA,mBAAA,GACA,kBAAA,GACA,aAAA,GACA,eAAA;;KAGQ,eAAA,GAAkB,WAAA;;KAElB,iBAAA,GAAoB,aAAA;AAAA,KAEpB,mBAAA,GACR,iBAAA,GACA,eAAA,GACA,YAAA,GACA,iBAAA,CAAkB,mBAAA,IAClB,qBAAA,CAAsB,mBAAA,IACtB,gBAAA,CAAiB,mBAAA,IACjB,gBAAA,CAAiB,mBAAA,IACjB,kBAAA,CAAmB,mBAAA,IACnB,eAAA,CAAgB,mBAAA,IAChB,uBAAA,CAAwB,mBAAA,IACxB,UAAA,CAAW,mBAAA,IACX,UAAA,CAAW,mBAAA,IACX,gBAAA,CAAiB,mBAAA,IACjB,mBAAA,CAAoB,mBAAA,IACpB,QAAA,CAAS,mBAAA,YACT,QAAA,CAAS,mBAAA;AAAA,KAED,0BAAA,GAA6B,2BAAA,CAA4B,mBAAA"}
@@ -1,10 +1,7 @@
1
1
  import { Domain, PColumnIdAndSpec, PColumnSpec } from "../spec/spec.js";
2
2
  import { SingleAxisSelector } from "../spec/selectors.js";
3
- import "../spec/index.js";
4
- import { ExprAxisRef, ExprColumnRef, ExprConstant, ExprIfNull, ExprIsIn, ExprIsNull, ExprLogicalUnary, ExprLogicalVariadic, ExprNumericBinary, ExprNumericComparison, ExprNumericUnary, ExprStringContains, ExprStringContainsFuzzy, ExprStringEquals, ExprStringRegex, InferBooleanExpressionUnion, QueryAxisSelector, QueryColumn, QueryFilter, QueryInlineColumn, QueryJoinEntry, QueryOuterJoin, QuerySliceAxes, QuerySort, QuerySparseToDenseColumn, QuerySymmetricJoin } from "./query_common.js";
3
+ import { ExprAxisRef, ExprColumnRef, ExprConstant, ExprIfNull, ExprIsIn, ExprIsNull, ExprLogicalUnary, ExprLogicalVariadic, ExprNumericBinary, ExprNumericComparison, ExprNumericUnary, ExprStringContains, ExprStringContainsFuzzy, ExprStringEquals, ExprStringRegex, InferBooleanExpressionUnion, QueryAxisSelector, QueryColumn, QueryFilter, QueryInlineColumn, QueryJoinEntry, QueryLinkerJoin, QueryOuterJoin, QuerySliceAxes, QuerySort, QuerySparseToDenseColumn, QuerySymmetricJoin } from "./query_common.js";
5
4
  import { PObjectId } from "../../../pool/spec.js";
6
- import "../../../pool/index.js";
7
-
8
5
  //#region src/drivers/pframe/query/query_spec.d.ts
9
6
  /**
10
7
  * Column identifier with specification.
@@ -48,6 +45,17 @@ type SpecQuerySparseToDenseColumn<C = PObjectId> = QuerySparseToDenseColumn<C, P
48
45
  type SpecQuerySymmetricJoin<C = PObjectId> = QuerySymmetricJoin<SpecQueryJoinEntry<C>>;
49
46
  /** @see QueryOuterJoin */
50
47
  type SpecQueryOuterJoin<C = PObjectId> = QueryOuterJoin<SpecQueryJoinEntry<C>>;
48
+ /**
49
+ * Linker side of a spec-layer linker-join.
50
+ *
51
+ * At the spec layer the linker is just a column reference — integration artifacts
52
+ * (axes mapping, one-side indices) are derived during spec→data conversion.
53
+ */
54
+ type SpecQueryLinkerJoinLinker<C = PObjectId> = {
55
+ /** Linker column reference. */column: C;
56
+ };
57
+ /** @see QueryLinkerJoin */
58
+ type SpecQueryLinkerJoin<C = PObjectId> = QueryLinkerJoin<SpecQueryLinkerJoinLinker<C>, SpecQueryJoinEntry<C>>;
51
59
  /** @see QuerySliceAxes */
52
60
  type SpecQuerySliceAxes<C = PObjectId> = QuerySliceAxes<SpecQuery<C>, QueryAxisSelector<SingleAxisSelector>>;
53
61
  /** @see QuerySort */
@@ -69,7 +77,7 @@ type SpecQueryFilter<C = PObjectId> = QueryFilter<SpecQuery<C>, SpecQueryBoolean
69
77
  * - Join operations: innerJoin, fullJoin, outerJoin
70
78
  * - Transformations: sliceAxes, sort, filter
71
79
  */
72
- type SpecQuery<C = PObjectId> = SpecQueryColumn<C> | SpecQueryInlineColumn | SpecQuerySparseToDenseColumn<C> | SpecQuerySymmetricJoin<C> | SpecQueryOuterJoin<C> | SpecQuerySliceAxes<C> | SpecQuerySort<C> | SpecQueryFilter<C>;
80
+ type SpecQuery<C = PObjectId> = SpecQueryColumn<C> | SpecQueryInlineColumn | SpecQuerySparseToDenseColumn<C> | SpecQuerySymmetricJoin<C> | SpecQueryOuterJoin<C> | SpecQueryLinkerJoin<C> | SpecQuerySliceAxes<C> | SpecQuerySort<C> | SpecQueryFilter<C>;
73
81
  /** @see ExprAxisRef */
74
82
  type SpecExprAxisRef = ExprAxisRef<SingleAxisSelector>;
75
83
  /** @see ExprColumnRef */
@@ -77,5 +85,5 @@ type SpecExprColumnRef = ExprColumnRef<PObjectId>;
77
85
  type SpecQueryExpression = SpecExprColumnRef | SpecExprAxisRef | ExprConstant | ExprNumericBinary<SpecQueryExpression> | ExprNumericComparison<SpecQueryExpression> | ExprNumericUnary<SpecQueryExpression> | ExprStringEquals<SpecQueryExpression> | ExprStringContains<SpecQueryExpression> | ExprStringRegex<SpecQueryExpression> | ExprStringContainsFuzzy<SpecQueryExpression> | ExprIsNull<SpecQueryExpression> | ExprIfNull<SpecQueryExpression> | ExprLogicalUnary<SpecQueryExpression> | ExprLogicalVariadic<SpecQueryExpression> | ExprIsIn<SpecQueryExpression, string> | ExprIsIn<SpecQueryExpression, number>;
78
86
  type SpecQueryBooleanExpression = InferBooleanExpressionUnion<SpecQueryExpression>;
79
87
  //#endregion
80
- export { SpecExprAxisRef, SpecExprColumnRef, SpecQuery, SpecQueryBooleanExpression, SpecQueryColumn, SpecQueryExpression, SpecQueryFilter, SpecQueryInlineColumn, SpecQueryJoinEntry, SpecQueryOuterJoin, SpecQuerySliceAxes, SpecQuerySort, SpecQuerySparseToDenseColumn, SpecQuerySymmetricJoin };
88
+ export { SpecExprAxisRef, SpecExprColumnRef, SpecQuery, SpecQueryBooleanExpression, SpecQueryColumn, SpecQueryExpression, SpecQueryFilter, SpecQueryInlineColumn, SpecQueryJoinEntry, SpecQueryLinkerJoin, SpecQueryLinkerJoinLinker, SpecQueryOuterJoin, SpecQuerySliceAxes, SpecQuerySort, SpecQuerySparseToDenseColumn, SpecQuerySymmetricJoin };
81
89
  //# sourceMappingURL=query_spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query_spec.d.ts","names":[],"sources":["../../../../src/drivers/pframe/query/query_spec.ts"],"mappings":";;;;;;;;;;AA8ByF;KAQpF,eAAA;wCAEH,EAAA,EAAI,SAAA,EAAJ;EAEA,IAAA,EAAM,WAAA;AAAA;;;;AAmBR;;;;;;;;;;;;;KAAY,kBAAA,KAAuB,SAAA,IAAa,cAAA,CAAe,SAAA,CAAU,CAAA;EAAV,6DAE7D,cAAA;IAAA,sDAEE,IAAA,EAAM,kBAAA,EAAA;IAEN,aAAA,EAAe,MAAA;EAAA;AAAA;;KAKP,eAAA,KAAoB,SAAA,IAAa,WAAA,CAAY,CAAA;;KAE7C,qBAAA,GAAwB,iBAAA,CAAkB,eAAA;;KAE1C,4BAAA,KAAiC,SAAA,IAAa,wBAAA,CACxD,CAAA,EACA,gBAAA;;KAGU,sBAAA,KAA2B,SAAA,IAAa,kBAAA,CAAmB,kBAAA,CAAmB,CAAA;;KAE9E,kBAAA,KAAuB,SAAA,IAAa,cAAA,CAAe,kBAAA,CAAmB,CAAA;;;;;;AATlF;KAgBY,yBAAA,KAA8B,SAAA;iCAExC,MAAA,EAAQ,CAAA;AAAA;AAhBV;AAAA,KAmBY,mBAAA,KAAwB,SAAA,IAAa,eAAA,CAC/C,yBAAA,CAA0B,CAAA,GAC1B,kBAAA,CAAmB,CAAA;;KAGT,kBAAA,KAAuB,SAAA,IAAa,cAAA,CAC9C,SAAA,CAAU,CAAA,GACV,iBAAA,CAAkB,kBAAA;;KAGR,aAAA,KAAkB,SAAA,IAAa,SAAA,CAAU,SAAA,CAAU,CAAA,GAAI,mBAAA;;KAEvD,eAAA,KAAoB,SAAA,IAAa,WAAA,CAAY,SAAA,CAAU,CAAA,GAAI,0BAAA;;;;;;;;;AA1BvE;;;;;;;KA2CY,SAAA,KAAc,SAAA,IACtB,eAAA,CAAgB,CAAA,IAChB,qBAAA,GACA,4BAAA,CAA6B,CAAA,IAC7B,sBAAA,CAAuB,CAAA,IACvB,kBAAA,CAAmB,CAAA,IACnB,mBAAA,CAAoB,CAAA,IACpB,kBAAA,CAAmB,CAAA,IACnB,aAAA,CAAc,CAAA,IACd,eAAA,CAAgB,CAAA;;KAGR,eAAA,GAAkB,WAAA,CAAY,kBAAA;;KAE9B,iBAAA,GAAoB,aAAA,CAAc,SAAA;AAAA,KAElC,mBAAA,GACR,iBAAA,GACA,eAAA,GACA,YAAA,GACA,iBAAA,CAAkB,mBAAA,IAClB,qBAAA,CAAsB,mBAAA,IACtB,gBAAA,CAAiB,mBAAA,IACjB,gBAAA,CAAiB,mBAAA,IACjB,kBAAA,CAAmB,mBAAA,IACnB,eAAA,CAAgB,mBAAA,IAChB,uBAAA,CAAwB,mBAAA,IACxB,UAAA,CAAW,mBAAA,IACX,UAAA,CAAW,mBAAA,IACX,gBAAA,CAAiB,mBAAA,IACjB,mBAAA,CAAoB,mBAAA,IACpB,QAAA,CAAS,mBAAA,YACT,QAAA,CAAS,mBAAA;AAAA,KAED,0BAAA,GAA6B,2BAAA,CAA4B,mBAAA"}
@@ -1,6 +1,5 @@
1
- const require_util = require('../../../util.cjs');
2
- const require_json = require('../../../json.cjs');
3
-
1
+ const require_util = require("../../../util.cjs");
2
+ const require_json = require("../../../json.cjs");
4
3
  //#region src/drivers/pframe/query/utils.ts
5
4
  const booleanTypesSet = new Set([
6
5
  "numericComparison",
@@ -66,6 +65,16 @@ function traverseQuerySpec(query, visitor) {
66
65
  secondary: query.secondary.map(traverseEntry)
67
66
  };
68
67
  break;
68
+ case "linkerJoin":
69
+ result = {
70
+ ...query,
71
+ linker: {
72
+ ...query.linker,
73
+ column: visitor.column(query.linker.column)
74
+ },
75
+ secondary: query.secondary.map(traverseEntry)
76
+ };
77
+ break;
69
78
  case "filter":
70
79
  case "sort":
71
80
  case "sliceAxes":
@@ -115,6 +124,13 @@ function sortSpecQuery(query) {
115
124
  secondary: sorted
116
125
  };
117
126
  }
127
+ case "linkerJoin": {
128
+ const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);
129
+ return {
130
+ ...node,
131
+ secondary: sorted
132
+ };
133
+ }
118
134
  case "sliceAxes": return {
119
135
  ...node,
120
136
  axisFilters: node.axisFilters.toSorted((a, b) => {
@@ -163,6 +179,16 @@ function cmpQuerySpec(lhs, rhs) {
163
179
  }
164
180
  return 0;
165
181
  }
182
+ case "linkerJoin": {
183
+ const rhsLinker = rhs;
184
+ if (lhs.linker.column !== rhsLinker.linker.column) return lhs.linker.column < rhsLinker.linker.column ? -1 : 1;
185
+ if (lhs.secondary.length !== rhsLinker.secondary.length) return lhs.secondary.length - rhsLinker.secondary.length;
186
+ for (let i = 0; i < lhs.secondary.length; i++) {
187
+ const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsLinker.secondary[i]);
188
+ if (cmp !== 0) return cmp;
189
+ }
190
+ return 0;
191
+ }
166
192
  case "sliceAxes": return cmpQuerySpec(lhs.input, rhs.input);
167
193
  case "sort": return cmpQuerySpec(lhs.input, rhs.input);
168
194
  case "filter": return cmpQuerySpec(lhs.input, rhs.input);
@@ -180,11 +206,11 @@ function cmpQueryJoinEntrySpec(lhs, rhs) {
180
206
  }
181
207
  return 0;
182
208
  }
183
-
184
209
  //#endregion
185
210
  exports.collectSpecQueryColumns = collectSpecQueryColumns;
186
211
  exports.isBooleanExpression = isBooleanExpression;
187
212
  exports.mapSpecQueryColumns = mapSpecQueryColumns;
188
213
  exports.sortSpecQuery = sortSpecQuery;
189
214
  exports.traverseQuerySpec = traverseQuerySpec;
215
+
190
216
  //# sourceMappingURL=utils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","names":["canonicalizeJson"],"sources":["../../../../src/drivers/pframe/query/utils.ts"],"sourcesContent":["import { canonicalizeJson } from \"../../../json\";\nimport { assertNever } from \"../../../util\";\nimport type {\n SpecQueryBooleanExpression,\n SpecQueryExpression,\n SpecQuery,\n SpecQueryJoinEntry,\n} from \"./query_spec\";\n\nconst booleanTypesSet = new Set<SpecQueryBooleanExpression[\"type\"]>([\n \"numericComparison\",\n \"stringEquals\",\n \"stringContains\",\n \"stringContainsFuzzy\",\n \"stringRegex\",\n \"isNull\",\n \"not\",\n \"and\",\n \"or\",\n \"isIn\",\n]);\n\nexport function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression {\n return booleanTypesSet.has(\n // @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime\n expr.type,\n );\n}\n\n/**\n * Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.\n *\n * Traversal order:\n * 1. Recurse into child queries\n * 2. Apply `column` to transform column references in leaf nodes\n * 3. Apply `joinEntry` to each join entry (with inner query already traversed)\n * 4. Assemble node with transformed children\n * 5. Apply `node` to the assembled node\n */\nexport function traverseQuerySpec<C1, C2>(\n query: SpecQuery<C1>,\n visitor: {\n /** Transform column references in leaf nodes (column, sparseToDenseColumn). */\n column: (c: C1) => C2;\n /** Visit a node after its children have been traversed. */\n node?: (node: SpecQuery<C2>) => SpecQuery<C2>;\n /** Visit a join entry after its inner query has been traversed. */\n joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;\n },\n): SpecQuery<C2> {\n const traverseEntry = (entry: SpecQueryJoinEntry<C1>): SpecQueryJoinEntry<C2> => {\n const traversed: SpecQueryJoinEntry<C2> = {\n ...entry,\n entry: traverseQuerySpec(entry.entry, visitor),\n };\n return visitor.joinEntry ? visitor.joinEntry(traversed) : traversed;\n };\n\n let result: SpecQuery<C2>;\n switch (query.type) {\n case \"column\":\n result = { type: \"column\", column: visitor.column(query.column) };\n break;\n case \"sparseToDenseColumn\":\n result = { ...query, column: visitor.column(query.column) };\n break;\n case \"inlineColumn\":\n result = query;\n break;\n case \"innerJoin\":\n case \"fullJoin\":\n result = { ...query, entries: query.entries.map(traverseEntry) };\n break;\n case \"outerJoin\":\n result = {\n ...query,\n primary: traverseEntry(query.primary),\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"filter\":\n case \"sort\":\n case \"sliceAxes\":\n result = { ...query, input: traverseQuerySpec(query.input, visitor) };\n break;\n default:\n assertNever(query);\n }\n\n return visitor.node ? visitor.node(result) : result;\n}\n\n/** Recursively maps all column references in a SpecQuery tree. */\nexport function mapSpecQueryColumns<C1, C2>(\n query: SpecQuery<C1>,\n cb: (c: C1) => C2,\n): SpecQuery<C2> {\n return traverseQuerySpec(query, { column: cb });\n}\n\n/** Collects all column references from a SpecQuery tree. */\nexport function collectSpecQueryColumns<C>(query: SpecQuery<C>): C[] {\n const result: C[] = [];\n traverseQuerySpec(query, {\n column: (c: C) => {\n result.push(c);\n return c;\n },\n });\n return result;\n}\n\nexport function sortSpecQuery(query: SpecQuery): SpecQuery {\n return traverseQuerySpec(query, {\n column: (c) => c,\n node: (node) => {\n switch (node.type) {\n case \"sparseToDenseColumn\":\n return { ...node, axesIndices: node.axesIndices.toSorted((a, b) => a - b) };\n case \"innerJoin\":\n case \"fullJoin\": {\n const sorted = [...node.entries].sort(cmpQueryJoinEntrySpec);\n return { ...node, entries: sorted };\n }\n case \"outerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"sliceAxes\":\n return {\n ...node,\n axisFilters: node.axisFilters.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axisSelector);\n const bk = canonicalizeJson(b.axisSelector);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n };\n default:\n return node;\n }\n },\n joinEntry: (entry) => ({\n ...entry,\n qualifications: entry.qualifications.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axis);\n const bk = canonicalizeJson(b.axis);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n }),\n });\n}\n\nfunction cmpQuerySpec(lhs: SpecQuery, rhs: SpecQuery): number {\n if (lhs.type !== rhs.type) {\n return lhs.type < rhs.type ? -1 : 1;\n }\n switch (lhs.type) {\n case \"column\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"inlineColumn\":\n return lhs.spec.id < (rhs as typeof lhs).spec.id\n ? -1\n : lhs.spec.id === (rhs as typeof lhs).spec.id\n ? 0\n : 1;\n case \"sparseToDenseColumn\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"innerJoin\":\n case \"fullJoin\": {\n const rhsJoin = rhs as typeof lhs;\n if (lhs.entries.length !== rhsJoin.entries.length) {\n return lhs.entries.length - rhsJoin.entries.length;\n }\n for (let i = 0; i < lhs.entries.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.entries[i], rhsJoin.entries[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"outerJoin\": {\n const rhsOuter = rhs as typeof lhs;\n const cmp = cmpQueryJoinEntrySpec(lhs.primary, rhsOuter.primary);\n if (cmp !== 0) return cmp;\n if (lhs.secondary.length !== rhsOuter.secondary.length) {\n return lhs.secondary.length - rhsOuter.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsOuter.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"sliceAxes\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"sort\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"filter\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n default:\n assertNever(lhs);\n }\n}\n\nfunction cmpQueryJoinEntrySpec(lhs: SpecQueryJoinEntry, rhs: SpecQueryJoinEntry): number {\n const cmp = cmpQuerySpec(lhs.entry, rhs.entry);\n if (cmp !== 0) return cmp;\n if (lhs.qualifications.length !== rhs.qualifications.length) {\n return lhs.qualifications.length - rhs.qualifications.length;\n }\n for (let i = 0; i < lhs.qualifications.length; i++) {\n const lhsQ = canonicalizeJson(lhs.qualifications[i]);\n const rhsQ = canonicalizeJson(rhs.qualifications[i]);\n if (lhsQ !== rhsQ) return lhsQ < rhsQ ? -1 : 1;\n }\n return 0;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs","names":["canonicalizeJson"],"sources":["../../../../src/drivers/pframe/query/utils.ts"],"sourcesContent":["import { canonicalizeJson } from \"../../../json\";\nimport { assertNever } from \"../../../util\";\nimport type {\n SpecQueryBooleanExpression,\n SpecQueryExpression,\n SpecQuery,\n SpecQueryJoinEntry,\n} from \"./query_spec\";\n\nconst booleanTypesSet = new Set<SpecQueryBooleanExpression[\"type\"]>([\n \"numericComparison\",\n \"stringEquals\",\n \"stringContains\",\n \"stringContainsFuzzy\",\n \"stringRegex\",\n \"isNull\",\n \"not\",\n \"and\",\n \"or\",\n \"isIn\",\n]);\n\nexport function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression {\n return booleanTypesSet.has(\n // @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime\n expr.type,\n );\n}\n\n/**\n * Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.\n *\n * Traversal order:\n * 1. Recurse into child queries\n * 2. Apply `column` to transform column references in leaf nodes\n * 3. Apply `joinEntry` to each join entry (with inner query already traversed)\n * 4. Assemble node with transformed children\n * 5. Apply `node` to the assembled node\n */\nexport function traverseQuerySpec<C1, C2>(\n query: SpecQuery<C1>,\n visitor: {\n /** Transform column references in leaf nodes (column, sparseToDenseColumn). */\n column: (c: C1) => C2;\n /** Visit a node after its children have been traversed. */\n node?: (node: SpecQuery<C2>) => SpecQuery<C2>;\n /** Visit a join entry after its inner query has been traversed. */\n joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;\n },\n): SpecQuery<C2> {\n const traverseEntry = (entry: SpecQueryJoinEntry<C1>): SpecQueryJoinEntry<C2> => {\n const traversed: SpecQueryJoinEntry<C2> = {\n ...entry,\n entry: traverseQuerySpec(entry.entry, visitor),\n };\n return visitor.joinEntry ? visitor.joinEntry(traversed) : traversed;\n };\n\n let result: SpecQuery<C2>;\n switch (query.type) {\n case \"column\":\n result = { type: \"column\", column: visitor.column(query.column) };\n break;\n case \"sparseToDenseColumn\":\n result = { ...query, column: visitor.column(query.column) };\n break;\n case \"inlineColumn\":\n result = query;\n break;\n case \"innerJoin\":\n case \"fullJoin\":\n result = { ...query, entries: query.entries.map(traverseEntry) };\n break;\n case \"outerJoin\":\n result = {\n ...query,\n primary: traverseEntry(query.primary),\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"linkerJoin\":\n result = {\n ...query,\n linker: { ...query.linker, column: visitor.column(query.linker.column) },\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"filter\":\n case \"sort\":\n case \"sliceAxes\":\n result = { ...query, input: traverseQuerySpec(query.input, visitor) };\n break;\n default:\n assertNever(query);\n }\n\n return visitor.node ? visitor.node(result) : result;\n}\n\n/** Recursively maps all column references in a SpecQuery tree. */\nexport function mapSpecQueryColumns<C1, C2>(\n query: SpecQuery<C1>,\n cb: (c: C1) => C2,\n): SpecQuery<C2> {\n return traverseQuerySpec(query, { column: cb });\n}\n\n/** Collects all column references from a SpecQuery tree. */\nexport function collectSpecQueryColumns<C>(query: SpecQuery<C>): C[] {\n const result: C[] = [];\n traverseQuerySpec(query, {\n column: (c: C) => {\n result.push(c);\n return c;\n },\n });\n return result;\n}\n\nexport function sortSpecQuery(query: SpecQuery): SpecQuery {\n return traverseQuerySpec(query, {\n column: (c) => c,\n node: (node) => {\n switch (node.type) {\n case \"sparseToDenseColumn\":\n return { ...node, axesIndices: node.axesIndices.toSorted((a, b) => a - b) };\n case \"innerJoin\":\n case \"fullJoin\": {\n const sorted = [...node.entries].sort(cmpQueryJoinEntrySpec);\n return { ...node, entries: sorted };\n }\n case \"outerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"linkerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"sliceAxes\":\n return {\n ...node,\n axisFilters: node.axisFilters.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axisSelector);\n const bk = canonicalizeJson(b.axisSelector);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n };\n default:\n return node;\n }\n },\n joinEntry: (entry) => ({\n ...entry,\n qualifications: entry.qualifications.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axis);\n const bk = canonicalizeJson(b.axis);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n }),\n });\n}\n\nfunction cmpQuerySpec(lhs: SpecQuery, rhs: SpecQuery): number {\n if (lhs.type !== rhs.type) {\n return lhs.type < rhs.type ? -1 : 1;\n }\n switch (lhs.type) {\n case \"column\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"inlineColumn\":\n return lhs.spec.id < (rhs as typeof lhs).spec.id\n ? -1\n : lhs.spec.id === (rhs as typeof lhs).spec.id\n ? 0\n : 1;\n case \"sparseToDenseColumn\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"innerJoin\":\n case \"fullJoin\": {\n const rhsJoin = rhs as typeof lhs;\n if (lhs.entries.length !== rhsJoin.entries.length) {\n return lhs.entries.length - rhsJoin.entries.length;\n }\n for (let i = 0; i < lhs.entries.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.entries[i], rhsJoin.entries[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"outerJoin\": {\n const rhsOuter = rhs as typeof lhs;\n const cmp = cmpQueryJoinEntrySpec(lhs.primary, rhsOuter.primary);\n if (cmp !== 0) return cmp;\n if (lhs.secondary.length !== rhsOuter.secondary.length) {\n return lhs.secondary.length - rhsOuter.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsOuter.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"linkerJoin\": {\n const rhsLinker = rhs as typeof lhs;\n if (lhs.linker.column !== rhsLinker.linker.column) {\n return lhs.linker.column < rhsLinker.linker.column ? -1 : 1;\n }\n if (lhs.secondary.length !== rhsLinker.secondary.length) {\n return lhs.secondary.length - rhsLinker.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsLinker.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"sliceAxes\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"sort\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"filter\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n default:\n assertNever(lhs);\n }\n}\n\nfunction cmpQueryJoinEntrySpec(lhs: SpecQueryJoinEntry, rhs: SpecQueryJoinEntry): number {\n const cmp = cmpQuerySpec(lhs.entry, rhs.entry);\n if (cmp !== 0) return cmp;\n if (lhs.qualifications.length !== rhs.qualifications.length) {\n return lhs.qualifications.length - rhs.qualifications.length;\n }\n for (let i = 0; i < lhs.qualifications.length; i++) {\n const lhsQ = canonicalizeJson(lhs.qualifications[i]);\n const rhsQ = canonicalizeJson(rhs.qualifications[i]);\n if (lhsQ !== rhsQ) return lhsQ < rhsQ ? -1 : 1;\n }\n return 0;\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","names":[],"sources":["../../../../src/drivers/pframe/query/utils.ts"],"mappings":";;;iBAsBgB,mBAAA,CAAoB,IAAA,EAAM,mBAAA,GAAsB,IAAA,IAAQ,0BAAA;;AAAxE;;;;;;;;;iBAiBgB,iBAAA,QAAA,CACd,KAAA,EAAO,SAAA,CAAU,EAAA,GACjB,OAAA;EAFc,+EAIZ,MAAA,GAAS,CAAA,EAAG,EAAA,KAAO,EAAA,EAJU;EAM7B,IAAA,IAAQ,IAAA,EAAM,SAAA,CAAU,EAAA,MAAQ,SAAA,CAAU,EAAA,GALrC;EAOL,SAAA,IAAa,KAAA,EAAO,kBAAA,CAAmB,EAAA,MAAQ,kBAAA,CAAmB,EAAA;AAAA,IAEnE,SAAA,CAAU,EAAA;;iBAmDG,mBAAA,QAAA,CACd,KAAA,EAAO,SAAA,CAAU,EAAA,GACjB,EAAA,GAAK,CAAA,EAAG,EAAA,KAAO,EAAA,GACd,SAAA,CAAU,EAAA;;iBAKG,uBAAA,GAAA,CAA2B,KAAA,EAAO,SAAA,CAAU,CAAA,IAAK,CAAA;AAAA,iBAWjD,aAAA,CAAc,KAAA,EAAO,SAAA,GAAY,SAAA"}
@@ -1,6 +1,5 @@
1
1
  import { assertNever } from "../../../util.js";
2
2
  import { canonicalizeJson } from "../../../json.js";
3
-
4
3
  //#region src/drivers/pframe/query/utils.ts
5
4
  const booleanTypesSet = new Set([
6
5
  "numericComparison",
@@ -66,6 +65,16 @@ function traverseQuerySpec(query, visitor) {
66
65
  secondary: query.secondary.map(traverseEntry)
67
66
  };
68
67
  break;
68
+ case "linkerJoin":
69
+ result = {
70
+ ...query,
71
+ linker: {
72
+ ...query.linker,
73
+ column: visitor.column(query.linker.column)
74
+ },
75
+ secondary: query.secondary.map(traverseEntry)
76
+ };
77
+ break;
69
78
  case "filter":
70
79
  case "sort":
71
80
  case "sliceAxes":
@@ -115,6 +124,13 @@ function sortSpecQuery(query) {
115
124
  secondary: sorted
116
125
  };
117
126
  }
127
+ case "linkerJoin": {
128
+ const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);
129
+ return {
130
+ ...node,
131
+ secondary: sorted
132
+ };
133
+ }
118
134
  case "sliceAxes": return {
119
135
  ...node,
120
136
  axisFilters: node.axisFilters.toSorted((a, b) => {
@@ -163,6 +179,16 @@ function cmpQuerySpec(lhs, rhs) {
163
179
  }
164
180
  return 0;
165
181
  }
182
+ case "linkerJoin": {
183
+ const rhsLinker = rhs;
184
+ if (lhs.linker.column !== rhsLinker.linker.column) return lhs.linker.column < rhsLinker.linker.column ? -1 : 1;
185
+ if (lhs.secondary.length !== rhsLinker.secondary.length) return lhs.secondary.length - rhsLinker.secondary.length;
186
+ for (let i = 0; i < lhs.secondary.length; i++) {
187
+ const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsLinker.secondary[i]);
188
+ if (cmp !== 0) return cmp;
189
+ }
190
+ return 0;
191
+ }
166
192
  case "sliceAxes": return cmpQuerySpec(lhs.input, rhs.input);
167
193
  case "sort": return cmpQuerySpec(lhs.input, rhs.input);
168
194
  case "filter": return cmpQuerySpec(lhs.input, rhs.input);
@@ -180,7 +206,7 @@ function cmpQueryJoinEntrySpec(lhs, rhs) {
180
206
  }
181
207
  return 0;
182
208
  }
183
-
184
209
  //#endregion
185
210
  export { collectSpecQueryColumns, isBooleanExpression, mapSpecQueryColumns, sortSpecQuery, traverseQuerySpec };
211
+
186
212
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../../../src/drivers/pframe/query/utils.ts"],"sourcesContent":["import { canonicalizeJson } from \"../../../json\";\nimport { assertNever } from \"../../../util\";\nimport type {\n SpecQueryBooleanExpression,\n SpecQueryExpression,\n SpecQuery,\n SpecQueryJoinEntry,\n} from \"./query_spec\";\n\nconst booleanTypesSet = new Set<SpecQueryBooleanExpression[\"type\"]>([\n \"numericComparison\",\n \"stringEquals\",\n \"stringContains\",\n \"stringContainsFuzzy\",\n \"stringRegex\",\n \"isNull\",\n \"not\",\n \"and\",\n \"or\",\n \"isIn\",\n]);\n\nexport function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression {\n return booleanTypesSet.has(\n // @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime\n expr.type,\n );\n}\n\n/**\n * Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.\n *\n * Traversal order:\n * 1. Recurse into child queries\n * 2. Apply `column` to transform column references in leaf nodes\n * 3. Apply `joinEntry` to each join entry (with inner query already traversed)\n * 4. Assemble node with transformed children\n * 5. Apply `node` to the assembled node\n */\nexport function traverseQuerySpec<C1, C2>(\n query: SpecQuery<C1>,\n visitor: {\n /** Transform column references in leaf nodes (column, sparseToDenseColumn). */\n column: (c: C1) => C2;\n /** Visit a node after its children have been traversed. */\n node?: (node: SpecQuery<C2>) => SpecQuery<C2>;\n /** Visit a join entry after its inner query has been traversed. */\n joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;\n },\n): SpecQuery<C2> {\n const traverseEntry = (entry: SpecQueryJoinEntry<C1>): SpecQueryJoinEntry<C2> => {\n const traversed: SpecQueryJoinEntry<C2> = {\n ...entry,\n entry: traverseQuerySpec(entry.entry, visitor),\n };\n return visitor.joinEntry ? visitor.joinEntry(traversed) : traversed;\n };\n\n let result: SpecQuery<C2>;\n switch (query.type) {\n case \"column\":\n result = { type: \"column\", column: visitor.column(query.column) };\n break;\n case \"sparseToDenseColumn\":\n result = { ...query, column: visitor.column(query.column) };\n break;\n case \"inlineColumn\":\n result = query;\n break;\n case \"innerJoin\":\n case \"fullJoin\":\n result = { ...query, entries: query.entries.map(traverseEntry) };\n break;\n case \"outerJoin\":\n result = {\n ...query,\n primary: traverseEntry(query.primary),\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"filter\":\n case \"sort\":\n case \"sliceAxes\":\n result = { ...query, input: traverseQuerySpec(query.input, visitor) };\n break;\n default:\n assertNever(query);\n }\n\n return visitor.node ? visitor.node(result) : result;\n}\n\n/** Recursively maps all column references in a SpecQuery tree. */\nexport function mapSpecQueryColumns<C1, C2>(\n query: SpecQuery<C1>,\n cb: (c: C1) => C2,\n): SpecQuery<C2> {\n return traverseQuerySpec(query, { column: cb });\n}\n\n/** Collects all column references from a SpecQuery tree. */\nexport function collectSpecQueryColumns<C>(query: SpecQuery<C>): C[] {\n const result: C[] = [];\n traverseQuerySpec(query, {\n column: (c: C) => {\n result.push(c);\n return c;\n },\n });\n return result;\n}\n\nexport function sortSpecQuery(query: SpecQuery): SpecQuery {\n return traverseQuerySpec(query, {\n column: (c) => c,\n node: (node) => {\n switch (node.type) {\n case \"sparseToDenseColumn\":\n return { ...node, axesIndices: node.axesIndices.toSorted((a, b) => a - b) };\n case \"innerJoin\":\n case \"fullJoin\": {\n const sorted = [...node.entries].sort(cmpQueryJoinEntrySpec);\n return { ...node, entries: sorted };\n }\n case \"outerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"sliceAxes\":\n return {\n ...node,\n axisFilters: node.axisFilters.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axisSelector);\n const bk = canonicalizeJson(b.axisSelector);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n };\n default:\n return node;\n }\n },\n joinEntry: (entry) => ({\n ...entry,\n qualifications: entry.qualifications.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axis);\n const bk = canonicalizeJson(b.axis);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n }),\n });\n}\n\nfunction cmpQuerySpec(lhs: SpecQuery, rhs: SpecQuery): number {\n if (lhs.type !== rhs.type) {\n return lhs.type < rhs.type ? -1 : 1;\n }\n switch (lhs.type) {\n case \"column\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"inlineColumn\":\n return lhs.spec.id < (rhs as typeof lhs).spec.id\n ? -1\n : lhs.spec.id === (rhs as typeof lhs).spec.id\n ? 0\n : 1;\n case \"sparseToDenseColumn\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"innerJoin\":\n case \"fullJoin\": {\n const rhsJoin = rhs as typeof lhs;\n if (lhs.entries.length !== rhsJoin.entries.length) {\n return lhs.entries.length - rhsJoin.entries.length;\n }\n for (let i = 0; i < lhs.entries.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.entries[i], rhsJoin.entries[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"outerJoin\": {\n const rhsOuter = rhs as typeof lhs;\n const cmp = cmpQueryJoinEntrySpec(lhs.primary, rhsOuter.primary);\n if (cmp !== 0) return cmp;\n if (lhs.secondary.length !== rhsOuter.secondary.length) {\n return lhs.secondary.length - rhsOuter.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsOuter.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"sliceAxes\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"sort\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"filter\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n default:\n assertNever(lhs);\n }\n}\n\nfunction cmpQueryJoinEntrySpec(lhs: SpecQueryJoinEntry, rhs: SpecQueryJoinEntry): number {\n const cmp = cmpQuerySpec(lhs.entry, rhs.entry);\n if (cmp !== 0) return cmp;\n if (lhs.qualifications.length !== rhs.qualifications.length) {\n return lhs.qualifications.length - rhs.qualifications.length;\n }\n for (let i = 0; i < lhs.qualifications.length; i++) {\n const lhsQ = canonicalizeJson(lhs.qualifications[i]);\n const rhsQ = canonicalizeJson(rhs.qualifications[i]);\n if (lhsQ !== rhsQ) return lhsQ < rhsQ ? -1 : 1;\n }\n return 0;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../../src/drivers/pframe/query/utils.ts"],"sourcesContent":["import { canonicalizeJson } from \"../../../json\";\nimport { assertNever } from \"../../../util\";\nimport type {\n SpecQueryBooleanExpression,\n SpecQueryExpression,\n SpecQuery,\n SpecQueryJoinEntry,\n} from \"./query_spec\";\n\nconst booleanTypesSet = new Set<SpecQueryBooleanExpression[\"type\"]>([\n \"numericComparison\",\n \"stringEquals\",\n \"stringContains\",\n \"stringContainsFuzzy\",\n \"stringRegex\",\n \"isNull\",\n \"not\",\n \"and\",\n \"or\",\n \"isIn\",\n]);\n\nexport function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression {\n return booleanTypesSet.has(\n // @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime\n expr.type,\n );\n}\n\n/**\n * Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.\n *\n * Traversal order:\n * 1. Recurse into child queries\n * 2. Apply `column` to transform column references in leaf nodes\n * 3. Apply `joinEntry` to each join entry (with inner query already traversed)\n * 4. Assemble node with transformed children\n * 5. Apply `node` to the assembled node\n */\nexport function traverseQuerySpec<C1, C2>(\n query: SpecQuery<C1>,\n visitor: {\n /** Transform column references in leaf nodes (column, sparseToDenseColumn). */\n column: (c: C1) => C2;\n /** Visit a node after its children have been traversed. */\n node?: (node: SpecQuery<C2>) => SpecQuery<C2>;\n /** Visit a join entry after its inner query has been traversed. */\n joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;\n },\n): SpecQuery<C2> {\n const traverseEntry = (entry: SpecQueryJoinEntry<C1>): SpecQueryJoinEntry<C2> => {\n const traversed: SpecQueryJoinEntry<C2> = {\n ...entry,\n entry: traverseQuerySpec(entry.entry, visitor),\n };\n return visitor.joinEntry ? visitor.joinEntry(traversed) : traversed;\n };\n\n let result: SpecQuery<C2>;\n switch (query.type) {\n case \"column\":\n result = { type: \"column\", column: visitor.column(query.column) };\n break;\n case \"sparseToDenseColumn\":\n result = { ...query, column: visitor.column(query.column) };\n break;\n case \"inlineColumn\":\n result = query;\n break;\n case \"innerJoin\":\n case \"fullJoin\":\n result = { ...query, entries: query.entries.map(traverseEntry) };\n break;\n case \"outerJoin\":\n result = {\n ...query,\n primary: traverseEntry(query.primary),\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"linkerJoin\":\n result = {\n ...query,\n linker: { ...query.linker, column: visitor.column(query.linker.column) },\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"filter\":\n case \"sort\":\n case \"sliceAxes\":\n result = { ...query, input: traverseQuerySpec(query.input, visitor) };\n break;\n default:\n assertNever(query);\n }\n\n return visitor.node ? visitor.node(result) : result;\n}\n\n/** Recursively maps all column references in a SpecQuery tree. */\nexport function mapSpecQueryColumns<C1, C2>(\n query: SpecQuery<C1>,\n cb: (c: C1) => C2,\n): SpecQuery<C2> {\n return traverseQuerySpec(query, { column: cb });\n}\n\n/** Collects all column references from a SpecQuery tree. */\nexport function collectSpecQueryColumns<C>(query: SpecQuery<C>): C[] {\n const result: C[] = [];\n traverseQuerySpec(query, {\n column: (c: C) => {\n result.push(c);\n return c;\n },\n });\n return result;\n}\n\nexport function sortSpecQuery(query: SpecQuery): SpecQuery {\n return traverseQuerySpec(query, {\n column: (c) => c,\n node: (node) => {\n switch (node.type) {\n case \"sparseToDenseColumn\":\n return { ...node, axesIndices: node.axesIndices.toSorted((a, b) => a - b) };\n case \"innerJoin\":\n case \"fullJoin\": {\n const sorted = [...node.entries].sort(cmpQueryJoinEntrySpec);\n return { ...node, entries: sorted };\n }\n case \"outerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"linkerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"sliceAxes\":\n return {\n ...node,\n axisFilters: node.axisFilters.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axisSelector);\n const bk = canonicalizeJson(b.axisSelector);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n };\n default:\n return node;\n }\n },\n joinEntry: (entry) => ({\n ...entry,\n qualifications: entry.qualifications.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axis);\n const bk = canonicalizeJson(b.axis);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n }),\n });\n}\n\nfunction cmpQuerySpec(lhs: SpecQuery, rhs: SpecQuery): number {\n if (lhs.type !== rhs.type) {\n return lhs.type < rhs.type ? -1 : 1;\n }\n switch (lhs.type) {\n case \"column\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"inlineColumn\":\n return lhs.spec.id < (rhs as typeof lhs).spec.id\n ? -1\n : lhs.spec.id === (rhs as typeof lhs).spec.id\n ? 0\n : 1;\n case \"sparseToDenseColumn\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"innerJoin\":\n case \"fullJoin\": {\n const rhsJoin = rhs as typeof lhs;\n if (lhs.entries.length !== rhsJoin.entries.length) {\n return lhs.entries.length - rhsJoin.entries.length;\n }\n for (let i = 0; i < lhs.entries.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.entries[i], rhsJoin.entries[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"outerJoin\": {\n const rhsOuter = rhs as typeof lhs;\n const cmp = cmpQueryJoinEntrySpec(lhs.primary, rhsOuter.primary);\n if (cmp !== 0) return cmp;\n if (lhs.secondary.length !== rhsOuter.secondary.length) {\n return lhs.secondary.length - rhsOuter.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsOuter.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"linkerJoin\": {\n const rhsLinker = rhs as typeof lhs;\n if (lhs.linker.column !== rhsLinker.linker.column) {\n return lhs.linker.column < rhsLinker.linker.column ? -1 : 1;\n }\n if (lhs.secondary.length !== rhsLinker.secondary.length) {\n return lhs.secondary.length - rhsLinker.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsLinker.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"sliceAxes\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"sort\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"filter\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n default:\n assertNever(lhs);\n }\n}\n\nfunction cmpQueryJoinEntrySpec(lhs: SpecQueryJoinEntry, rhs: SpecQueryJoinEntry): number {\n const cmp = cmpQuerySpec(lhs.entry, rhs.entry);\n if (cmp !== 0) return cmp;\n if (lhs.qualifications.length !== rhs.qualifications.length) {\n return lhs.qualifications.length - rhs.qualifications.length;\n }\n for (let i = 0; i < lhs.qualifications.length; i++) {\n const lhsQ = canonicalizeJson(lhs.qualifications[i]);\n const rhsQ = canonicalizeJson(rhs.qualifications[i]);\n if (lhsQ !== rhsQ) return lhsQ < rhsQ ? -1 : 1;\n }\n return 0;\n}\n"],"mappings":"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"}
@@ -1,9 +1,8 @@
1
- const require_runtime = require('../../../_virtual/_rolldown/runtime.cjs');
2
- const require_spec = require('./spec.cjs');
3
- const require_ids = require('./ids.cjs');
1
+ const require_runtime = require("../../../_virtual/_rolldown/runtime.cjs");
2
+ const require_spec = require("./spec.cjs");
3
+ const require_ids = require("./ids.cjs");
4
4
  let canonicalize = require("canonicalize");
5
5
  canonicalize = require_runtime.__toESM(canonicalize);
6
-
7
6
  //#region src/drivers/pframe/spec/anchored.ts
8
7
  function axisKey(axis) {
9
8
  return (0, canonicalize.default)(require_spec.getAxisId(axis));
@@ -247,8 +246,8 @@ function resolveAxisReference(anchors, axisRef) {
247
246
  function isAnchorAxisRef(value) {
248
247
  return typeof value === "object" && "anchor" in value;
249
248
  }
250
-
251
249
  //#endregion
252
250
  exports.AnchoredIdDeriver = AnchoredIdDeriver;
253
251
  exports.resolveAnchors = resolveAnchors;
252
+
254
253
  //# sourceMappingURL=anchored.cjs.map