@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
@@ -2,20 +2,22 @@ import type {
2
2
  AxisFilterByIdx,
3
3
  AxisFilterValue,
4
4
  AxisId,
5
- PartitionedDataInfoEntries,
6
- PObjectId,
5
+ TraceEntry,
7
6
  } from "@milaboratories/pl-model-common";
8
7
  import {
8
+ Annotation,
9
9
  canonicalizeAxisId,
10
- entriesToDataInfo,
11
10
  getAxisId,
12
- isPartitionedDataInfoEntries,
11
+ isDataInfoEntries,
12
+ readAnnotation,
13
13
  } from "@milaboratories/pl-model-common";
14
- import type { TreeNodeAccessor } from "../render/accessor";
15
- import { filterDataInfoEntries } from "../render/util/axis_filtering";
16
- import { convertOrParsePColumnData, getUniquePartitionKeys } from "../render/util/pcolumn_data";
17
- import type { ColumnSnapshot } from "./column_snapshot";
18
- import { createReadyColumnData } from "./column_snapshot";
14
+ import { TreeNodeAccessor } from "../render/accessor";
15
+ import { getUniquePartitionKeys } from "../render/util/pcolumn_data";
16
+ import type { ColumnRecipe } from "./column_recipes";
17
+ import { ColumnFilteredRecipe } from "./column_recipes/column_filtered_recipe";
18
+ import { ColumnOverriddenRecipe } from "./column_recipes/column_overrided_recipe";
19
+ import { Column } from "./column";
20
+ import { getLeafColumnData } from "./utils";
19
21
 
20
22
  // --- Types ---
21
23
 
@@ -26,128 +28,114 @@ export interface SplitAxis {
26
28
 
27
29
  export interface ExpandByPartitionOpts {
28
30
  /** Resolve axis values to human-readable labels. */
29
- axisLabels?: (axisId: AxisId) => undefined | Record<string | number, string>;
30
- }
31
-
32
- export interface ExpandByPartitionResult {
33
- /** Expanded snapshots (one per key combination per original snapshot). */
34
- readonly items: ColumnSnapshot<PObjectId>[];
35
- /** False if any column's data was not ready for splitting. */
36
- readonly complete: boolean;
31
+ axisValuesLabels?: (axisId: AxisId) => undefined | Record<string | number, string>;
37
32
  }
38
33
 
39
34
  // --- Implementation ---
40
35
 
36
+ const MAX_KEY_COMBINATIONS = 10_000;
37
+
41
38
  /**
42
- * Expand snapshots by splitting along partition axes.
39
+ * Expand each input column along the requested partition axes into one
40
+ * {@link ColumnRecipe} per Cartesian combination of unique partition values.
41
+ *
42
+ * Each split is produced as `ColumnOverriddenRecipe.wrap(ColumnFilteredRecipe.wrap(inner, axisFilters), { domain, annotations })`:
43
+ * - `ColumnFilteredRecipe` pins all split axes at once (one wrap call with
44
+ * every `[idx, value]` pair) and removes them from `axesSpec`. The
45
+ * engine performs the data slicing via the `sliceAxes` query node.
46
+ * - `ColumnOverriddenRecipe` overlays a `domain[axisName] = String(value)`
47
+ * entry per split axis and appends a `split:<canonicalAxisId>` trace
48
+ * entry per split axis to the existing `pl7.app/trace` annotation.
43
49
  *
44
- * For each snapshot, reads partition data, enumerates unique keys on the
45
- * split axes, and produces one output snapshot per key combination —
46
- * with the split axes removed from `axesSpec` and a `pl7.app/trace`
47
- * annotation recording the split origin.
50
+ * The recipe id is a canonical
51
+ * `ColumnOverriddenId(source: ColumnFilteredId(source: inner.id, axisFilters), specOverrides)`
52
+ * — distinct per split combination, parseable by `extractPObjectId`, and
53
+ * traversable by recipe walkers.
48
54
  *
49
- * Returns `{ items: [], complete: false }` when any snapshot's data
50
- * is not ready (status !== 'ready' or partition data unavailable).
55
+ * Returns `undefined` when any input's `getData()` is not a
56
+ * {@link TreeNodeAccessor} — partition inspection is not yet possible.
51
57
  */
52
58
  export function expandByPartition(
53
- snapshots: ColumnSnapshot<PObjectId>[],
59
+ inputs: Column[],
54
60
  splitAxes: SplitAxis[],
55
61
  opts?: ExpandByPartitionOpts,
56
- ): ExpandByPartitionResult {
62
+ ): ColumnRecipe[] | undefined {
57
63
  if (splitAxes.length === 0) {
58
- return { items: snapshots, complete: true };
64
+ return [...inputs];
59
65
  }
60
66
 
61
67
  const splitAxisIdxs = splitAxes.map((a) => a.idx).sort((a, b) => a - b);
62
- const result: ColumnSnapshot<PObjectId>[] = [];
68
+ const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];
63
69
 
64
- for (const snapshot of snapshots) {
65
- if (snapshot.dataStatus !== "ready" || snapshot.data === undefined) {
66
- return { items: [], complete: false };
67
- }
70
+ const result: ColumnRecipe[] = [];
68
71
 
69
- const rawData = snapshot.data.get();
70
- const dataEntries = convertOrParsePColumnData(rawData as TreeNodeAccessor | undefined);
71
-
72
- if (dataEntries === undefined) {
73
- return { items: [], complete: false };
74
- }
75
-
76
- if (!isPartitionedDataInfoEntries(dataEntries)) {
77
- throw new Error(
78
- `Splitting requires Partitioned DataInfoEntries, but got ${dataEntries.type} for column ${String(snapshot.id)}`,
79
- );
72
+ for (const inner of inputs) {
73
+ const data = getLeafColumnData(inner);
74
+ // Partition inspection requires either a live tree-accessor or already
75
+ // parsed DataInfoEntries. Anything else means the input is not yet ready.
76
+ if (!(data instanceof TreeNodeAccessor) && !isDataInfoEntries(data)) {
77
+ return undefined;
80
78
  }
81
79
 
82
- const uniqueKeys = getUniquePartitionKeys(dataEntries);
80
+ const uniqueKeys = getUniquePartitionKeys(data);
81
+ if (uniqueKeys === undefined) return undefined;
83
82
 
84
- const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];
85
- if (maxSplitIdx >= dataEntries.partitionKeyLength) {
83
+ if (maxSplitIdx >= uniqueKeys.length) {
86
84
  throw new Error(
87
- `Not enough partition keys (${dataEntries.partitionKeyLength}) for requested split axes (max index ${maxSplitIdx}) in column ${snapshot.spec.name}`,
85
+ `Not enough partition keys (${uniqueKeys.length}) for requested split axes (max index ${maxSplitIdx}) in column ${inner.getSpec().name}`,
88
86
  );
89
87
  }
90
88
 
91
- // Resolve labels for each split axis
92
- const axesLabels: (undefined | Record<string | number, string>)[] = splitAxisIdxs.map((idx) =>
93
- opts?.axisLabels?.(getAxisId(snapshot.spec.axesSpec[idx])),
94
- );
89
+ const spec = inner.getSpec();
90
+ const axesSpec = spec.axesSpec;
91
+ const splitAxisSpecs = splitAxisIdxs.map((idx) => axesSpec[idx]);
92
+ const splitAxisIds = splitAxisSpecs.map((axisSpec) => getAxisId(axisSpec));
93
+ const axesLabels = splitAxisIds.map((axisId) => opts?.axisValuesLabels?.(axisId));
94
+
95
+ const existingTraceRaw = readAnnotation(spec, Annotation.Trace);
96
+ const baseTrace: TraceEntry[] = existingTraceRaw
97
+ ? ((JSON.parse(existingTraceRaw) as TraceEntry[]) ?? [])
98
+ : [];
95
99
 
96
- // Generate all key combinations across split axes
97
100
  const keyCombinations = generateKeyCombinations(uniqueKeys, splitAxisIdxs);
98
101
  if (keyCombinations.length === 0) continue;
99
102
 
100
- // Build adjusted axesSpec (remove split axes in reverse order)
101
- const newAxesSpec = [...snapshot.spec.axesSpec];
102
- for (let i = splitAxisIdxs.length - 1; i >= 0; i--) {
103
- newAxesSpec.splice(splitAxisIdxs[i], 1);
104
- }
105
-
106
103
  for (const keyCombo of keyCombinations) {
107
104
  const axisFilters: AxisFilterByIdx[] = keyCombo.map(
108
105
  (value, sAxisIdx): AxisFilterByIdx => [splitAxisIdxs[sAxisIdx], value as AxisFilterValue],
109
106
  );
110
107
 
111
- const traceEntries = keyCombo.map((value, sAxisIdx) => {
112
- const axisIdx = splitAxisIdxs[sAxisIdx];
113
- const axisId = getAxisId(snapshot.spec.axesSpec[axisIdx]);
108
+ const domain: Record<string, string> = {};
109
+ const traceEntries: TraceEntry[] = [];
110
+ for (let sAxisIdx = 0; sAxisIdx < keyCombo.length; sAxisIdx++) {
111
+ const value = keyCombo[sAxisIdx];
112
+ const axisSpec = splitAxisSpecs[sAxisIdx];
113
+ const axisId = splitAxisIds[sAxisIdx];
114
114
  const labelMap = axesLabels[sAxisIdx];
115
115
  const label = labelMap?.[value] ?? String(value);
116
- return {
116
+ domain[axisSpec.name] = String(value);
117
+ traceEntries.push({
117
118
  type: `split:${canonicalizeAxisId(axisId)}`,
118
119
  label,
119
120
  importance: 1_000_000,
120
- };
121
- });
122
-
123
- const filteredData = filterDataInfoEntries(
124
- dataEntries as PartitionedDataInfoEntries<TreeNodeAccessor>,
125
- axisFilters,
126
- );
121
+ });
122
+ }
127
123
 
128
- const adjustedSpec = {
129
- ...snapshot.spec,
130
- axesSpec: newAxesSpec,
124
+ const filtered = ColumnFilteredRecipe.wrap(inner, axisFilters);
125
+ const overrided = ColumnOverriddenRecipe.wrap(filtered, {
126
+ domain,
131
127
  annotations: {
132
- ...snapshot.spec.annotations,
133
- "pl7.app/trace": JSON.stringify(traceEntries),
128
+ [Annotation.Trace]: JSON.stringify([...baseTrace, ...traceEntries]),
134
129
  },
135
- };
136
-
137
- result.push({
138
- id: snapshot.id,
139
- spec: adjustedSpec,
140
- dataStatus: "ready",
141
- data: createReadyColumnData(() => entriesToDataInfo(filteredData)),
142
130
  });
131
+
132
+ result.push(overrided);
143
133
  }
144
134
  }
145
135
 
146
- return { items: result, complete: true };
136
+ return result;
147
137
  }
148
138
 
149
- const MAX_KEY_COMBINATIONS = 10_000;
150
-
151
139
  function generateKeyCombinations(
152
140
  uniqueKeys: (string | number)[][],
153
141
  splitAxisIdxs: number[],
@@ -1,6 +1,8 @@
1
- export * from "./column_snapshot";
2
- export * from "./column_snapshot_provider";
3
- export * from "./column_selector";
4
- export * from "./column_collection_builder";
5
- export * from "./ctx_column_sources";
1
+ export * from "./column_providers";
6
2
  export * from "./expand_by_partition";
3
+ export * from "./derive_axis_values_labels";
4
+ export * from "./columns_collection";
5
+ export * from "./column_lazy";
6
+ export * from "./column_recipes";
7
+ export * from "./column";
8
+ export * from "./utils";
@@ -0,0 +1,249 @@
1
+ import { afterEach, beforeEach, describe, expect, test } from "vitest";
2
+ import {
3
+ createColumnDiscoveredKey,
4
+ createGlobalPObjectId,
5
+ createLocalPObjectId,
6
+ stringifyColumnDiscoveredId,
7
+ type AxisQualification,
8
+ type PColumnSpec,
9
+ type PObjectId,
10
+ type SpecOverrides,
11
+ type SpecQuery,
12
+ type ColumnUniversalId,
13
+ } from "@milaboratories/pl-model-common";
14
+ import { collectLinkerIds, hitQualifications, queriesQualifications } from "./utils";
15
+ import { ColumnDiscoveredRecipe } from "./column_recipes/column_discovered_recipe";
16
+ import { ColumnFilteredRecipe } from "./column_recipes/column_filtered_recipe";
17
+ import { ColumnOverriddenRecipe } from "./column_recipes/column_overrided_recipe";
18
+ import type { ColumnFieldStatus, ColumnRecipe } from "./column_recipes/types";
19
+ import { installStubRegistry } from "./__test_helpers__/stub_registry";
20
+
21
+ // ── ctx mock ────────────────────────────────────────────────────────────────
22
+ // ColumnDiscoveredRecipe pulls `getCfgRenderCtx()` for `pframeSpec`. Minimal
23
+ // no-op stub keeps the constructor happy.
24
+
25
+ function makeCtx() {
26
+ // Minimal pframeSpec mock — `ColumnFilteredRecipe.wrap` validates axis
27
+ // indices against `inner.getSpec()`, which for a real `ColumnDiscoveredRecipe`
28
+ // runs `createSpecFrame` + `evaluateQuery` through this service. The mock
29
+ // echoes the registered specs as `tableSpec` entries so `getSpec()` returns
30
+ // the spec planted by the discovered fixture.
31
+ const services: Record<string, (...args: unknown[]) => unknown> = {
32
+ // Wrap whatever specs map the caller passes; we don't inspect its shape.
33
+ createSpecFrame: (...args: unknown[]) => ({ key: { specs: args[0] }, unref: () => {} }),
34
+ // Echo the registered specs as `tableSpec` entries — `getSpec` looks up
35
+ // the entry by id, so we need the shape we planted in `createSpecFrame`.
36
+ evaluateQuery: (...args: unknown[]) => {
37
+ const frameKey = args[0] as { specs: Record<string, PColumnSpec> };
38
+ return {
39
+ tableSpec: Object.entries(frameKey.specs).map(([id, spec]) => ({
40
+ type: "column" as const,
41
+ id,
42
+ spec,
43
+ })),
44
+ };
45
+ },
46
+ };
47
+ return {
48
+ getAccessorHandleByName: () => undefined,
49
+ getUpstreamBlockCtx: () => [],
50
+ getServiceNames: () => ["pframeSpec"],
51
+ getServiceMethods: () => Object.keys(services),
52
+ callServiceMethod: (_id: string, method: string, ...args: unknown[]) =>
53
+ services[method]?.(...args),
54
+ } as unknown as never;
55
+ }
56
+
57
+ let activeCtx: ReturnType<typeof makeCtx>;
58
+ beforeEach(() => {
59
+ activeCtx = makeCtx();
60
+ (globalThis as { cfgRenderCtx?: unknown }).cfgRenderCtx = activeCtx;
61
+ });
62
+
63
+ afterEach(() => {
64
+ delete (globalThis as { cfgRenderCtx?: unknown }).cfgRenderCtx;
65
+ });
66
+
67
+ // ── fixtures ────────────────────────────────────────────────────────────────
68
+
69
+ const hit = createLocalPObjectId(["main", "out"], "hit");
70
+ const linker1 = createLocalPObjectId(["main"], "L1");
71
+ const linker2 = createLocalPObjectId(["main"], "L2");
72
+ const otherCol = createGlobalPObjectId("block-x", "extra");
73
+
74
+ const colNode = (c: PObjectId): SpecQuery => ({ type: "column", column: c });
75
+
76
+ const axisQual = (name: string): AxisQualification => ({ axis: { name }, contextDomain: {} });
77
+
78
+ const overrides = (patch: Partial<SpecOverrides> = {}): SpecOverrides => ({
79
+ annotations: patch.annotations ?? {},
80
+ domain: patch.domain ?? {},
81
+ contextDomain: patch.contextDomain ?? {},
82
+ axesSpec: patch.axesSpec ?? {},
83
+ });
84
+
85
+ class StubRecipe implements ColumnRecipe<ColumnUniversalId> {
86
+ constructor(
87
+ readonly id: ColumnUniversalId,
88
+ private readonly query: SpecQuery,
89
+ ) {}
90
+ getReferencedIds(): PObjectId[] {
91
+ return [];
92
+ }
93
+ getDataStatus(): ColumnFieldStatus {
94
+ return "present";
95
+ }
96
+ getSpec(): PColumnSpec {
97
+ return { kind: "PColumn", valueType: "String", name: "stub", axesSpec: [] };
98
+ }
99
+ getQuery(): SpecQuery {
100
+ return this.query;
101
+ }
102
+ withSpecs(o: SpecOverrides): ColumnRecipe {
103
+ return ColumnOverriddenRecipe.wrap(this, o);
104
+ }
105
+ }
106
+
107
+ const recipe = (id: PObjectId, query: SpecQuery): ColumnRecipe => new StubRecipe(id, query);
108
+
109
+ /**
110
+ * Build a real ColumnDiscoveredRecipe from a manually-crafted key. Plants a
111
+ * stub registry that resolves the hit column so {@link
112
+ * ColumnDiscoveredRecipe.fromKey} succeeds without a real ctx.
113
+ */
114
+ function discovered(opts: {
115
+ column: PObjectId;
116
+ columnQualifications?: AxisQualification[];
117
+ queriesQualifications?: Record<PObjectId, AxisQualification[]>;
118
+ }): ColumnDiscoveredRecipe {
119
+ const distilled = createColumnDiscoveredKey({
120
+ column: opts.column,
121
+ columnQualifications: opts.columnQualifications,
122
+ queriesQualifications: opts.queriesQualifications,
123
+ });
124
+ // Spec with two axes — leaves room for `ColumnFilteredRecipe.wrap` callers
125
+ // in dependent tests (need ≥1 filter and ≥1 remaining axis).
126
+ const stubSpec: PColumnSpec = {
127
+ kind: "PColumn",
128
+ name: "stub",
129
+ valueType: "String",
130
+ axesSpec: [
131
+ { name: "donor", type: "String" },
132
+ { name: "sample", type: "String" },
133
+ ],
134
+ annotations: {},
135
+ };
136
+ installStubRegistry(activeCtx, { [opts.column]: stubSpec });
137
+ const rec = ColumnDiscoveredRecipe.fromKey(distilled);
138
+ if (rec === undefined) throw new Error("discovered fixture: fromKey returned undefined");
139
+ expect(rec.id).toBe(stringifyColumnDiscoveredId(distilled));
140
+ return rec;
141
+ }
142
+
143
+ // ════════════════════════════════════════════════════════════════════════════
144
+ // collectLinkerIds
145
+ // ════════════════════════════════════════════════════════════════════════════
146
+
147
+ describe("collectLinkerIds", () => {
148
+ test("leaf recipe → empty", () => {
149
+ expect(collectLinkerIds(recipe(hit, colNode(hit)))).toEqual([]);
150
+ });
151
+
152
+ test("linkerJoin chain → linker ids in outer-to-inner order, hit excluded", () => {
153
+ const q: SpecQuery = {
154
+ type: "linkerJoin",
155
+ linker: colNode(linker1),
156
+ secondary: [
157
+ {
158
+ entry: {
159
+ type: "linkerJoin",
160
+ linker: colNode(linker2),
161
+ secondary: [{ entry: colNode(hit) }],
162
+ },
163
+ },
164
+ ],
165
+ };
166
+ expect(collectLinkerIds(recipe(hit, q))).toEqual([linker1, linker2]);
167
+ });
168
+
169
+ test("dedupes repeated references", () => {
170
+ const q: SpecQuery = {
171
+ type: "linkerJoin",
172
+ linker: colNode(linker1),
173
+ secondary: [
174
+ {
175
+ entry: {
176
+ type: "linkerJoin",
177
+ linker: colNode(linker1),
178
+ secondary: [{ entry: colNode(hit) }],
179
+ },
180
+ },
181
+ ],
182
+ };
183
+ expect(collectLinkerIds(recipe(hit, q))).toEqual([linker1]);
184
+ });
185
+
186
+ test("ignores the hit even when it appears multiple times", () => {
187
+ const q: SpecQuery = {
188
+ type: "innerJoin",
189
+ entries: [{ entry: colNode(hit) }, { entry: colNode(hit) }, { entry: colNode(otherCol) }],
190
+ };
191
+ expect(collectLinkerIds(recipe(hit, q))).toEqual([otherCol]);
192
+ });
193
+ });
194
+
195
+ // ════════════════════════════════════════════════════════════════════════════
196
+ // hitQualifications / queriesQualifications — recipe-structure walk
197
+ // ════════════════════════════════════════════════════════════════════════════
198
+
199
+ describe("hitQualifications", () => {
200
+ test("leaf recipe → empty list", () => {
201
+ expect(hitQualifications(recipe(hit, colNode(hit)))).toEqual([]);
202
+ });
203
+
204
+ test("reads ColumnDiscoveredRecipe.columnQualifications", () => {
205
+ const d = discovered({ column: hit, columnQualifications: [axisQual("sample")] });
206
+ expect(hitQualifications(d)).toEqual([axisQual("sample")]);
207
+ });
208
+
209
+ test("descends through Overridden wrapper", () => {
210
+ const d = discovered({ column: hit, columnQualifications: [axisQual("donor")] });
211
+ const wrapped = ColumnOverriddenRecipe.wrap(d, overrides({ annotations: { x: "1" } }));
212
+ expect(hitQualifications(wrapped)).toEqual([axisQual("donor")]);
213
+ });
214
+
215
+ test("descends through Filtered wrapper", () => {
216
+ // Filter axis 0 — axis 1 remains, satisfying the wrap invariant.
217
+ const d = discovered({ column: hit, columnQualifications: [axisQual("donor")] });
218
+ const wrapped = ColumnFilteredRecipe.wrap(d, [[0, "v"]]);
219
+ expect(hitQualifications(wrapped)).toEqual([axisQual("donor")]);
220
+ });
221
+
222
+ test("descends through stacked Overridden<Filtered<Discovered>>", () => {
223
+ const d = discovered({ column: hit, columnQualifications: [axisQual("donor")] });
224
+ const stacked = ColumnOverriddenRecipe.wrap(
225
+ ColumnFilteredRecipe.wrap(d, [[0, "v"]]),
226
+ overrides({ annotations: { x: "1" } }),
227
+ );
228
+ expect(hitQualifications(stacked)).toEqual([axisQual("donor")]);
229
+ });
230
+ });
231
+
232
+ describe("queriesQualifications", () => {
233
+ test("leaf recipe → empty record", () => {
234
+ expect(queriesQualifications(recipe(hit, colNode(hit)))).toEqual({});
235
+ });
236
+
237
+ test("reads ColumnDiscoveredRecipe.queriesQualifications", () => {
238
+ const quals = { [otherCol]: [axisQual("primary-side")] };
239
+ const d = discovered({ column: hit, queriesQualifications: quals });
240
+ expect(queriesQualifications(d)).toEqual(quals);
241
+ });
242
+
243
+ test("descends through wrappers", () => {
244
+ const quals = { [otherCol]: [axisQual("primary-side")] };
245
+ const d = discovered({ column: hit, queriesQualifications: quals });
246
+ const wrapped = ColumnOverriddenRecipe.wrap(d, overrides());
247
+ expect(queriesQualifications(wrapped)).toEqual(quals);
248
+ });
249
+ });