@platforma-sdk/model 1.58.5 → 1.58.9

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 (365) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +43 -0
  2. package/dist/_virtual/_rolldown/runtime.js +18 -0
  3. package/dist/annotations/converter.cjs +15 -20
  4. package/dist/annotations/converter.cjs.map +1 -1
  5. package/dist/annotations/converter.d.ts +6 -2
  6. package/dist/annotations/converter.js +14 -18
  7. package/dist/annotations/converter.js.map +1 -1
  8. package/dist/annotations/index.cjs +1 -0
  9. package/dist/annotations/index.d.ts +2 -3
  10. package/dist/annotations/index.js +1 -0
  11. package/dist/annotations/types.d.ts +21 -16
  12. package/dist/bconfig/index.cjs +2 -0
  13. package/dist/bconfig/index.d.ts +5 -6
  14. package/dist/bconfig/index.js +2 -0
  15. package/dist/bconfig/lambdas.d.ts +52 -52
  16. package/dist/bconfig/normalization.cjs +13 -18
  17. package/dist/bconfig/normalization.cjs.map +1 -1
  18. package/dist/bconfig/normalization.d.ts +10 -6
  19. package/dist/bconfig/normalization.js +12 -16
  20. package/dist/bconfig/normalization.js.map +1 -1
  21. package/dist/bconfig/types.cjs +4 -3
  22. package/dist/bconfig/types.cjs.map +1 -1
  23. package/dist/bconfig/types.d.ts +10 -5
  24. package/dist/bconfig/types.js +4 -2
  25. package/dist/bconfig/types.js.map +1 -1
  26. package/dist/bconfig/util.d.ts +7 -4
  27. package/dist/bconfig/v3.d.ts +10 -6
  28. package/dist/block_api_v1.d.ts +62 -58
  29. package/dist/block_api_v2.d.ts +51 -47
  30. package/dist/block_api_v3.d.ts +33 -29
  31. package/dist/block_migrations.cjs +481 -413
  32. package/dist/block_migrations.cjs.map +1 -1
  33. package/dist/block_migrations.d.ts +258 -204
  34. package/dist/block_migrations.js +482 -408
  35. package/dist/block_migrations.js.map +1 -1
  36. package/dist/block_model.cjs +312 -343
  37. package/dist/block_model.cjs.map +1 -1
  38. package/dist/block_model.d.ts +143 -147
  39. package/dist/block_model.js +312 -341
  40. package/dist/block_model.js.map +1 -1
  41. package/dist/block_model_legacy.cjs +231 -255
  42. package/dist/block_model_legacy.cjs.map +1 -1
  43. package/dist/block_model_legacy.d.ts +108 -106
  44. package/dist/block_model_legacy.js +231 -253
  45. package/dist/block_model_legacy.js.map +1 -1
  46. package/dist/block_state_patch.d.ts +10 -10
  47. package/dist/block_state_util.cjs +15 -19
  48. package/dist/block_state_util.cjs.map +1 -1
  49. package/dist/block_state_util.d.ts +14 -13
  50. package/dist/block_state_util.js +15 -18
  51. package/dist/block_state_util.js.map +1 -1
  52. package/dist/block_storage.cjs +233 -238
  53. package/dist/block_storage.cjs.map +1 -1
  54. package/dist/block_storage.d.ts +62 -78
  55. package/dist/block_storage.js +234 -237
  56. package/dist/block_storage.js.map +1 -1
  57. package/dist/block_storage_callbacks.cjs +156 -195
  58. package/dist/block_storage_callbacks.cjs.map +1 -1
  59. package/dist/block_storage_callbacks.js +156 -192
  60. package/dist/block_storage_callbacks.js.map +1 -1
  61. package/dist/block_storage_facade.cjs +29 -85
  62. package/dist/block_storage_facade.cjs.map +1 -1
  63. package/dist/block_storage_facade.d.ts +83 -126
  64. package/dist/block_storage_facade.js +29 -83
  65. package/dist/block_storage_facade.js.map +1 -1
  66. package/dist/components/PFrameForGraphs.cjs +26 -24
  67. package/dist/components/PFrameForGraphs.cjs.map +1 -1
  68. package/dist/components/PFrameForGraphs.d.ts +12 -7
  69. package/dist/components/PFrameForGraphs.js +25 -22
  70. package/dist/components/PFrameForGraphs.js.map +1 -1
  71. package/dist/components/PlAnnotations/filter.d.ts +62 -79
  72. package/dist/components/PlAnnotations/filters_ui.cjs +135 -171
  73. package/dist/components/PlAnnotations/filters_ui.cjs.map +1 -1
  74. package/dist/components/PlAnnotations/filters_ui.d.ts +48 -46
  75. package/dist/components/PlAnnotations/filters_ui.js +135 -170
  76. package/dist/components/PlAnnotations/filters_ui.js.map +1 -1
  77. package/dist/components/PlAnnotations/index.d.ts +2 -3
  78. package/dist/components/PlDataTable/index.cjs +2 -0
  79. package/dist/components/PlDataTable/index.d.ts +3 -5
  80. package/dist/components/PlDataTable/index.js +2 -0
  81. package/dist/components/PlDataTable/labels.cjs +59 -81
  82. package/dist/components/PlDataTable/labels.cjs.map +1 -1
  83. package/dist/components/PlDataTable/labels.js +58 -79
  84. package/dist/components/PlDataTable/labels.js.map +1 -1
  85. package/dist/components/PlDataTable/state-migration.cjs +186 -144
  86. package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
  87. package/dist/components/PlDataTable/state-migration.d.ts +85 -82
  88. package/dist/components/PlDataTable/state-migration.js +185 -142
  89. package/dist/components/PlDataTable/state-migration.js.map +1 -1
  90. package/dist/components/PlDataTable/table.cjs +172 -194
  91. package/dist/components/PlDataTable/table.cjs.map +1 -1
  92. package/dist/components/PlDataTable/table.d.ts +16 -12
  93. package/dist/components/PlDataTable/table.js +171 -192
  94. package/dist/components/PlDataTable/table.js.map +1 -1
  95. package/dist/components/PlDataTable/v4.d.ts +84 -119
  96. package/dist/components/PlDataTable/v5.d.ts +80 -103
  97. package/dist/components/PlMultiSequenceAlignment.cjs +27 -29
  98. package/dist/components/PlMultiSequenceAlignment.cjs.map +1 -1
  99. package/dist/components/PlMultiSequenceAlignment.d.ts +36 -27
  100. package/dist/components/PlMultiSequenceAlignment.js +26 -27
  101. package/dist/components/PlMultiSequenceAlignment.js.map +1 -1
  102. package/dist/components/PlSelectionModel.cjs +7 -6
  103. package/dist/components/PlSelectionModel.cjs.map +1 -1
  104. package/dist/components/PlSelectionModel.d.ts +10 -8
  105. package/dist/components/PlSelectionModel.js +7 -5
  106. package/dist/components/PlSelectionModel.js.map +1 -1
  107. package/dist/components/index.cjs +8 -0
  108. package/dist/components/index.d.ts +11 -6
  109. package/dist/components/index.js +8 -0
  110. package/dist/config/actions.cjs +138 -171
  111. package/dist/config/actions.cjs.map +1 -1
  112. package/dist/config/actions.d.ts +47 -47
  113. package/dist/config/actions.js +146 -178
  114. package/dist/config/actions.js.map +1 -1
  115. package/dist/config/actions_kinds.d.ts +114 -121
  116. package/dist/config/index.cjs +1 -0
  117. package/dist/config/index.d.ts +6 -7
  118. package/dist/config/index.js +1 -0
  119. package/dist/config/model.d.ts +131 -127
  120. package/dist/config/model_meta.d.ts +4 -1
  121. package/dist/config/type_engine.d.ts +22 -21
  122. package/dist/config/type_util.d.ts +12 -10
  123. package/dist/env_value.cjs +5 -6
  124. package/dist/env_value.cjs.map +1 -1
  125. package/dist/env_value.d.ts +4 -1
  126. package/dist/env_value.js +5 -5
  127. package/dist/env_value.js.map +1 -1
  128. package/dist/filters/converters/filterToQuery.cjs +273 -239
  129. package/dist/filters/converters/filterToQuery.cjs.map +1 -1
  130. package/dist/filters/converters/filterToQuery.d.ts +6 -2
  131. package/dist/filters/converters/filterToQuery.js +272 -237
  132. package/dist/filters/converters/filterToQuery.js.map +1 -1
  133. package/dist/filters/converters/filterUiToExpressionImpl.cjs +56 -85
  134. package/dist/filters/converters/filterUiToExpressionImpl.cjs.map +1 -1
  135. package/dist/filters/converters/filterUiToExpressionImpl.d.ts +8 -4
  136. package/dist/filters/converters/filterUiToExpressionImpl.js +55 -83
  137. package/dist/filters/converters/filterUiToExpressionImpl.js.map +1 -1
  138. package/dist/filters/converters/index.cjs +2 -0
  139. package/dist/filters/converters/index.d.ts +2 -3
  140. package/dist/filters/converters/index.js +2 -0
  141. package/dist/filters/distill.cjs +59 -60
  142. package/dist/filters/distill.cjs.map +1 -1
  143. package/dist/filters/distill.d.ts +6 -3
  144. package/dist/filters/distill.js +58 -58
  145. package/dist/filters/distill.js.map +1 -1
  146. package/dist/filters/index.cjs +4 -0
  147. package/dist/filters/index.d.ts +5 -4
  148. package/dist/filters/index.js +4 -0
  149. package/dist/filters/traverse.cjs +31 -40
  150. package/dist/filters/traverse.cjs.map +1 -1
  151. package/dist/filters/traverse.js +31 -39
  152. package/dist/filters/traverse.js.map +1 -1
  153. package/dist/filters/types.d.ts +10 -7
  154. package/dist/index.cjs +193 -187
  155. package/dist/index.d.ts +61 -28
  156. package/dist/index.js +49 -41
  157. package/dist/internal.cjs +48 -62
  158. package/dist/internal.cjs.map +1 -1
  159. package/dist/internal.js +49 -60
  160. package/dist/internal.js.map +1 -1
  161. package/dist/package.cjs +12 -0
  162. package/dist/package.cjs.map +1 -0
  163. package/dist/package.js +6 -0
  164. package/dist/package.js.map +1 -0
  165. package/dist/pframe.cjs +32 -37
  166. package/dist/pframe.cjs.map +1 -1
  167. package/dist/pframe.d.ts +14 -10
  168. package/dist/pframe.js +32 -35
  169. package/dist/pframe.js.map +1 -1
  170. package/dist/pframe_utils/axes.cjs +81 -114
  171. package/dist/pframe_utils/axes.cjs.map +1 -1
  172. package/dist/pframe_utils/axes.d.ts +10 -13
  173. package/dist/pframe_utils/axes.js +80 -112
  174. package/dist/pframe_utils/axes.js.map +1 -1
  175. package/dist/pframe_utils/columns.cjs +61 -81
  176. package/dist/pframe_utils/columns.cjs.map +1 -1
  177. package/dist/pframe_utils/columns.d.ts +15 -6
  178. package/dist/pframe_utils/columns.js +60 -79
  179. package/dist/pframe_utils/columns.js.map +1 -1
  180. package/dist/pframe_utils/index.cjs +232 -253
  181. package/dist/pframe_utils/index.cjs.map +1 -1
  182. package/dist/pframe_utils/index.d.ts +39 -35
  183. package/dist/pframe_utils/index.js +231 -251
  184. package/dist/pframe_utils/index.js.map +1 -1
  185. package/dist/platforma.d.ts +48 -46
  186. package/dist/plugin_handle.cjs +6 -14
  187. package/dist/plugin_handle.cjs.map +1 -1
  188. package/dist/plugin_handle.d.ts +20 -25
  189. package/dist/plugin_handle.js +6 -13
  190. package/dist/plugin_handle.js.map +1 -1
  191. package/dist/plugin_model.cjs +364 -163
  192. package/dist/plugin_model.cjs.map +1 -1
  193. package/dist/plugin_model.d.ts +280 -129
  194. package/dist/plugin_model.js +362 -163
  195. package/dist/plugin_model.js.map +1 -1
  196. package/dist/raw_globals.cjs +10 -22
  197. package/dist/raw_globals.cjs.map +1 -1
  198. package/dist/raw_globals.d.ts +8 -5
  199. package/dist/raw_globals.js +10 -20
  200. package/dist/raw_globals.js.map +1 -1
  201. package/dist/ref_util.cjs +14 -13
  202. package/dist/ref_util.cjs.map +1 -1
  203. package/dist/ref_util.d.ts +18 -12
  204. package/dist/ref_util.js +14 -11
  205. package/dist/ref_util.js.map +1 -1
  206. package/dist/render/accessor.cjs +213 -226
  207. package/dist/render/accessor.cjs.map +1 -1
  208. package/dist/render/accessor.d.ts +115 -120
  209. package/dist/render/accessor.js +212 -224
  210. package/dist/render/accessor.js.map +1 -1
  211. package/dist/render/api.cjs +478 -580
  212. package/dist/render/api.cjs.map +1 -1
  213. package/dist/render/api.d.ts +207 -209
  214. package/dist/render/api.js +476 -578
  215. package/dist/render/api.js.map +1 -1
  216. package/dist/render/future.cjs +28 -32
  217. package/dist/render/future.cjs.map +1 -1
  218. package/dist/render/future.d.ts +15 -11
  219. package/dist/render/future.js +28 -30
  220. package/dist/render/future.js.map +1 -1
  221. package/dist/render/index.cjs +8 -0
  222. package/dist/render/index.d.ts +10 -8
  223. package/dist/render/index.js +8 -0
  224. package/dist/render/internal.cjs +33 -29
  225. package/dist/render/internal.cjs.map +1 -1
  226. package/dist/render/internal.d.ts +78 -72
  227. package/dist/render/internal.js +29 -26
  228. package/dist/render/internal.js.map +1 -1
  229. package/dist/render/traversal_ops.d.ts +42 -43
  230. package/dist/render/util/axis_filtering.cjs +63 -86
  231. package/dist/render/util/axis_filtering.cjs.map +1 -1
  232. package/dist/render/util/axis_filtering.d.ts +10 -7
  233. package/dist/render/util/axis_filtering.js +63 -85
  234. package/dist/render/util/axis_filtering.js.map +1 -1
  235. package/dist/render/util/column_collection.cjs +266 -321
  236. package/dist/render/util/column_collection.cjs.map +1 -1
  237. package/dist/render/util/column_collection.d.ts +47 -47
  238. package/dist/render/util/column_collection.js +264 -319
  239. package/dist/render/util/column_collection.js.map +1 -1
  240. package/dist/render/util/index.cjs +4 -0
  241. package/dist/render/util/index.d.ts +4 -5
  242. package/dist/render/util/index.js +4 -0
  243. package/dist/render/util/label.cjs +129 -163
  244. package/dist/render/util/label.cjs.map +1 -1
  245. package/dist/render/util/label.d.ts +45 -46
  246. package/dist/render/util/label.js +128 -161
  247. package/dist/render/util/label.js.map +1 -1
  248. package/dist/render/util/pcolumn_data.cjs +315 -375
  249. package/dist/render/util/pcolumn_data.cjs.map +1 -1
  250. package/dist/render/util/pcolumn_data.d.ts +33 -32
  251. package/dist/render/util/pcolumn_data.js +314 -373
  252. package/dist/render/util/pcolumn_data.js.map +1 -1
  253. package/dist/render/util/pframe_upgraders.cjs +37 -42
  254. package/dist/render/util/pframe_upgraders.cjs.map +1 -1
  255. package/dist/render/util/pframe_upgraders.js +37 -41
  256. package/dist/render/util/pframe_upgraders.js.map +1 -1
  257. package/dist/render/util/split_selectors.d.ts +13 -9
  258. package/dist/version.cjs +6 -8
  259. package/dist/version.cjs.map +1 -1
  260. package/dist/version.d.ts +7 -4
  261. package/dist/version.js +5 -5
  262. package/dist/version.js.map +1 -1
  263. package/package.json +10 -4
  264. package/src/block_migrations.test.ts +184 -14
  265. package/src/block_migrations.ts +185 -30
  266. package/src/block_model.ts +111 -66
  267. package/src/block_storage.test.ts +147 -3
  268. package/src/block_storage.ts +43 -8
  269. package/src/block_storage_callbacks.ts +9 -4
  270. package/src/env_value.ts +0 -2
  271. package/src/index.ts +12 -11
  272. package/src/internal.ts +0 -1
  273. package/src/platforma.ts +4 -4
  274. package/src/plugin_handle.ts +1 -1
  275. package/src/plugin_model.test.ts +217 -21
  276. package/src/plugin_model.ts +450 -55
  277. package/src/raw_globals.ts +0 -1
  278. package/dist/annotations/converter.d.ts.map +0 -1
  279. package/dist/annotations/index.d.ts.map +0 -1
  280. package/dist/annotations/types.d.ts.map +0 -1
  281. package/dist/bconfig/index.d.ts.map +0 -1
  282. package/dist/bconfig/lambdas.d.ts.map +0 -1
  283. package/dist/bconfig/normalization.d.ts.map +0 -1
  284. package/dist/bconfig/types.d.ts.map +0 -1
  285. package/dist/bconfig/util.d.ts.map +0 -1
  286. package/dist/bconfig/v3.d.ts.map +0 -1
  287. package/dist/block_api_v1.d.ts.map +0 -1
  288. package/dist/block_api_v2.d.ts.map +0 -1
  289. package/dist/block_api_v3.d.ts.map +0 -1
  290. package/dist/block_migrations.d.ts.map +0 -1
  291. package/dist/block_model.d.ts.map +0 -1
  292. package/dist/block_model_legacy.d.ts.map +0 -1
  293. package/dist/block_state_patch.d.ts.map +0 -1
  294. package/dist/block_state_util.d.ts.map +0 -1
  295. package/dist/block_storage.d.ts.map +0 -1
  296. package/dist/block_storage_callbacks.d.ts +0 -115
  297. package/dist/block_storage_callbacks.d.ts.map +0 -1
  298. package/dist/block_storage_facade.d.ts.map +0 -1
  299. package/dist/components/PFrameForGraphs.d.ts.map +0 -1
  300. package/dist/components/PlAnnotations/filter.d.ts.map +0 -1
  301. package/dist/components/PlAnnotations/filters_ui.d.ts.map +0 -1
  302. package/dist/components/PlAnnotations/index.d.ts.map +0 -1
  303. package/dist/components/PlAnnotations/types.d.ts +0 -3
  304. package/dist/components/PlAnnotations/types.d.ts.map +0 -1
  305. package/dist/components/PlDataTable/index.d.ts.map +0 -1
  306. package/dist/components/PlDataTable/labels.d.ts +0 -7
  307. package/dist/components/PlDataTable/labels.d.ts.map +0 -1
  308. package/dist/components/PlDataTable/state-migration.d.ts.map +0 -1
  309. package/dist/components/PlDataTable/table.d.ts.map +0 -1
  310. package/dist/components/PlDataTable/v4.d.ts.map +0 -1
  311. package/dist/components/PlDataTable/v5.d.ts.map +0 -1
  312. package/dist/components/PlMultiSequenceAlignment.d.ts.map +0 -1
  313. package/dist/components/PlSelectionModel.d.ts.map +0 -1
  314. package/dist/components/index.d.ts.map +0 -1
  315. package/dist/config/actions.d.ts.map +0 -1
  316. package/dist/config/actions_kinds.d.ts.map +0 -1
  317. package/dist/config/index.d.ts.map +0 -1
  318. package/dist/config/model.d.ts.map +0 -1
  319. package/dist/config/model_meta.d.ts.map +0 -1
  320. package/dist/config/type_engine.d.ts.map +0 -1
  321. package/dist/config/type_util.d.ts.map +0 -1
  322. package/dist/env_value.d.ts.map +0 -1
  323. package/dist/filters/converters/filterToQuery.d.ts.map +0 -1
  324. package/dist/filters/converters/filterUiToExpressionImpl.d.ts.map +0 -1
  325. package/dist/filters/converters/index.d.ts.map +0 -1
  326. package/dist/filters/distill.d.ts.map +0 -1
  327. package/dist/filters/index.d.ts.map +0 -1
  328. package/dist/filters/traverse.d.ts +0 -27
  329. package/dist/filters/traverse.d.ts.map +0 -1
  330. package/dist/filters/types.d.ts.map +0 -1
  331. package/dist/index.cjs.map +0 -1
  332. package/dist/index.d.ts.map +0 -1
  333. package/dist/index.js.map +0 -1
  334. package/dist/internal.d.ts +0 -36
  335. package/dist/internal.d.ts.map +0 -1
  336. package/dist/package.json.cjs +0 -6
  337. package/dist/package.json.cjs.map +0 -1
  338. package/dist/package.json.js +0 -4
  339. package/dist/package.json.js.map +0 -1
  340. package/dist/pframe.d.ts.map +0 -1
  341. package/dist/pframe_utils/axes.d.ts.map +0 -1
  342. package/dist/pframe_utils/columns.d.ts.map +0 -1
  343. package/dist/pframe_utils/index.d.ts.map +0 -1
  344. package/dist/pframe_utils/querySpec.d.ts +0 -2
  345. package/dist/pframe_utils/querySpec.d.ts.map +0 -1
  346. package/dist/platforma.d.ts.map +0 -1
  347. package/dist/plugin_handle.d.ts.map +0 -1
  348. package/dist/plugin_model.d.ts.map +0 -1
  349. package/dist/raw_globals.d.ts.map +0 -1
  350. package/dist/ref_util.d.ts.map +0 -1
  351. package/dist/render/accessor.d.ts.map +0 -1
  352. package/dist/render/api.d.ts.map +0 -1
  353. package/dist/render/future.d.ts.map +0 -1
  354. package/dist/render/index.d.ts.map +0 -1
  355. package/dist/render/internal.d.ts.map +0 -1
  356. package/dist/render/traversal_ops.d.ts.map +0 -1
  357. package/dist/render/util/axis_filtering.d.ts.map +0 -1
  358. package/dist/render/util/column_collection.d.ts.map +0 -1
  359. package/dist/render/util/index.d.ts.map +0 -1
  360. package/dist/render/util/label.d.ts.map +0 -1
  361. package/dist/render/util/pcolumn_data.d.ts.map +0 -1
  362. package/dist/render/util/pframe_upgraders.d.ts +0 -3
  363. package/dist/render/util/pframe_upgraders.d.ts.map +0 -1
  364. package/dist/render/util/split_selectors.d.ts.map +0 -1
  365. package/dist/version.d.ts.map +0 -1
@@ -1,248 +1,283 @@
1
- import { assertNever } from '@milaboratories/pl-model-common';
2
- import { traverseFilterSpec } from '../traverse.js';
1
+ import { traverseFilterSpec } from "../traverse.js";
2
+ import { assertNever } from "@milaboratories/pl-model-common";
3
3
 
4
+ //#region src/filters/converters/filterToQuery.ts
4
5
  /** Parses a CanonicalizedJson<PTableColumnId> string into a SpecQueryExpression reference. */
5
6
  function resolveColumnRef(columnStr) {
6
- const parsed = JSON.parse(columnStr);
7
- return parsed.type === "axis"
8
- ? { type: "axisRef", value: parsed.id }
9
- : { type: "columnRef", value: parsed.id };
7
+ const parsed = JSON.parse(columnStr);
8
+ return parsed.type === "axis" ? {
9
+ type: "axisRef",
10
+ value: parsed.id
11
+ } : {
12
+ type: "columnRef",
13
+ value: parsed.id
14
+ };
10
15
  }
11
16
  /** Converts a FilterSpec tree into a SpecQueryExpression. */
12
17
  function filterSpecToSpecQueryExpr(filter) {
13
- return traverseFilterSpec(filter, {
14
- leaf: leafToSpecQueryExpr,
15
- and: (inputs) => {
16
- if (inputs.length === 0) {
17
- throw new Error("AND filter requires at least one operand");
18
- }
19
- return { type: "and", input: inputs };
20
- },
21
- or: (inputs) => {
22
- if (inputs.length === 0) {
23
- throw new Error("OR filter requires at least one operand");
24
- }
25
- return { type: "or", input: inputs };
26
- },
27
- not: (input) => ({ type: "not", input }),
28
- });
18
+ return traverseFilterSpec(filter, {
19
+ leaf: leafToSpecQueryExpr,
20
+ and: (inputs) => {
21
+ if (inputs.length === 0) throw new Error("AND filter requires at least one operand");
22
+ return {
23
+ type: "and",
24
+ input: inputs
25
+ };
26
+ },
27
+ or: (inputs) => {
28
+ if (inputs.length === 0) throw new Error("OR filter requires at least one operand");
29
+ return {
30
+ type: "or",
31
+ input: inputs
32
+ };
33
+ },
34
+ not: (input) => ({
35
+ type: "not",
36
+ input
37
+ })
38
+ });
29
39
  }
30
40
  function leafToSpecQueryExpr(filter) {
31
- switch (filter.type) {
32
- case "patternEquals":
33
- return {
34
- type: "stringEquals",
35
- input: resolveColumnRef(filter.column),
36
- value: filter.value,
37
- caseInsensitive: false,
38
- };
39
- case "patternNotEquals":
40
- return {
41
- type: "not",
42
- input: {
43
- type: "stringEquals",
44
- input: resolveColumnRef(filter.column),
45
- value: filter.value,
46
- caseInsensitive: false,
47
- },
48
- };
49
- case "patternContainSubsequence":
50
- return {
51
- type: "stringContains",
52
- input: resolveColumnRef(filter.column),
53
- value: filter.value,
54
- caseInsensitive: false,
55
- };
56
- case "patternNotContainSubsequence":
57
- return {
58
- type: "not",
59
- input: {
60
- type: "stringContains",
61
- input: resolveColumnRef(filter.column),
62
- value: filter.value,
63
- caseInsensitive: false,
64
- },
65
- };
66
- case "patternMatchesRegularExpression":
67
- return {
68
- type: "stringRegex",
69
- input: resolveColumnRef(filter.column),
70
- value: filter.value,
71
- };
72
- case "patternFuzzyContainSubsequence":
73
- return {
74
- type: "stringContainsFuzzy",
75
- input: resolveColumnRef(filter.column),
76
- value: filter.value,
77
- maxEdits: filter.maxEdits ?? 1,
78
- caseInsensitive: false,
79
- substitutionsOnly: filter.substitutionsOnly ?? false,
80
- wildcard: filter.wildcard ?? null,
81
- };
82
- case "equal":
83
- return {
84
- type: "numericComparison",
85
- operand: "eq",
86
- left: resolveColumnRef(filter.column),
87
- right: { type: "constant", value: filter.x },
88
- };
89
- case "notEqual":
90
- return {
91
- type: "numericComparison",
92
- operand: "ne",
93
- left: resolveColumnRef(filter.column),
94
- right: { type: "constant", value: filter.x },
95
- };
96
- case "lessThan":
97
- return {
98
- type: "numericComparison",
99
- operand: "lt",
100
- left: resolveColumnRef(filter.column),
101
- right: { type: "constant", value: filter.x },
102
- };
103
- case "greaterThan":
104
- return {
105
- type: "numericComparison",
106
- operand: "gt",
107
- left: resolveColumnRef(filter.column),
108
- right: { type: "constant", value: filter.x },
109
- };
110
- case "lessThanOrEqual":
111
- return {
112
- type: "numericComparison",
113
- operand: "le",
114
- left: resolveColumnRef(filter.column),
115
- right: { type: "constant", value: filter.x },
116
- };
117
- case "greaterThanOrEqual":
118
- return {
119
- type: "numericComparison",
120
- operand: "ge",
121
- left: resolveColumnRef(filter.column),
122
- right: { type: "constant", value: filter.x },
123
- };
124
- case "equalToColumn":
125
- return {
126
- type: "numericComparison",
127
- operand: "eq",
128
- left: resolveColumnRef(filter.column),
129
- right: resolveColumnRef(filter.rhs),
130
- };
131
- case "lessThanColumn": {
132
- const left = resolveColumnRef(filter.column);
133
- const right = resolveColumnRef(filter.rhs);
134
- if (filter.minDiff !== undefined && filter.minDiff !== 0) {
135
- return {
136
- type: "numericComparison",
137
- operand: "lt",
138
- left: {
139
- type: "numericBinary",
140
- operand: "add",
141
- left,
142
- right: { type: "constant", value: filter.minDiff },
143
- },
144
- right,
145
- };
146
- }
147
- return { type: "numericComparison", operand: "lt", left, right };
148
- }
149
- case "greaterThanColumn": {
150
- const left = resolveColumnRef(filter.column);
151
- const right = resolveColumnRef(filter.rhs);
152
- if (filter.minDiff !== undefined && filter.minDiff !== 0) {
153
- return {
154
- type: "numericComparison",
155
- operand: "gt",
156
- left: {
157
- type: "numericBinary",
158
- operand: "add",
159
- left,
160
- right: { type: "constant", value: filter.minDiff },
161
- },
162
- right,
163
- };
164
- }
165
- return { type: "numericComparison", operand: "gt", left, right };
166
- }
167
- case "lessThanColumnOrEqual": {
168
- const left = resolveColumnRef(filter.column);
169
- const right = resolveColumnRef(filter.rhs);
170
- if (filter.minDiff !== undefined && filter.minDiff !== 0) {
171
- return {
172
- type: "numericComparison",
173
- operand: "le",
174
- left: {
175
- type: "numericBinary",
176
- operand: "add",
177
- left,
178
- right: { type: "constant", value: filter.minDiff },
179
- },
180
- right,
181
- };
182
- }
183
- return { type: "numericComparison", operand: "le", left, right };
184
- }
185
- case "greaterThanColumnOrEqual": {
186
- const left = resolveColumnRef(filter.column);
187
- const right = resolveColumnRef(filter.rhs);
188
- if (filter.minDiff !== undefined && filter.minDiff !== 0) {
189
- return {
190
- type: "numericComparison",
191
- operand: "ge",
192
- left: {
193
- type: "numericBinary",
194
- operand: "add",
195
- left,
196
- right: { type: "constant", value: filter.minDiff },
197
- },
198
- right,
199
- };
200
- }
201
- return { type: "numericComparison", operand: "ge", left, right };
202
- }
203
- case "inSet":
204
- return {
205
- type: "isIn",
206
- input: resolveColumnRef(filter.column),
207
- set: filter.value,
208
- };
209
- case "notInSet":
210
- return {
211
- type: "not",
212
- input: {
213
- type: "isIn",
214
- input: resolveColumnRef(filter.column),
215
- set: filter.value,
216
- },
217
- };
218
- case "isNA":
219
- return {
220
- type: "isNull",
221
- input: resolveColumnRef(filter.column),
222
- };
223
- case "isNotNA":
224
- return {
225
- type: "not",
226
- input: {
227
- type: "isNull",
228
- input: resolveColumnRef(filter.column),
229
- },
230
- };
231
- case "ifNa":
232
- return {
233
- type: "ifNull",
234
- input: resolveColumnRef(filter.column),
235
- replacement: { type: "constant", value: filter.replacement },
236
- };
237
- case "topN":
238
- case "bottomN":
239
- throw new Error(`Filter type "${filter.type}" is not supported in query expressions`);
240
- case undefined:
241
- throw new Error("Filter type is undefined");
242
- default:
243
- assertNever(filter);
244
- }
41
+ switch (filter.type) {
42
+ case "patternEquals": return {
43
+ type: "stringEquals",
44
+ input: resolveColumnRef(filter.column),
45
+ value: filter.value,
46
+ caseInsensitive: false
47
+ };
48
+ case "patternNotEquals": return {
49
+ type: "not",
50
+ input: {
51
+ type: "stringEquals",
52
+ input: resolveColumnRef(filter.column),
53
+ value: filter.value,
54
+ caseInsensitive: false
55
+ }
56
+ };
57
+ case "patternContainSubsequence": return {
58
+ type: "stringContains",
59
+ input: resolveColumnRef(filter.column),
60
+ value: filter.value,
61
+ caseInsensitive: false
62
+ };
63
+ case "patternNotContainSubsequence": return {
64
+ type: "not",
65
+ input: {
66
+ type: "stringContains",
67
+ input: resolveColumnRef(filter.column),
68
+ value: filter.value,
69
+ caseInsensitive: false
70
+ }
71
+ };
72
+ case "patternMatchesRegularExpression": return {
73
+ type: "stringRegex",
74
+ input: resolveColumnRef(filter.column),
75
+ value: filter.value
76
+ };
77
+ case "patternFuzzyContainSubsequence": return {
78
+ type: "stringContainsFuzzy",
79
+ input: resolveColumnRef(filter.column),
80
+ value: filter.value,
81
+ maxEdits: filter.maxEdits ?? 1,
82
+ caseInsensitive: false,
83
+ substitutionsOnly: filter.substitutionsOnly ?? false,
84
+ wildcard: filter.wildcard ?? null
85
+ };
86
+ case "equal": return {
87
+ type: "numericComparison",
88
+ operand: "eq",
89
+ left: resolveColumnRef(filter.column),
90
+ right: {
91
+ type: "constant",
92
+ value: filter.x
93
+ }
94
+ };
95
+ case "notEqual": return {
96
+ type: "numericComparison",
97
+ operand: "ne",
98
+ left: resolveColumnRef(filter.column),
99
+ right: {
100
+ type: "constant",
101
+ value: filter.x
102
+ }
103
+ };
104
+ case "lessThan": return {
105
+ type: "numericComparison",
106
+ operand: "lt",
107
+ left: resolveColumnRef(filter.column),
108
+ right: {
109
+ type: "constant",
110
+ value: filter.x
111
+ }
112
+ };
113
+ case "greaterThan": return {
114
+ type: "numericComparison",
115
+ operand: "gt",
116
+ left: resolveColumnRef(filter.column),
117
+ right: {
118
+ type: "constant",
119
+ value: filter.x
120
+ }
121
+ };
122
+ case "lessThanOrEqual": return {
123
+ type: "numericComparison",
124
+ operand: "le",
125
+ left: resolveColumnRef(filter.column),
126
+ right: {
127
+ type: "constant",
128
+ value: filter.x
129
+ }
130
+ };
131
+ case "greaterThanOrEqual": return {
132
+ type: "numericComparison",
133
+ operand: "ge",
134
+ left: resolveColumnRef(filter.column),
135
+ right: {
136
+ type: "constant",
137
+ value: filter.x
138
+ }
139
+ };
140
+ case "equalToColumn": return {
141
+ type: "numericComparison",
142
+ operand: "eq",
143
+ left: resolveColumnRef(filter.column),
144
+ right: resolveColumnRef(filter.rhs)
145
+ };
146
+ case "lessThanColumn": {
147
+ const left = resolveColumnRef(filter.column);
148
+ const right = resolveColumnRef(filter.rhs);
149
+ if (filter.minDiff !== void 0 && filter.minDiff !== 0) return {
150
+ type: "numericComparison",
151
+ operand: "lt",
152
+ left: {
153
+ type: "numericBinary",
154
+ operand: "add",
155
+ left,
156
+ right: {
157
+ type: "constant",
158
+ value: filter.minDiff
159
+ }
160
+ },
161
+ right
162
+ };
163
+ return {
164
+ type: "numericComparison",
165
+ operand: "lt",
166
+ left,
167
+ right
168
+ };
169
+ }
170
+ case "greaterThanColumn": {
171
+ const left = resolveColumnRef(filter.column);
172
+ const right = resolveColumnRef(filter.rhs);
173
+ if (filter.minDiff !== void 0 && filter.minDiff !== 0) return {
174
+ type: "numericComparison",
175
+ operand: "gt",
176
+ left: {
177
+ type: "numericBinary",
178
+ operand: "add",
179
+ left,
180
+ right: {
181
+ type: "constant",
182
+ value: filter.minDiff
183
+ }
184
+ },
185
+ right
186
+ };
187
+ return {
188
+ type: "numericComparison",
189
+ operand: "gt",
190
+ left,
191
+ right
192
+ };
193
+ }
194
+ case "lessThanColumnOrEqual": {
195
+ const left = resolveColumnRef(filter.column);
196
+ const right = resolveColumnRef(filter.rhs);
197
+ if (filter.minDiff !== void 0 && filter.minDiff !== 0) return {
198
+ type: "numericComparison",
199
+ operand: "le",
200
+ left: {
201
+ type: "numericBinary",
202
+ operand: "add",
203
+ left,
204
+ right: {
205
+ type: "constant",
206
+ value: filter.minDiff
207
+ }
208
+ },
209
+ right
210
+ };
211
+ return {
212
+ type: "numericComparison",
213
+ operand: "le",
214
+ left,
215
+ right
216
+ };
217
+ }
218
+ case "greaterThanColumnOrEqual": {
219
+ const left = resolveColumnRef(filter.column);
220
+ const right = resolveColumnRef(filter.rhs);
221
+ if (filter.minDiff !== void 0 && filter.minDiff !== 0) return {
222
+ type: "numericComparison",
223
+ operand: "ge",
224
+ left: {
225
+ type: "numericBinary",
226
+ operand: "add",
227
+ left,
228
+ right: {
229
+ type: "constant",
230
+ value: filter.minDiff
231
+ }
232
+ },
233
+ right
234
+ };
235
+ return {
236
+ type: "numericComparison",
237
+ operand: "ge",
238
+ left,
239
+ right
240
+ };
241
+ }
242
+ case "inSet": return {
243
+ type: "isIn",
244
+ input: resolveColumnRef(filter.column),
245
+ set: filter.value
246
+ };
247
+ case "notInSet": return {
248
+ type: "not",
249
+ input: {
250
+ type: "isIn",
251
+ input: resolveColumnRef(filter.column),
252
+ set: filter.value
253
+ }
254
+ };
255
+ case "isNA": return {
256
+ type: "isNull",
257
+ input: resolveColumnRef(filter.column)
258
+ };
259
+ case "isNotNA": return {
260
+ type: "not",
261
+ input: {
262
+ type: "isNull",
263
+ input: resolveColumnRef(filter.column)
264
+ }
265
+ };
266
+ case "ifNa": return {
267
+ type: "ifNull",
268
+ input: resolveColumnRef(filter.column),
269
+ replacement: {
270
+ type: "constant",
271
+ value: filter.replacement
272
+ }
273
+ };
274
+ case "topN":
275
+ case "bottomN": throw new Error(`Filter type "${filter.type}" is not supported in query expressions`);
276
+ case void 0: throw new Error("Filter type is undefined");
277
+ default: assertNever(filter);
278
+ }
245
279
  }
246
280
 
281
+ //#endregion
247
282
  export { filterSpecToSpecQueryExpr };
248
- //# sourceMappingURL=filterToQuery.js.map
283
+ //# sourceMappingURL=filterToQuery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"filterToQuery.js","sources":["../../../src/filters/converters/filterToQuery.ts"],"sourcesContent":["import { assertNever } from \"@milaboratories/pl-model-common\";\nimport type {\n FilterSpec,\n FilterSpecLeaf,\n PTableColumnId,\n SingleAxisSelector,\n SpecQueryExpression,\n} from \"@milaboratories/pl-model-common\";\nimport { traverseFilterSpec } from \"../traverse\";\n\n/** Parses a CanonicalizedJson<PTableColumnId> string into a SpecQueryExpression reference. */\nfunction resolveColumnRef(columnStr: string): SpecQueryExpression {\n const parsed = JSON.parse(columnStr) as PTableColumnId;\n return parsed.type === \"axis\"\n ? { type: \"axisRef\", value: parsed.id as SingleAxisSelector }\n : { type: \"columnRef\", value: parsed.id };\n}\n\n/** Converts a FilterSpec tree into a SpecQueryExpression. */\nexport function filterSpecToSpecQueryExpr<Leaf extends FilterSpecLeaf<string>>(\n filter: FilterSpec<Leaf>,\n): SpecQueryExpression {\n return traverseFilterSpec(filter, {\n leaf: leafToSpecQueryExpr,\n and: (inputs) => {\n if (inputs.length === 0) {\n throw new Error(\"AND filter requires at least one operand\");\n }\n return { type: \"and\", input: inputs };\n },\n or: (inputs) => {\n if (inputs.length === 0) {\n throw new Error(\"OR filter requires at least one operand\");\n }\n return { type: \"or\", input: inputs };\n },\n not: (input) => ({ type: \"not\", input }),\n });\n}\n\nfunction leafToSpecQueryExpr<Leaf extends FilterSpecLeaf<string>>(\n filter: Leaf,\n): SpecQueryExpression {\n switch (filter.type) {\n case \"patternEquals\":\n return {\n type: \"stringEquals\",\n input: resolveColumnRef(filter.column),\n value: filter.value,\n caseInsensitive: false,\n };\n case \"patternNotEquals\":\n return {\n type: \"not\",\n input: {\n type: \"stringEquals\",\n input: resolveColumnRef(filter.column),\n value: filter.value,\n caseInsensitive: false,\n },\n };\n case \"patternContainSubsequence\":\n return {\n type: \"stringContains\",\n input: resolveColumnRef(filter.column),\n value: filter.value,\n caseInsensitive: false,\n };\n case \"patternNotContainSubsequence\":\n return {\n type: \"not\",\n input: {\n type: \"stringContains\",\n input: resolveColumnRef(filter.column),\n value: filter.value,\n caseInsensitive: false,\n },\n };\n case \"patternMatchesRegularExpression\":\n return {\n type: \"stringRegex\",\n input: resolveColumnRef(filter.column),\n value: filter.value,\n };\n case \"patternFuzzyContainSubsequence\":\n return {\n type: \"stringContainsFuzzy\",\n input: resolveColumnRef(filter.column),\n value: filter.value,\n maxEdits: filter.maxEdits ?? 1,\n caseInsensitive: false,\n substitutionsOnly: filter.substitutionsOnly ?? false,\n wildcard: filter.wildcard ?? null,\n };\n\n case \"equal\":\n return {\n type: \"numericComparison\",\n operand: \"eq\",\n left: resolveColumnRef(filter.column),\n right: { type: \"constant\", value: filter.x },\n };\n case \"notEqual\":\n return {\n type: \"numericComparison\",\n operand: \"ne\",\n left: resolveColumnRef(filter.column),\n right: { type: \"constant\", value: filter.x },\n };\n case \"lessThan\":\n return {\n type: \"numericComparison\",\n operand: \"lt\",\n left: resolveColumnRef(filter.column),\n right: { type: \"constant\", value: filter.x },\n };\n case \"greaterThan\":\n return {\n type: \"numericComparison\",\n operand: \"gt\",\n left: resolveColumnRef(filter.column),\n right: { type: \"constant\", value: filter.x },\n };\n case \"lessThanOrEqual\":\n return {\n type: \"numericComparison\",\n operand: \"le\",\n left: resolveColumnRef(filter.column),\n right: { type: \"constant\", value: filter.x },\n };\n case \"greaterThanOrEqual\":\n return {\n type: \"numericComparison\",\n operand: \"ge\",\n left: resolveColumnRef(filter.column),\n right: { type: \"constant\", value: filter.x },\n };\n\n case \"equalToColumn\":\n return {\n type: \"numericComparison\",\n operand: \"eq\",\n left: resolveColumnRef(filter.column),\n right: resolveColumnRef(filter.rhs),\n };\n case \"lessThanColumn\": {\n const left = resolveColumnRef(filter.column);\n const right = resolveColumnRef(filter.rhs);\n if (filter.minDiff !== undefined && filter.minDiff !== 0) {\n return {\n type: \"numericComparison\",\n operand: \"lt\",\n left: {\n type: \"numericBinary\",\n operand: \"add\",\n left,\n right: { type: \"constant\", value: filter.minDiff },\n },\n right,\n };\n }\n return { type: \"numericComparison\", operand: \"lt\", left, right };\n }\n case \"greaterThanColumn\": {\n const left = resolveColumnRef(filter.column);\n const right = resolveColumnRef(filter.rhs);\n if (filter.minDiff !== undefined && filter.minDiff !== 0) {\n return {\n type: \"numericComparison\",\n operand: \"gt\",\n left: {\n type: \"numericBinary\",\n operand: \"add\",\n left,\n right: { type: \"constant\", value: filter.minDiff },\n },\n right,\n };\n }\n return { type: \"numericComparison\", operand: \"gt\", left, right };\n }\n case \"lessThanColumnOrEqual\": {\n const left = resolveColumnRef(filter.column);\n const right = resolveColumnRef(filter.rhs);\n if (filter.minDiff !== undefined && filter.minDiff !== 0) {\n return {\n type: \"numericComparison\",\n operand: \"le\",\n left: {\n type: \"numericBinary\",\n operand: \"add\",\n left,\n right: { type: \"constant\", value: filter.minDiff },\n },\n right,\n };\n }\n return { type: \"numericComparison\", operand: \"le\", left, right };\n }\n case \"greaterThanColumnOrEqual\": {\n const left = resolveColumnRef(filter.column);\n const right = resolveColumnRef(filter.rhs);\n if (filter.minDiff !== undefined && filter.minDiff !== 0) {\n return {\n type: \"numericComparison\",\n operand: \"ge\",\n left: {\n type: \"numericBinary\",\n operand: \"add\",\n left,\n right: { type: \"constant\", value: filter.minDiff },\n },\n right,\n };\n }\n return { type: \"numericComparison\", operand: \"ge\", left, right };\n }\n\n case \"inSet\":\n return {\n type: \"isIn\",\n input: resolveColumnRef(filter.column),\n set: filter.value,\n };\n case \"notInSet\":\n return {\n type: \"not\",\n input: {\n type: \"isIn\",\n input: resolveColumnRef(filter.column),\n set: filter.value,\n },\n };\n\n case \"isNA\":\n return {\n type: \"isNull\",\n input: resolveColumnRef(filter.column),\n };\n case \"isNotNA\":\n return {\n type: \"not\",\n input: {\n type: \"isNull\",\n input: resolveColumnRef(filter.column),\n },\n };\n\n case \"ifNa\":\n return {\n type: \"ifNull\",\n input: resolveColumnRef(filter.column),\n replacement: { type: \"constant\", value: filter.replacement },\n };\n\n case \"topN\":\n case \"bottomN\":\n throw new Error(`Filter type \"${filter.type}\" is not supported in query expressions`);\n\n case undefined:\n throw new Error(\"Filter type is undefined\");\n\n default:\n assertNever(filter);\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filterToQuery.js","names":[],"sources":["../../../src/filters/converters/filterToQuery.ts"],"sourcesContent":["import { assertNever } from \"@milaboratories/pl-model-common\";\nimport type {\n FilterSpec,\n FilterSpecLeaf,\n PTableColumnId,\n SingleAxisSelector,\n SpecQueryExpression,\n} from \"@milaboratories/pl-model-common\";\nimport { traverseFilterSpec } from \"../traverse\";\n\n/** Parses a CanonicalizedJson<PTableColumnId> string into a SpecQueryExpression reference. */\nfunction resolveColumnRef(columnStr: string): SpecQueryExpression {\n const parsed = JSON.parse(columnStr) as PTableColumnId;\n return parsed.type === \"axis\"\n ? { type: \"axisRef\", value: parsed.id as SingleAxisSelector }\n : { type: \"columnRef\", value: parsed.id };\n}\n\n/** Converts a FilterSpec tree into a SpecQueryExpression. */\nexport function filterSpecToSpecQueryExpr<Leaf extends FilterSpecLeaf<string>>(\n filter: FilterSpec<Leaf>,\n): SpecQueryExpression {\n return traverseFilterSpec(filter, {\n leaf: leafToSpecQueryExpr,\n and: (inputs) => {\n if (inputs.length === 0) {\n throw new Error(\"AND filter requires at least one operand\");\n }\n return { type: \"and\", input: inputs };\n },\n or: (inputs) => {\n if (inputs.length === 0) {\n throw new Error(\"OR filter requires at least one operand\");\n }\n return { type: \"or\", input: inputs };\n },\n not: (input) => ({ type: \"not\", input }),\n });\n}\n\nfunction leafToSpecQueryExpr<Leaf extends FilterSpecLeaf<string>>(\n filter: Leaf,\n): SpecQueryExpression {\n switch (filter.type) {\n case \"patternEquals\":\n return {\n type: \"stringEquals\",\n input: resolveColumnRef(filter.column),\n value: filter.value,\n caseInsensitive: false,\n };\n case \"patternNotEquals\":\n return {\n type: \"not\",\n input: {\n type: \"stringEquals\",\n input: resolveColumnRef(filter.column),\n value: filter.value,\n caseInsensitive: false,\n },\n };\n case \"patternContainSubsequence\":\n return {\n type: \"stringContains\",\n input: resolveColumnRef(filter.column),\n value: filter.value,\n caseInsensitive: false,\n };\n case \"patternNotContainSubsequence\":\n return {\n type: \"not\",\n input: {\n type: \"stringContains\",\n input: resolveColumnRef(filter.column),\n value: filter.value,\n caseInsensitive: false,\n },\n };\n case \"patternMatchesRegularExpression\":\n return {\n type: \"stringRegex\",\n input: resolveColumnRef(filter.column),\n value: filter.value,\n };\n case \"patternFuzzyContainSubsequence\":\n return {\n type: \"stringContainsFuzzy\",\n input: resolveColumnRef(filter.column),\n value: filter.value,\n maxEdits: filter.maxEdits ?? 1,\n caseInsensitive: false,\n substitutionsOnly: filter.substitutionsOnly ?? false,\n wildcard: filter.wildcard ?? null,\n };\n\n case \"equal\":\n return {\n type: \"numericComparison\",\n operand: \"eq\",\n left: resolveColumnRef(filter.column),\n right: { type: \"constant\", value: filter.x },\n };\n case \"notEqual\":\n return {\n type: \"numericComparison\",\n operand: \"ne\",\n left: resolveColumnRef(filter.column),\n right: { type: \"constant\", value: filter.x },\n };\n case \"lessThan\":\n return {\n type: \"numericComparison\",\n operand: \"lt\",\n left: resolveColumnRef(filter.column),\n right: { type: \"constant\", value: filter.x },\n };\n case \"greaterThan\":\n return {\n type: \"numericComparison\",\n operand: \"gt\",\n left: resolveColumnRef(filter.column),\n right: { type: \"constant\", value: filter.x },\n };\n case \"lessThanOrEqual\":\n return {\n type: \"numericComparison\",\n operand: \"le\",\n left: resolveColumnRef(filter.column),\n right: { type: \"constant\", value: filter.x },\n };\n case \"greaterThanOrEqual\":\n return {\n type: \"numericComparison\",\n operand: \"ge\",\n left: resolveColumnRef(filter.column),\n right: { type: \"constant\", value: filter.x },\n };\n\n case \"equalToColumn\":\n return {\n type: \"numericComparison\",\n operand: \"eq\",\n left: resolveColumnRef(filter.column),\n right: resolveColumnRef(filter.rhs),\n };\n case \"lessThanColumn\": {\n const left = resolveColumnRef(filter.column);\n const right = resolveColumnRef(filter.rhs);\n if (filter.minDiff !== undefined && filter.minDiff !== 0) {\n return {\n type: \"numericComparison\",\n operand: \"lt\",\n left: {\n type: \"numericBinary\",\n operand: \"add\",\n left,\n right: { type: \"constant\", value: filter.minDiff },\n },\n right,\n };\n }\n return { type: \"numericComparison\", operand: \"lt\", left, right };\n }\n case \"greaterThanColumn\": {\n const left = resolveColumnRef(filter.column);\n const right = resolveColumnRef(filter.rhs);\n if (filter.minDiff !== undefined && filter.minDiff !== 0) {\n return {\n type: \"numericComparison\",\n operand: \"gt\",\n left: {\n type: \"numericBinary\",\n operand: \"add\",\n left,\n right: { type: \"constant\", value: filter.minDiff },\n },\n right,\n };\n }\n return { type: \"numericComparison\", operand: \"gt\", left, right };\n }\n case \"lessThanColumnOrEqual\": {\n const left = resolveColumnRef(filter.column);\n const right = resolveColumnRef(filter.rhs);\n if (filter.minDiff !== undefined && filter.minDiff !== 0) {\n return {\n type: \"numericComparison\",\n operand: \"le\",\n left: {\n type: \"numericBinary\",\n operand: \"add\",\n left,\n right: { type: \"constant\", value: filter.minDiff },\n },\n right,\n };\n }\n return { type: \"numericComparison\", operand: \"le\", left, right };\n }\n case \"greaterThanColumnOrEqual\": {\n const left = resolveColumnRef(filter.column);\n const right = resolveColumnRef(filter.rhs);\n if (filter.minDiff !== undefined && filter.minDiff !== 0) {\n return {\n type: \"numericComparison\",\n operand: \"ge\",\n left: {\n type: \"numericBinary\",\n operand: \"add\",\n left,\n right: { type: \"constant\", value: filter.minDiff },\n },\n right,\n };\n }\n return { type: \"numericComparison\", operand: \"ge\", left, right };\n }\n\n case \"inSet\":\n return {\n type: \"isIn\",\n input: resolveColumnRef(filter.column),\n set: filter.value,\n };\n case \"notInSet\":\n return {\n type: \"not\",\n input: {\n type: \"isIn\",\n input: resolveColumnRef(filter.column),\n set: filter.value,\n },\n };\n\n case \"isNA\":\n return {\n type: \"isNull\",\n input: resolveColumnRef(filter.column),\n };\n case \"isNotNA\":\n return {\n type: \"not\",\n input: {\n type: \"isNull\",\n input: resolveColumnRef(filter.column),\n },\n };\n\n case \"ifNa\":\n return {\n type: \"ifNull\",\n input: resolveColumnRef(filter.column),\n replacement: { type: \"constant\", value: filter.replacement },\n };\n\n case \"topN\":\n case \"bottomN\":\n throw new Error(`Filter type \"${filter.type}\" is not supported in query expressions`);\n\n case undefined:\n throw new Error(\"Filter type is undefined\");\n\n default:\n assertNever(filter);\n }\n}\n"],"mappings":"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"}