@platforma-sdk/model 1.79.24 → 1.80.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 (356) hide show
  1. package/dist/block_model.d.ts +2 -0
  2. package/dist/block_model.d.ts.map +1 -1
  3. package/dist/columns/column.cjs +28 -0
  4. package/dist/columns/column.cjs.map +1 -0
  5. package/dist/columns/column.d.ts +30 -0
  6. package/dist/columns/column.d.ts.map +1 -0
  7. package/dist/columns/column.js +27 -0
  8. package/dist/columns/column.js.map +1 -0
  9. package/dist/columns/column_lazy.cjs +248 -0
  10. package/dist/columns/column_lazy.cjs.map +1 -0
  11. package/dist/columns/column_lazy.d.ts +137 -0
  12. package/dist/columns/column_lazy.d.ts.map +1 -0
  13. package/dist/columns/column_lazy.js +245 -0
  14. package/dist/columns/column_lazy.js.map +1 -0
  15. package/dist/columns/column_providers/index.cjs +62 -0
  16. package/dist/columns/column_providers/index.cjs.map +1 -0
  17. package/dist/columns/column_providers/index.d.ts +30 -0
  18. package/dist/columns/column_providers/index.d.ts.map +1 -0
  19. package/dist/columns/column_providers/index.js +53 -0
  20. package/dist/columns/column_providers/index.js.map +1 -0
  21. package/dist/columns/column_providers/providers.cjs +123 -0
  22. package/dist/columns/column_providers/providers.cjs.map +1 -0
  23. package/dist/columns/column_providers/providers.d.ts +75 -0
  24. package/dist/columns/column_providers/providers.d.ts.map +1 -0
  25. package/dist/columns/column_providers/providers.js +118 -0
  26. package/dist/columns/column_providers/providers.js.map +1 -0
  27. package/dist/columns/column_providers/types.d.ts +23 -0
  28. package/dist/columns/column_providers/types.d.ts.map +1 -0
  29. package/dist/columns/column_recipes/column_discovered_recipe.cjs +180 -0
  30. package/dist/columns/column_recipes/column_discovered_recipe.cjs.map +1 -0
  31. package/dist/columns/column_recipes/column_discovered_recipe.d.ts +120 -0
  32. package/dist/columns/column_recipes/column_discovered_recipe.d.ts.map +1 -0
  33. package/dist/columns/column_recipes/column_discovered_recipe.js +180 -0
  34. package/dist/columns/column_recipes/column_discovered_recipe.js.map +1 -0
  35. package/dist/columns/column_recipes/column_filtered_recipe.cjs +133 -0
  36. package/dist/columns/column_recipes/column_filtered_recipe.cjs.map +1 -0
  37. package/dist/columns/column_recipes/column_filtered_recipe.d.ts +75 -0
  38. package/dist/columns/column_recipes/column_filtered_recipe.d.ts.map +1 -0
  39. package/dist/columns/column_recipes/column_filtered_recipe.js +133 -0
  40. package/dist/columns/column_recipes/column_filtered_recipe.js.map +1 -0
  41. package/dist/columns/column_recipes/column_overrided_recipe.cjs +101 -0
  42. package/dist/columns/column_recipes/column_overrided_recipe.cjs.map +1 -0
  43. package/dist/columns/column_recipes/column_overrided_recipe.d.ts +73 -0
  44. package/dist/columns/column_recipes/column_overrided_recipe.d.ts.map +1 -0
  45. package/dist/columns/column_recipes/column_overrided_recipe.js +101 -0
  46. package/dist/columns/column_recipes/column_overrided_recipe.js.map +1 -0
  47. package/dist/columns/column_recipes/index.cjs +72 -0
  48. package/dist/columns/column_recipes/index.cjs.map +1 -0
  49. package/dist/columns/column_recipes/index.d.ts +52 -0
  50. package/dist/columns/column_recipes/index.d.ts.map +1 -0
  51. package/dist/columns/column_recipes/index.js +68 -0
  52. package/dist/columns/column_recipes/index.js.map +1 -0
  53. package/dist/columns/column_recipes/leaf_rebrand.cjs +22 -0
  54. package/dist/columns/column_recipes/leaf_rebrand.cjs.map +1 -0
  55. package/dist/columns/column_recipes/leaf_rebrand.js +22 -0
  56. package/dist/columns/column_recipes/leaf_rebrand.js.map +1 -0
  57. package/dist/columns/column_recipes/types.d.ts +101 -0
  58. package/dist/columns/column_recipes/types.d.ts.map +1 -0
  59. package/dist/columns/columns_collection.cjs +124 -0
  60. package/dist/columns/columns_collection.cjs.map +1 -0
  61. package/dist/columns/columns_collection.d.ts +64 -0
  62. package/dist/columns/columns_collection.d.ts.map +1 -0
  63. package/dist/columns/columns_collection.js +122 -0
  64. package/dist/columns/columns_collection.js.map +1 -0
  65. package/dist/columns/derive_axis_values_labels.cjs +76 -0
  66. package/dist/columns/derive_axis_values_labels.cjs.map +1 -0
  67. package/dist/columns/derive_axis_values_labels.d.ts +30 -0
  68. package/dist/columns/derive_axis_values_labels.d.ts.map +1 -0
  69. package/dist/columns/derive_axis_values_labels.js +76 -0
  70. package/dist/columns/derive_axis_values_labels.js.map +1 -0
  71. package/dist/columns/expand_by_partition.cjs +53 -56
  72. package/dist/columns/expand_by_partition.cjs.map +1 -1
  73. package/dist/columns/expand_by_partition.d.ts +22 -18
  74. package/dist/columns/expand_by_partition.d.ts.map +1 -1
  75. package/dist/columns/expand_by_partition.js +55 -58
  76. package/dist/columns/expand_by_partition.js.map +1 -1
  77. package/dist/columns/index.cjs +44 -18
  78. package/dist/columns/index.d.ts +15 -7
  79. package/dist/columns/index.js +12 -6
  80. package/dist/columns/utils.cjs +186 -0
  81. package/dist/columns/utils.cjs.map +1 -0
  82. package/dist/columns/utils.d.ts +96 -0
  83. package/dist/columns/utils.d.ts.map +1 -0
  84. package/dist/columns/utils.js +179 -0
  85. package/dist/columns/utils.js.map +1 -0
  86. package/dist/components/PFrameForGraphs.cjs +1 -0
  87. package/dist/components/PFrameForGraphs.cjs.map +1 -1
  88. package/dist/components/PFrameForGraphs.d.ts +1 -1
  89. package/dist/components/PFrameForGraphs.d.ts.map +1 -1
  90. package/dist/components/PFrameForGraphs.js +1 -0
  91. package/dist/components/PFrameForGraphs.js.map +1 -1
  92. package/dist/components/PlDataTable/columnResolver.cjs +28 -0
  93. package/dist/components/PlDataTable/columnResolver.cjs.map +1 -0
  94. package/dist/components/PlDataTable/columnResolver.js +28 -0
  95. package/dist/components/PlDataTable/columnResolver.js.map +1 -0
  96. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs +4 -2
  97. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs.map +1 -1
  98. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js +4 -2
  99. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js.map +1 -1
  100. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs +20 -25
  101. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs.map +1 -1
  102. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js +20 -25
  103. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js.map +1 -1
  104. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs +58 -26
  105. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs.map +1 -1
  106. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts +1 -1
  107. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts.map +1 -1
  108. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js +60 -28
  109. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js.map +1 -1
  110. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs +224 -194
  111. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
  112. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +13 -16
  113. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts.map +1 -1
  114. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js +228 -198
  115. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
  116. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs +40 -98
  117. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs.map +1 -1
  118. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts +17 -8
  119. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts.map +1 -1
  120. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js +40 -98
  121. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js.map +1 -1
  122. package/dist/components/PlDataTable/createPlDataTable/index.cjs +1 -1
  123. package/dist/components/PlDataTable/createPlDataTable/index.cjs.map +1 -1
  124. package/dist/components/PlDataTable/createPlDataTable/index.d.ts +2 -2
  125. package/dist/components/PlDataTable/createPlDataTable/index.js +2 -2
  126. package/dist/components/PlDataTable/createPlDataTable/index.js.map +1 -1
  127. package/dist/components/PlDataTable/createPlDataTable/utils.cjs +51 -169
  128. package/dist/components/PlDataTable/createPlDataTable/utils.cjs.map +1 -1
  129. package/dist/components/PlDataTable/createPlDataTable/utils.d.ts +1 -1
  130. package/dist/components/PlDataTable/createPlDataTable/utils.d.ts.map +1 -1
  131. package/dist/components/PlDataTable/createPlDataTable/utils.js +52 -166
  132. package/dist/components/PlDataTable/createPlDataTable/utils.js.map +1 -1
  133. package/dist/components/PlDataTable/createPlDataTableSheet.cjs.map +1 -1
  134. package/dist/components/PlDataTable/createPlDataTableSheet.d.ts +1 -1
  135. package/dist/components/PlDataTable/createPlDataTableSheet.js.map +1 -1
  136. package/dist/components/PlDataTable/index.cjs +1 -1
  137. package/dist/components/PlDataTable/index.d.ts +4 -4
  138. package/dist/components/PlDataTable/index.js +2 -2
  139. package/dist/components/PlDataTable/labels.cjs +0 -1
  140. package/dist/components/PlDataTable/labels.cjs.map +1 -1
  141. package/dist/components/PlDataTable/labels.js +0 -1
  142. package/dist/components/PlDataTable/labels.js.map +1 -1
  143. package/dist/components/PlDataTable/state-migration.cjs +107 -10
  144. package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
  145. package/dist/components/PlDataTable/state-migration.d.ts +5 -4
  146. package/dist/components/PlDataTable/state-migration.d.ts.map +1 -1
  147. package/dist/components/PlDataTable/state-migration.js +107 -10
  148. package/dist/components/PlDataTable/state-migration.js.map +1 -1
  149. package/dist/components/PlDataTable/typesV7.d.ts +1 -36
  150. package/dist/components/PlDataTable/typesV7.d.ts.map +1 -1
  151. package/dist/components/PlDataTable/typesV8.d.ts +123 -0
  152. package/dist/components/PlDataTable/typesV8.d.ts.map +1 -0
  153. package/dist/components/PlDatasetSelector/build_dataset_options.cjs +27 -34
  154. package/dist/components/PlDatasetSelector/build_dataset_options.cjs.map +1 -1
  155. package/dist/components/PlDatasetSelector/build_dataset_options.d.ts.map +1 -1
  156. package/dist/components/PlDatasetSelector/build_dataset_options.js +27 -34
  157. package/dist/components/PlDatasetSelector/build_dataset_options.js.map +1 -1
  158. package/dist/components/PlDatasetSelector/enrichment_discovery.cjs +28 -33
  159. package/dist/components/PlDatasetSelector/enrichment_discovery.cjs.map +1 -1
  160. package/dist/components/PlDatasetSelector/enrichment_discovery.js +29 -34
  161. package/dist/components/PlDatasetSelector/enrichment_discovery.js.map +1 -1
  162. package/dist/components/PlDatasetSelector/filter_discovery.cjs +27 -17
  163. package/dist/components/PlDatasetSelector/filter_discovery.cjs.map +1 -1
  164. package/dist/components/PlDatasetSelector/filter_discovery.d.ts +24 -10
  165. package/dist/components/PlDatasetSelector/filter_discovery.d.ts.map +1 -1
  166. package/dist/components/PlDatasetSelector/filter_discovery.js +28 -18
  167. package/dist/components/PlDatasetSelector/filter_discovery.js.map +1 -1
  168. package/dist/components/PlDatasetSelector/index.d.ts +2 -2
  169. package/dist/components/index.cjs +1 -1
  170. package/dist/components/index.d.ts +5 -5
  171. package/dist/components/index.js +2 -2
  172. package/dist/filters/converters/filterToQuery.cjs +5 -6
  173. package/dist/filters/converters/filterToQuery.cjs.map +1 -1
  174. package/dist/filters/converters/filterToQuery.d.ts +12 -3
  175. package/dist/filters/converters/filterToQuery.d.ts.map +1 -1
  176. package/dist/filters/converters/filterToQuery.js +5 -6
  177. package/dist/filters/converters/filterToQuery.js.map +1 -1
  178. package/dist/filters/converters/index.d.ts +2 -2
  179. package/dist/filters/index.d.ts +2 -2
  180. package/dist/index.cjs +64 -35
  181. package/dist/index.d.ts +23 -15
  182. package/dist/index.js +15 -9
  183. package/dist/labels/derive_distinct_labels.cjs.map +1 -1
  184. package/dist/labels/derive_distinct_labels.d.ts +1 -2
  185. package/dist/labels/derive_distinct_labels.d.ts.map +1 -1
  186. package/dist/labels/derive_distinct_labels.js.map +1 -1
  187. package/dist/labels/derive_distinct_tooltips.cjs +1 -1
  188. package/dist/labels/derive_distinct_tooltips.cjs.map +1 -1
  189. package/dist/labels/derive_distinct_tooltips.d.ts +6 -3
  190. package/dist/labels/derive_distinct_tooltips.d.ts.map +1 -1
  191. package/dist/labels/derive_distinct_tooltips.js +1 -1
  192. package/dist/labels/derive_distinct_tooltips.js.map +1 -1
  193. package/dist/package.cjs +1 -1
  194. package/dist/package.js +1 -1
  195. package/dist/pframe_utils/axes.cjs.map +1 -1
  196. package/dist/pframe_utils/axes.d.ts +2 -2
  197. package/dist/pframe_utils/axes.d.ts.map +1 -1
  198. package/dist/pframe_utils/axes.js.map +1 -1
  199. package/dist/pframe_utils/columns.cjs +6 -10
  200. package/dist/pframe_utils/columns.cjs.map +1 -1
  201. package/dist/pframe_utils/columns.d.ts +4 -4
  202. package/dist/pframe_utils/columns.d.ts.map +1 -1
  203. package/dist/pframe_utils/columns.js +7 -11
  204. package/dist/pframe_utils/columns.js.map +1 -1
  205. package/dist/pframe_utils/index.cjs.map +1 -1
  206. package/dist/pframe_utils/index.d.ts +1 -1
  207. package/dist/pframe_utils/index.d.ts.map +1 -1
  208. package/dist/pframe_utils/index.js.map +1 -1
  209. package/dist/render/accessor.cjs +15 -16
  210. package/dist/render/accessor.cjs.map +1 -1
  211. package/dist/render/accessor.d.ts +7 -10
  212. package/dist/render/accessor.d.ts.map +1 -1
  213. package/dist/render/accessor.js +15 -16
  214. package/dist/render/accessor.js.map +1 -1
  215. package/dist/render/api.cjs +34 -36
  216. package/dist/render/api.cjs.map +1 -1
  217. package/dist/render/api.d.ts +30 -20
  218. package/dist/render/api.d.ts.map +1 -1
  219. package/dist/render/api.js +35 -38
  220. package/dist/render/api.js.map +1 -1
  221. package/dist/render/index.cjs +4 -0
  222. package/dist/render/index.d.ts +4 -4
  223. package/dist/render/index.js +3 -2
  224. package/dist/render/internal.cjs +3 -2
  225. package/dist/render/internal.cjs.map +1 -1
  226. package/dist/render/internal.d.ts +17 -9
  227. package/dist/render/internal.d.ts.map +1 -1
  228. package/dist/render/internal.js +3 -2
  229. package/dist/render/internal.js.map +1 -1
  230. package/dist/render/util/axis_filtering.cjs.map +1 -1
  231. package/dist/render/util/axis_filtering.js.map +1 -1
  232. package/dist/render/util/column_collection.cjs +6 -4
  233. package/dist/render/util/column_collection.cjs.map +1 -1
  234. package/dist/render/util/column_collection.d.ts +9 -9
  235. package/dist/render/util/column_collection.d.ts.map +1 -1
  236. package/dist/render/util/column_collection.js +6 -4
  237. package/dist/render/util/column_collection.js.map +1 -1
  238. package/dist/render/util/index.d.ts +2 -2
  239. package/dist/render/util/pcolumn_data.cjs +1 -1
  240. package/dist/render/util/pcolumn_data.cjs.map +1 -1
  241. package/dist/render/util/pcolumn_data.d.ts +3 -3
  242. package/dist/render/util/pcolumn_data.d.ts.map +1 -1
  243. package/dist/render/util/pcolumn_data.js +1 -1
  244. package/dist/render/util/pcolumn_data.js.map +1 -1
  245. package/dist/services/block_services.cjs +2 -1
  246. package/dist/services/block_services.cjs.map +1 -1
  247. package/dist/services/block_services.d.ts +1 -0
  248. package/dist/services/block_services.d.ts.map +1 -1
  249. package/dist/services/block_services.js +2 -1
  250. package/dist/services/block_services.js.map +1 -1
  251. package/dist/services/get_services.cjs +2 -2
  252. package/dist/services/get_services.cjs.map +1 -1
  253. package/dist/services/get_services.d.ts +4 -1
  254. package/dist/services/get_services.d.ts.map +1 -1
  255. package/dist/services/get_services.js +2 -2
  256. package/dist/services/get_services.js.map +1 -1
  257. package/package.json +9 -7
  258. package/src/columns/__test_helpers__/collection_driver.ts +197 -0
  259. package/src/columns/__test_helpers__/stub_registry.ts +134 -0
  260. package/src/columns/column.ts +46 -0
  261. package/src/columns/column_lazy.test.ts +201 -0
  262. package/src/columns/column_lazy.ts +311 -0
  263. package/src/columns/column_providers/index.ts +78 -0
  264. package/src/columns/column_providers/providers.ts +193 -0
  265. package/src/columns/column_providers/types.ts +24 -0
  266. package/src/columns/column_recipes/column_discovered_recipe.ts +231 -0
  267. package/src/columns/column_recipes/column_filtered_recipe.ts +184 -0
  268. package/src/columns/column_recipes/column_overrided_recipe.ts +146 -0
  269. package/src/columns/column_recipes/column_recipes.test.ts +681 -0
  270. package/src/columns/column_recipes/index.ts +127 -0
  271. package/src/columns/column_recipes/leaf_rebrand.ts +28 -0
  272. package/src/columns/column_recipes/types.ts +113 -0
  273. package/src/columns/columns_collection.test.ts +164 -0
  274. package/src/columns/columns_collection.ts +170 -0
  275. package/src/columns/derive_axis_values_labels.ts +98 -0
  276. package/src/columns/expand_by_partition.test.ts +146 -110
  277. package/src/columns/expand_by_partition.ts +72 -84
  278. package/src/columns/index.ts +7 -5
  279. package/src/columns/utils.test.ts +249 -0
  280. package/src/columns/utils.ts +226 -0
  281. package/src/components/PFrameForGraphs.ts +3 -1
  282. package/src/components/PlAnnotations/filters_ui.test.ts +46 -47
  283. package/src/components/PlDataTable/columnResolver.test.ts +122 -0
  284. package/src/components/PlDataTable/columnResolver.ts +57 -0
  285. package/src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts +9 -9
  286. package/src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts +31 -63
  287. package/src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts +85 -58
  288. package/src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts +316 -354
  289. package/src/components/PlDataTable/createPlDataTable/discoverColumns.ts +48 -144
  290. package/src/components/PlDataTable/createPlDataTable/index.ts +2 -2
  291. package/src/components/PlDataTable/createPlDataTable/utils.test.ts +60 -69
  292. package/src/components/PlDataTable/createPlDataTable/utils.ts +65 -173
  293. package/src/components/PlDataTable/createPlDataTableSheet.ts +1 -1
  294. package/src/components/PlDataTable/index.ts +4 -2
  295. package/src/components/PlDataTable/labels.ts +4 -33
  296. package/src/components/PlDataTable/state-migration.ts +151 -22
  297. package/src/components/PlDataTable/typesV8.ts +188 -0
  298. package/src/components/PlDatasetSelector/build_dataset_options.ts +35 -60
  299. package/src/components/PlDatasetSelector/enrichment_discovery.ts +65 -61
  300. package/src/components/PlDatasetSelector/filter_discovery.test.ts +110 -72
  301. package/src/components/PlDatasetSelector/filter_discovery.ts +51 -31
  302. package/src/filters/converters/filterToQuery.test.ts +15 -8
  303. package/src/filters/converters/filterToQuery.ts +22 -9
  304. package/src/filters/converters/filterUiToExpressionImpl.test.ts +35 -36
  305. package/src/labels/derive_distinct_labels.ts +1 -1
  306. package/src/labels/derive_distinct_tooltips.test.ts +7 -4
  307. package/src/labels/derive_distinct_tooltips.ts +3 -3
  308. package/src/pframe_utils/axes.ts +2 -2
  309. package/src/pframe_utils/columns.ts +14 -23
  310. package/src/pframe_utils/index.ts +1 -1
  311. package/src/render/accessor.ts +35 -38
  312. package/src/render/api.ts +45 -61
  313. package/src/render/index.ts +2 -1
  314. package/src/render/internal.ts +43 -10
  315. package/src/render/util/axis_filtering.ts +0 -1
  316. package/src/render/util/column_collection.ts +17 -17
  317. package/src/render/util/pcolumn_data.ts +5 -9
  318. package/src/services/block_services.ts +1 -0
  319. package/src/services/get_services.ts +5 -2
  320. package/dist/columns/column_collection_builder.cjs +0 -241
  321. package/dist/columns/column_collection_builder.cjs.map +0 -1
  322. package/dist/columns/column_collection_builder.d.ts +0 -119
  323. package/dist/columns/column_collection_builder.d.ts.map +0 -1
  324. package/dist/columns/column_collection_builder.js +0 -241
  325. package/dist/columns/column_collection_builder.js.map +0 -1
  326. package/dist/columns/column_selector.cjs +0 -49
  327. package/dist/columns/column_selector.cjs.map +0 -1
  328. package/dist/columns/column_selector.d.ts +0 -33
  329. package/dist/columns/column_selector.d.ts.map +0 -1
  330. package/dist/columns/column_selector.js +0 -47
  331. package/dist/columns/column_selector.js.map +0 -1
  332. package/dist/columns/column_snapshot.cjs +0 -19
  333. package/dist/columns/column_snapshot.cjs.map +0 -1
  334. package/dist/columns/column_snapshot.d.ts +0 -39
  335. package/dist/columns/column_snapshot.d.ts.map +0 -1
  336. package/dist/columns/column_snapshot.js +0 -18
  337. package/dist/columns/column_snapshot.js.map +0 -1
  338. package/dist/columns/column_snapshot_provider.cjs +0 -137
  339. package/dist/columns/column_snapshot_provider.cjs.map +0 -1
  340. package/dist/columns/column_snapshot_provider.d.ts +0 -74
  341. package/dist/columns/column_snapshot_provider.d.ts.map +0 -1
  342. package/dist/columns/column_snapshot_provider.js +0 -133
  343. package/dist/columns/column_snapshot_provider.js.map +0 -1
  344. package/dist/columns/ctx_column_sources.cjs +0 -80
  345. package/dist/columns/ctx_column_sources.cjs.map +0 -1
  346. package/dist/columns/ctx_column_sources.d.ts +0 -30
  347. package/dist/columns/ctx_column_sources.d.ts.map +0 -1
  348. package/dist/columns/ctx_column_sources.js +0 -79
  349. package/dist/columns/ctx_column_sources.js.map +0 -1
  350. package/src/columns/column_collection_builder.test.ts +0 -484
  351. package/src/columns/column_collection_builder.ts +0 -485
  352. package/src/columns/column_selector.test.ts +0 -90
  353. package/src/columns/column_selector.ts +0 -100
  354. package/src/columns/column_snapshot.ts +0 -58
  355. package/src/columns/column_snapshot_provider.ts +0 -194
  356. package/src/columns/ctx_column_sources.ts +0 -99
@@ -0,0 +1,78 @@
1
+ import { PColumn, type ColumnEntriesProvider } from "@milaboratories/pl-model-common";
2
+ import type { GlobalCfgRenderCtx, PColumnDataUniversal } from "../../render/internal";
3
+ import { getCfgRenderCtx } from "../../internal";
4
+ import { MainAccessorName, StagingAccessorName } from "../../render/internal";
5
+ import { TreeNodeAccessor } from "../../render/accessor";
6
+ import { ColumnLazy } from "../column_lazy";
7
+ import type { ColumnsSource } from "./types";
8
+ import { ArrayColumnsProvider, ColumnsProvider } from "./providers";
9
+
10
+ export * from "./types";
11
+ export * from "./providers";
12
+
13
+ /**
14
+ * Build the default set of ColumnsProviders for the ambient render ctx:
15
+ * - `AccessorColumnsProvider` over `outputs` (if present)
16
+ * - `AccessorColumnsProvider` over `prerun` (if present)
17
+ * - `ResultPoolColumnsProvider` over `rawResultPool`
18
+ *
19
+ * Pulls handles directly from the ambient `cfgRenderCtx`. Returns `[]` when
20
+ * called outside a render context.
21
+ *
22
+ * Result is memoised per-ctx (WeakMap → array). Repeated calls within the
23
+ * same render cycle return the same provider triplet — inner providers are
24
+ * also LRU-memoised by their content keys, so even a cache miss here doesn't
25
+ * re-walk the trees.
26
+ */
27
+ export const _ctxProvidersCache = new WeakMap<
28
+ GlobalCfgRenderCtx,
29
+ (ColumnEntriesProvider<TreeNodeAccessor> & ColumnsProvider)[]
30
+ >();
31
+
32
+ export function getCtxProviders(deps?: {
33
+ ctx?: GlobalCfgRenderCtx;
34
+ }): (ColumnEntriesProvider<TreeNodeAccessor> & ColumnsProvider)[] {
35
+ const ctx = deps?.ctx ?? getCfgRenderCtx();
36
+
37
+ const cached = _ctxProvidersCache.get(ctx);
38
+ if (cached !== undefined) return cached;
39
+
40
+ const providers: (ColumnEntriesProvider<TreeNodeAccessor> & ColumnsProvider)[] = [];
41
+
42
+ const outputs = ctx.getAccessorHandleByName(MainAccessorName);
43
+ if (outputs !== undefined) {
44
+ providers.push(ColumnsProvider(new TreeNodeAccessor(outputs, [MainAccessorName])));
45
+ }
46
+
47
+ const prerun = ctx.getAccessorHandleByName(StagingAccessorName);
48
+ if (prerun !== undefined) {
49
+ providers.push(ColumnsProvider(new TreeNodeAccessor(prerun, [StagingAccessorName])));
50
+ }
51
+
52
+ providers.push(ColumnsProvider(ctx.getUpstreamBlockCtx()));
53
+
54
+ _ctxProvidersCache.set(ctx, providers);
55
+ return providers;
56
+ }
57
+
58
+ export function isColumnProvider(source: unknown): source is ColumnsProvider {
59
+ if (typeof source !== "object" || source === null) return false;
60
+ const p = source as ColumnsProvider;
61
+ return typeof p.getColumns === "function" && typeof p.isFinal === "function";
62
+ }
63
+
64
+ export function toColumnProvider(source: ColumnsSource): ColumnsProvider {
65
+ if (isColumnArray(source)) return new ArrayColumnsProvider(source.columns, source.isFinal);
66
+ if (isColumnProvider(source)) return source;
67
+ if (source instanceof TreeNodeAccessor) return ColumnsProvider(source);
68
+ throw new Error("Unknown ColumnsSource type");
69
+ }
70
+
71
+ function isColumnArray(source: unknown): source is {
72
+ readonly columns: ReadonlyArray<PColumn<undefined | PColumnDataUniversal> | ColumnLazy>;
73
+ readonly isFinal: boolean;
74
+ } {
75
+ if (typeof source !== "object" || source === null) return false;
76
+ const s = source as { columns?: unknown; isFinal?: unknown };
77
+ return Array.isArray(s.columns) && typeof s.isFinal === "boolean";
78
+ }
@@ -0,0 +1,193 @@
1
+ import {
2
+ AccessorEntriesProvider,
3
+ ResultPoolEntriesProvider,
4
+ type PColumn,
5
+ type UpstreamBlockCtx,
6
+ } from "@milaboratories/pl-model-common";
7
+ import { AccessorHandle, PColumnDataUniversal, TreeNodeAccessor } from "../../render";
8
+ import { ColumnLazy, ColumnLazyImpl } from "../column_lazy";
9
+ import { getCfgRenderCtx } from "../../internal";
10
+ import { isNil } from "es-toolkit";
11
+ import { LRUCache } from "lru-cache";
12
+
13
+ /**
14
+ * Data source for sandbox column-list builders. Has nothing to say about
15
+ * id-resolution — `ColumnRegistry` (in `@milaboratories/pl-model-common`)
16
+ * consumes the separate `ColumnEntriesProvider` interface for that.
17
+ *
18
+ * Same name as the factory function below — they merge into one TS
19
+ * declaration: `ColumnsProvider` is callable AND the interface type.
20
+ */
21
+ export interface ColumnsProvider {
22
+ /** Returns all currently known PColumn columns as lazy views. */
23
+ getColumns(): ColumnLazy[];
24
+ /** Whether the provider has finished enumerating all its columns. */
25
+ isFinal(): boolean;
26
+ }
27
+
28
+ /**
29
+ * Unified memoised factory dispatching to the right provider flavour by the
30
+ * source shape:
31
+ * - `TreeNodeAccessor` → {@link AccessorColumnsProvider}
32
+ * (indexed by `root.handle`, walks the accessor tree once per root).
33
+ * - `UpstreamBlockCtx<AccessorHandle>[]` (or omitted — pulled from the
34
+ * ambient ctx) → {@link ResultPoolColumnsProvider}
35
+ * (indexed by a content-hash of the block list).
36
+ *
37
+ * Both branches return cached instances within their LRU window, so repeated
38
+ * calls with the same source skip re-walking / re-hashing.
39
+ */
40
+ export function ColumnsProvider(
41
+ source?: TreeNodeAccessor | ReadonlyArray<UpstreamBlockCtx<AccessorHandle>>,
42
+ ) {
43
+ if (isNil(source) || Array.isArray(source)) {
44
+ return ResultPoolColumnsProvider(source);
45
+ } else if (source instanceof TreeNodeAccessor) {
46
+ return AccessorColumnsProvider(source);
47
+ } else {
48
+ throw new Error("Unknown columns provider source");
49
+ }
50
+ }
51
+
52
+ /**
53
+ * Memoised constructor — same `root.handle` returns the same
54
+ * {@link AccessorColumnsProviderImpl}, so `indexAccessorRoot` runs once per
55
+ * accessor root (within the LRU window).
56
+ */
57
+ const _accessorProviderCache = new LRUCache<AccessorHandle, AccessorColumnsProviderImpl>({
58
+ max: 64,
59
+ });
60
+ export function AccessorColumnsProvider(root: TreeNodeAccessor): AccessorColumnsProvider {
61
+ let provider = _accessorProviderCache.get(root.handle);
62
+ if (provider === undefined) {
63
+ provider = new AccessorColumnsProviderImpl(root);
64
+ _accessorProviderCache.set(root.handle, provider);
65
+ }
66
+ return provider;
67
+ }
68
+
69
+ /**
70
+ * Memoised constructor — same `rawPool` content returns the same
71
+ * {@link ResultPoolColumnsProviderImpl}, so `indexPoolBlock` runs once per
72
+ * pool snapshot (within the LRU window).
73
+ */
74
+ const _resultPoolProviderCache = new LRUCache<string, ResultPoolColumnsProviderImpl>({ max: 4 });
75
+ export function ResultPoolColumnsProvider(
76
+ rawPool: ReadonlyArray<
77
+ UpstreamBlockCtx<AccessorHandle>
78
+ > = getCfgRenderCtx().getUpstreamBlockCtx(),
79
+ ): ResultPoolColumnsProvider {
80
+ const key = hashRawPool(rawPool);
81
+ let provider = _resultPoolProviderCache.get(key);
82
+ if (provider === undefined) {
83
+ provider = new ResultPoolColumnsProviderImpl(rawPool);
84
+ _resultPoolProviderCache.set(key, provider);
85
+ }
86
+ return provider;
87
+ }
88
+
89
+ /**
90
+ * Simple provider wrapping an array of PColumns. Sandbox-only —
91
+ * implements {@link ColumnsProvider} (lazy-view enumeration). It is *not* an
92
+ * id-index source — `ColumnRegistry` does not consume it.
93
+ */
94
+ export class ArrayColumnsProvider implements ColumnsProvider {
95
+ private readonly columns: ColumnLazy[];
96
+
97
+ constructor(
98
+ columns: ReadonlyArray<PColumn<undefined | PColumnDataUniversal> | ColumnLazy>,
99
+ private readonly _isFinal: boolean,
100
+ ) {
101
+ this.columns = columns.map((c) => ColumnLazyImpl.fromColumn(c));
102
+ }
103
+
104
+ getColumns(): ColumnLazy[] {
105
+ return this.columns;
106
+ }
107
+
108
+ isFinal(): boolean {
109
+ return this._isFinal;
110
+ }
111
+ }
112
+
113
+ /**
114
+ * Sandbox-specific provider over a {@link TreeNodeAccessor} root. Uses the
115
+ * accessor's own `resolvePath` as the canonical root path for id construction,
116
+ * and adds `getColumns()` returning {@link ColumnLazy}s on top of the generic
117
+ * entries index.
118
+ */
119
+ export class AccessorColumnsProviderImpl
120
+ extends AccessorEntriesProvider<TreeNodeAccessor>
121
+ implements ColumnsProvider
122
+ {
123
+ private cachedColumns?: ColumnLazy[];
124
+
125
+ constructor(root: TreeNodeAccessor) {
126
+ super(root, root.resolvePath);
127
+ }
128
+
129
+ getColumns(): ColumnLazy[] {
130
+ if (this.cachedColumns !== undefined) return this.cachedColumns;
131
+ return (this.cachedColumns = Array.from(this.entries.values())
132
+ .map((e) => ColumnLazyImpl.fromAccessor(e))
133
+ .filter((v): v is ColumnLazy => !isNil(v)));
134
+ }
135
+ }
136
+
137
+ /** Public type alias — value of the same name is the memoised factory above. */
138
+ export type AccessorColumnsProvider = AccessorColumnsProviderImpl;
139
+
140
+ /**
141
+ * Sandbox-specific result-pool provider. Accepts the raw handle-shaped blocks
142
+ * returned by {@link GlobalCfgRenderCtxMethods.getUpstreamBlockCtx} and
143
+ * wraps them into {@link TreeNodeAccessor}s, then adds `getColumns()`.
144
+ */
145
+ export class ResultPoolColumnsProviderImpl
146
+ extends ResultPoolEntriesProvider<TreeNodeAccessor>
147
+ implements ColumnsProvider
148
+ {
149
+ private cachedColumns?: ColumnLazy[];
150
+
151
+ constructor(
152
+ rawPool: ReadonlyArray<
153
+ UpstreamBlockCtx<AccessorHandle>
154
+ > = getCfgRenderCtx().getUpstreamBlockCtx(),
155
+ ) {
156
+ const blocks = rawPool.map((b) => ({
157
+ blockId: b.blockId,
158
+ prodCtx:
159
+ b.prodCtx !== undefined
160
+ ? new TreeNodeAccessor(b.prodCtx, [b.blockId, "prodCtx"])
161
+ : undefined,
162
+ stagingCtx:
163
+ b.stagingCtx !== undefined
164
+ ? new TreeNodeAccessor(b.stagingCtx, [b.blockId, "stagingCtx"])
165
+ : undefined,
166
+ prodIncomplete: b.prodIncomplete,
167
+ stagingIncomplete: b.stagingIncomplete,
168
+ }));
169
+
170
+ super(blocks);
171
+ }
172
+
173
+ getColumns(): ColumnLazy[] {
174
+ if (this.cachedColumns !== undefined) return this.cachedColumns;
175
+ return (this.cachedColumns = Array.from(this.getPObjectEntries().values())
176
+ .map((e) => ColumnLazyImpl.fromAccessor(e))
177
+ .filter((v): v is ColumnLazy => !isNil(v)));
178
+ }
179
+ }
180
+
181
+ /** Public type alias — value of the same name is the memoised factory above. */
182
+ export type ResultPoolColumnsProvider = ResultPoolColumnsProviderImpl;
183
+
184
+ function hashRawPool(rawPool: ReadonlyArray<UpstreamBlockCtx<AccessorHandle>>): string {
185
+ return rawPool
186
+ .map(
187
+ (b) =>
188
+ `${b.blockId}\x1f${b.prodCtx ?? ""}\x1f${b.stagingCtx ?? ""}\x1f${
189
+ b.prodIncomplete ? 1 : 0
190
+ }\x1f${b.stagingIncomplete ? 1 : 0}`,
191
+ )
192
+ .join("\x1e");
193
+ }
@@ -0,0 +1,24 @@
1
+ import type { PColumn } from "@milaboratories/pl-model-common";
2
+ import { TreeNodeAccessor } from "../../render";
3
+ import type { PColumnDataUniversal } from "../../render/internal";
4
+ import type { ColumnLazy } from "../column_lazy";
5
+ import type { ColumnRecipe } from "../column_recipes";
6
+ import type { ColumnsProvider } from "./providers";
7
+
8
+ /**
9
+ * Union of types that can serve as column sources for helpers and builders.
10
+ * Includes TreeNodeAccessor, ColumnsProvider, and arrays of columns.
11
+ *
12
+ * The array form accepts plain {@link PColumn}s (materialized snapshots),
13
+ * {@link ColumnLazy} leaves, or any {@link ColumnRecipe} — builders only
14
+ * need each entry's `id` for serialization.
15
+ */
16
+ export type ColumnsSource =
17
+ | ColumnsProvider
18
+ | TreeNodeAccessor
19
+ | {
20
+ readonly columns: ReadonlyArray<
21
+ PColumn<undefined | PColumnDataUniversal> | ColumnLazy | ColumnRecipe
22
+ >;
23
+ readonly isFinal: boolean;
24
+ };
@@ -0,0 +1,231 @@
1
+ import {
2
+ distillColumnDiscoveredKey,
3
+ extractPObjectId,
4
+ stringifyColumnDiscoveredId,
5
+ type AxisQualification,
6
+ type ColumnDiscoveredId,
7
+ type ColumnDiscoveredKey,
8
+ type ColumnUniversalId,
9
+ type PColumnSpec,
10
+ type PObjectId,
11
+ type SpecOverrides,
12
+ type SpecQuery,
13
+ } from "@milaboratories/pl-model-common";
14
+ import type { GlobalCfgRenderCtx } from "../../render/internal";
15
+ import type { ColumnFieldStatus, ColumnResolutionStatus } from "./types";
16
+ import { ColumnRecipe } from "./index";
17
+ import { ColumnOverriddenRecipe } from "./column_overrided_recipe";
18
+ import { Column } from "../column";
19
+ import { rebrandLeafId } from "./leaf_rebrand";
20
+ import { throwError } from "@milaboratories/helpers";
21
+
22
+ /**
23
+ * Recipe for columns identified by a {@link ColumnDiscoveredKey}: a base
24
+ * column + a `path` of linkers + qualifications.
25
+ *
26
+ * Specifics:
27
+ * - References more than one column (`column` + each `path[i].column`);
28
+ * {@link getDataStatus} aggregates across the whole set.
29
+ * - {@link getQuery} assembles the {@link SpecQuery} locally
30
+ * ({@link buildSpecQuery}) — the hit is inlined as its own recipe's query
31
+ * tree, linkers fold inside-out into nested `linkerJoin` nodes.
32
+ * - {@link getSpec} passes through to the hit column's own spec: the linker
33
+ * chain only enables co-indexing and does not remap the hit's `axesSpec`, so
34
+ * no engine round-trip is needed (mirrors the Discovered branch of
35
+ * `reconstructSpecFromId` on the host side).
36
+ */
37
+ export class ColumnDiscoveredRecipe implements ColumnRecipe<ColumnDiscoveredId> {
38
+ /**
39
+ * Validate the key + resolve every referenced column via
40
+ * {@link ColumnLazy.fromId} (which itself checks the leaf accessor reports
41
+ * `hasData()`). Returns `undefined` if the key is malformed or any
42
+ * referenced column is not yet spec-resolvable.
43
+ *
44
+ * Spec JSON is deserialized lazily on first {@link getSpec}/{@link getQuery}.
45
+ */
46
+ static fromKey(
47
+ key: ColumnDiscoveredKey,
48
+ opts: { ctx?: GlobalCfgRenderCtx } = {},
49
+ ): undefined | ColumnDiscoveredRecipe {
50
+ const distilled = distillColumnDiscoveredKey(key);
51
+ const columns: Record<ColumnUniversalId, Column> = {};
52
+ for (const uniId of referencedUniIdsOf(distilled)) {
53
+ const recipe = Column(uniId, opts);
54
+ if (recipe === undefined) return undefined;
55
+ columns[uniId] = recipe;
56
+ }
57
+ return new ColumnDiscoveredRecipe(distilled, columns);
58
+ }
59
+
60
+ /**
61
+ * Static counterpart to {@link fromKey}: returns the resolution status of
62
+ * a {@link ColumnDiscoveredKey} without constructing the recipe. Worst-wins
63
+ * across every referenced {@link ColumnUniversalId} (hit + path linkers),
64
+ * each resolved via the top-level {@link ColumnRecipe.getStatus} dispatcher.
65
+ */
66
+ static getStatusByKey(
67
+ key: ColumnDiscoveredKey,
68
+ opts: { ctx?: GlobalCfgRenderCtx } = {},
69
+ ): ColumnResolutionStatus {
70
+ const distilled = distillColumnDiscoveredKey(key);
71
+ let worst: ColumnResolutionStatus = "present";
72
+ for (const uniId of referencedUniIdsOf(distilled)) {
73
+ const s = ColumnRecipe.getStatus(uniId, opts);
74
+ if (s === "absent") return "absent";
75
+ if (s === "resolving") worst = "resolving";
76
+ }
77
+ return worst;
78
+ }
79
+
80
+ readonly id: ColumnDiscoveredId;
81
+ private specCache?: { readonly value: PColumnSpec };
82
+ private queryCache?: { readonly value: SpecQuery };
83
+ private dataStatusCache?: { readonly value: ColumnFieldStatus };
84
+
85
+ private constructor(
86
+ private readonly key: ColumnDiscoveredKey,
87
+ private readonly columns: Record<ColumnUniversalId, ColumnRecipe>,
88
+ ) {
89
+ this.id = stringifyColumnDiscoveredId(this.key);
90
+ }
91
+
92
+ /**
93
+ * Universal id of the hit column (excluding path/qualifications on top).
94
+ * May itself be a wrapped id (Overridden / Filtered / nested Discovered) —
95
+ * preserves projections applied to the underlying column.
96
+ */
97
+ getHitId(): ColumnUniversalId {
98
+ return this.key.column;
99
+ }
100
+
101
+ /**
102
+ * Axis qualifications attached to the hit column itself — applied to the
103
+ * outer-join entry that wraps this column at the consumer boundary.
104
+ */
105
+ getColumnQualifications(): readonly AxisQualification[] {
106
+ return this.key.columnQualifications ?? [];
107
+ }
108
+
109
+ /**
110
+ * Per-primary-column qualifications applied to the primary anchors on
111
+ * this group's side. Keyed by the external primary column id.
112
+ */
113
+ getQueriesQualifications(): Readonly<Record<PObjectId, AxisQualification[]>> {
114
+ return this.key.queriesQualifications ?? {};
115
+ }
116
+
117
+ /**
118
+ * Leaf {@link PObjectId}s the recipe physically depends on: hit column +
119
+ * each linker in `path`, with any projection wrappers unwrapped down to
120
+ * their underlying storage column. Used to track real-data dependencies
121
+ * (e.g. {@link getDataStatus}), not projected identities.
122
+ */
123
+ getReferencedIds(): PObjectId[] {
124
+ return [...new Set([...referencedUniIdsOf(this.key)].map((uniId) => extractPObjectId(uniId)))];
125
+ }
126
+
127
+ /**
128
+ * Final spec of a discovered hit is just the hit column's own spec: the
129
+ * linker chain only enables co-indexing, it does not remap the hit's
130
+ * `axesSpec`, and axis qualifications live on the outer join entry (see
131
+ * {@link buildSpecQuery}), not in the spec. So pass through to the hit
132
+ * recipe's `getSpec()` — no engine round-trip needed. This mirrors the
133
+ * Discovered branch of `reconstructSpecFromId` on the host side.
134
+ */
135
+ getSpec(): PColumnSpec {
136
+ if (this.specCache === undefined) {
137
+ const hit =
138
+ this.columns[this.key.column] ??
139
+ throwError(`ColumnDiscoveredRecipe.getSpec: missing column ${this.key.column}`);
140
+ this.specCache = { value: hit.getSpec() };
141
+ }
142
+ return this.specCache.value;
143
+ }
144
+
145
+ /** IR for building the final spec — see {@link buildSpecQuery}. */
146
+ getQuery(): SpecQuery {
147
+ if (this.queryCache === undefined) {
148
+ this.queryCache = { value: this.buildSpecQuery() };
149
+ }
150
+ return this.queryCache.value;
151
+ }
152
+
153
+ getDataStatus(): ColumnFieldStatus {
154
+ if (this.dataStatusCache === undefined) {
155
+ this.dataStatusCache = {
156
+ value: Object.values(this.columns).reduce<ColumnFieldStatus>((worst, lazy) => {
157
+ const s = lazy.getDataStatus();
158
+ if (s === "absent" || worst === "absent") return "absent";
159
+ if (s === "resolving") return "resolving";
160
+ return worst;
161
+ }, "present"),
162
+ };
163
+ }
164
+ return this.dataStatusCache.value;
165
+ }
166
+
167
+ /**
168
+ * Discovered + overrides → Overridden<Discovered>. Delegates to the
169
+ * flat-merge factory of ColumnOverriddenRecipe; subsequent `withSpecs`
170
+ * calls merge at the Overridden level (one wrapper, no nesting).
171
+ */
172
+ withSpecs(overrides: SpecOverrides): ColumnRecipe {
173
+ return ColumnOverriddenRecipe.wrap(this, overrides);
174
+ }
175
+
176
+ /**
177
+ * Assembles the SpecQuery for this discovered hit by folding `key.path`
178
+ * around the hit column.
179
+ *
180
+ * The hit (innermost) is built by inlining `columns[key.column].getQuery()`
181
+ * — recursing into the hit's own recipe — so wrapping layers on the hit
182
+ * (Overridden / Filtered / nested Discovered) appear in the produced tree.
183
+ * The previous `pframeSpec.buildQuery` path was a flat
184
+ * {@link PObjectId}-only call and could not express that.
185
+ *
186
+ * Linkers stay as plain column references on the linker side of
187
+ * `linkerJoin` (the spec node has no slot for a query-side linker); the
188
+ * linker's recipe id is used directly. The frame registered in
189
+ * {@link getSpec} carries each recipe's final spec under that same id, so
190
+ * the engine resolves linker axes from the post-projection spec.
191
+ *
192
+ * Path ordering matches {@link ColumnDiscoveredKey.path}: `path[0]` is
193
+ * outermost, `path[N-1]` is closest to the hit. We fold from the inside
194
+ * out — innermost wrap first — so the result lines up with that convention.
195
+ *
196
+ * `columnQualifications` / `queriesQualifications` are not emitted here —
197
+ * qualifications live on a {@link SpecQueryJoinEntry} wrapper (lost on
198
+ * unwrapping to {@link SpecQuery}). External consumers apply them at the
199
+ * outer join via {@link getColumnQualifications} / {@link getQueriesQualifications}.
200
+ */
201
+ private buildSpecQuery(): SpecQuery {
202
+ // Preserve the inner hit recipe's full query tree — it may carry
203
+ // wrappers (specOverride / sliceAxes / nested linkerJoin) that the
204
+ // host needs to apply correctly. We only rebrand the terminal column
205
+ // leaf to this.id so two variants of the same physical hit reached via
206
+ // different linker chains stay distinct columns in the engine output.
207
+ const hitRecipe =
208
+ this.columns[this.key.column] ??
209
+ throwError(`ColumnDiscoveredRecipe.buildSpecQuery: missing column ${this.key.column}`);
210
+ let query: SpecQuery = rebrandLeafId(hitRecipe.getQuery(), hitRecipe.id, this.id);
211
+ const path = this.key.path ?? [];
212
+
213
+ for (let i = path.length - 1; i >= 0; i--) {
214
+ const linker =
215
+ this.columns[path[i].column] ??
216
+ throwError(
217
+ `ColumnDiscoveredRecipe.buildSpecQuery: missing linker column ${path[i].column}`,
218
+ );
219
+ query = {
220
+ type: "linkerJoin",
221
+ linker: linker.getQuery(),
222
+ secondary: [{ entry: query }],
223
+ };
224
+ }
225
+ return query;
226
+ }
227
+ }
228
+
229
+ function referencedUniIdsOf(key: ColumnDiscoveredKey): Set<ColumnUniversalId> {
230
+ return new Set<ColumnUniversalId>([key.column, ...(key.path ?? []).map((item) => item.column)]);
231
+ }