@platforma-sdk/model 1.79.27 → 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 +10 -8
  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,76 @@
1
+ import { TreeNodeAccessor } from "../render/accessor.js";
2
+ import "../render/index.js";
3
+ import { isColumnLazy } from "./column_lazy.js";
4
+ import { ColumnsCollection, isColumnsCollection } from "./columns_collection.js";
5
+ import { PColumnName, canonicalizeAxisId, getAxisId } from "@milaboratories/pl-model-common";
6
+ //#region src/columns/derive_axis_values_labels.ts
7
+ const RT_JSON = "PColumnData/Json";
8
+ const RT_JSON_PARTITIONED = "PColumnData/JsonPartitioned";
9
+ /**
10
+ * Build an `axisValuesLabels` callback by discovering `pl7.app/label` columns
11
+ * from the given source, eagerly materialising their value→label maps, and
12
+ * keying them by canonical axis id.
13
+ *
14
+ * Modern replacement for `ctx.resultPool.findLabels` — uses the new
15
+ * column-access mechanism (filtered {@link ColumnsCollection}) instead of
16
+ * walking the raw result pool.
17
+ *
18
+ * Pair with {@link expandByPartition} (or any consumer expecting the
19
+ * `(axisId) => Record<axisValue, label>` shape).
20
+ *
21
+ * Skips:
22
+ * - non-leaf recipes (only direct `ColumnLazy` data is read);
23
+ * - label columns whose `axesSpec.length !== 1`;
24
+ * - label columns whose data resource type isn't `PColumnData/Json` /
25
+ * `PColumnData/JsonPartitioned`.
26
+ */
27
+ function deriveAxisValuesLabels(source, opts) {
28
+ const byAxis = (source === void 0 ? ColumnsCollection(void 0, opts) : isColumnsCollection(source) ? source : ColumnsCollection(source, opts)).filter({ include: { name: [{
29
+ type: "exact",
30
+ value: PColumnName.Label
31
+ }] } }).getColumns().reduce((map, col) => {
32
+ if (!isColumnLazy(col)) return map;
33
+ const spec = col.getSpec();
34
+ if (spec.axesSpec.length !== 1) return map;
35
+ const data = col.getData();
36
+ if (!(data instanceof TreeNodeAccessor)) return map;
37
+ const labelMap = readLabelMap(data);
38
+ if (!labelMap) return map;
39
+ map.set(canonicalizeAxisId(getAxisId(spec.axesSpec[0])), labelMap);
40
+ return map;
41
+ }, /* @__PURE__ */ new Map());
42
+ return (axisId) => byAxis.get(canonicalizeAxisId(axisId));
43
+ }
44
+ function readLabelMap(acc) {
45
+ const rt = acc.resourceType.name;
46
+ if (rt === RT_JSON) {
47
+ const json = acc.getDataAsJson();
48
+ return json?.data ? parseLabelKeys(json.data) : void 0;
49
+ }
50
+ if (rt === RT_JSON_PARTITIONED) return acc.listInputFields().reduce((merged, partKey) => {
51
+ const part = acc.resolve({
52
+ field: partKey,
53
+ assertFieldType: "Input",
54
+ ignoreError: true
55
+ });
56
+ if (!part) return merged;
57
+ const json = part.getDataAsJson();
58
+ if (!json?.data) return merged;
59
+ return Object.assign(merged, parseLabelKeys(json.data));
60
+ }, {});
61
+ }
62
+ function parseLabelKeys(raw) {
63
+ return Object.entries(raw).reduce((acc, [k, v]) => {
64
+ try {
65
+ const parsed = JSON.parse(k);
66
+ acc[Array.isArray(parsed) ? parsed[0] : parsed] = v;
67
+ } catch {
68
+ acc[k] = v;
69
+ }
70
+ return acc;
71
+ }, {});
72
+ }
73
+ //#endregion
74
+ export { deriveAxisValuesLabels };
75
+
76
+ //# sourceMappingURL=derive_axis_values_labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive_axis_values_labels.js","names":[],"sources":["../../src/columns/derive_axis_values_labels.ts"],"sourcesContent":["import type { AxisId } from \"@milaboratories/pl-model-common\";\nimport { canonicalizeAxisId, getAxisId, PColumnName } from \"@milaboratories/pl-model-common\";\nimport type { ColumnsSource } from \"./column_providers\";\nimport { ColumnsCollection, isColumnsCollection } from \"./columns_collection\";\nimport type { GlobalCfgRenderCtx } from \"../render/internal\";\nimport { TreeNodeAccessor } from \"../render\";\nimport { isColumnLazy } from \"./column_lazy\";\n\nconst RT_JSON = \"PColumnData/Json\";\nconst RT_JSON_PARTITIONED = \"PColumnData/JsonPartitioned\";\n\n/**\n * Build an `axisValuesLabels` callback by discovering `pl7.app/label` columns\n * from the given source, eagerly materialising their value→label maps, and\n * keying them by canonical axis id.\n *\n * Modern replacement for `ctx.resultPool.findLabels` — uses the new\n * column-access mechanism (filtered {@link ColumnsCollection}) instead of\n * walking the raw result pool.\n *\n * Pair with {@link expandByPartition} (or any consumer expecting the\n * `(axisId) => Record<axisValue, label>` shape).\n *\n * Skips:\n * - non-leaf recipes (only direct `ColumnLazy` data is read);\n * - label columns whose `axesSpec.length !== 1`;\n * - label columns whose data resource type isn't `PColumnData/Json` /\n * `PColumnData/JsonPartitioned`.\n */\nexport function deriveAxisValuesLabels(\n source?: ColumnsCollection | (ColumnsCollection | ColumnsSource)[],\n opts?: { ctx?: GlobalCfgRenderCtx },\n): (axisId: AxisId) => Record<string | number, string> | undefined {\n const collection =\n source === undefined\n ? ColumnsCollection(undefined, opts)\n : isColumnsCollection(source)\n ? source\n : ColumnsCollection(source, opts);\n\n const labelCols = collection\n .filter({ include: { name: [{ type: \"exact\", value: PColumnName.Label }] } })\n .getColumns();\n\n const byAxis = labelCols.reduce<Map<string, Record<string | number, string>>>((map, col) => {\n if (!isColumnLazy(col)) return map;\n const spec = col.getSpec();\n if (spec.axesSpec.length !== 1) return map;\n\n const data = col.getData();\n if (!(data instanceof TreeNodeAccessor)) return map;\n\n const labelMap = readLabelMap(data);\n if (!labelMap) return map;\n\n map.set(canonicalizeAxisId(getAxisId(spec.axesSpec[0])), labelMap);\n return map;\n }, new Map());\n\n return (axisId) => byAxis.get(canonicalizeAxisId(axisId));\n}\n\nfunction readLabelMap(acc: TreeNodeAccessor): undefined | Record<string | number, string> {\n const rt = acc.resourceType.name;\n\n if (rt === RT_JSON) {\n const json = acc.getDataAsJson<{ data?: Record<string, string> }>();\n return json?.data ? parseLabelKeys(json.data) : undefined;\n }\n\n if (rt === RT_JSON_PARTITIONED) {\n return acc.listInputFields().reduce<Record<string | number, string>>((merged, partKey) => {\n const part = acc.resolve({\n field: partKey,\n assertFieldType: \"Input\",\n ignoreError: true,\n });\n if (!part) return merged;\n const json = part.getDataAsJson<{ data?: Record<string, string> }>();\n if (!json?.data) return merged;\n return Object.assign(merged, parseLabelKeys(json.data));\n }, {});\n }\n\n return undefined;\n}\n\nfunction parseLabelKeys(raw: Record<string, string>): Record<string | number, string> {\n return Object.entries(raw).reduce<Record<string | number, string>>((acc, [k, v]) => {\n try {\n const parsed = JSON.parse(k);\n acc[Array.isArray(parsed) ? parsed[0] : parsed] = v;\n } catch {\n acc[k] = v;\n }\n return acc;\n }, {});\n}\n"],"mappings":";;;;;;AAQA,MAAM,UAAU;AAChB,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;AAoB5B,SAAgB,uBACd,QACA,MACiE;CAYjE,MAAM,UAVJ,WAAW,KAAA,IACP,kBAAkB,KAAA,GAAW,IAAI,IACjC,oBAAoB,MAAM,IACxB,SACA,kBAAkB,QAAQ,IAAI,EAAA,CAGnC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC;EAAE,MAAM;EAAS,OAAO,YAAY;CAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAC5E,WAEoB,CAAC,CAAC,QAAsD,KAAK,QAAQ;EAC1F,IAAI,CAAC,aAAa,GAAG,GAAG,OAAO;EAC/B,MAAM,OAAO,IAAI,QAAQ;EACzB,IAAI,KAAK,SAAS,WAAW,GAAG,OAAO;EAEvC,MAAM,OAAO,IAAI,QAAQ;EACzB,IAAI,EAAE,gBAAgB,mBAAmB,OAAO;EAEhD,MAAM,WAAW,aAAa,IAAI;EAClC,IAAI,CAAC,UAAU,OAAO;EAEtB,IAAI,IAAI,mBAAmB,UAAU,KAAK,SAAS,EAAE,CAAC,GAAG,QAAQ;EACjE,OAAO;CACT,mBAAG,IAAI,IAAI,CAAC;CAEZ,QAAQ,WAAW,OAAO,IAAI,mBAAmB,MAAM,CAAC;AAC1D;AAEA,SAAS,aAAa,KAAoE;CACxF,MAAM,KAAK,IAAI,aAAa;CAE5B,IAAI,OAAO,SAAS;EAClB,MAAM,OAAO,IAAI,cAAiD;EAClE,OAAO,MAAM,OAAO,eAAe,KAAK,IAAI,IAAI,KAAA;CAClD;CAEA,IAAI,OAAO,qBACT,OAAO,IAAI,gBAAgB,CAAC,CAAC,QAAyC,QAAQ,YAAY;EACxF,MAAM,OAAO,IAAI,QAAQ;GACvB,OAAO;GACP,iBAAiB;GACjB,aAAa;EACf,CAAC;EACD,IAAI,CAAC,MAAM,OAAO;EAClB,MAAM,OAAO,KAAK,cAAiD;EACnE,IAAI,CAAC,MAAM,MAAM,OAAO;EACxB,OAAO,OAAO,OAAO,QAAQ,eAAe,KAAK,IAAI,CAAC;CACxD,GAAG,CAAC,CAAC;AAIT;AAEA,SAAS,eAAe,KAA8D;CACpF,OAAO,OAAO,QAAQ,GAAG,CAAC,CAAC,QAAyC,KAAK,CAAC,GAAG,OAAO;EAClF,IAAI;GACF,MAAM,SAAS,KAAK,MAAM,CAAC;GAC3B,IAAI,MAAM,QAAQ,MAAM,IAAI,OAAO,KAAK,UAAU;EACpD,QAAQ;GACN,IAAI,KAAK;EACX;EACA,OAAO;CACT,GAAG,CAAC,CAAC;AACP"}
@@ -1,80 +1,77 @@
1
- const require_axis_filtering = require("../render/util/axis_filtering.cjs");
1
+ const require_accessor = require("../render/accessor.cjs");
2
2
  const require_pcolumn_data = require("../render/util/pcolumn_data.cjs");
3
- const require_column_snapshot = require("./column_snapshot.cjs");
3
+ const require_column_filtered_recipe = require("./column_recipes/column_filtered_recipe.cjs");
4
+ const require_column_overrided_recipe = require("./column_recipes/column_overrided_recipe.cjs");
5
+ const require_utils = require("./utils.cjs");
4
6
  let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
5
7
  //#region src/columns/expand_by_partition.ts
8
+ const MAX_KEY_COMBINATIONS = 1e4;
6
9
  /**
7
- * Expand snapshots by splitting along partition axes.
10
+ * Expand each input column along the requested partition axes into one
11
+ * {@link ColumnRecipe} per Cartesian combination of unique partition values.
12
+ *
13
+ * Each split is produced as `ColumnOverriddenRecipe.wrap(ColumnFilteredRecipe.wrap(inner, axisFilters), { domain, annotations })`:
14
+ * - `ColumnFilteredRecipe` pins all split axes at once (one wrap call with
15
+ * every `[idx, value]` pair) and removes them from `axesSpec`. The
16
+ * engine performs the data slicing via the `sliceAxes` query node.
17
+ * - `ColumnOverriddenRecipe` overlays a `domain[axisName] = String(value)`
18
+ * entry per split axis and appends a `split:<canonicalAxisId>` trace
19
+ * entry per split axis to the existing `pl7.app/trace` annotation.
8
20
  *
9
- * For each snapshot, reads partition data, enumerates unique keys on the
10
- * split axes, and produces one output snapshot per key combination —
11
- * with the split axes removed from `axesSpec` and a `pl7.app/trace`
12
- * annotation recording the split origin.
21
+ * The recipe id is a canonical
22
+ * `ColumnOverriddenId(source: ColumnFilteredId(source: inner.id, axisFilters), specOverrides)`
23
+ * — distinct per split combination, parseable by `extractPObjectId`, and
24
+ * traversable by recipe walkers.
13
25
  *
14
- * Returns `{ items: [], complete: false }` when any snapshot's data
15
- * is not ready (status !== 'ready' or partition data unavailable).
26
+ * Returns `undefined` when any input's `getData()` is not a
27
+ * {@link TreeNodeAccessor} — partition inspection is not yet possible.
16
28
  */
17
- function expandByPartition(snapshots, splitAxes, opts) {
18
- if (splitAxes.length === 0) return {
19
- items: snapshots,
20
- complete: true
21
- };
29
+ function expandByPartition(inputs, splitAxes, opts) {
30
+ if (splitAxes.length === 0) return [...inputs];
22
31
  const splitAxisIdxs = splitAxes.map((a) => a.idx).sort((a, b) => a - b);
32
+ const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];
23
33
  const result = [];
24
- for (const snapshot of snapshots) {
25
- if (snapshot.dataStatus !== "ready" || snapshot.data === void 0) return {
26
- items: [],
27
- complete: false
28
- };
29
- const dataEntries = require_pcolumn_data.convertOrParsePColumnData(snapshot.data.get());
30
- if (dataEntries === void 0) return {
31
- items: [],
32
- complete: false
33
- };
34
- if (!(0, _milaboratories_pl_model_common.isPartitionedDataInfoEntries)(dataEntries)) throw new Error(`Splitting requires Partitioned DataInfoEntries, but got ${dataEntries.type} for column ${String(snapshot.id)}`);
35
- const uniqueKeys = require_pcolumn_data.getUniquePartitionKeys(dataEntries);
36
- const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];
37
- if (maxSplitIdx >= dataEntries.partitionKeyLength) throw new Error(`Not enough partition keys (${dataEntries.partitionKeyLength}) for requested split axes (max index ${maxSplitIdx}) in column ${snapshot.spec.name}`);
38
- const axesLabels = splitAxisIdxs.map((idx) => opts?.axisLabels?.((0, _milaboratories_pl_model_common.getAxisId)(snapshot.spec.axesSpec[idx])));
34
+ for (const inner of inputs) {
35
+ const data = require_utils.getLeafColumnData(inner);
36
+ if (!(data instanceof require_accessor.TreeNodeAccessor) && !(0, _milaboratories_pl_model_common.isDataInfoEntries)(data)) return;
37
+ const uniqueKeys = require_pcolumn_data.getUniquePartitionKeys(data);
38
+ if (uniqueKeys === void 0) return void 0;
39
+ if (maxSplitIdx >= uniqueKeys.length) throw new Error(`Not enough partition keys (${uniqueKeys.length}) for requested split axes (max index ${maxSplitIdx}) in column ${inner.getSpec().name}`);
40
+ const spec = inner.getSpec();
41
+ const axesSpec = spec.axesSpec;
42
+ const splitAxisSpecs = splitAxisIdxs.map((idx) => axesSpec[idx]);
43
+ const splitAxisIds = splitAxisSpecs.map((axisSpec) => (0, _milaboratories_pl_model_common.getAxisId)(axisSpec));
44
+ const axesLabels = splitAxisIds.map((axisId) => opts?.axisValuesLabels?.(axisId));
45
+ const existingTraceRaw = (0, _milaboratories_pl_model_common.readAnnotation)(spec, _milaboratories_pl_model_common.Annotation.Trace);
46
+ const baseTrace = existingTraceRaw ? JSON.parse(existingTraceRaw) ?? [] : [];
39
47
  const keyCombinations = generateKeyCombinations(uniqueKeys, splitAxisIdxs);
40
48
  if (keyCombinations.length === 0) continue;
41
- const newAxesSpec = [...snapshot.spec.axesSpec];
42
- for (let i = splitAxisIdxs.length - 1; i >= 0; i--) newAxesSpec.splice(splitAxisIdxs[i], 1);
43
49
  for (const keyCombo of keyCombinations) {
44
50
  const axisFilters = keyCombo.map((value, sAxisIdx) => [splitAxisIdxs[sAxisIdx], value]);
45
- const traceEntries = keyCombo.map((value, sAxisIdx) => {
46
- const axisIdx = splitAxisIdxs[sAxisIdx];
47
- const axisId = (0, _milaboratories_pl_model_common.getAxisId)(snapshot.spec.axesSpec[axisIdx]);
51
+ const domain = {};
52
+ const traceEntries = [];
53
+ for (let sAxisIdx = 0; sAxisIdx < keyCombo.length; sAxisIdx++) {
54
+ const value = keyCombo[sAxisIdx];
55
+ const axisSpec = splitAxisSpecs[sAxisIdx];
56
+ const axisId = splitAxisIds[sAxisIdx];
48
57
  const label = axesLabels[sAxisIdx]?.[value] ?? String(value);
49
- return {
58
+ domain[axisSpec.name] = String(value);
59
+ traceEntries.push({
50
60
  type: `split:${(0, _milaboratories_pl_model_common.canonicalizeAxisId)(axisId)}`,
51
61
  label,
52
62
  importance: 1e6
53
- };
54
- });
55
- const filteredData = require_axis_filtering.filterDataInfoEntries(dataEntries, axisFilters);
56
- const adjustedSpec = {
57
- ...snapshot.spec,
58
- axesSpec: newAxesSpec,
59
- annotations: {
60
- ...snapshot.spec.annotations,
61
- "pl7.app/trace": JSON.stringify(traceEntries)
62
- }
63
- };
64
- result.push({
65
- id: snapshot.id,
66
- spec: adjustedSpec,
67
- dataStatus: "ready",
68
- data: require_column_snapshot.createReadyColumnData(() => (0, _milaboratories_pl_model_common.entriesToDataInfo)(filteredData))
63
+ });
64
+ }
65
+ const filtered = require_column_filtered_recipe.ColumnFilteredRecipe.wrap(inner, axisFilters);
66
+ const overrided = require_column_overrided_recipe.ColumnOverriddenRecipe.wrap(filtered, {
67
+ domain,
68
+ annotations: { [_milaboratories_pl_model_common.Annotation.Trace]: JSON.stringify([...baseTrace, ...traceEntries]) }
69
69
  });
70
+ result.push(overrided);
70
71
  }
71
72
  }
72
- return {
73
- items: result,
74
- complete: true
75
- };
73
+ return result;
76
74
  }
77
- const MAX_KEY_COMBINATIONS = 1e4;
78
75
  function generateKeyCombinations(uniqueKeys, splitAxisIdxs) {
79
76
  const combinations = [];
80
77
  function generate(currentCombo, sAxisIdx) {
@@ -1 +1 @@
1
- {"version":3,"file":"expand_by_partition.cjs","names":["convertOrParsePColumnData","getUniquePartitionKeys","filterDataInfoEntries","createReadyColumnData"],"sources":["../../src/columns/expand_by_partition.ts"],"sourcesContent":["import type {\n AxisFilterByIdx,\n AxisFilterValue,\n AxisId,\n PartitionedDataInfoEntries,\n PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n canonicalizeAxisId,\n entriesToDataInfo,\n getAxisId,\n isPartitionedDataInfoEntries,\n} from \"@milaboratories/pl-model-common\";\nimport type { TreeNodeAccessor } from \"../render/accessor\";\nimport { filterDataInfoEntries } from \"../render/util/axis_filtering\";\nimport { convertOrParsePColumnData, getUniquePartitionKeys } from \"../render/util/pcolumn_data\";\nimport type { ColumnSnapshot } from \"./column_snapshot\";\nimport { createReadyColumnData } from \"./column_snapshot\";\n\n// --- Types ---\n\nexport interface SplitAxis {\n /** Index of the axis in the column's axesSpec to split by. */\n readonly idx: number;\n}\n\nexport interface ExpandByPartitionOpts {\n /** Resolve axis values to human-readable labels. */\n axisLabels?: (axisId: AxisId) => undefined | Record<string | number, string>;\n}\n\nexport interface ExpandByPartitionResult {\n /** Expanded snapshots (one per key combination per original snapshot). */\n readonly items: ColumnSnapshot<PObjectId>[];\n /** False if any column's data was not ready for splitting. */\n readonly complete: boolean;\n}\n\n// --- Implementation ---\n\n/**\n * Expand snapshots by splitting along partition axes.\n *\n * For each snapshot, reads partition data, enumerates unique keys on the\n * split axes, and produces one output snapshot per key combination —\n * with the split axes removed from `axesSpec` and a `pl7.app/trace`\n * annotation recording the split origin.\n *\n * Returns `{ items: [], complete: false }` when any snapshot's data\n * is not ready (status !== 'ready' or partition data unavailable).\n */\nexport function expandByPartition(\n snapshots: ColumnSnapshot<PObjectId>[],\n splitAxes: SplitAxis[],\n opts?: ExpandByPartitionOpts,\n): ExpandByPartitionResult {\n if (splitAxes.length === 0) {\n return { items: snapshots, complete: true };\n }\n\n const splitAxisIdxs = splitAxes.map((a) => a.idx).sort((a, b) => a - b);\n const result: ColumnSnapshot<PObjectId>[] = [];\n\n for (const snapshot of snapshots) {\n if (snapshot.dataStatus !== \"ready\" || snapshot.data === undefined) {\n return { items: [], complete: false };\n }\n\n const rawData = snapshot.data.get();\n const dataEntries = convertOrParsePColumnData(rawData as TreeNodeAccessor | undefined);\n\n if (dataEntries === undefined) {\n return { items: [], complete: false };\n }\n\n if (!isPartitionedDataInfoEntries(dataEntries)) {\n throw new Error(\n `Splitting requires Partitioned DataInfoEntries, but got ${dataEntries.type} for column ${String(snapshot.id)}`,\n );\n }\n\n const uniqueKeys = getUniquePartitionKeys(dataEntries);\n\n const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];\n if (maxSplitIdx >= dataEntries.partitionKeyLength) {\n throw new Error(\n `Not enough partition keys (${dataEntries.partitionKeyLength}) for requested split axes (max index ${maxSplitIdx}) in column ${snapshot.spec.name}`,\n );\n }\n\n // Resolve labels for each split axis\n const axesLabels: (undefined | Record<string | number, string>)[] = splitAxisIdxs.map((idx) =>\n opts?.axisLabels?.(getAxisId(snapshot.spec.axesSpec[idx])),\n );\n\n // Generate all key combinations across split axes\n const keyCombinations = generateKeyCombinations(uniqueKeys, splitAxisIdxs);\n if (keyCombinations.length === 0) continue;\n\n // Build adjusted axesSpec (remove split axes in reverse order)\n const newAxesSpec = [...snapshot.spec.axesSpec];\n for (let i = splitAxisIdxs.length - 1; i >= 0; i--) {\n newAxesSpec.splice(splitAxisIdxs[i], 1);\n }\n\n for (const keyCombo of keyCombinations) {\n const axisFilters: AxisFilterByIdx[] = keyCombo.map(\n (value, sAxisIdx): AxisFilterByIdx => [splitAxisIdxs[sAxisIdx], value as AxisFilterValue],\n );\n\n const traceEntries = keyCombo.map((value, sAxisIdx) => {\n const axisIdx = splitAxisIdxs[sAxisIdx];\n const axisId = getAxisId(snapshot.spec.axesSpec[axisIdx]);\n const labelMap = axesLabels[sAxisIdx];\n const label = labelMap?.[value] ?? String(value);\n return {\n type: `split:${canonicalizeAxisId(axisId)}`,\n label,\n importance: 1_000_000,\n };\n });\n\n const filteredData = filterDataInfoEntries(\n dataEntries as PartitionedDataInfoEntries<TreeNodeAccessor>,\n axisFilters,\n );\n\n const adjustedSpec = {\n ...snapshot.spec,\n axesSpec: newAxesSpec,\n annotations: {\n ...snapshot.spec.annotations,\n \"pl7.app/trace\": JSON.stringify(traceEntries),\n },\n };\n\n result.push({\n id: snapshot.id,\n spec: adjustedSpec,\n dataStatus: \"ready\",\n data: createReadyColumnData(() => entriesToDataInfo(filteredData)),\n });\n }\n }\n\n return { items: result, complete: true };\n}\n\nconst MAX_KEY_COMBINATIONS = 10_000;\n\nfunction generateKeyCombinations(\n uniqueKeys: (string | number)[][],\n splitAxisIdxs: number[],\n): (string | number)[][] {\n const combinations: (string | number)[][] = [];\n\n function generate(currentCombo: (string | number)[], sAxisIdx: number): void {\n if (sAxisIdx >= splitAxisIdxs.length) {\n combinations.push([...currentCombo]);\n if (combinations.length > MAX_KEY_COMBINATIONS) {\n throw new Error(\"Too many key combinations, aborting.\");\n }\n return;\n }\n\n const axisIdx = splitAxisIdxs[sAxisIdx];\n if (axisIdx >= uniqueKeys.length) {\n throw new Error(\n `Axis index ${axisIdx} out of bounds for unique keys array (length ${uniqueKeys.length})`,\n );\n }\n\n const axisValues = uniqueKeys[axisIdx];\n if (!axisValues || axisValues.length === 0) {\n combinations.length = 0;\n return;\n }\n\n for (const val of axisValues) {\n currentCombo.push(val);\n generate(currentCombo, sAxisIdx + 1);\n currentCombo.pop();\n }\n }\n\n generate([], 0);\n return combinations;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAmDA,SAAgB,kBACd,WACA,WACA,MACyB;CACzB,IAAI,UAAU,WAAW,GACvB,OAAO;EAAE,OAAO;EAAW,UAAU;CAAK;CAG5C,MAAM,gBAAgB,UAAU,KAAK,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC;CACtE,MAAM,SAAsC,CAAC;CAE7C,KAAK,MAAM,YAAY,WAAW;EAChC,IAAI,SAAS,eAAe,WAAW,SAAS,SAAS,KAAA,GACvD,OAAO;GAAE,OAAO,CAAC;GAAG,UAAU;EAAM;EAItC,MAAM,cAAcA,qBAAAA,0BADJ,SAAS,KAAK,IACsB,CAAiC;EAErF,IAAI,gBAAgB,KAAA,GAClB,OAAO;GAAE,OAAO,CAAC;GAAG,UAAU;EAAM;EAGtC,IAAI,EAAA,GAAA,gCAAA,6BAAA,CAA8B,WAAW,GAC3C,MAAM,IAAI,MACR,2DAA2D,YAAY,KAAK,cAAc,OAAO,SAAS,EAAE,GAC9G;EAGF,MAAM,aAAaC,qBAAAA,uBAAuB,WAAW;EAErD,MAAM,cAAc,cAAc,cAAc,SAAS;EACzD,IAAI,eAAe,YAAY,oBAC7B,MAAM,IAAI,MACR,8BAA8B,YAAY,mBAAmB,wCAAwC,YAAY,cAAc,SAAS,KAAK,MAC/I;EAIF,MAAM,aAA8D,cAAc,KAAK,QACrF,MAAM,cAAA,GAAA,gCAAA,UAAA,CAAuB,SAAS,KAAK,SAAS,IAAI,CAAC,CAC3D;EAGA,MAAM,kBAAkB,wBAAwB,YAAY,aAAa;EACzE,IAAI,gBAAgB,WAAW,GAAG;EAGlC,MAAM,cAAc,CAAC,GAAG,SAAS,KAAK,QAAQ;EAC9C,KAAK,IAAI,IAAI,cAAc,SAAS,GAAG,KAAK,GAAG,KAC7C,YAAY,OAAO,cAAc,IAAI,CAAC;EAGxC,KAAK,MAAM,YAAY,iBAAiB;GACtC,MAAM,cAAiC,SAAS,KAC7C,OAAO,aAA8B,CAAC,cAAc,WAAW,KAAwB,CAC1F;GAEA,MAAM,eAAe,SAAS,KAAK,OAAO,aAAa;IACrD,MAAM,UAAU,cAAc;IAC9B,MAAM,UAAA,GAAA,gCAAA,UAAA,CAAmB,SAAS,KAAK,SAAS,QAAQ;IAExD,MAAM,QADW,WAAW,SACN,GAAG,UAAU,OAAO,KAAK;IAC/C,OAAO;KACL,MAAM,UAAA,GAAA,gCAAA,mBAAA,CAA4B,MAAM;KACxC;KACA,YAAY;IACd;GACF,CAAC;GAED,MAAM,eAAeC,uBAAAA,sBACnB,aACA,WACF;GAEA,MAAM,eAAe;IACnB,GAAG,SAAS;IACZ,UAAU;IACV,aAAa;KACX,GAAG,SAAS,KAAK;KACjB,iBAAiB,KAAK,UAAU,YAAY;IAC9C;GACF;GAEA,OAAO,KAAK;IACV,IAAI,SAAS;IACb,MAAM;IACN,YAAY;IACZ,MAAMC,wBAAAA,6BAAAA,GAAAA,gCAAAA,kBAAAA,CAA8C,YAAY,CAAC;GACnE,CAAC;EACH;CACF;CAEA,OAAO;EAAE,OAAO;EAAQ,UAAU;CAAK;AACzC;AAEA,MAAM,uBAAuB;AAE7B,SAAS,wBACP,YACA,eACuB;CACvB,MAAM,eAAsC,CAAC;CAE7C,SAAS,SAAS,cAAmC,UAAwB;EAC3E,IAAI,YAAY,cAAc,QAAQ;GACpC,aAAa,KAAK,CAAC,GAAG,YAAY,CAAC;GACnC,IAAI,aAAa,SAAS,sBACxB,MAAM,IAAI,MAAM,sCAAsC;GAExD;EACF;EAEA,MAAM,UAAU,cAAc;EAC9B,IAAI,WAAW,WAAW,QACxB,MAAM,IAAI,MACR,cAAc,QAAQ,+CAA+C,WAAW,OAAO,EACzF;EAGF,MAAM,aAAa,WAAW;EAC9B,IAAI,CAAC,cAAc,WAAW,WAAW,GAAG;GAC1C,aAAa,SAAS;GACtB;EACF;EAEA,KAAK,MAAM,OAAO,YAAY;GAC5B,aAAa,KAAK,GAAG;GACrB,SAAS,cAAc,WAAW,CAAC;GACnC,aAAa,IAAI;EACnB;CACF;CAEA,SAAS,CAAC,GAAG,CAAC;CACd,OAAO;AACT"}
1
+ {"version":3,"file":"expand_by_partition.cjs","names":["getLeafColumnData","TreeNodeAccessor","getUniquePartitionKeys","Annotation","ColumnFilteredRecipe","ColumnOverriddenRecipe"],"sources":["../../src/columns/expand_by_partition.ts"],"sourcesContent":["import type {\n AxisFilterByIdx,\n AxisFilterValue,\n AxisId,\n TraceEntry,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeAxisId,\n getAxisId,\n isDataInfoEntries,\n readAnnotation,\n} from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport { getUniquePartitionKeys } from \"../render/util/pcolumn_data\";\nimport type { ColumnRecipe } from \"./column_recipes\";\nimport { ColumnFilteredRecipe } from \"./column_recipes/column_filtered_recipe\";\nimport { ColumnOverriddenRecipe } from \"./column_recipes/column_overrided_recipe\";\nimport { Column } from \"./column\";\nimport { getLeafColumnData } from \"./utils\";\n\n// --- Types ---\n\nexport interface SplitAxis {\n /** Index of the axis in the column's axesSpec to split by. */\n readonly idx: number;\n}\n\nexport interface ExpandByPartitionOpts {\n /** Resolve axis values to human-readable labels. */\n axisValuesLabels?: (axisId: AxisId) => undefined | Record<string | number, string>;\n}\n\n// --- Implementation ---\n\nconst MAX_KEY_COMBINATIONS = 10_000;\n\n/**\n * Expand each input column along the requested partition axes into one\n * {@link ColumnRecipe} per Cartesian combination of unique partition values.\n *\n * Each split is produced as `ColumnOverriddenRecipe.wrap(ColumnFilteredRecipe.wrap(inner, axisFilters), { domain, annotations })`:\n * - `ColumnFilteredRecipe` pins all split axes at once (one wrap call with\n * every `[idx, value]` pair) and removes them from `axesSpec`. The\n * engine performs the data slicing via the `sliceAxes` query node.\n * - `ColumnOverriddenRecipe` overlays a `domain[axisName] = String(value)`\n * entry per split axis and appends a `split:<canonicalAxisId>` trace\n * entry per split axis to the existing `pl7.app/trace` annotation.\n *\n * The recipe id is a canonical\n * `ColumnOverriddenId(source: ColumnFilteredId(source: inner.id, axisFilters), specOverrides)`\n * — distinct per split combination, parseable by `extractPObjectId`, and\n * traversable by recipe walkers.\n *\n * Returns `undefined` when any input's `getData()` is not a\n * {@link TreeNodeAccessor} — partition inspection is not yet possible.\n */\nexport function expandByPartition(\n inputs: Column[],\n splitAxes: SplitAxis[],\n opts?: ExpandByPartitionOpts,\n): ColumnRecipe[] | undefined {\n if (splitAxes.length === 0) {\n return [...inputs];\n }\n\n const splitAxisIdxs = splitAxes.map((a) => a.idx).sort((a, b) => a - b);\n const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];\n\n const result: ColumnRecipe[] = [];\n\n for (const inner of inputs) {\n const data = getLeafColumnData(inner);\n // Partition inspection requires either a live tree-accessor or already\n // parsed DataInfoEntries. Anything else means the input is not yet ready.\n if (!(data instanceof TreeNodeAccessor) && !isDataInfoEntries(data)) {\n return undefined;\n }\n\n const uniqueKeys = getUniquePartitionKeys(data);\n if (uniqueKeys === undefined) return undefined;\n\n if (maxSplitIdx >= uniqueKeys.length) {\n throw new Error(\n `Not enough partition keys (${uniqueKeys.length}) for requested split axes (max index ${maxSplitIdx}) in column ${inner.getSpec().name}`,\n );\n }\n\n const spec = inner.getSpec();\n const axesSpec = spec.axesSpec;\n const splitAxisSpecs = splitAxisIdxs.map((idx) => axesSpec[idx]);\n const splitAxisIds = splitAxisSpecs.map((axisSpec) => getAxisId(axisSpec));\n const axesLabels = splitAxisIds.map((axisId) => opts?.axisValuesLabels?.(axisId));\n\n const existingTraceRaw = readAnnotation(spec, Annotation.Trace);\n const baseTrace: TraceEntry[] = existingTraceRaw\n ? ((JSON.parse(existingTraceRaw) as TraceEntry[]) ?? [])\n : [];\n\n const keyCombinations = generateKeyCombinations(uniqueKeys, splitAxisIdxs);\n if (keyCombinations.length === 0) continue;\n\n for (const keyCombo of keyCombinations) {\n const axisFilters: AxisFilterByIdx[] = keyCombo.map(\n (value, sAxisIdx): AxisFilterByIdx => [splitAxisIdxs[sAxisIdx], value as AxisFilterValue],\n );\n\n const domain: Record<string, string> = {};\n const traceEntries: TraceEntry[] = [];\n for (let sAxisIdx = 0; sAxisIdx < keyCombo.length; sAxisIdx++) {\n const value = keyCombo[sAxisIdx];\n const axisSpec = splitAxisSpecs[sAxisIdx];\n const axisId = splitAxisIds[sAxisIdx];\n const labelMap = axesLabels[sAxisIdx];\n const label = labelMap?.[value] ?? String(value);\n domain[axisSpec.name] = String(value);\n traceEntries.push({\n type: `split:${canonicalizeAxisId(axisId)}`,\n label,\n importance: 1_000_000,\n });\n }\n\n const filtered = ColumnFilteredRecipe.wrap(inner, axisFilters);\n const overrided = ColumnOverriddenRecipe.wrap(filtered, {\n domain,\n annotations: {\n [Annotation.Trace]: JSON.stringify([...baseTrace, ...traceEntries]),\n },\n });\n\n result.push(overrided);\n }\n }\n\n return result;\n}\n\nfunction generateKeyCombinations(\n uniqueKeys: (string | number)[][],\n splitAxisIdxs: number[],\n): (string | number)[][] {\n const combinations: (string | number)[][] = [];\n\n function generate(currentCombo: (string | number)[], sAxisIdx: number): void {\n if (sAxisIdx >= splitAxisIdxs.length) {\n combinations.push([...currentCombo]);\n if (combinations.length > MAX_KEY_COMBINATIONS) {\n throw new Error(\"Too many key combinations, aborting.\");\n }\n return;\n }\n\n const axisIdx = splitAxisIdxs[sAxisIdx];\n if (axisIdx >= uniqueKeys.length) {\n throw new Error(\n `Axis index ${axisIdx} out of bounds for unique keys array (length ${uniqueKeys.length})`,\n );\n }\n\n const axisValues = uniqueKeys[axisIdx];\n if (!axisValues || axisValues.length === 0) {\n combinations.length = 0;\n return;\n }\n\n for (const val of axisValues) {\n currentCombo.push(val);\n generate(currentCombo, sAxisIdx + 1);\n currentCombo.pop();\n }\n }\n\n generate([], 0);\n return combinations;\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
- import { ColumnSnapshot } from "./column_snapshot.js";
2
- import { AxisId, PObjectId } from "@milaboratories/pl-model-common";
1
+ import { Column } from "./column.js";
2
+ import { ColumnRecipe } from "./column_recipes/index.js";
3
+ import { AxisId } from "@milaboratories/pl-model-common";
3
4
 
4
5
  //#region src/columns/expand_by_partition.d.ts
5
6
  interface SplitAxis {
@@ -8,26 +9,29 @@ interface SplitAxis {
8
9
  }
9
10
  interface ExpandByPartitionOpts {
10
11
  /** Resolve axis values to human-readable labels. */
11
- axisLabels?: (axisId: AxisId) => undefined | Record<string | number, string>;
12
- }
13
- interface ExpandByPartitionResult {
14
- /** Expanded snapshots (one per key combination per original snapshot). */
15
- readonly items: ColumnSnapshot<PObjectId>[];
16
- /** False if any column's data was not ready for splitting. */
17
- readonly complete: boolean;
12
+ axisValuesLabels?: (axisId: AxisId) => undefined | Record<string | number, string>;
18
13
  }
19
14
  /**
20
- * Expand snapshots by splitting along partition axes.
15
+ * Expand each input column along the requested partition axes into one
16
+ * {@link ColumnRecipe} per Cartesian combination of unique partition values.
17
+ *
18
+ * Each split is produced as `ColumnOverriddenRecipe.wrap(ColumnFilteredRecipe.wrap(inner, axisFilters), { domain, annotations })`:
19
+ * - `ColumnFilteredRecipe` pins all split axes at once (one wrap call with
20
+ * every `[idx, value]` pair) and removes them from `axesSpec`. The
21
+ * engine performs the data slicing via the `sliceAxes` query node.
22
+ * - `ColumnOverriddenRecipe` overlays a `domain[axisName] = String(value)`
23
+ * entry per split axis and appends a `split:<canonicalAxisId>` trace
24
+ * entry per split axis to the existing `pl7.app/trace` annotation.
21
25
  *
22
- * For each snapshot, reads partition data, enumerates unique keys on the
23
- * split axes, and produces one output snapshot per key combination —
24
- * with the split axes removed from `axesSpec` and a `pl7.app/trace`
25
- * annotation recording the split origin.
26
+ * The recipe id is a canonical
27
+ * `ColumnOverriddenId(source: ColumnFilteredId(source: inner.id, axisFilters), specOverrides)`
28
+ * — distinct per split combination, parseable by `extractPObjectId`, and
29
+ * traversable by recipe walkers.
26
30
  *
27
- * Returns `{ items: [], complete: false }` when any snapshot's data
28
- * is not ready (status !== 'ready' or partition data unavailable).
31
+ * Returns `undefined` when any input's `getData()` is not a
32
+ * {@link TreeNodeAccessor} — partition inspection is not yet possible.
29
33
  */
30
- declare function expandByPartition(snapshots: ColumnSnapshot<PObjectId>[], splitAxes: SplitAxis[], opts?: ExpandByPartitionOpts): ExpandByPartitionResult;
34
+ declare function expandByPartition(inputs: Column[], splitAxes: SplitAxis[], opts?: ExpandByPartitionOpts): ColumnRecipe[] | undefined;
31
35
  //#endregion
32
- export { ExpandByPartitionOpts, ExpandByPartitionResult, SplitAxis, expandByPartition };
36
+ export { ExpandByPartitionOpts, SplitAxis, expandByPartition };
33
37
  //# sourceMappingURL=expand_by_partition.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"expand_by_partition.d.ts","names":[],"sources":["../../src/columns/expand_by_partition.ts"],"mappings":";;;;UAqBiB,SAAA;;WAEN,GAAG;AAAA;AAAA,UAGG,qBAAA;EAHH;EAKZ,UAAA,IAAc,MAAA,EAAQ,MAAA,iBAAuB,MAAM;AAAA;AAAA,UAGpC,uBAAA;;WAEN,KAAA,EAAO,cAAc,CAAC,SAAA;EAL/B;EAAA,SAOS,QAAA;AAAA;;;AAP0C;AAGrD;;;;;;;;iBAoBgB,iBAAA,CACd,SAAA,EAAW,cAAA,CAAe,SAAA,KAC1B,SAAA,EAAW,SAAA,IACX,IAAA,GAAO,qBAAA,GACN,uBAAA"}
1
+ {"version":3,"file":"expand_by_partition.d.ts","names":[],"sources":["../../src/columns/expand_by_partition.ts"],"mappings":";;;;;UAuBiB,SAAA;;WAEN,GAAG;AAAA;AAAA,UAGG,qBAAA;EAHH;EAKZ,gBAAA,IAAoB,MAAA,EAAQ,MAAA,iBAAuB,MAAM;AAAA;;;;;;;;;AAAA;AA2B3D;;;;;;;;;;;iBAAgB,iBAAA,CACd,MAAA,EAAQ,MAAA,IACR,SAAA,EAAW,SAAA,IACX,IAAA,GAAO,qBAAA,GACN,YAAA"}
@@ -1,80 +1,77 @@
1
- import { filterDataInfoEntries } from "../render/util/axis_filtering.js";
2
- import { convertOrParsePColumnData, getUniquePartitionKeys } from "../render/util/pcolumn_data.js";
3
- import { createReadyColumnData } from "./column_snapshot.js";
4
- import { canonicalizeAxisId, entriesToDataInfo, getAxisId, isPartitionedDataInfoEntries } from "@milaboratories/pl-model-common";
1
+ import { TreeNodeAccessor } from "../render/accessor.js";
2
+ import { getUniquePartitionKeys } from "../render/util/pcolumn_data.js";
3
+ import { ColumnFilteredRecipe } from "./column_recipes/column_filtered_recipe.js";
4
+ import { ColumnOverriddenRecipe } from "./column_recipes/column_overrided_recipe.js";
5
+ import { getLeafColumnData } from "./utils.js";
6
+ import { Annotation, canonicalizeAxisId, getAxisId, isDataInfoEntries, readAnnotation } from "@milaboratories/pl-model-common";
5
7
  //#region src/columns/expand_by_partition.ts
8
+ const MAX_KEY_COMBINATIONS = 1e4;
6
9
  /**
7
- * Expand snapshots by splitting along partition axes.
10
+ * Expand each input column along the requested partition axes into one
11
+ * {@link ColumnRecipe} per Cartesian combination of unique partition values.
12
+ *
13
+ * Each split is produced as `ColumnOverriddenRecipe.wrap(ColumnFilteredRecipe.wrap(inner, axisFilters), { domain, annotations })`:
14
+ * - `ColumnFilteredRecipe` pins all split axes at once (one wrap call with
15
+ * every `[idx, value]` pair) and removes them from `axesSpec`. The
16
+ * engine performs the data slicing via the `sliceAxes` query node.
17
+ * - `ColumnOverriddenRecipe` overlays a `domain[axisName] = String(value)`
18
+ * entry per split axis and appends a `split:<canonicalAxisId>` trace
19
+ * entry per split axis to the existing `pl7.app/trace` annotation.
8
20
  *
9
- * For each snapshot, reads partition data, enumerates unique keys on the
10
- * split axes, and produces one output snapshot per key combination —
11
- * with the split axes removed from `axesSpec` and a `pl7.app/trace`
12
- * annotation recording the split origin.
21
+ * The recipe id is a canonical
22
+ * `ColumnOverriddenId(source: ColumnFilteredId(source: inner.id, axisFilters), specOverrides)`
23
+ * — distinct per split combination, parseable by `extractPObjectId`, and
24
+ * traversable by recipe walkers.
13
25
  *
14
- * Returns `{ items: [], complete: false }` when any snapshot's data
15
- * is not ready (status !== 'ready' or partition data unavailable).
26
+ * Returns `undefined` when any input's `getData()` is not a
27
+ * {@link TreeNodeAccessor} — partition inspection is not yet possible.
16
28
  */
17
- function expandByPartition(snapshots, splitAxes, opts) {
18
- if (splitAxes.length === 0) return {
19
- items: snapshots,
20
- complete: true
21
- };
29
+ function expandByPartition(inputs, splitAxes, opts) {
30
+ if (splitAxes.length === 0) return [...inputs];
22
31
  const splitAxisIdxs = splitAxes.map((a) => a.idx).sort((a, b) => a - b);
32
+ const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];
23
33
  const result = [];
24
- for (const snapshot of snapshots) {
25
- if (snapshot.dataStatus !== "ready" || snapshot.data === void 0) return {
26
- items: [],
27
- complete: false
28
- };
29
- const dataEntries = convertOrParsePColumnData(snapshot.data.get());
30
- if (dataEntries === void 0) return {
31
- items: [],
32
- complete: false
33
- };
34
- if (!isPartitionedDataInfoEntries(dataEntries)) throw new Error(`Splitting requires Partitioned DataInfoEntries, but got ${dataEntries.type} for column ${String(snapshot.id)}`);
35
- const uniqueKeys = getUniquePartitionKeys(dataEntries);
36
- const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];
37
- if (maxSplitIdx >= dataEntries.partitionKeyLength) throw new Error(`Not enough partition keys (${dataEntries.partitionKeyLength}) for requested split axes (max index ${maxSplitIdx}) in column ${snapshot.spec.name}`);
38
- const axesLabels = splitAxisIdxs.map((idx) => opts?.axisLabels?.(getAxisId(snapshot.spec.axesSpec[idx])));
34
+ for (const inner of inputs) {
35
+ const data = getLeafColumnData(inner);
36
+ if (!(data instanceof TreeNodeAccessor) && !isDataInfoEntries(data)) return;
37
+ const uniqueKeys = getUniquePartitionKeys(data);
38
+ if (uniqueKeys === void 0) return void 0;
39
+ if (maxSplitIdx >= uniqueKeys.length) throw new Error(`Not enough partition keys (${uniqueKeys.length}) for requested split axes (max index ${maxSplitIdx}) in column ${inner.getSpec().name}`);
40
+ const spec = inner.getSpec();
41
+ const axesSpec = spec.axesSpec;
42
+ const splitAxisSpecs = splitAxisIdxs.map((idx) => axesSpec[idx]);
43
+ const splitAxisIds = splitAxisSpecs.map((axisSpec) => getAxisId(axisSpec));
44
+ const axesLabels = splitAxisIds.map((axisId) => opts?.axisValuesLabels?.(axisId));
45
+ const existingTraceRaw = readAnnotation(spec, Annotation.Trace);
46
+ const baseTrace = existingTraceRaw ? JSON.parse(existingTraceRaw) ?? [] : [];
39
47
  const keyCombinations = generateKeyCombinations(uniqueKeys, splitAxisIdxs);
40
48
  if (keyCombinations.length === 0) continue;
41
- const newAxesSpec = [...snapshot.spec.axesSpec];
42
- for (let i = splitAxisIdxs.length - 1; i >= 0; i--) newAxesSpec.splice(splitAxisIdxs[i], 1);
43
49
  for (const keyCombo of keyCombinations) {
44
50
  const axisFilters = keyCombo.map((value, sAxisIdx) => [splitAxisIdxs[sAxisIdx], value]);
45
- const traceEntries = keyCombo.map((value, sAxisIdx) => {
46
- const axisIdx = splitAxisIdxs[sAxisIdx];
47
- const axisId = getAxisId(snapshot.spec.axesSpec[axisIdx]);
51
+ const domain = {};
52
+ const traceEntries = [];
53
+ for (let sAxisIdx = 0; sAxisIdx < keyCombo.length; sAxisIdx++) {
54
+ const value = keyCombo[sAxisIdx];
55
+ const axisSpec = splitAxisSpecs[sAxisIdx];
56
+ const axisId = splitAxisIds[sAxisIdx];
48
57
  const label = axesLabels[sAxisIdx]?.[value] ?? String(value);
49
- return {
58
+ domain[axisSpec.name] = String(value);
59
+ traceEntries.push({
50
60
  type: `split:${canonicalizeAxisId(axisId)}`,
51
61
  label,
52
62
  importance: 1e6
53
- };
54
- });
55
- const filteredData = filterDataInfoEntries(dataEntries, axisFilters);
56
- const adjustedSpec = {
57
- ...snapshot.spec,
58
- axesSpec: newAxesSpec,
59
- annotations: {
60
- ...snapshot.spec.annotations,
61
- "pl7.app/trace": JSON.stringify(traceEntries)
62
- }
63
- };
64
- result.push({
65
- id: snapshot.id,
66
- spec: adjustedSpec,
67
- dataStatus: "ready",
68
- data: createReadyColumnData(() => entriesToDataInfo(filteredData))
63
+ });
64
+ }
65
+ const filtered = ColumnFilteredRecipe.wrap(inner, axisFilters);
66
+ const overrided = ColumnOverriddenRecipe.wrap(filtered, {
67
+ domain,
68
+ annotations: { [Annotation.Trace]: JSON.stringify([...baseTrace, ...traceEntries]) }
69
69
  });
70
+ result.push(overrided);
70
71
  }
71
72
  }
72
- return {
73
- items: result,
74
- complete: true
75
- };
73
+ return result;
76
74
  }
77
- const MAX_KEY_COMBINATIONS = 1e4;
78
75
  function generateKeyCombinations(uniqueKeys, splitAxisIdxs) {
79
76
  const combinations = [];
80
77
  function generate(currentCombo, sAxisIdx) {
@@ -1 +1 @@
1
- {"version":3,"file":"expand_by_partition.js","names":[],"sources":["../../src/columns/expand_by_partition.ts"],"sourcesContent":["import type {\n AxisFilterByIdx,\n AxisFilterValue,\n AxisId,\n PartitionedDataInfoEntries,\n PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n canonicalizeAxisId,\n entriesToDataInfo,\n getAxisId,\n isPartitionedDataInfoEntries,\n} from \"@milaboratories/pl-model-common\";\nimport type { TreeNodeAccessor } from \"../render/accessor\";\nimport { filterDataInfoEntries } from \"../render/util/axis_filtering\";\nimport { convertOrParsePColumnData, getUniquePartitionKeys } from \"../render/util/pcolumn_data\";\nimport type { ColumnSnapshot } from \"./column_snapshot\";\nimport { createReadyColumnData } from \"./column_snapshot\";\n\n// --- Types ---\n\nexport interface SplitAxis {\n /** Index of the axis in the column's axesSpec to split by. */\n readonly idx: number;\n}\n\nexport interface ExpandByPartitionOpts {\n /** Resolve axis values to human-readable labels. */\n axisLabels?: (axisId: AxisId) => undefined | Record<string | number, string>;\n}\n\nexport interface ExpandByPartitionResult {\n /** Expanded snapshots (one per key combination per original snapshot). */\n readonly items: ColumnSnapshot<PObjectId>[];\n /** False if any column's data was not ready for splitting. */\n readonly complete: boolean;\n}\n\n// --- Implementation ---\n\n/**\n * Expand snapshots by splitting along partition axes.\n *\n * For each snapshot, reads partition data, enumerates unique keys on the\n * split axes, and produces one output snapshot per key combination —\n * with the split axes removed from `axesSpec` and a `pl7.app/trace`\n * annotation recording the split origin.\n *\n * Returns `{ items: [], complete: false }` when any snapshot's data\n * is not ready (status !== 'ready' or partition data unavailable).\n */\nexport function expandByPartition(\n snapshots: ColumnSnapshot<PObjectId>[],\n splitAxes: SplitAxis[],\n opts?: ExpandByPartitionOpts,\n): ExpandByPartitionResult {\n if (splitAxes.length === 0) {\n return { items: snapshots, complete: true };\n }\n\n const splitAxisIdxs = splitAxes.map((a) => a.idx).sort((a, b) => a - b);\n const result: ColumnSnapshot<PObjectId>[] = [];\n\n for (const snapshot of snapshots) {\n if (snapshot.dataStatus !== \"ready\" || snapshot.data === undefined) {\n return { items: [], complete: false };\n }\n\n const rawData = snapshot.data.get();\n const dataEntries = convertOrParsePColumnData(rawData as TreeNodeAccessor | undefined);\n\n if (dataEntries === undefined) {\n return { items: [], complete: false };\n }\n\n if (!isPartitionedDataInfoEntries(dataEntries)) {\n throw new Error(\n `Splitting requires Partitioned DataInfoEntries, but got ${dataEntries.type} for column ${String(snapshot.id)}`,\n );\n }\n\n const uniqueKeys = getUniquePartitionKeys(dataEntries);\n\n const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];\n if (maxSplitIdx >= dataEntries.partitionKeyLength) {\n throw new Error(\n `Not enough partition keys (${dataEntries.partitionKeyLength}) for requested split axes (max index ${maxSplitIdx}) in column ${snapshot.spec.name}`,\n );\n }\n\n // Resolve labels for each split axis\n const axesLabels: (undefined | Record<string | number, string>)[] = splitAxisIdxs.map((idx) =>\n opts?.axisLabels?.(getAxisId(snapshot.spec.axesSpec[idx])),\n );\n\n // Generate all key combinations across split axes\n const keyCombinations = generateKeyCombinations(uniqueKeys, splitAxisIdxs);\n if (keyCombinations.length === 0) continue;\n\n // Build adjusted axesSpec (remove split axes in reverse order)\n const newAxesSpec = [...snapshot.spec.axesSpec];\n for (let i = splitAxisIdxs.length - 1; i >= 0; i--) {\n newAxesSpec.splice(splitAxisIdxs[i], 1);\n }\n\n for (const keyCombo of keyCombinations) {\n const axisFilters: AxisFilterByIdx[] = keyCombo.map(\n (value, sAxisIdx): AxisFilterByIdx => [splitAxisIdxs[sAxisIdx], value as AxisFilterValue],\n );\n\n const traceEntries = keyCombo.map((value, sAxisIdx) => {\n const axisIdx = splitAxisIdxs[sAxisIdx];\n const axisId = getAxisId(snapshot.spec.axesSpec[axisIdx]);\n const labelMap = axesLabels[sAxisIdx];\n const label = labelMap?.[value] ?? String(value);\n return {\n type: `split:${canonicalizeAxisId(axisId)}`,\n label,\n importance: 1_000_000,\n };\n });\n\n const filteredData = filterDataInfoEntries(\n dataEntries as PartitionedDataInfoEntries<TreeNodeAccessor>,\n axisFilters,\n );\n\n const adjustedSpec = {\n ...snapshot.spec,\n axesSpec: newAxesSpec,\n annotations: {\n ...snapshot.spec.annotations,\n \"pl7.app/trace\": JSON.stringify(traceEntries),\n },\n };\n\n result.push({\n id: snapshot.id,\n spec: adjustedSpec,\n dataStatus: \"ready\",\n data: createReadyColumnData(() => entriesToDataInfo(filteredData)),\n });\n }\n }\n\n return { items: result, complete: true };\n}\n\nconst MAX_KEY_COMBINATIONS = 10_000;\n\nfunction generateKeyCombinations(\n uniqueKeys: (string | number)[][],\n splitAxisIdxs: number[],\n): (string | number)[][] {\n const combinations: (string | number)[][] = [];\n\n function generate(currentCombo: (string | number)[], sAxisIdx: number): void {\n if (sAxisIdx >= splitAxisIdxs.length) {\n combinations.push([...currentCombo]);\n if (combinations.length > MAX_KEY_COMBINATIONS) {\n throw new Error(\"Too many key combinations, aborting.\");\n }\n return;\n }\n\n const axisIdx = splitAxisIdxs[sAxisIdx];\n if (axisIdx >= uniqueKeys.length) {\n throw new Error(\n `Axis index ${axisIdx} out of bounds for unique keys array (length ${uniqueKeys.length})`,\n );\n }\n\n const axisValues = uniqueKeys[axisIdx];\n if (!axisValues || axisValues.length === 0) {\n combinations.length = 0;\n return;\n }\n\n for (const val of axisValues) {\n currentCombo.push(val);\n generate(currentCombo, sAxisIdx + 1);\n currentCombo.pop();\n }\n }\n\n generate([], 0);\n return combinations;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"expand_by_partition.js","names":[],"sources":["../../src/columns/expand_by_partition.ts"],"sourcesContent":["import type {\n AxisFilterByIdx,\n AxisFilterValue,\n AxisId,\n TraceEntry,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeAxisId,\n getAxisId,\n isDataInfoEntries,\n readAnnotation,\n} from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport { getUniquePartitionKeys } from \"../render/util/pcolumn_data\";\nimport type { ColumnRecipe } from \"./column_recipes\";\nimport { ColumnFilteredRecipe } from \"./column_recipes/column_filtered_recipe\";\nimport { ColumnOverriddenRecipe } from \"./column_recipes/column_overrided_recipe\";\nimport { Column } from \"./column\";\nimport { getLeafColumnData } from \"./utils\";\n\n// --- Types ---\n\nexport interface SplitAxis {\n /** Index of the axis in the column's axesSpec to split by. */\n readonly idx: number;\n}\n\nexport interface ExpandByPartitionOpts {\n /** Resolve axis values to human-readable labels. */\n axisValuesLabels?: (axisId: AxisId) => undefined | Record<string | number, string>;\n}\n\n// --- Implementation ---\n\nconst MAX_KEY_COMBINATIONS = 10_000;\n\n/**\n * Expand each input column along the requested partition axes into one\n * {@link ColumnRecipe} per Cartesian combination of unique partition values.\n *\n * Each split is produced as `ColumnOverriddenRecipe.wrap(ColumnFilteredRecipe.wrap(inner, axisFilters), { domain, annotations })`:\n * - `ColumnFilteredRecipe` pins all split axes at once (one wrap call with\n * every `[idx, value]` pair) and removes them from `axesSpec`. The\n * engine performs the data slicing via the `sliceAxes` query node.\n * - `ColumnOverriddenRecipe` overlays a `domain[axisName] = String(value)`\n * entry per split axis and appends a `split:<canonicalAxisId>` trace\n * entry per split axis to the existing `pl7.app/trace` annotation.\n *\n * The recipe id is a canonical\n * `ColumnOverriddenId(source: ColumnFilteredId(source: inner.id, axisFilters), specOverrides)`\n * — distinct per split combination, parseable by `extractPObjectId`, and\n * traversable by recipe walkers.\n *\n * Returns `undefined` when any input's `getData()` is not a\n * {@link TreeNodeAccessor} — partition inspection is not yet possible.\n */\nexport function expandByPartition(\n inputs: Column[],\n splitAxes: SplitAxis[],\n opts?: ExpandByPartitionOpts,\n): ColumnRecipe[] | undefined {\n if (splitAxes.length === 0) {\n return [...inputs];\n }\n\n const splitAxisIdxs = splitAxes.map((a) => a.idx).sort((a, b) => a - b);\n const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];\n\n const result: ColumnRecipe[] = [];\n\n for (const inner of inputs) {\n const data = getLeafColumnData(inner);\n // Partition inspection requires either a live tree-accessor or already\n // parsed DataInfoEntries. Anything else means the input is not yet ready.\n if (!(data instanceof TreeNodeAccessor) && !isDataInfoEntries(data)) {\n return undefined;\n }\n\n const uniqueKeys = getUniquePartitionKeys(data);\n if (uniqueKeys === undefined) return undefined;\n\n if (maxSplitIdx >= uniqueKeys.length) {\n throw new Error(\n `Not enough partition keys (${uniqueKeys.length}) for requested split axes (max index ${maxSplitIdx}) in column ${inner.getSpec().name}`,\n );\n }\n\n const spec = inner.getSpec();\n const axesSpec = spec.axesSpec;\n const splitAxisSpecs = splitAxisIdxs.map((idx) => axesSpec[idx]);\n const splitAxisIds = splitAxisSpecs.map((axisSpec) => getAxisId(axisSpec));\n const axesLabels = splitAxisIds.map((axisId) => opts?.axisValuesLabels?.(axisId));\n\n const existingTraceRaw = readAnnotation(spec, Annotation.Trace);\n const baseTrace: TraceEntry[] = existingTraceRaw\n ? ((JSON.parse(existingTraceRaw) as TraceEntry[]) ?? [])\n : [];\n\n const keyCombinations = generateKeyCombinations(uniqueKeys, splitAxisIdxs);\n if (keyCombinations.length === 0) continue;\n\n for (const keyCombo of keyCombinations) {\n const axisFilters: AxisFilterByIdx[] = keyCombo.map(\n (value, sAxisIdx): AxisFilterByIdx => [splitAxisIdxs[sAxisIdx], value as AxisFilterValue],\n );\n\n const domain: Record<string, string> = {};\n const traceEntries: TraceEntry[] = [];\n for (let sAxisIdx = 0; sAxisIdx < keyCombo.length; sAxisIdx++) {\n const value = keyCombo[sAxisIdx];\n const axisSpec = splitAxisSpecs[sAxisIdx];\n const axisId = splitAxisIds[sAxisIdx];\n const labelMap = axesLabels[sAxisIdx];\n const label = labelMap?.[value] ?? String(value);\n domain[axisSpec.name] = String(value);\n traceEntries.push({\n type: `split:${canonicalizeAxisId(axisId)}`,\n label,\n importance: 1_000_000,\n });\n }\n\n const filtered = ColumnFilteredRecipe.wrap(inner, axisFilters);\n const overrided = ColumnOverriddenRecipe.wrap(filtered, {\n domain,\n annotations: {\n [Annotation.Trace]: JSON.stringify([...baseTrace, ...traceEntries]),\n },\n });\n\n result.push(overrided);\n }\n }\n\n return result;\n}\n\nfunction generateKeyCombinations(\n uniqueKeys: (string | number)[][],\n splitAxisIdxs: number[],\n): (string | number)[][] {\n const combinations: (string | number)[][] = [];\n\n function generate(currentCombo: (string | number)[], sAxisIdx: number): void {\n if (sAxisIdx >= splitAxisIdxs.length) {\n combinations.push([...currentCombo]);\n if (combinations.length > MAX_KEY_COMBINATIONS) {\n throw new Error(\"Too many key combinations, aborting.\");\n }\n return;\n }\n\n const axisIdx = splitAxisIdxs[sAxisIdx];\n if (axisIdx >= uniqueKeys.length) {\n throw new Error(\n `Axis index ${axisIdx} out of bounds for unique keys array (length ${uniqueKeys.length})`,\n );\n }\n\n const axisValues = uniqueKeys[axisIdx];\n if (!axisValues || axisValues.length === 0) {\n combinations.length = 0;\n return;\n }\n\n for (const val of axisValues) {\n currentCombo.push(val);\n generate(currentCombo, sAxisIdx + 1);\n currentCombo.pop();\n }\n }\n\n generate([], 0);\n return combinations;\n}\n"],"mappings":";;;;;;;AAmCA,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;AAsB7B,SAAgB,kBACd,QACA,WACA,MAC4B;CAC5B,IAAI,UAAU,WAAW,GACvB,OAAO,CAAC,GAAG,MAAM;CAGnB,MAAM,gBAAgB,UAAU,KAAK,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC;CACtE,MAAM,cAAc,cAAc,cAAc,SAAS;CAEzD,MAAM,SAAyB,CAAC;CAEhC,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,OAAO,kBAAkB,KAAK;EAGpC,IAAI,EAAE,gBAAgB,qBAAqB,CAAC,kBAAkB,IAAI,GAChE;EAGF,MAAM,aAAa,uBAAuB,IAAI;EAC9C,IAAI,eAAe,KAAA,GAAW,OAAO,KAAA;EAErC,IAAI,eAAe,WAAW,QAC5B,MAAM,IAAI,MACR,8BAA8B,WAAW,OAAO,wCAAwC,YAAY,cAAc,MAAM,QAAQ,CAAC,CAAC,MACpI;EAGF,MAAM,OAAO,MAAM,QAAQ;EAC3B,MAAM,WAAW,KAAK;EACtB,MAAM,iBAAiB,cAAc,KAAK,QAAQ,SAAS,IAAI;EAC/D,MAAM,eAAe,eAAe,KAAK,aAAa,UAAU,QAAQ,CAAC;EACzE,MAAM,aAAa,aAAa,KAAK,WAAW,MAAM,mBAAmB,MAAM,CAAC;EAEhF,MAAM,mBAAmB,eAAe,MAAM,WAAW,KAAK;EAC9D,MAAM,YAA0B,mBAC1B,KAAK,MAAM,gBAAgB,KAAsB,CAAC,IACpD,CAAC;EAEL,MAAM,kBAAkB,wBAAwB,YAAY,aAAa;EACzE,IAAI,gBAAgB,WAAW,GAAG;EAElC,KAAK,MAAM,YAAY,iBAAiB;GACtC,MAAM,cAAiC,SAAS,KAC7C,OAAO,aAA8B,CAAC,cAAc,WAAW,KAAwB,CAC1F;GAEA,MAAM,SAAiC,CAAC;GACxC,MAAM,eAA6B,CAAC;GACpC,KAAK,IAAI,WAAW,GAAG,WAAW,SAAS,QAAQ,YAAY;IAC7D,MAAM,QAAQ,SAAS;IACvB,MAAM,WAAW,eAAe;IAChC,MAAM,SAAS,aAAa;IAE5B,MAAM,QADW,WAAW,SACN,GAAG,UAAU,OAAO,KAAK;IAC/C,OAAO,SAAS,QAAQ,OAAO,KAAK;IACpC,aAAa,KAAK;KAChB,MAAM,SAAS,mBAAmB,MAAM;KACxC;KACA,YAAY;IACd,CAAC;GACH;GAEA,MAAM,WAAW,qBAAqB,KAAK,OAAO,WAAW;GAC7D,MAAM,YAAY,uBAAuB,KAAK,UAAU;IACtD;IACA,aAAa,GACV,WAAW,QAAQ,KAAK,UAAU,CAAC,GAAG,WAAW,GAAG,YAAY,CAAC,EACpE;GACF,CAAC;GAED,OAAO,KAAK,SAAS;EACvB;CACF;CAEA,OAAO;AACT;AAEA,SAAS,wBACP,YACA,eACuB;CACvB,MAAM,eAAsC,CAAC;CAE7C,SAAS,SAAS,cAAmC,UAAwB;EAC3E,IAAI,YAAY,cAAc,QAAQ;GACpC,aAAa,KAAK,CAAC,GAAG,YAAY,CAAC;GACnC,IAAI,aAAa,SAAS,sBACxB,MAAM,IAAI,MAAM,sCAAsC;GAExD;EACF;EAEA,MAAM,UAAU,cAAc;EAC9B,IAAI,WAAW,WAAW,QACxB,MAAM,IAAI,MACR,cAAc,QAAQ,+CAA+C,WAAW,OAAO,EACzF;EAGF,MAAM,aAAa,WAAW;EAC9B,IAAI,CAAC,cAAc,WAAW,WAAW,GAAG;GAC1C,aAAa,SAAS;GACtB;EACF;EAEA,KAAK,MAAM,OAAO,YAAY;GAC5B,aAAa,KAAK,GAAG;GACrB,SAAS,cAAc,WAAW,CAAC;GACnC,aAAa,IAAI;EACnB;CACF;CAEA,SAAS,CAAC,GAAG,CAAC;CACd,OAAO;AACT"}
@@ -1,20 +1,46 @@
1
- const require_column_snapshot = require("./column_snapshot.cjs");
2
- const require_column_snapshot_provider = require("./column_snapshot_provider.cjs");
3
- const require_column_selector = require("./column_selector.cjs");
4
- const require_column_collection_builder = require("./column_collection_builder.cjs");
5
- const require_ctx_column_sources = require("./ctx_column_sources.cjs");
1
+ const require_column = require("./column.cjs");
2
+ const require_column_discovered_recipe = require("./column_recipes/column_discovered_recipe.cjs");
3
+ const require_column_filtered_recipe = require("./column_recipes/column_filtered_recipe.cjs");
4
+ const require_index = require("./column_recipes/index.cjs");
5
+ const require_column_overrided_recipe = require("./column_recipes/column_overrided_recipe.cjs");
6
+ const require_column_lazy = require("./column_lazy.cjs");
7
+ const require_providers = require("./column_providers/providers.cjs");
8
+ const require_index$1 = require("./column_providers/index.cjs");
9
+ const require_columns_collection = require("./columns_collection.cjs");
10
+ const require_utils = require("./utils.cjs");
6
11
  const require_expand_by_partition = require("./expand_by_partition.cjs");
7
- exports.ArrayColumnProvider = require_column_snapshot_provider.ArrayColumnProvider;
8
- exports.ColumnCollectionBuilder = require_column_collection_builder.ColumnCollectionBuilder;
9
- exports.OutputColumnProvider = require_column_snapshot_provider.OutputColumnProvider;
10
- exports.ResultPoolColumnSnapshotProvider = require_ctx_column_sources.ResultPoolColumnSnapshotProvider;
11
- exports.SnapshotColumnProvider = require_column_snapshot_provider.SnapshotColumnProvider;
12
- exports.collectCtxColumnSnapshotProviders = require_ctx_column_sources.collectCtxColumnSnapshotProviders;
13
- exports.convertColumnSelectorToMultiColumnSelector = require_column_selector.convertColumnSelectorToMultiColumnSelector;
14
- exports.convertRelaxedAxisSelectorToMultiAxisSelector = require_column_selector.convertRelaxedAxisSelectorToMultiAxisSelector;
15
- exports.convertRelaxedColumnSelectorToMultiColumnSelector = require_column_selector.convertRelaxedColumnSelectorToMultiColumnSelector;
16
- exports.createColumnSnapshot = require_column_snapshot.createColumnSnapshot;
17
- exports.createReadyColumnData = require_column_snapshot.createReadyColumnData;
12
+ const require_derive_axis_values_labels = require("./derive_axis_values_labels.cjs");
13
+ exports.AccessorColumnsProvider = require_providers.AccessorColumnsProvider;
14
+ exports.AccessorColumnsProviderImpl = require_providers.AccessorColumnsProviderImpl;
15
+ exports.ArrayColumnsProvider = require_providers.ArrayColumnsProvider;
16
+ exports.Column = require_column.Column;
17
+ exports.ColumnAbsentError = require_column_lazy.ColumnAbsentError;
18
+ exports.ColumnDiscoveredRecipe = require_column_discovered_recipe.ColumnDiscoveredRecipe;
19
+ exports.ColumnFilteredRecipe = require_column_filtered_recipe.ColumnFilteredRecipe;
20
+ exports.ColumnLazy = require_column_lazy.ColumnLazy;
21
+ exports.ColumnLazyImpl = require_column_lazy.ColumnLazyImpl;
22
+ exports.ColumnOverriddenRecipe = require_column_overrided_recipe.ColumnOverriddenRecipe;
23
+ exports.ColumnRecipe = require_index.ColumnRecipe;
24
+ exports.ColumnsCollection = require_columns_collection.ColumnsCollection;
25
+ exports.ColumnsCollectionImpl = require_columns_collection.ColumnsCollectionImpl;
26
+ exports.ColumnsProvider = require_providers.ColumnsProvider;
27
+ exports.ResultPoolColumnsProvider = require_providers.ResultPoolColumnsProvider;
28
+ exports.ResultPoolColumnsProviderImpl = require_providers.ResultPoolColumnsProviderImpl;
29
+ exports._ctxProvidersCache = require_index$1._ctxProvidersCache;
30
+ exports.collectLinkerColumns = require_utils.collectLinkerColumns;
31
+ exports.collectLinkerIds = require_utils.collectLinkerIds;
32
+ exports.deriveAxisValuesLabels = require_derive_axis_values_labels.deriveAxisValuesLabels;
33
+ exports.deriveColumnOptions = require_utils.deriveColumnOptions;
18
34
  exports.expandByPartition = require_expand_by_partition.expandByPartition;
19
- exports.isColumnSnapshotProvider = require_column_snapshot_provider.isColumnSnapshotProvider;
20
- exports.toColumnSnapshotProvider = require_column_snapshot_provider.toColumnSnapshotProvider;
35
+ exports.getCtxProviders = require_index$1.getCtxProviders;
36
+ exports.getLeafColumnData = require_utils.getLeafColumnData;
37
+ exports.hasColumnData = require_utils.hasColumnData;
38
+ exports.hitQualifications = require_utils.hitQualifications;
39
+ exports.isColumn = require_column.isColumn;
40
+ exports.isColumnLazy = require_column_lazy.isColumnLazy;
41
+ exports.isColumnProvider = require_index$1.isColumnProvider;
42
+ exports.isColumnRecipe = require_index.isColumnRecipe;
43
+ exports.isColumnsCollection = require_columns_collection.isColumnsCollection;
44
+ exports.isLeafColumn = require_utils.isLeafColumn;
45
+ exports.queriesQualifications = require_utils.queriesQualifications;
46
+ exports.toColumnProvider = require_index$1.toColumnProvider;