@platforma-sdk/model 1.79.27 → 1.80.2

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
@@ -1,5 +1,6 @@
1
- import { ColumnCollectionBuilder } from "../../columns/column_collection_builder.js";
2
- import { ResultPoolColumnSnapshotProvider, collectCtxColumnSnapshotProviders } from "../../columns/ctx_column_sources.js";
1
+ import { ColumnsProvider } from "../../columns/column_providers/providers.js";
2
+ import { getCtxProviders } from "../../columns/column_providers/index.js";
3
+ import "../../columns/index.js";
3
4
  import { buildRefMap, filterMatchesToOptions, findFilterColumns } from "./filter_discovery.js";
4
5
  import { enrichmentVariantsToRefs, findEnrichmentColumns } from "./enrichment_discovery.js";
5
6
  import { multiColumnSelectorsToPredicate } from "@milaboratories/pl-model-common";
@@ -20,44 +21,36 @@ function buildDatasetOptions(ctx, opts) {
20
21
  const options = ctx.resultPool.getOptions(primaryPredicate, { refsWithEnrichments: true });
21
22
  if (options.length === 0) return [];
22
23
  const refMap = buildRefMap(ctx.resultPool.getSpecs().entries);
23
- const pframeSpec = ctx.getService("pframeSpec");
24
24
  const withEnrichments = opts?.withEnrichments ?? false;
25
- const filterSource = new ResultPoolColumnSnapshotProvider(ctx.resultPool);
26
- const enrichmentSources = withEnrichments ? collectCtxColumnSnapshotProviders(ctx) : void 0;
25
+ const filterSource = ColumnsProvider(ctx.ctx.getUpstreamBlockCtx());
26
+ const enrichmentSources = withEnrichments ? getCtxProviders(ctx) : void 0;
27
27
  return options.map((primary) => {
28
28
  const datasetSpec = ctx.resultPool.getPColumnSpecByRef(primary.ref);
29
29
  if (!datasetSpec) return { primary };
30
- let filterCollection;
31
- let enrichmentCollection;
32
- try {
33
- filterCollection = new ColumnCollectionBuilder(pframeSpec).addSource(filterSource).build({
34
- anchors: { main: datasetSpec },
35
- allowPartialColumnList: true
30
+ const filterMatches = findFilterColumns({
31
+ sources: [filterSource],
32
+ anchorSpec: datasetSpec
33
+ }).filter((m) => filterPredicate(m.getSpec()));
34
+ const filters = filterMatches.length === 0 ? void 0 : filterMatchesToOptions(filterMatches, {
35
+ refsByObjectId: refMap,
36
+ datasetSpec,
37
+ labelOptions: opts?.labelOptions
38
+ });
39
+ let enrichments;
40
+ if (enrichmentSources && withEnrichments) {
41
+ const enrichmentVariants = findEnrichmentColumns({
42
+ sources: enrichmentSources,
43
+ anchorSpec: datasetSpec,
44
+ maxHops: opts?.enrichmentMaxHops,
45
+ ...typeof withEnrichments === "function" ? { predicate: withEnrichments } : { include: withEnrichments }
36
46
  });
37
- enrichmentCollection = enrichmentSources !== void 0 ? new ColumnCollectionBuilder(pframeSpec).addSources(enrichmentSources).build({ anchors: { main: datasetSpec } }) : void 0;
38
- const filterMatches = findFilterColumns(filterCollection).filter((m) => filterPredicate(m.column.spec));
39
- const filters = filterMatches.length === 0 ? void 0 : filterMatchesToOptions(filterMatches, {
40
- refsByObjectId: refMap,
41
- datasetSpec,
42
- labelOptions: opts?.labelOptions
43
- });
44
- let enrichments;
45
- if (enrichmentCollection && withEnrichments) {
46
- const enrichmentVariants = findEnrichmentColumns(enrichmentCollection, {
47
- maxHops: opts?.enrichmentMaxHops,
48
- ...typeof withEnrichments === "function" ? { predicate: withEnrichments } : { include: withEnrichments }
49
- });
50
- if (enrichmentVariants.length > 0) enrichments = enrichmentVariantsToRefs(enrichmentVariants, opts?.labelOptions);
51
- }
52
- return {
53
- primary,
54
- ...filters !== void 0 && filters.length > 0 ? { filters } : {},
55
- ...enrichments !== void 0 && enrichments.length > 0 ? { enrichments } : {}
56
- };
57
- } finally {
58
- filterCollection?.dispose();
59
- enrichmentCollection?.dispose();
47
+ if (enrichmentVariants.length > 0) enrichments = enrichmentVariantsToRefs(enrichmentVariants, opts?.labelOptions);
60
48
  }
49
+ return {
50
+ primary,
51
+ ...filters !== void 0 && filters.length > 0 ? { filters } : {},
52
+ ...enrichments !== void 0 && enrichments.length > 0 ? { enrichments } : {}
53
+ };
61
54
  });
62
55
  }
63
56
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"build_dataset_options.js","names":[],"sources":["../../../src/components/PlDatasetSelector/build_dataset_options.ts"],"sourcesContent":["import type { MultiColumnSelector, Option, PObjectSpec } from \"@milaboratories/pl-model-common\";\nimport { multiColumnSelectorsToPredicate } from \"@milaboratories/pl-model-common\";\nimport type { DeriveLabelsOptions } from \"../../labels/derive_distinct_labels\";\nimport type { RenderCtxBase } from \"../../render\";\nimport type { AnchoredColumnCollection } from \"../../columns/column_collection_builder\";\nimport { ColumnCollectionBuilder } from \"../../columns/column_collection_builder\";\nimport {\n ResultPoolColumnSnapshotProvider,\n collectCtxColumnSnapshotProviders,\n} from \"../../columns/ctx_column_sources\";\nimport type { DatasetOption } from \"./dataset_selection\";\nimport { buildRefMap, filterMatchesToOptions, findFilterColumns } from \"./filter_discovery\";\nimport { enrichmentVariantsToRefs, findEnrichmentColumns } from \"./enrichment_discovery\";\n\ntype SpecPredicateOption =\n | MultiColumnSelector\n | MultiColumnSelector[]\n | ((spec: PObjectSpec) => boolean);\n\nfunction toPredicate(opt: SpecPredicateOption | undefined): (spec: PObjectSpec) => boolean {\n if (opt === undefined) return () => true;\n return typeof opt === \"function\" ? opt : multiColumnSelectorsToPredicate(opt);\n}\n\nexport type BuildDatasetOptions = {\n /** Which result pool columns qualify as datasets. Defaults to all. */\n primary?: SpecPredicateOption;\n /**\n * Restricts which result pool columns are considered as filters. Intersected\n * with the built-in `pl7.app/isSubset: \"true\"` constraint. Defaults to\n * accept-all.\n */\n filter?: SpecPredicateOption;\n /**\n * Formatting options forwarded to label derivation for both filter and\n * enrichment rows. `formatters.native` on the filter path is overridden\n * — see `FilterMatchOptions.labelOptions`.\n */\n labelOptions?: DeriveLabelsOptions;\n /**\n * Enables enrichment discovery and filters hits attached to\n * `DatasetOption.enrichments`. Use `() => true` to accept all; omit to disable.\n */\n withEnrichments?: SpecPredicateOption;\n /** Maximum linker hops considered. Only used when `withEnrichments` is set. */\n enrichmentMaxHops?: number;\n};\n\n/**\n * Usage:\n * ```ts\n * .output(\"datasetOptions\", (ctx) => buildDatasetOptions(ctx))\n * ```\n */\nexport function buildDatasetOptions(\n ctx: RenderCtxBase,\n opts?: BuildDatasetOptions,\n): DatasetOption[] | undefined {\n const primaryPredicate = toPredicate(opts?.primary);\n const filterPredicate = toPredicate(opts?.filter);\n\n const options = ctx.resultPool.getOptions(primaryPredicate, { refsWithEnrichments: true });\n if (options.length === 0) return [];\n\n const refMap = buildRefMap(ctx.resultPool.getSpecs().entries);\n const pframeSpec = ctx.getService(\"pframeSpec\");\n\n const withEnrichments = opts?.withEnrichments ?? false;\n const filterSource = new ResultPoolColumnSnapshotProvider(ctx.resultPool);\n // Hoisted out of the per-option loop: collectCtxColumnSnapshotProviders\n // walks the entire output tree, so calling it once per dataset option would\n // be O(N × tree).\n const enrichmentSources = withEnrichments ? collectCtxColumnSnapshotProviders(ctx) : undefined;\n\n return options.map((primary: Option): DatasetOption => {\n const datasetSpec = ctx.resultPool.getPColumnSpecByRef(primary.ref);\n if (!datasetSpec) return { primary };\n\n // Allocations happen inside try so a throw on the second build()\n // still disposes the first collection.\n let filterCollection: AnchoredColumnCollection | undefined;\n let enrichmentCollection: AnchoredColumnCollection | undefined;\n try {\n // ResultPoolColumnSnapshotProvider is always complete;\n // allowPartialColumnList narrows the return type to non-undefined.\n filterCollection = new ColumnCollectionBuilder(pframeSpec)\n .addSource(filterSource)\n .build({ anchors: { main: datasetSpec }, allowPartialColumnList: true });\n\n enrichmentCollection =\n enrichmentSources !== undefined\n ? new ColumnCollectionBuilder(pframeSpec)\n .addSources(enrichmentSources)\n .build({ anchors: { main: datasetSpec } })\n : undefined;\n\n const filterMatches = findFilterColumns(filterCollection).filter((m) =>\n filterPredicate(m.column.spec),\n );\n const filters =\n filterMatches.length === 0\n ? undefined\n : filterMatchesToOptions(filterMatches, {\n refsByObjectId: refMap,\n datasetSpec,\n labelOptions: opts?.labelOptions,\n });\n\n let enrichments;\n if (enrichmentCollection && withEnrichments) {\n const enrichmentVariants = findEnrichmentColumns(enrichmentCollection, {\n maxHops: opts?.enrichmentMaxHops,\n ...(typeof withEnrichments === \"function\"\n ? { predicate: withEnrichments }\n : { include: withEnrichments }),\n });\n if (enrichmentVariants.length > 0) {\n enrichments = enrichmentVariantsToRefs(enrichmentVariants, opts?.labelOptions);\n }\n }\n\n return {\n primary,\n ...(filters !== undefined && filters.length > 0 ? { filters } : {}),\n ...(enrichments !== undefined && enrichments.length > 0 ? { enrichments } : {}),\n };\n } finally {\n filterCollection?.dispose();\n enrichmentCollection?.dispose();\n }\n });\n}\n"],"mappings":";;;;;;AAmBA,SAAS,YAAY,KAAsE;CACzF,IAAI,QAAQ,KAAA,GAAW,aAAa;CACpC,OAAO,OAAO,QAAQ,aAAa,MAAM,gCAAgC,GAAG;AAC9E;;;;;;;AAgCA,SAAgB,oBACd,KACA,MAC6B;CAC7B,MAAM,mBAAmB,YAAY,MAAM,OAAO;CAClD,MAAM,kBAAkB,YAAY,MAAM,MAAM;CAEhD,MAAM,UAAU,IAAI,WAAW,WAAW,kBAAkB,EAAE,qBAAqB,KAAK,CAAC;CACzF,IAAI,QAAQ,WAAW,GAAG,OAAO,CAAC;CAElC,MAAM,SAAS,YAAY,IAAI,WAAW,SAAS,CAAC,CAAC,OAAO;CAC5D,MAAM,aAAa,IAAI,WAAW,YAAY;CAE9C,MAAM,kBAAkB,MAAM,mBAAmB;CACjD,MAAM,eAAe,IAAI,iCAAiC,IAAI,UAAU;CAIxE,MAAM,oBAAoB,kBAAkB,kCAAkC,GAAG,IAAI,KAAA;CAErF,OAAO,QAAQ,KAAK,YAAmC;EACrD,MAAM,cAAc,IAAI,WAAW,oBAAoB,QAAQ,GAAG;EAClE,IAAI,CAAC,aAAa,OAAO,EAAE,QAAQ;EAInC,IAAI;EACJ,IAAI;EACJ,IAAI;GAGF,mBAAmB,IAAI,wBAAwB,UAAU,CAAC,CACvD,UAAU,YAAY,CAAC,CACvB,MAAM;IAAE,SAAS,EAAE,MAAM,YAAY;IAAG,wBAAwB;GAAK,CAAC;GAEzE,uBACE,sBAAsB,KAAA,IAClB,IAAI,wBAAwB,UAAU,CAAC,CACpC,WAAW,iBAAiB,CAAC,CAC7B,MAAM,EAAE,SAAS,EAAE,MAAM,YAAY,EAAE,CAAC,IAC3C,KAAA;GAEN,MAAM,gBAAgB,kBAAkB,gBAAgB,CAAC,CAAC,QAAQ,MAChE,gBAAgB,EAAE,OAAO,IAAI,CAC/B;GACA,MAAM,UACJ,cAAc,WAAW,IACrB,KAAA,IACA,uBAAuB,eAAe;IACpC,gBAAgB;IAChB;IACA,cAAc,MAAM;GACtB,CAAC;GAEP,IAAI;GACJ,IAAI,wBAAwB,iBAAiB;IAC3C,MAAM,qBAAqB,sBAAsB,sBAAsB;KACrE,SAAS,MAAM;KACf,GAAI,OAAO,oBAAoB,aAC3B,EAAE,WAAW,gBAAgB,IAC7B,EAAE,SAAS,gBAAgB;IACjC,CAAC;IACD,IAAI,mBAAmB,SAAS,GAC9B,cAAc,yBAAyB,oBAAoB,MAAM,YAAY;GAEjF;GAEA,OAAO;IACL;IACA,GAAI,YAAY,KAAA,KAAa,QAAQ,SAAS,IAAI,EAAE,QAAQ,IAAI,CAAC;IACjE,GAAI,gBAAgB,KAAA,KAAa,YAAY,SAAS,IAAI,EAAE,YAAY,IAAI,CAAC;GAC/E;EACF,UAAU;GACR,kBAAkB,QAAQ;GAC1B,sBAAsB,QAAQ;EAChC;CACF,CAAC;AACH"}
1
+ {"version":3,"file":"build_dataset_options.js","names":[],"sources":["../../../src/components/PlDatasetSelector/build_dataset_options.ts"],"sourcesContent":["import type { MultiColumnSelector, Option, PObjectSpec } from \"@milaboratories/pl-model-common\";\nimport { multiColumnSelectorsToPredicate } from \"@milaboratories/pl-model-common\";\nimport type { DeriveLabelsOptions } from \"../../labels/derive_distinct_labels\";\nimport type { RenderCtxBase } from \"../../render\";\nimport type { DatasetOption } from \"./dataset_selection\";\nimport { buildRefMap, filterMatchesToOptions, findFilterColumns } from \"./filter_discovery\";\nimport { enrichmentVariantsToRefs, findEnrichmentColumns } from \"./enrichment_discovery\";\nimport { ColumnsProvider, getCtxProviders } from \"../../columns\";\n\ntype SpecPredicateOption =\n | MultiColumnSelector\n | MultiColumnSelector[]\n | ((spec: PObjectSpec) => boolean);\n\nfunction toPredicate(opt: SpecPredicateOption | undefined): (spec: PObjectSpec) => boolean {\n if (opt === undefined) return () => true;\n return typeof opt === \"function\" ? opt : multiColumnSelectorsToPredicate(opt);\n}\n\nexport type BuildDatasetOptions = {\n /** Which result pool columns qualify as datasets. Defaults to all. */\n primary?: SpecPredicateOption;\n /**\n * Restricts which result pool columns are considered as filters. Intersected\n * with the built-in `pl7.app/isSubset: \"true\"` constraint. Defaults to\n * accept-all.\n */\n filter?: SpecPredicateOption;\n /**\n * Formatting options forwarded to label derivation for both filter and\n * enrichment rows. `formatters.native` on the filter path is overridden\n * — see `FilterMatchOptions.labelOptions`.\n */\n labelOptions?: DeriveLabelsOptions;\n /**\n * Enables enrichment discovery and filters hits attached to\n * `DatasetOption.enrichments`. Use `() => true` to accept all; omit to disable.\n */\n withEnrichments?: SpecPredicateOption;\n /** Maximum linker hops considered. Only used when `withEnrichments` is set. */\n enrichmentMaxHops?: number;\n};\n\n/**\n * Usage:\n * ```ts\n * .output(\"datasetOptions\", (ctx) => buildDatasetOptions(ctx))\n * ```\n */\nexport function buildDatasetOptions(\n ctx: RenderCtxBase,\n opts?: BuildDatasetOptions,\n): DatasetOption[] | undefined {\n const primaryPredicate = toPredicate(opts?.primary);\n const filterPredicate = toPredicate(opts?.filter);\n\n const options = ctx.resultPool.getOptions(primaryPredicate, { refsWithEnrichments: true });\n if (options.length === 0) return [];\n\n const refMap = buildRefMap(ctx.resultPool.getSpecs().entries);\n\n const withEnrichments = opts?.withEnrichments ?? false;\n const filterSource = ColumnsProvider(ctx.ctx.getUpstreamBlockCtx());\n // Hoist providers once: getCtxProviders walks the full output tree, so\n // calling it per dataset option would be O(N × tree).\n const enrichmentSources = withEnrichments ? getCtxProviders(ctx) : undefined;\n\n return options.map((primary: Option): DatasetOption => {\n const datasetSpec = ctx.resultPool.getPColumnSpecByRef(primary.ref);\n if (!datasetSpec) return { primary };\n\n const filterMatches = findFilterColumns({\n sources: [filterSource],\n anchorSpec: datasetSpec,\n }).filter((m) => filterPredicate(m.getSpec()!));\n\n const filters =\n filterMatches.length === 0\n ? undefined\n : filterMatchesToOptions(filterMatches, {\n refsByObjectId: refMap,\n datasetSpec,\n labelOptions: opts?.labelOptions,\n });\n\n let enrichments;\n if (enrichmentSources && withEnrichments) {\n const enrichmentVariants = findEnrichmentColumns({\n sources: enrichmentSources,\n anchorSpec: datasetSpec,\n maxHops: opts?.enrichmentMaxHops,\n ...(typeof withEnrichments === \"function\"\n ? { predicate: withEnrichments }\n : { include: withEnrichments }),\n });\n if (enrichmentVariants.length > 0) {\n enrichments = enrichmentVariantsToRefs(enrichmentVariants, opts?.labelOptions);\n }\n }\n\n return {\n primary,\n ...(filters !== undefined && filters.length > 0 ? { filters } : {}),\n ...(enrichments !== undefined && enrichments.length > 0 ? { enrichments } : {}),\n };\n });\n}\n"],"mappings":";;;;;;;AAcA,SAAS,YAAY,KAAsE;CACzF,IAAI,QAAQ,KAAA,GAAW,aAAa;CACpC,OAAO,OAAO,QAAQ,aAAa,MAAM,gCAAgC,GAAG;AAC9E;;;;;;;AAgCA,SAAgB,oBACd,KACA,MAC6B;CAC7B,MAAM,mBAAmB,YAAY,MAAM,OAAO;CAClD,MAAM,kBAAkB,YAAY,MAAM,MAAM;CAEhD,MAAM,UAAU,IAAI,WAAW,WAAW,kBAAkB,EAAE,qBAAqB,KAAK,CAAC;CACzF,IAAI,QAAQ,WAAW,GAAG,OAAO,CAAC;CAElC,MAAM,SAAS,YAAY,IAAI,WAAW,SAAS,CAAC,CAAC,OAAO;CAE5D,MAAM,kBAAkB,MAAM,mBAAmB;CACjD,MAAM,eAAe,gBAAgB,IAAI,IAAI,oBAAoB,CAAC;CAGlE,MAAM,oBAAoB,kBAAkB,gBAAgB,GAAG,IAAI,KAAA;CAEnE,OAAO,QAAQ,KAAK,YAAmC;EACrD,MAAM,cAAc,IAAI,WAAW,oBAAoB,QAAQ,GAAG;EAClE,IAAI,CAAC,aAAa,OAAO,EAAE,QAAQ;EAEnC,MAAM,gBAAgB,kBAAkB;GACtC,SAAS,CAAC,YAAY;GACtB,YAAY;EACd,CAAC,CAAC,CAAC,QAAQ,MAAM,gBAAgB,EAAE,QAAQ,CAAE,CAAC;EAE9C,MAAM,UACJ,cAAc,WAAW,IACrB,KAAA,IACA,uBAAuB,eAAe;GACpC,gBAAgB;GAChB;GACA,cAAc,MAAM;EACtB,CAAC;EAEP,IAAI;EACJ,IAAI,qBAAqB,iBAAiB;GACxC,MAAM,qBAAqB,sBAAsB;IAC/C,SAAS;IACT,YAAY;IACZ,SAAS,MAAM;IACf,GAAI,OAAO,oBAAoB,aAC3B,EAAE,WAAW,gBAAgB,IAC7B,EAAE,SAAS,gBAAgB;GACjC,CAAC;GACD,IAAI,mBAAmB,SAAS,GAC9B,cAAc,yBAAyB,oBAAoB,MAAM,YAAY;EAEjF;EAEA,OAAO;GACL;GACA,GAAI,YAAY,KAAA,KAAa,QAAQ,SAAS,IAAI,EAAE,QAAQ,IAAI,CAAC;GACjE,GAAI,gBAAgB,KAAA,KAAa,YAAY,SAAS,IAAI,EAAE,YAAY,IAAI,CAAC;EAC/E;CACF,CAAC;AACH"}
@@ -1,43 +1,33 @@
1
1
  const require_derive_distinct_labels = require("../../labels/derive_distinct_labels.cjs");
2
+ const require_columns_collection = require("../../columns/columns_collection.cjs");
3
+ const require_utils = require("../../columns/utils.cjs");
4
+ require("../../columns/index.cjs");
2
5
  let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
3
6
  //#region src/components/PlDatasetSelector/enrichment_discovery.ts
4
7
  /**
5
- * True for global-form ids — `canonicalize({__isRef: true, blockId, name})` —
6
- * which the workflow can resolve via bquery. Local-form ids (`resolvePath`)
7
- * fail this check and are excluded from auto-discovery; prerun/outputs hops
8
- * must be supplied as resolved `{spec, data}` instead.
9
- */
10
- function isGloballyAddressable(id) {
11
- try {
12
- const decoded = JSON.parse(id);
13
- return typeof decoded === "object" && decoded !== null && decoded.__isRef === true && typeof decoded.blockId === "string" && typeof decoded.name === "string";
14
- } catch {
15
- return false;
16
- }
17
- }
18
- /**
19
8
  * Linker-reached hits attached to the anchor primary. Drops zero-hop variants
20
9
  * (filters / the primary itself) and structural hits (subset, linker, label
21
10
  * columns). Narrow further with `include` selectors or a `predicate`.
22
11
  */
23
- function findEnrichmentColumns(collection, options) {
24
- const include = options?.include === void 0 ? void 0 : Array.isArray(options.include) ? options.include : [options.include];
25
- const variants = collection.findColumnVariants({
12
+ function findEnrichmentColumns(options) {
13
+ const include = options.include === void 0 ? void 0 : Array.isArray(options.include) ? options.include : [options.include];
14
+ const columns = require_columns_collection.ColumnsCollection([...options.sources], { driver: options.driver }).discover({
15
+ anchors: { main: options.anchorSpec },
26
16
  mode: "enrichment",
27
- maxHops: options?.maxHops ?? 4,
17
+ maxHops: options.maxHops ?? 4,
28
18
  include,
29
19
  exclude: [
30
20
  { annotations: { [_milaboratories_pl_model_common.Annotation.IsSubset]: "true" } },
31
21
  { annotations: { [_milaboratories_pl_model_common.Annotation.IsLinkerColumn]: "true" } },
32
22
  { name: _milaboratories_pl_model_common.Annotation.Label }
33
23
  ]
34
- });
35
- const predicate = options?.predicate;
36
- return variants.filter((v) => {
37
- if ((v.path?.length ?? 0) === 0) return false;
38
- if (predicate !== void 0 && !predicate(v.column.spec)) return false;
39
- if (!isGloballyAddressable(v.column.id)) return false;
40
- if (v.path?.some((p) => !isGloballyAddressable(p.linker.id))) return false;
24
+ }).getColumns();
25
+ const predicate = options.predicate;
26
+ return columns.filter((v) => {
27
+ if (require_utils.isLeafColumn(v)) return false;
28
+ if (predicate !== void 0 && !predicate(v.getSpec())) return false;
29
+ if (!(0, _milaboratories_pl_model_common.isGlobalPObjectId)((0, _milaboratories_pl_model_common.extractPObjectId)(v.id))) return false;
30
+ if (require_utils.collectLinkerIds(v).some((id) => !(0, _milaboratories_pl_model_common.isGlobalPObjectId)(id))) return false;
41
31
  return true;
42
32
  });
43
33
  }
@@ -48,20 +38,25 @@ function findEnrichmentColumns(collection, options) {
48
38
  */
49
39
  function enrichmentVariantsToRefs(variants, labelOptions) {
50
40
  if (variants.length === 0) return [];
51
- const labels = require_derive_distinct_labels.deriveDistinctLabels(variants.map((variant) => ({
52
- spec: variant.column.spec,
53
- linkerPath: variant.path?.map((p) => ({ spec: p.linker.spec })),
54
- qualifications: variant.qualifications
41
+ const linkerIdsByVariant = variants.map((v) => require_utils.collectLinkerIds(v));
42
+ const hitQualsByVariant = variants.map((v) => [...require_utils.hitQualifications(v)]);
43
+ const labels = require_derive_distinct_labels.deriveDistinctLabels(variants.map((variant, i) => ({
44
+ spec: variant.getSpec(),
45
+ linkerPath: require_utils.collectLinkerColumns(variant).map((linker) => ({ spec: linker.getSpec() })),
46
+ qualifications: {
47
+ forHit: hitQualsByVariant[i],
48
+ forQueries: require_utils.queriesQualifications(variant)
49
+ }
55
50
  })), labelOptions);
56
51
  return variants.map((variant, i) => {
57
- const path = variant.path?.map((step) => ({
52
+ const path = linkerIdsByVariant[i].length === 0 ? void 0 : linkerIdsByVariant[i].map((id) => ({
58
53
  type: "linker",
59
- linker: step.linker.id
54
+ linker: id
60
55
  }));
61
56
  return {
62
- ref: (0, _milaboratories_pl_model_common.createEnrichmentRef)(variant.column.id, {
57
+ ref: (0, _milaboratories_pl_model_common.createEnrichmentRef)((0, _milaboratories_pl_model_common.extractPObjectId)(variant.id), {
63
58
  path,
64
- qualifications: variant.qualifications?.forHit
59
+ qualifications: hitQualsByVariant[i]
65
60
  }),
66
61
  label: labels[i]
67
62
  };
@@ -1 +1 @@
1
- {"version":3,"file":"enrichment_discovery.cjs","names":["Annotation","deriveDistinctLabels"],"sources":["../../../src/components/PlDatasetSelector/enrichment_discovery.ts"],"sourcesContent":["import { Annotation, createEnrichmentRef } from \"@milaboratories/pl-model-common\";\nimport type {\n EnrichmentStep,\n LabeledEnrichmentRef,\n LabeledEnrichmentRefs,\n MultiColumnSelector,\n PObjectId,\n PObjectSpec,\n} from \"@milaboratories/pl-model-common\";\nimport type {\n AnchoredColumnCollection,\n ColumnVariant,\n} from \"../../columns/column_collection_builder\";\nimport {\n deriveDistinctLabels,\n type DeriveLabelsOptions,\n type Entry,\n} from \"../../labels/derive_distinct_labels\";\n\n/**\n * True for global-form ids — `canonicalize({__isRef: true, blockId, name})` —\n * which the workflow can resolve via bquery. Local-form ids (`resolvePath`)\n * fail this check and are excluded from auto-discovery; prerun/outputs hops\n * must be supplied as resolved `{spec, data}` instead.\n */\nfunction isGloballyAddressable(id: PObjectId): boolean {\n try {\n const decoded = JSON.parse(id);\n return (\n typeof decoded === \"object\" &&\n decoded !== null &&\n decoded.__isRef === true &&\n typeof decoded.blockId === \"string\" &&\n typeof decoded.name === \"string\"\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Linker-reached hits attached to the anchor primary. Drops zero-hop variants\n * (filters / the primary itself) and structural hits (subset, linker, label\n * columns). Narrow further with `include` selectors or a `predicate`.\n */\nexport function findEnrichmentColumns(\n collection: AnchoredColumnCollection,\n options?: {\n maxHops?: number;\n include?: MultiColumnSelector | MultiColumnSelector[];\n predicate?: (spec: PObjectSpec) => boolean;\n },\n): ColumnVariant[] {\n const include =\n options?.include === undefined\n ? undefined\n : Array.isArray(options.include)\n ? options.include\n : [options.include];\n const variants = collection.findColumnVariants({\n mode: \"enrichment\",\n maxHops: options?.maxHops ?? 4,\n include,\n exclude: [\n { annotations: { [Annotation.IsSubset]: \"true\" } },\n { annotations: { [Annotation.IsLinkerColumn]: \"true\" } },\n { name: Annotation.Label },\n ],\n });\n const predicate = options?.predicate;\n return variants.filter((v) => {\n if ((v.path?.length ?? 0) === 0) return false;\n if (predicate !== undefined && !predicate(v.column.spec)) return false;\n if (!isGloballyAddressable(v.column.id)) return false;\n if (v.path?.some((p) => !isGloballyAddressable(p.linker.id))) return false;\n return true;\n });\n}\n\n/**\n * Pair each variant with a path-disambiguated label (so export headers stay\n * unique) and carry hit/linker `PObjectId`s through verbatim. Propagates\n * `qualifications.forHit`; `forQueries` is re-derived by the table builder.\n */\nexport function enrichmentVariantsToRefs(\n variants: ColumnVariant[],\n labelOptions?: DeriveLabelsOptions,\n): LabeledEnrichmentRefs {\n if (variants.length === 0) return [];\n\n const entries: Entry[] = variants.map((variant) => ({\n spec: variant.column.spec,\n linkerPath: variant.path?.map((p) => ({ spec: p.linker.spec })),\n qualifications: variant.qualifications,\n }));\n const labels = deriveDistinctLabels(entries, labelOptions);\n\n return variants.map((variant, i): LabeledEnrichmentRef => {\n const path: undefined | EnrichmentStep[] = variant.path?.map((step) => ({\n type: \"linker\",\n linker: step.linker.id,\n }));\n return {\n ref: createEnrichmentRef(variant.column.id, {\n path,\n qualifications: variant.qualifications?.forHit,\n }),\n label: labels[i],\n };\n });\n}\n"],"mappings":";;;;;;;;;AAyBA,SAAS,sBAAsB,IAAwB;CACrD,IAAI;EACF,MAAM,UAAU,KAAK,MAAM,EAAE;EAC7B,OACE,OAAO,YAAY,YACnB,YAAY,QACZ,QAAQ,YAAY,QACpB,OAAO,QAAQ,YAAY,YAC3B,OAAO,QAAQ,SAAS;CAE5B,QAAQ;EACN,OAAO;CACT;AACF;;;;;;AAOA,SAAgB,sBACd,YACA,SAKiB;CACjB,MAAM,UACJ,SAAS,YAAY,KAAA,IACjB,KAAA,IACA,MAAM,QAAQ,QAAQ,OAAO,IAC3B,QAAQ,UACR,CAAC,QAAQ,OAAO;CACxB,MAAM,WAAW,WAAW,mBAAmB;EAC7C,MAAM;EACN,SAAS,SAAS,WAAW;EAC7B;EACA,SAAS;GACP,EAAE,aAAa,GAAGA,gCAAAA,WAAW,WAAW,OAAO,EAAE;GACjD,EAAE,aAAa,GAAGA,gCAAAA,WAAW,iBAAiB,OAAO,EAAE;GACvD,EAAE,MAAMA,gCAAAA,WAAW,MAAM;EAC3B;CACF,CAAC;CACD,MAAM,YAAY,SAAS;CAC3B,OAAO,SAAS,QAAQ,MAAM;EAC5B,KAAK,EAAE,MAAM,UAAU,OAAO,GAAG,OAAO;EACxC,IAAI,cAAc,KAAA,KAAa,CAAC,UAAU,EAAE,OAAO,IAAI,GAAG,OAAO;EACjE,IAAI,CAAC,sBAAsB,EAAE,OAAO,EAAE,GAAG,OAAO;EAChD,IAAI,EAAE,MAAM,MAAM,MAAM,CAAC,sBAAsB,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO;EACrE,OAAO;CACT,CAAC;AACH;;;;;;AAOA,SAAgB,yBACd,UACA,cACuB;CACvB,IAAI,SAAS,WAAW,GAAG,OAAO,CAAC;CAOnC,MAAM,SAASC,+BAAAA,qBALU,SAAS,KAAK,aAAa;EAClD,MAAM,QAAQ,OAAO;EACrB,YAAY,QAAQ,MAAM,KAAK,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,EAAE;EAC9D,gBAAgB,QAAQ;CAC1B,EAC0C,GAAG,YAAY;CAEzD,OAAO,SAAS,KAAK,SAAS,MAA4B;EACxD,MAAM,OAAqC,QAAQ,MAAM,KAAK,UAAU;GACtE,MAAM;GACN,QAAQ,KAAK,OAAO;EACtB,EAAE;EACF,OAAO;GACL,MAAA,GAAA,gCAAA,oBAAA,CAAyB,QAAQ,OAAO,IAAI;IAC1C;IACA,gBAAgB,QAAQ,gBAAgB;GAC1C,CAAC;GACD,OAAO,OAAO;EAChB;CACF,CAAC;AACH"}
1
+ {"version":3,"file":"enrichment_discovery.cjs","names":["ColumnsCollection","Annotation","isLeafColumn","collectLinkerIds","hitQualifications","deriveDistinctLabels","collectLinkerColumns","queriesQualifications"],"sources":["../../../src/components/PlDatasetSelector/enrichment_discovery.ts"],"sourcesContent":["import {\n Annotation,\n createEnrichmentRef,\n extractPObjectId,\n isGlobalPObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport type {\n ColumnsCollectionDriverModel,\n EnrichmentStep,\n LabeledEnrichmentRef,\n LabeledEnrichmentRefs,\n MultiColumnSelector,\n PColumnSpec,\n PObjectSpec,\n} from \"@milaboratories/pl-model-common\";\nimport type { ColumnRecipe, ColumnsSource } from \"../../columns\";\nimport {\n isLeafColumn,\n ColumnsCollection,\n collectLinkerIds,\n hitQualifications,\n collectLinkerColumns,\n queriesQualifications,\n} from \"../../columns\";\nimport {\n deriveDistinctLabels,\n type DeriveLabelsOptions,\n type Entry,\n} from \"../../labels/derive_distinct_labels\";\n\nexport interface FindEnrichmentColumnsOptions {\n sources: ReadonlyArray<ColumnsSource>;\n anchorSpec: PColumnSpec;\n maxHops?: number;\n include?: MultiColumnSelector | MultiColumnSelector[];\n predicate?: (spec: PObjectSpec) => boolean;\n /** Override the resolved `columnsCollection` service (primarily for tests). */\n driver?: ColumnsCollectionDriverModel;\n}\n\n/**\n * Linker-reached hits attached to the anchor primary. Drops zero-hop variants\n * (filters / the primary itself) and structural hits (subset, linker, label\n * columns). Narrow further with `include` selectors or a `predicate`.\n */\nexport function findEnrichmentColumns(options: FindEnrichmentColumnsOptions): ColumnRecipe[] {\n const include =\n options.include === undefined\n ? undefined\n : Array.isArray(options.include)\n ? options.include\n : [options.include];\n\n const columns = ColumnsCollection([...options.sources], { driver: options.driver })\n .discover({\n anchors: { main: options.anchorSpec },\n mode: \"enrichment\",\n maxHops: options.maxHops ?? 4,\n include,\n exclude: [\n { annotations: { [Annotation.IsSubset]: \"true\" } },\n { annotations: { [Annotation.IsLinkerColumn]: \"true\" } },\n { name: Annotation.Label },\n ],\n })\n .getColumns();\n\n const predicate = options.predicate;\n return columns.filter((v) => {\n if (isLeafColumn(v)) return false;\n if (predicate !== undefined && !predicate(v.getSpec())) return false;\n if (!isGlobalPObjectId(extractPObjectId(v.id))) return false;\n if (collectLinkerIds(v).some((id) => !isGlobalPObjectId(id))) return false;\n return true;\n });\n}\n\n/**\n * Pair each variant with a path-disambiguated label (so export headers stay\n * unique) and carry hit/linker `PObjectId`s through verbatim. Propagates\n * `qualifications.forHit`; `forQueries` is re-derived by the table builder.\n */\nexport function enrichmentVariantsToRefs(\n variants: ColumnRecipe[],\n labelOptions?: DeriveLabelsOptions,\n): LabeledEnrichmentRefs {\n if (variants.length === 0) return [];\n\n const linkerIdsByVariant = variants.map((v) => collectLinkerIds(v));\n const hitQualsByVariant = variants.map((v) => [...hitQualifications(v)]);\n\n const entries: Entry[] = variants.map((variant, i) => ({\n spec: variant.getSpec(),\n linkerPath: collectLinkerColumns(variant).map((linker) => ({ spec: linker.getSpec() })),\n qualifications: {\n forHit: hitQualsByVariant[i],\n forQueries: queriesQualifications(variant),\n },\n }));\n const labels = deriveDistinctLabels(entries, labelOptions);\n\n return variants.map((variant, i): LabeledEnrichmentRef => {\n const path: undefined | EnrichmentStep[] =\n linkerIdsByVariant[i].length === 0\n ? undefined\n : linkerIdsByVariant[i].map((id) => ({ type: \"linker\", linker: id }));\n return {\n ref: createEnrichmentRef(extractPObjectId(variant.id), {\n path,\n qualifications: hitQualsByVariant[i],\n }),\n label: labels[i],\n };\n });\n}\n"],"mappings":";;;;;;;;;;;AA6CA,SAAgB,sBAAsB,SAAuD;CAC3F,MAAM,UACJ,QAAQ,YAAY,KAAA,IAChB,KAAA,IACA,MAAM,QAAQ,QAAQ,OAAO,IAC3B,QAAQ,UACR,CAAC,QAAQ,OAAO;CAExB,MAAM,UAAUA,2BAAAA,kBAAkB,CAAC,GAAG,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,OAAO,CAAC,CAAC,CAChF,SAAS;EACR,SAAS,EAAE,MAAM,QAAQ,WAAW;EACpC,MAAM;EACN,SAAS,QAAQ,WAAW;EAC5B;EACA,SAAS;GACP,EAAE,aAAa,GAAGC,gCAAAA,WAAW,WAAW,OAAO,EAAE;GACjD,EAAE,aAAa,GAAGA,gCAAAA,WAAW,iBAAiB,OAAO,EAAE;GACvD,EAAE,MAAMA,gCAAAA,WAAW,MAAM;EAC3B;CACF,CAAC,CAAC,CACD,WAAW;CAEd,MAAM,YAAY,QAAQ;CAC1B,OAAO,QAAQ,QAAQ,MAAM;EAC3B,IAAIC,cAAAA,aAAa,CAAC,GAAG,OAAO;EAC5B,IAAI,cAAc,KAAA,KAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,OAAO;EAC/D,IAAI,EAAA,GAAA,gCAAA,kBAAA,EAAA,GAAA,gCAAA,iBAAA,CAAoC,EAAE,EAAE,CAAC,GAAG,OAAO;EACvD,IAAIC,cAAAA,iBAAiB,CAAC,CAAC,CAAC,MAAM,OAAO,EAAA,GAAA,gCAAA,kBAAA,CAAmB,EAAE,CAAC,GAAG,OAAO;EACrE,OAAO;CACT,CAAC;AACH;;;;;;AAOA,SAAgB,yBACd,UACA,cACuB;CACvB,IAAI,SAAS,WAAW,GAAG,OAAO,CAAC;CAEnC,MAAM,qBAAqB,SAAS,KAAK,MAAMA,cAAAA,iBAAiB,CAAC,CAAC;CAClE,MAAM,oBAAoB,SAAS,KAAK,MAAM,CAAC,GAAGC,cAAAA,kBAAkB,CAAC,CAAC,CAAC;CAUvE,MAAM,SAASC,+BAAAA,qBARU,SAAS,KAAK,SAAS,OAAO;EACrD,MAAM,QAAQ,QAAQ;EACtB,YAAYC,cAAAA,qBAAqB,OAAO,CAAC,CAAC,KAAK,YAAY,EAAE,MAAM,OAAO,QAAQ,EAAE,EAAE;EACtF,gBAAgB;GACd,QAAQ,kBAAkB;GAC1B,YAAYC,cAAAA,sBAAsB,OAAO;EAC3C;CACF,EAC0C,GAAG,YAAY;CAEzD,OAAO,SAAS,KAAK,SAAS,MAA4B;EACxD,MAAM,OACJ,mBAAmB,EAAE,CAAC,WAAW,IAC7B,KAAA,IACA,mBAAmB,EAAE,CAAC,KAAK,QAAQ;GAAE,MAAM;GAAU,QAAQ;EAAG,EAAE;EACxE,OAAO;GACL,MAAA,GAAA,gCAAA,oBAAA,EAAA,GAAA,gCAAA,iBAAA,CAA0C,QAAQ,EAAE,GAAG;IACrD;IACA,gBAAgB,kBAAkB;GACpC,CAAC;GACD,OAAO,OAAO;EAChB;CACF,CAAC;AACH"}
@@ -1,43 +1,33 @@
1
1
  import { deriveDistinctLabels } from "../../labels/derive_distinct_labels.js";
2
- import { Annotation, createEnrichmentRef } from "@milaboratories/pl-model-common";
2
+ import { ColumnsCollection } from "../../columns/columns_collection.js";
3
+ import { collectLinkerColumns, collectLinkerIds, hitQualifications, isLeafColumn, queriesQualifications } from "../../columns/utils.js";
4
+ import "../../columns/index.js";
5
+ import { Annotation, createEnrichmentRef, extractPObjectId, isGlobalPObjectId } from "@milaboratories/pl-model-common";
3
6
  //#region src/components/PlDatasetSelector/enrichment_discovery.ts
4
7
  /**
5
- * True for global-form ids — `canonicalize({__isRef: true, blockId, name})` —
6
- * which the workflow can resolve via bquery. Local-form ids (`resolvePath`)
7
- * fail this check and are excluded from auto-discovery; prerun/outputs hops
8
- * must be supplied as resolved `{spec, data}` instead.
9
- */
10
- function isGloballyAddressable(id) {
11
- try {
12
- const decoded = JSON.parse(id);
13
- return typeof decoded === "object" && decoded !== null && decoded.__isRef === true && typeof decoded.blockId === "string" && typeof decoded.name === "string";
14
- } catch {
15
- return false;
16
- }
17
- }
18
- /**
19
8
  * Linker-reached hits attached to the anchor primary. Drops zero-hop variants
20
9
  * (filters / the primary itself) and structural hits (subset, linker, label
21
10
  * columns). Narrow further with `include` selectors or a `predicate`.
22
11
  */
23
- function findEnrichmentColumns(collection, options) {
24
- const include = options?.include === void 0 ? void 0 : Array.isArray(options.include) ? options.include : [options.include];
25
- const variants = collection.findColumnVariants({
12
+ function findEnrichmentColumns(options) {
13
+ const include = options.include === void 0 ? void 0 : Array.isArray(options.include) ? options.include : [options.include];
14
+ const columns = ColumnsCollection([...options.sources], { driver: options.driver }).discover({
15
+ anchors: { main: options.anchorSpec },
26
16
  mode: "enrichment",
27
- maxHops: options?.maxHops ?? 4,
17
+ maxHops: options.maxHops ?? 4,
28
18
  include,
29
19
  exclude: [
30
20
  { annotations: { [Annotation.IsSubset]: "true" } },
31
21
  { annotations: { [Annotation.IsLinkerColumn]: "true" } },
32
22
  { name: Annotation.Label }
33
23
  ]
34
- });
35
- const predicate = options?.predicate;
36
- return variants.filter((v) => {
37
- if ((v.path?.length ?? 0) === 0) return false;
38
- if (predicate !== void 0 && !predicate(v.column.spec)) return false;
39
- if (!isGloballyAddressable(v.column.id)) return false;
40
- if (v.path?.some((p) => !isGloballyAddressable(p.linker.id))) return false;
24
+ }).getColumns();
25
+ const predicate = options.predicate;
26
+ return columns.filter((v) => {
27
+ if (isLeafColumn(v)) return false;
28
+ if (predicate !== void 0 && !predicate(v.getSpec())) return false;
29
+ if (!isGlobalPObjectId(extractPObjectId(v.id))) return false;
30
+ if (collectLinkerIds(v).some((id) => !isGlobalPObjectId(id))) return false;
41
31
  return true;
42
32
  });
43
33
  }
@@ -48,20 +38,25 @@ function findEnrichmentColumns(collection, options) {
48
38
  */
49
39
  function enrichmentVariantsToRefs(variants, labelOptions) {
50
40
  if (variants.length === 0) return [];
51
- const labels = deriveDistinctLabels(variants.map((variant) => ({
52
- spec: variant.column.spec,
53
- linkerPath: variant.path?.map((p) => ({ spec: p.linker.spec })),
54
- qualifications: variant.qualifications
41
+ const linkerIdsByVariant = variants.map((v) => collectLinkerIds(v));
42
+ const hitQualsByVariant = variants.map((v) => [...hitQualifications(v)]);
43
+ const labels = deriveDistinctLabels(variants.map((variant, i) => ({
44
+ spec: variant.getSpec(),
45
+ linkerPath: collectLinkerColumns(variant).map((linker) => ({ spec: linker.getSpec() })),
46
+ qualifications: {
47
+ forHit: hitQualsByVariant[i],
48
+ forQueries: queriesQualifications(variant)
49
+ }
55
50
  })), labelOptions);
56
51
  return variants.map((variant, i) => {
57
- const path = variant.path?.map((step) => ({
52
+ const path = linkerIdsByVariant[i].length === 0 ? void 0 : linkerIdsByVariant[i].map((id) => ({
58
53
  type: "linker",
59
- linker: step.linker.id
54
+ linker: id
60
55
  }));
61
56
  return {
62
- ref: createEnrichmentRef(variant.column.id, {
57
+ ref: createEnrichmentRef(extractPObjectId(variant.id), {
63
58
  path,
64
- qualifications: variant.qualifications?.forHit
59
+ qualifications: hitQualsByVariant[i]
65
60
  }),
66
61
  label: labels[i]
67
62
  };
@@ -1 +1 @@
1
- {"version":3,"file":"enrichment_discovery.js","names":[],"sources":["../../../src/components/PlDatasetSelector/enrichment_discovery.ts"],"sourcesContent":["import { Annotation, createEnrichmentRef } from \"@milaboratories/pl-model-common\";\nimport type {\n EnrichmentStep,\n LabeledEnrichmentRef,\n LabeledEnrichmentRefs,\n MultiColumnSelector,\n PObjectId,\n PObjectSpec,\n} from \"@milaboratories/pl-model-common\";\nimport type {\n AnchoredColumnCollection,\n ColumnVariant,\n} from \"../../columns/column_collection_builder\";\nimport {\n deriveDistinctLabels,\n type DeriveLabelsOptions,\n type Entry,\n} from \"../../labels/derive_distinct_labels\";\n\n/**\n * True for global-form ids — `canonicalize({__isRef: true, blockId, name})` —\n * which the workflow can resolve via bquery. Local-form ids (`resolvePath`)\n * fail this check and are excluded from auto-discovery; prerun/outputs hops\n * must be supplied as resolved `{spec, data}` instead.\n */\nfunction isGloballyAddressable(id: PObjectId): boolean {\n try {\n const decoded = JSON.parse(id);\n return (\n typeof decoded === \"object\" &&\n decoded !== null &&\n decoded.__isRef === true &&\n typeof decoded.blockId === \"string\" &&\n typeof decoded.name === \"string\"\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Linker-reached hits attached to the anchor primary. Drops zero-hop variants\n * (filters / the primary itself) and structural hits (subset, linker, label\n * columns). Narrow further with `include` selectors or a `predicate`.\n */\nexport function findEnrichmentColumns(\n collection: AnchoredColumnCollection,\n options?: {\n maxHops?: number;\n include?: MultiColumnSelector | MultiColumnSelector[];\n predicate?: (spec: PObjectSpec) => boolean;\n },\n): ColumnVariant[] {\n const include =\n options?.include === undefined\n ? undefined\n : Array.isArray(options.include)\n ? options.include\n : [options.include];\n const variants = collection.findColumnVariants({\n mode: \"enrichment\",\n maxHops: options?.maxHops ?? 4,\n include,\n exclude: [\n { annotations: { [Annotation.IsSubset]: \"true\" } },\n { annotations: { [Annotation.IsLinkerColumn]: \"true\" } },\n { name: Annotation.Label },\n ],\n });\n const predicate = options?.predicate;\n return variants.filter((v) => {\n if ((v.path?.length ?? 0) === 0) return false;\n if (predicate !== undefined && !predicate(v.column.spec)) return false;\n if (!isGloballyAddressable(v.column.id)) return false;\n if (v.path?.some((p) => !isGloballyAddressable(p.linker.id))) return false;\n return true;\n });\n}\n\n/**\n * Pair each variant with a path-disambiguated label (so export headers stay\n * unique) and carry hit/linker `PObjectId`s through verbatim. Propagates\n * `qualifications.forHit`; `forQueries` is re-derived by the table builder.\n */\nexport function enrichmentVariantsToRefs(\n variants: ColumnVariant[],\n labelOptions?: DeriveLabelsOptions,\n): LabeledEnrichmentRefs {\n if (variants.length === 0) return [];\n\n const entries: Entry[] = variants.map((variant) => ({\n spec: variant.column.spec,\n linkerPath: variant.path?.map((p) => ({ spec: p.linker.spec })),\n qualifications: variant.qualifications,\n }));\n const labels = deriveDistinctLabels(entries, labelOptions);\n\n return variants.map((variant, i): LabeledEnrichmentRef => {\n const path: undefined | EnrichmentStep[] = variant.path?.map((step) => ({\n type: \"linker\",\n linker: step.linker.id,\n }));\n return {\n ref: createEnrichmentRef(variant.column.id, {\n path,\n qualifications: variant.qualifications?.forHit,\n }),\n label: labels[i],\n };\n });\n}\n"],"mappings":";;;;;;;;;AAyBA,SAAS,sBAAsB,IAAwB;CACrD,IAAI;EACF,MAAM,UAAU,KAAK,MAAM,EAAE;EAC7B,OACE,OAAO,YAAY,YACnB,YAAY,QACZ,QAAQ,YAAY,QACpB,OAAO,QAAQ,YAAY,YAC3B,OAAO,QAAQ,SAAS;CAE5B,QAAQ;EACN,OAAO;CACT;AACF;;;;;;AAOA,SAAgB,sBACd,YACA,SAKiB;CACjB,MAAM,UACJ,SAAS,YAAY,KAAA,IACjB,KAAA,IACA,MAAM,QAAQ,QAAQ,OAAO,IAC3B,QAAQ,UACR,CAAC,QAAQ,OAAO;CACxB,MAAM,WAAW,WAAW,mBAAmB;EAC7C,MAAM;EACN,SAAS,SAAS,WAAW;EAC7B;EACA,SAAS;GACP,EAAE,aAAa,GAAG,WAAW,WAAW,OAAO,EAAE;GACjD,EAAE,aAAa,GAAG,WAAW,iBAAiB,OAAO,EAAE;GACvD,EAAE,MAAM,WAAW,MAAM;EAC3B;CACF,CAAC;CACD,MAAM,YAAY,SAAS;CAC3B,OAAO,SAAS,QAAQ,MAAM;EAC5B,KAAK,EAAE,MAAM,UAAU,OAAO,GAAG,OAAO;EACxC,IAAI,cAAc,KAAA,KAAa,CAAC,UAAU,EAAE,OAAO,IAAI,GAAG,OAAO;EACjE,IAAI,CAAC,sBAAsB,EAAE,OAAO,EAAE,GAAG,OAAO;EAChD,IAAI,EAAE,MAAM,MAAM,MAAM,CAAC,sBAAsB,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO;EACrE,OAAO;CACT,CAAC;AACH;;;;;;AAOA,SAAgB,yBACd,UACA,cACuB;CACvB,IAAI,SAAS,WAAW,GAAG,OAAO,CAAC;CAOnC,MAAM,SAAS,qBALU,SAAS,KAAK,aAAa;EAClD,MAAM,QAAQ,OAAO;EACrB,YAAY,QAAQ,MAAM,KAAK,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,EAAE;EAC9D,gBAAgB,QAAQ;CAC1B,EAC0C,GAAG,YAAY;CAEzD,OAAO,SAAS,KAAK,SAAS,MAA4B;EACxD,MAAM,OAAqC,QAAQ,MAAM,KAAK,UAAU;GACtE,MAAM;GACN,QAAQ,KAAK,OAAO;EACtB,EAAE;EACF,OAAO;GACL,KAAK,oBAAoB,QAAQ,OAAO,IAAI;IAC1C;IACA,gBAAgB,QAAQ,gBAAgB;GAC1C,CAAC;GACD,OAAO,OAAO;EAChB;CACF,CAAC;AACH"}
1
+ {"version":3,"file":"enrichment_discovery.js","names":[],"sources":["../../../src/components/PlDatasetSelector/enrichment_discovery.ts"],"sourcesContent":["import {\n Annotation,\n createEnrichmentRef,\n extractPObjectId,\n isGlobalPObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport type {\n ColumnsCollectionDriverModel,\n EnrichmentStep,\n LabeledEnrichmentRef,\n LabeledEnrichmentRefs,\n MultiColumnSelector,\n PColumnSpec,\n PObjectSpec,\n} from \"@milaboratories/pl-model-common\";\nimport type { ColumnRecipe, ColumnsSource } from \"../../columns\";\nimport {\n isLeafColumn,\n ColumnsCollection,\n collectLinkerIds,\n hitQualifications,\n collectLinkerColumns,\n queriesQualifications,\n} from \"../../columns\";\nimport {\n deriveDistinctLabels,\n type DeriveLabelsOptions,\n type Entry,\n} from \"../../labels/derive_distinct_labels\";\n\nexport interface FindEnrichmentColumnsOptions {\n sources: ReadonlyArray<ColumnsSource>;\n anchorSpec: PColumnSpec;\n maxHops?: number;\n include?: MultiColumnSelector | MultiColumnSelector[];\n predicate?: (spec: PObjectSpec) => boolean;\n /** Override the resolved `columnsCollection` service (primarily for tests). */\n driver?: ColumnsCollectionDriverModel;\n}\n\n/**\n * Linker-reached hits attached to the anchor primary. Drops zero-hop variants\n * (filters / the primary itself) and structural hits (subset, linker, label\n * columns). Narrow further with `include` selectors or a `predicate`.\n */\nexport function findEnrichmentColumns(options: FindEnrichmentColumnsOptions): ColumnRecipe[] {\n const include =\n options.include === undefined\n ? undefined\n : Array.isArray(options.include)\n ? options.include\n : [options.include];\n\n const columns = ColumnsCollection([...options.sources], { driver: options.driver })\n .discover({\n anchors: { main: options.anchorSpec },\n mode: \"enrichment\",\n maxHops: options.maxHops ?? 4,\n include,\n exclude: [\n { annotations: { [Annotation.IsSubset]: \"true\" } },\n { annotations: { [Annotation.IsLinkerColumn]: \"true\" } },\n { name: Annotation.Label },\n ],\n })\n .getColumns();\n\n const predicate = options.predicate;\n return columns.filter((v) => {\n if (isLeafColumn(v)) return false;\n if (predicate !== undefined && !predicate(v.getSpec())) return false;\n if (!isGlobalPObjectId(extractPObjectId(v.id))) return false;\n if (collectLinkerIds(v).some((id) => !isGlobalPObjectId(id))) return false;\n return true;\n });\n}\n\n/**\n * Pair each variant with a path-disambiguated label (so export headers stay\n * unique) and carry hit/linker `PObjectId`s through verbatim. Propagates\n * `qualifications.forHit`; `forQueries` is re-derived by the table builder.\n */\nexport function enrichmentVariantsToRefs(\n variants: ColumnRecipe[],\n labelOptions?: DeriveLabelsOptions,\n): LabeledEnrichmentRefs {\n if (variants.length === 0) return [];\n\n const linkerIdsByVariant = variants.map((v) => collectLinkerIds(v));\n const hitQualsByVariant = variants.map((v) => [...hitQualifications(v)]);\n\n const entries: Entry[] = variants.map((variant, i) => ({\n spec: variant.getSpec(),\n linkerPath: collectLinkerColumns(variant).map((linker) => ({ spec: linker.getSpec() })),\n qualifications: {\n forHit: hitQualsByVariant[i],\n forQueries: queriesQualifications(variant),\n },\n }));\n const labels = deriveDistinctLabels(entries, labelOptions);\n\n return variants.map((variant, i): LabeledEnrichmentRef => {\n const path: undefined | EnrichmentStep[] =\n linkerIdsByVariant[i].length === 0\n ? undefined\n : linkerIdsByVariant[i].map((id) => ({ type: \"linker\", linker: id }));\n return {\n ref: createEnrichmentRef(extractPObjectId(variant.id), {\n path,\n qualifications: hitQualsByVariant[i],\n }),\n label: labels[i],\n };\n });\n}\n"],"mappings":";;;;;;;;;;;AA6CA,SAAgB,sBAAsB,SAAuD;CAC3F,MAAM,UACJ,QAAQ,YAAY,KAAA,IAChB,KAAA,IACA,MAAM,QAAQ,QAAQ,OAAO,IAC3B,QAAQ,UACR,CAAC,QAAQ,OAAO;CAExB,MAAM,UAAU,kBAAkB,CAAC,GAAG,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,OAAO,CAAC,CAAC,CAChF,SAAS;EACR,SAAS,EAAE,MAAM,QAAQ,WAAW;EACpC,MAAM;EACN,SAAS,QAAQ,WAAW;EAC5B;EACA,SAAS;GACP,EAAE,aAAa,GAAG,WAAW,WAAW,OAAO,EAAE;GACjD,EAAE,aAAa,GAAG,WAAW,iBAAiB,OAAO,EAAE;GACvD,EAAE,MAAM,WAAW,MAAM;EAC3B;CACF,CAAC,CAAC,CACD,WAAW;CAEd,MAAM,YAAY,QAAQ;CAC1B,OAAO,QAAQ,QAAQ,MAAM;EAC3B,IAAI,aAAa,CAAC,GAAG,OAAO;EAC5B,IAAI,cAAc,KAAA,KAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,OAAO;EAC/D,IAAI,CAAC,kBAAkB,iBAAiB,EAAE,EAAE,CAAC,GAAG,OAAO;EACvD,IAAI,iBAAiB,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,kBAAkB,EAAE,CAAC,GAAG,OAAO;EACrE,OAAO;CACT,CAAC;AACH;;;;;;AAOA,SAAgB,yBACd,UACA,cACuB;CACvB,IAAI,SAAS,WAAW,GAAG,OAAO,CAAC;CAEnC,MAAM,qBAAqB,SAAS,KAAK,MAAM,iBAAiB,CAAC,CAAC;CAClE,MAAM,oBAAoB,SAAS,KAAK,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC;CAUvE,MAAM,SAAS,qBARU,SAAS,KAAK,SAAS,OAAO;EACrD,MAAM,QAAQ,QAAQ;EACtB,YAAY,qBAAqB,OAAO,CAAC,CAAC,KAAK,YAAY,EAAE,MAAM,OAAO,QAAQ,EAAE,EAAE;EACtF,gBAAgB;GACd,QAAQ,kBAAkB;GAC1B,YAAY,sBAAsB,OAAO;EAC3C;CACF,EAC0C,GAAG,YAAY;CAEzD,OAAO,SAAS,KAAK,SAAS,MAA4B;EACxD,MAAM,OACJ,mBAAmB,EAAE,CAAC,WAAW,IAC7B,KAAA,IACA,mBAAmB,EAAE,CAAC,KAAK,QAAQ;GAAE,MAAM;GAAU,QAAQ;EAAG,EAAE;EACxE,OAAO;GACL,KAAK,oBAAoB,iBAAiB,QAAQ,EAAE,GAAG;IACrD;IACA,gBAAgB,kBAAkB;GACpC,CAAC;GACD,OAAO,OAAO;EAChB;CACF,CAAC;AACH"}
@@ -1,35 +1,45 @@
1
1
  const require_runtime = require("../../_virtual/_rolldown/runtime.cjs");
2
2
  const require_derive_distinct_labels = require("../../labels/derive_distinct_labels.cjs");
3
+ const require_columns_collection = require("../../columns/columns_collection.cjs");
4
+ const require_utils = require("../../columns/utils.cjs");
5
+ require("../../columns/index.cjs");
3
6
  let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
4
7
  let canonicalize = require("canonicalize");
5
8
  canonicalize = require_runtime.__toESM(canonicalize, 1);
6
9
  //#region src/components/PlDatasetSelector/filter_discovery.ts
7
10
  /**
8
- * Columns annotated `pl7.app/isSubset: "true"` whose axes ⊆ anchor axes.
9
- * The axes-subset constraint comes from `mode: "enrichment"`.
11
+ * Matches columns annotated `pl7.app/isSubset: "true"` whose axes ⊆ anchor axes.
12
+ *
13
+ * Filter-intent: only the dataset's own direct subset columns, no linker
14
+ * traversal — so this uses `.filter()` (pins `maxHops: 0`), not `.discover()`
15
+ * (which would default to 4 hops and surface subset columns from other,
16
+ * linker-reachable datasets). `.filter()` still applies the default
17
+ * `enrichment` matching mode (`allowFloatingHitAxes: false`), which enforces
18
+ * the axes-subset constraint. See `matchingModeToConstraints()`.
10
19
  */
11
- function findFilterColumns(collection) {
12
- return collection.findColumns({
13
- mode: "enrichment",
20
+ function findFilterColumns(options) {
21
+ return require_columns_collection.ColumnsCollection([...options.sources], { driver: options.driver }).filter({
22
+ anchors: { main: options.anchorSpec },
14
23
  include: { annotations: { [_milaboratories_pl_model_common.Annotation.IsSubset]: "true" } }
15
- });
24
+ }).getColumns();
16
25
  }
17
26
  /**
18
- * Derive labels for filter column matches (for `DatasetOption.filters`).
19
- * Matches whose column id is missing from `refsByObjectId` are silently
20
- * dropped — they cannot be exposed as selectable options.
27
+ * Derive labeled options from filter column variants, for use in DatasetOption.filters.
28
+ *
29
+ * Entries whose column id has no PlRef in `refsByObjectId` are silently
30
+ * skipped — they cannot be exposed as user-selectable options.
21
31
  */
22
- function filterMatchesToOptions(matches, options) {
23
- if (matches.length === 0) return [];
32
+ function filterMatchesToOptions(variants, options) {
33
+ if (variants.length === 0) return [];
24
34
  const { refsByObjectId, datasetSpec, labelOptions } = options;
25
- const entries = matches.flatMap((match) => {
26
- const ref = refsByObjectId.get(match.column.id);
35
+ const entries = variants.flatMap((variant) => {
36
+ const ref = refsByObjectId.get((0, _milaboratories_pl_model_common.extractPObjectId)(variant.id));
27
37
  if (ref === void 0) return [];
28
- return match.variants.map((variant) => ({
38
+ return [{
29
39
  ref,
30
- spec: match.column.spec,
31
- linkerPath: variant.path.map((p) => ({ spec: p.linker.spec }))
32
- }));
40
+ spec: variant.getSpec(),
41
+ linkerPath: require_utils.collectLinkerColumns(variant).map((linker) => ({ spec: linker.getSpec() }))
42
+ }];
33
43
  });
34
44
  const labels = require_derive_distinct_labels.deriveDistinctLabels([...entries, { spec: datasetSpec }], {
35
45
  ...labelOptions,
@@ -1 +1 @@
1
- {"version":3,"file":"filter_discovery.cjs","names":["Annotation","deriveDistinctLabels"],"sources":["../../../src/components/PlDatasetSelector/filter_discovery.ts"],"sourcesContent":["import { Annotation } from \"@milaboratories/pl-model-common\";\nimport type { Option, PlRef, PObjectId, PObjectSpec } from \"@milaboratories/pl-model-common\";\nimport canonicalize from \"canonicalize\";\nimport type {\n AnchoredColumnCollection,\n ColumnMatch,\n} from \"../../columns/column_collection_builder\";\nimport {\n deriveDistinctLabels,\n type DeriveLabelsOptions,\n type Entry,\n} from \"../../labels/derive_distinct_labels\";\n\n/**\n * Columns annotated `pl7.app/isSubset: \"true\"` whose axes ⊆ anchor axes.\n * The axes-subset constraint comes from `mode: \"enrichment\"`.\n */\nexport function findFilterColumns(collection: AnchoredColumnCollection): ColumnMatch[] {\n return collection.findColumns({\n mode: \"enrichment\",\n include: {\n annotations: { [Annotation.IsSubset]: \"true\" },\n },\n });\n}\n\nexport type FilterMatchOptions = {\n /** Maps result-pool column id back to its source PlRef (see {@link buildRefMap}). */\n refsByObjectId: ReadonlyMap<PObjectId, PlRef>;\n /** Spec of the dataset the filters are subsets of. */\n datasetSpec: PObjectSpec;\n /**\n * Forwarded to `deriveDistinctLabels`. Any `formatters.native` caller\n * sets is silently overridden — the function relies on a no-op native\n * formatter to keep the algorithm from short-circuiting on filters'\n * inherited `pl7.app/label`.\n */\n labelOptions?: DeriveLabelsOptions;\n};\n\n/**\n * Derive labels for filter column matches (for `DatasetOption.filters`).\n * Matches whose column id is missing from `refsByObjectId` are silently\n * dropped — they cannot be exposed as selectable options.\n */\nexport function filterMatchesToOptions(\n matches: ColumnMatch[],\n options: FilterMatchOptions,\n): Option[] {\n if (matches.length === 0) return [];\n\n const { refsByObjectId, datasetSpec, labelOptions } = options;\n\n // One entry per match-variant (different paths to the same column are\n // exposed as separate Options). The `ref` field rides along on the\n // Entry-shaped objects via structural typing; `deriveDistinctLabels`\n // ignores extra fields.\n const entries = matches.flatMap((match): (Entry & { ref: PlRef })[] => {\n const ref = refsByObjectId.get(match.column.id);\n if (ref === undefined) return [];\n return match.variants.map((variant) => ({\n ref,\n spec: match.column.spec,\n linkerPath: variant.path.map((p) => ({ spec: p.linker.spec })),\n }));\n });\n\n // Appending the dataset forces a discriminating trace step into every\n // filter label (yielding e.g. \"Bulk / Top 10\"); the dataset's own label\n // is dropped because we only zip `entries`. Native label is force-\n // suppressed (the override sits after caller's spread) — filters\n // inherit the dataset's `pl7.app/label` and would otherwise satisfy\n // uniqueness before any trace step is consulted.\n const labels = deriveDistinctLabels([...entries, { spec: datasetSpec }], {\n ...labelOptions,\n formatters: { ...labelOptions?.formatters, native: () => undefined },\n });\n\n return entries.map(({ ref }, i) => ({ ref, label: labels[i] }));\n}\n\n/** Build the `refsByObjectId` map from `ctx.resultPool.getSpecs().entries`. */\nexport function buildRefMap(entries: readonly { readonly ref: PlRef }[]): Map<PObjectId, PlRef> {\n return new Map(entries.map((e) => [canonicalize(e.ref)! as PObjectId, e.ref]));\n}\n"],"mappings":";;;;;;;;;;AAiBA,SAAgB,kBAAkB,YAAqD;CACrF,OAAO,WAAW,YAAY;EAC5B,MAAM;EACN,SAAS,EACP,aAAa,GAAGA,gCAAAA,WAAW,WAAW,OAAO,EAC/C;CACF,CAAC;AACH;;;;;;AAqBA,SAAgB,uBACd,SACA,SACU;CACV,IAAI,QAAQ,WAAW,GAAG,OAAO,CAAC;CAElC,MAAM,EAAE,gBAAgB,aAAa,iBAAiB;CAMtD,MAAM,UAAU,QAAQ,SAAS,UAAsC;EACrE,MAAM,MAAM,eAAe,IAAI,MAAM,OAAO,EAAE;EAC9C,IAAI,QAAQ,KAAA,GAAW,OAAO,CAAC;EAC/B,OAAO,MAAM,SAAS,KAAK,aAAa;GACtC;GACA,MAAM,MAAM,OAAO;GACnB,YAAY,QAAQ,KAAK,KAAK,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,EAAE;EAC/D,EAAE;CACJ,CAAC;CAQD,MAAM,SAASC,+BAAAA,qBAAqB,CAAC,GAAG,SAAS,EAAE,MAAM,YAAY,CAAC,GAAG;EACvE,GAAG;EACH,YAAY;GAAE,GAAG,cAAc;GAAY,cAAc,KAAA;EAAU;CACrE,CAAC;CAED,OAAO,QAAQ,KAAK,EAAE,OAAO,OAAO;EAAE;EAAK,OAAO,OAAO;CAAG,EAAE;AAChE;;AAGA,SAAgB,YAAY,SAAoE;CAC9F,OAAO,IAAI,IAAI,QAAQ,KAAK,MAAM,EAAA,GAAA,aAAA,QAAA,CAAc,EAAE,GAAG,GAAiB,EAAE,GAAG,CAAC,CAAC;AAC/E"}
1
+ {"version":3,"file":"filter_discovery.cjs","names":["ColumnsCollection","Annotation","collectLinkerColumns","deriveDistinctLabels"],"sources":["../../../src/components/PlDatasetSelector/filter_discovery.ts"],"sourcesContent":["import { Annotation, extractPObjectId } from \"@milaboratories/pl-model-common\";\nimport type {\n ColumnsCollectionDriverModel,\n Option,\n PColumnSpec,\n PlRef,\n PObjectId,\n PObjectSpec,\n} from \"@milaboratories/pl-model-common\";\nimport canonicalize from \"canonicalize\";\nimport type { ColumnRecipe, ColumnsSource } from \"../../columns\";\nimport { ColumnsCollection, collectLinkerColumns } from \"../../columns\";\nimport {\n deriveDistinctLabels,\n type DeriveLabelsOptions,\n type Entry,\n} from \"../../labels/derive_distinct_labels\";\n\nexport interface FindFilterColumnsOptions {\n sources: ReadonlyArray<ColumnsSource>;\n anchorSpec: PColumnSpec;\n /** Override the resolved `columnsCollection` service (primarily for tests). */\n driver?: ColumnsCollectionDriverModel;\n}\n\n/**\n * Matches columns annotated `pl7.app/isSubset: \"true\"` whose axes ⊆ anchor axes.\n *\n * Filter-intent: only the dataset's own direct subset columns, no linker\n * traversal — so this uses `.filter()` (pins `maxHops: 0`), not `.discover()`\n * (which would default to 4 hops and surface subset columns from other,\n * linker-reachable datasets). `.filter()` still applies the default\n * `enrichment` matching mode (`allowFloatingHitAxes: false`), which enforces\n * the axes-subset constraint. See `matchingModeToConstraints()`.\n */\nexport function findFilterColumns(options: FindFilterColumnsOptions): ColumnRecipe[] {\n return ColumnsCollection([...options.sources], { driver: options.driver })\n .filter({\n anchors: { main: options.anchorSpec },\n include: { annotations: { [Annotation.IsSubset]: \"true\" } },\n })\n .getColumns();\n}\n\nexport type FilterMatchOptions = {\n /** Maps result-pool column id back to its source PlRef (see {@link buildRefMap}). */\n refsByObjectId: ReadonlyMap<PObjectId, PlRef>;\n /** Spec of the dataset the filters are subsets of. */\n datasetSpec: PObjectSpec;\n /**\n * Forwarded to `deriveDistinctLabels`. Any `formatters.native` caller\n * sets is silently overridden — the function relies on a no-op native\n * formatter to keep the algorithm from short-circuiting on filters'\n * inherited `pl7.app/label`.\n */\n labelOptions?: DeriveLabelsOptions;\n};\n\n/**\n * Derive labeled options from filter column variants, for use in DatasetOption.filters.\n *\n * Entries whose column id has no PlRef in `refsByObjectId` are silently\n * skipped — they cannot be exposed as user-selectable options.\n */\nexport function filterMatchesToOptions(\n variants: ColumnRecipe[],\n options: FilterMatchOptions,\n): Option[] {\n if (variants.length === 0) return [];\n\n const { refsByObjectId, datasetSpec, labelOptions } = options;\n\n // One Option per variant — `deriveDistinctLabels` disambiguates labels by\n // path. All variants of the same column share a terminal PObjectId, so the\n // ref lookup happens once per variant.\n const entries: (Entry & { ref: PlRef })[] = variants.flatMap((variant) => {\n const ref = refsByObjectId.get(extractPObjectId(variant.id));\n if (ref === undefined) return [];\n return [\n {\n ref,\n spec: variant.getSpec(),\n linkerPath: collectLinkerColumns(variant).map((linker) => ({ spec: linker.getSpec() })),\n },\n ];\n });\n\n // Appending the dataset forces a discriminating trace step into every\n // filter label (yielding e.g. \"Bulk / Top 10\"); the dataset's own label\n // is dropped because we only zip `entries`. Native label is force-\n // suppressed (the override sits after caller's spread) — filters\n // inherit the dataset's `pl7.app/label` and would otherwise satisfy\n // uniqueness before any trace step is consulted.\n const labels = deriveDistinctLabels([...entries, { spec: datasetSpec }], {\n ...labelOptions,\n formatters: { ...labelOptions?.formatters, native: () => undefined },\n });\n\n return entries.map(({ ref }, i) => ({ ref, label: labels[i] }));\n}\n\n/** Build the `refsByObjectId` map from `ctx.resultPool.getSpecs().entries`. */\nexport function buildRefMap(entries: readonly { readonly ref: PlRef }[]): Map<PObjectId, PlRef> {\n return new Map(entries.map((e) => [canonicalize(e.ref)! as PObjectId, e.ref]));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAmCA,SAAgB,kBAAkB,SAAmD;CACnF,OAAOA,2BAAAA,kBAAkB,CAAC,GAAG,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,OAAO,CAAC,CAAC,CACvE,OAAO;EACN,SAAS,EAAE,MAAM,QAAQ,WAAW;EACpC,SAAS,EAAE,aAAa,GAAGC,gCAAAA,WAAW,WAAW,OAAO,EAAE;CAC5D,CAAC,CAAC,CACD,WAAW;AAChB;;;;;;;AAsBA,SAAgB,uBACd,UACA,SACU;CACV,IAAI,SAAS,WAAW,GAAG,OAAO,CAAC;CAEnC,MAAM,EAAE,gBAAgB,aAAa,iBAAiB;CAKtD,MAAM,UAAsC,SAAS,SAAS,YAAY;EACxE,MAAM,MAAM,eAAe,KAAA,GAAA,gCAAA,iBAAA,CAAqB,QAAQ,EAAE,CAAC;EAC3D,IAAI,QAAQ,KAAA,GAAW,OAAO,CAAC;EAC/B,OAAO,CACL;GACE;GACA,MAAM,QAAQ,QAAQ;GACtB,YAAYC,cAAAA,qBAAqB,OAAO,CAAC,CAAC,KAAK,YAAY,EAAE,MAAM,OAAO,QAAQ,EAAE,EAAE;EACxF,CACF;CACF,CAAC;CAQD,MAAM,SAASC,+BAAAA,qBAAqB,CAAC,GAAG,SAAS,EAAE,MAAM,YAAY,CAAC,GAAG;EACvE,GAAG;EACH,YAAY;GAAE,GAAG,cAAc;GAAY,cAAc,KAAA;EAAU;CACrE,CAAC;CAED,OAAO,QAAQ,KAAK,EAAE,OAAO,OAAO;EAAE;EAAK,OAAO,OAAO;CAAG,EAAE;AAChE;;AAGA,SAAgB,YAAY,SAAoE;CAC9F,OAAO,IAAI,IAAI,QAAQ,KAAK,MAAM,EAAA,GAAA,aAAA,QAAA,CAAc,EAAE,GAAG,GAAiB,EAAE,GAAG,CAAC,CAAC;AAC/E"}
@@ -1,13 +1,26 @@
1
- import { AnchoredColumnCollection, ColumnMatch } from "../../columns/column_collection_builder.js";
2
1
  import { DeriveLabelsOptions } from "../../labels/derive_distinct_labels.js";
3
- import { Option, PObjectId, PObjectSpec, PlRef } from "@milaboratories/pl-model-common";
2
+ import { ColumnRecipe } from "../../columns/column_recipes/index.js";
3
+ import { ColumnsSource } from "../../columns/column_providers/types.js";
4
+ import { ColumnsCollectionDriverModel, Option, PColumnSpec, PObjectId, PObjectSpec, PlRef } from "@milaboratories/pl-model-common";
4
5
 
5
6
  //#region src/components/PlDatasetSelector/filter_discovery.d.ts
7
+ interface FindFilterColumnsOptions {
8
+ sources: ReadonlyArray<ColumnsSource>;
9
+ anchorSpec: PColumnSpec;
10
+ /** Override the resolved `columnsCollection` service (primarily for tests). */
11
+ driver?: ColumnsCollectionDriverModel;
12
+ }
6
13
  /**
7
- * Columns annotated `pl7.app/isSubset: "true"` whose axes ⊆ anchor axes.
8
- * The axes-subset constraint comes from `mode: "enrichment"`.
14
+ * Matches columns annotated `pl7.app/isSubset: "true"` whose axes ⊆ anchor axes.
15
+ *
16
+ * Filter-intent: only the dataset's own direct subset columns, no linker
17
+ * traversal — so this uses `.filter()` (pins `maxHops: 0`), not `.discover()`
18
+ * (which would default to 4 hops and surface subset columns from other,
19
+ * linker-reachable datasets). `.filter()` still applies the default
20
+ * `enrichment` matching mode (`allowFloatingHitAxes: false`), which enforces
21
+ * the axes-subset constraint. See `matchingModeToConstraints()`.
9
22
  */
10
- declare function findFilterColumns(collection: AnchoredColumnCollection): ColumnMatch[];
23
+ declare function findFilterColumns(options: FindFilterColumnsOptions): ColumnRecipe[];
11
24
  type FilterMatchOptions = {
12
25
  /** Maps result-pool column id back to its source PlRef (see {@link buildRefMap}). */refsByObjectId: ReadonlyMap<PObjectId, PlRef>; /** Spec of the dataset the filters are subsets of. */
13
26
  datasetSpec: PObjectSpec;
@@ -20,15 +33,16 @@ type FilterMatchOptions = {
20
33
  labelOptions?: DeriveLabelsOptions;
21
34
  };
22
35
  /**
23
- * Derive labels for filter column matches (for `DatasetOption.filters`).
24
- * Matches whose column id is missing from `refsByObjectId` are silently
25
- * dropped — they cannot be exposed as selectable options.
36
+ * Derive labeled options from filter column variants, for use in DatasetOption.filters.
37
+ *
38
+ * Entries whose column id has no PlRef in `refsByObjectId` are silently
39
+ * skipped — they cannot be exposed as user-selectable options.
26
40
  */
27
- declare function filterMatchesToOptions(matches: ColumnMatch[], options: FilterMatchOptions): Option[];
41
+ declare function filterMatchesToOptions(variants: ColumnRecipe[], options: FilterMatchOptions): Option[];
28
42
  /** Build the `refsByObjectId` map from `ctx.resultPool.getSpecs().entries`. */
29
43
  declare function buildRefMap(entries: readonly {
30
44
  readonly ref: PlRef;
31
45
  }[]): Map<PObjectId, PlRef>;
32
46
  //#endregion
33
- export { FilterMatchOptions, buildRefMap, filterMatchesToOptions, findFilterColumns };
47
+ export { FilterMatchOptions, FindFilterColumnsOptions, buildRefMap, filterMatchesToOptions, findFilterColumns };
34
48
  //# sourceMappingURL=filter_discovery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filter_discovery.d.ts","names":[],"sources":["../../../src/components/PlDatasetSelector/filter_discovery.ts"],"mappings":";;;;;;;AAiBA;;iBAAgB,iBAAA,CAAkB,UAAA,EAAY,wBAAA,GAA2B,WAAW;AAAA,KASxE,kBAAA;EATkC,qFAW5C,cAAA,EAAgB,WAAA,CAAY,SAAA,EAAW,KAAA,GAXgC;EAavE,WAAA,EAAa,WAAA;EAbqE;AASpF;;;;;EAWE,YAAA,GAAe,mBAAA;AAAA;;;;;;iBAQD,sBAAA,CACd,OAAA,EAAS,WAAA,IACT,OAAA,EAAS,kBAAA,GACR,MAAA;;iBAkCa,WAAA,CAAY,OAAA;EAAA,SAA6B,GAAA,EAAK,KAAA;AAAA,MAAY,GAAA,CAAI,SAAA,EAAW,KAAA"}
1
+ {"version":3,"file":"filter_discovery.d.ts","names":[],"sources":["../../../src/components/PlDatasetSelector/filter_discovery.ts"],"mappings":";;;;;;UAkBiB,wBAAA;EACf,OAAA,EAAS,aAAA,CAAc,aAAA;EACvB,UAAA,EAAY,WAAA;;EAEZ,MAAA,GAAS,4BAAA;AAAA;;;;;;;;;;;iBAaK,iBAAA,CAAkB,OAAA,EAAS,wBAAA,GAA2B,YAAY;AAAA,KAStE,kBAAA;EAtBV,qFAwBA,cAAA,EAAgB,WAAA,CAAY,SAAA,EAAW,KAAA,GAxBF;EA0BrC,WAAA,EAAa,WAAA;EAbC;;;;;;EAoBd,YAAA,GAAe,mBAAA;AAAA;AApBiE;AASlF;;;;;AATkF,iBA6BlE,sBAAA,CACd,QAAA,EAAU,YAAA,IACV,OAAA,EAAS,kBAAA,GACR,MAAA;;iBAmCa,WAAA,CAAY,OAAA;EAAA,SAA6B,GAAA,EAAK,KAAA;AAAA,MAAY,GAAA,CAAI,SAAA,EAAW,KAAA"}
@@ -1,33 +1,43 @@
1
1
  import { deriveDistinctLabels } from "../../labels/derive_distinct_labels.js";
2
- import { Annotation } from "@milaboratories/pl-model-common";
2
+ import { ColumnsCollection } from "../../columns/columns_collection.js";
3
+ import { collectLinkerColumns } from "../../columns/utils.js";
4
+ import "../../columns/index.js";
5
+ import { Annotation, extractPObjectId } from "@milaboratories/pl-model-common";
3
6
  import canonicalize from "canonicalize";
4
7
  //#region src/components/PlDatasetSelector/filter_discovery.ts
5
8
  /**
6
- * Columns annotated `pl7.app/isSubset: "true"` whose axes ⊆ anchor axes.
7
- * The axes-subset constraint comes from `mode: "enrichment"`.
9
+ * Matches columns annotated `pl7.app/isSubset: "true"` whose axes ⊆ anchor axes.
10
+ *
11
+ * Filter-intent: only the dataset's own direct subset columns, no linker
12
+ * traversal — so this uses `.filter()` (pins `maxHops: 0`), not `.discover()`
13
+ * (which would default to 4 hops and surface subset columns from other,
14
+ * linker-reachable datasets). `.filter()` still applies the default
15
+ * `enrichment` matching mode (`allowFloatingHitAxes: false`), which enforces
16
+ * the axes-subset constraint. See `matchingModeToConstraints()`.
8
17
  */
9
- function findFilterColumns(collection) {
10
- return collection.findColumns({
11
- mode: "enrichment",
18
+ function findFilterColumns(options) {
19
+ return ColumnsCollection([...options.sources], { driver: options.driver }).filter({
20
+ anchors: { main: options.anchorSpec },
12
21
  include: { annotations: { [Annotation.IsSubset]: "true" } }
13
- });
22
+ }).getColumns();
14
23
  }
15
24
  /**
16
- * Derive labels for filter column matches (for `DatasetOption.filters`).
17
- * Matches whose column id is missing from `refsByObjectId` are silently
18
- * dropped — they cannot be exposed as selectable options.
25
+ * Derive labeled options from filter column variants, for use in DatasetOption.filters.
26
+ *
27
+ * Entries whose column id has no PlRef in `refsByObjectId` are silently
28
+ * skipped — they cannot be exposed as user-selectable options.
19
29
  */
20
- function filterMatchesToOptions(matches, options) {
21
- if (matches.length === 0) return [];
30
+ function filterMatchesToOptions(variants, options) {
31
+ if (variants.length === 0) return [];
22
32
  const { refsByObjectId, datasetSpec, labelOptions } = options;
23
- const entries = matches.flatMap((match) => {
24
- const ref = refsByObjectId.get(match.column.id);
33
+ const entries = variants.flatMap((variant) => {
34
+ const ref = refsByObjectId.get(extractPObjectId(variant.id));
25
35
  if (ref === void 0) return [];
26
- return match.variants.map((variant) => ({
36
+ return [{
27
37
  ref,
28
- spec: match.column.spec,
29
- linkerPath: variant.path.map((p) => ({ spec: p.linker.spec }))
30
- }));
38
+ spec: variant.getSpec(),
39
+ linkerPath: collectLinkerColumns(variant).map((linker) => ({ spec: linker.getSpec() }))
40
+ }];
31
41
  });
32
42
  const labels = deriveDistinctLabels([...entries, { spec: datasetSpec }], {
33
43
  ...labelOptions,