@finos/legend-query-builder 4.17.99 → 4.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/lib/components/QueryBuilder.d.ts.map +1 -1
  2. package/lib/components/QueryBuilder.js +2 -1
  3. package/lib/components/QueryBuilder.js.map +1 -1
  4. package/lib/components/QueryBuilderSideBar.d.ts.map +1 -1
  5. package/lib/components/QueryBuilderSideBar.js +9 -8
  6. package/lib/components/QueryBuilderSideBar.js.map +1 -1
  7. package/lib/components/explorer/QueryBuilderExplorerPanel.d.ts.map +1 -1
  8. package/lib/components/explorer/QueryBuilderExplorerPanel.js +48 -5
  9. package/lib/components/explorer/QueryBuilderExplorerPanel.js.map +1 -1
  10. package/lib/components/explorer/QueryBuilderRelationExplorerPanel.d.ts +24 -0
  11. package/lib/components/explorer/QueryBuilderRelationExplorerPanel.d.ts.map +1 -0
  12. package/lib/components/explorer/QueryBuilderRelationExplorerPanel.js +202 -0
  13. package/lib/components/explorer/QueryBuilderRelationExplorerPanel.js.map +1 -0
  14. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.d.ts.map +1 -1
  15. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js.map +1 -1
  16. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js +3 -3
  17. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js.map +1 -1
  18. package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
  19. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +25 -6
  20. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
  21. package/lib/components/result/QueryBuilderResultPanel.d.ts.map +1 -1
  22. package/lib/components/result/QueryBuilderResultPanel.js +1 -1
  23. package/lib/components/result/QueryBuilderResultPanel.js.map +1 -1
  24. package/lib/components/result/tds/QueryBuilderTDSAsyncCellSelectionStats.d.ts +42 -0
  25. package/lib/components/result/tds/QueryBuilderTDSAsyncCellSelectionStats.d.ts.map +1 -0
  26. package/lib/components/result/tds/QueryBuilderTDSAsyncCellSelectionStats.js +212 -0
  27. package/lib/components/result/tds/QueryBuilderTDSAsyncCellSelectionStats.js.map +1 -0
  28. package/lib/components/result/tds/QueryBuilderTDSCellSelectionStats.d.ts +66 -0
  29. package/lib/components/result/tds/QueryBuilderTDSCellSelectionStats.d.ts.map +1 -0
  30. package/lib/components/result/tds/QueryBuilderTDSCellSelectionStats.js +265 -0
  31. package/lib/components/result/tds/QueryBuilderTDSCellSelectionStats.js.map +1 -0
  32. package/lib/components/result/tds/QueryBuilderTDSCellSelectionStatsBar.d.ts +28 -0
  33. package/lib/components/result/tds/QueryBuilderTDSCellSelectionStatsBar.d.ts.map +1 -0
  34. package/lib/components/result/tds/QueryBuilderTDSCellSelectionStatsBar.js +148 -0
  35. package/lib/components/result/tds/QueryBuilderTDSCellSelectionStatsBar.js.map +1 -0
  36. package/lib/components/result/tds/QueryBuilderTDSGridKeyboardShortcuts.d.ts +19 -0
  37. package/lib/components/result/tds/QueryBuilderTDSGridKeyboardShortcuts.d.ts.map +1 -0
  38. package/lib/components/result/tds/QueryBuilderTDSGridKeyboardShortcuts.js +196 -0
  39. package/lib/components/result/tds/QueryBuilderTDSGridKeyboardShortcuts.js.map +1 -0
  40. package/lib/components/result/tds/QueryBuilderTDSGridResult.d.ts +5 -0
  41. package/lib/components/result/tds/QueryBuilderTDSGridResult.d.ts.map +1 -1
  42. package/lib/components/result/tds/QueryBuilderTDSGridResult.js +64 -87
  43. package/lib/components/result/tds/QueryBuilderTDSGridResult.js.map +1 -1
  44. package/lib/components/result/tds/QueryBuilderTDSGridShared.d.ts +26 -0
  45. package/lib/components/result/tds/QueryBuilderTDSGridShared.d.ts.map +1 -0
  46. package/lib/components/result/tds/QueryBuilderTDSGridShared.js +51 -0
  47. package/lib/components/result/tds/QueryBuilderTDSGridShared.js.map +1 -0
  48. package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.d.ts +5 -0
  49. package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.d.ts.map +1 -1
  50. package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.js +169 -60
  51. package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.js.map +1 -1
  52. package/lib/components/workflows/AccessorQueryBuilder.d.ts +18 -0
  53. package/lib/components/workflows/AccessorQueryBuilder.d.ts.map +1 -0
  54. package/lib/components/workflows/AccessorQueryBuilder.js +87 -0
  55. package/lib/components/workflows/AccessorQueryBuilder.js.map +1 -0
  56. package/lib/components/workflows/ClassQueryBuilder.js +5 -5
  57. package/lib/components/workflows/ClassQueryBuilder.js.map +1 -1
  58. package/lib/data-access-overview.css +1 -1
  59. package/lib/graph/QueryBuilderMetaModelConst.d.ts +4 -0
  60. package/lib/graph/QueryBuilderMetaModelConst.d.ts.map +1 -1
  61. package/lib/graph/QueryBuilderMetaModelConst.js +4 -0
  62. package/lib/graph/QueryBuilderMetaModelConst.js.map +1 -1
  63. package/lib/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.d.ts.map +1 -1
  64. package/lib/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.js +7 -1
  65. package/lib/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.js.map +1 -1
  66. package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.d.ts +2 -0
  67. package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.d.ts.map +1 -1
  68. package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.js +93 -3
  69. package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.js.map +1 -1
  70. package/lib/index.css +2 -2
  71. package/lib/index.css.map +1 -1
  72. package/lib/index.d.ts +2 -0
  73. package/lib/index.d.ts.map +1 -1
  74. package/lib/index.js +2 -0
  75. package/lib/index.js.map +1 -1
  76. package/lib/package.json +1 -1
  77. package/lib/stores/QueryBuilderConfig.d.ts +3 -0
  78. package/lib/stores/QueryBuilderConfig.d.ts.map +1 -1
  79. package/lib/stores/QueryBuilderConfig.js +3 -0
  80. package/lib/stores/QueryBuilderConfig.js.map +1 -1
  81. package/lib/stores/QueryBuilderResultState.d.ts.map +1 -1
  82. package/lib/stores/QueryBuilderResultState.js +13 -3
  83. package/lib/stores/QueryBuilderResultState.js.map +1 -1
  84. package/lib/stores/QueryBuilderState.d.ts +14 -4
  85. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  86. package/lib/stores/QueryBuilderState.js +41 -13
  87. package/lib/stores/QueryBuilderState.js.map +1 -1
  88. package/lib/stores/QueryBuilderStateBuilder.d.ts +2 -1
  89. package/lib/stores/QueryBuilderStateBuilder.d.ts.map +1 -1
  90. package/lib/stores/QueryBuilderStateBuilder.js +51 -20
  91. package/lib/stores/QueryBuilderStateBuilder.js.map +1 -1
  92. package/lib/stores/QueryBuilderStateHashUtils.d.ts +1 -0
  93. package/lib/stores/QueryBuilderStateHashUtils.d.ts.map +1 -1
  94. package/lib/stores/QueryBuilderStateHashUtils.js +1 -0
  95. package/lib/stores/QueryBuilderStateHashUtils.js.map +1 -1
  96. package/lib/stores/QueryBuilderTypeaheadHelper.js +2 -2
  97. package/lib/stores/QueryBuilderTypeaheadHelper.js.map +1 -1
  98. package/lib/stores/QueryBuilderValueSpecificationBuilder.d.ts +1 -1
  99. package/lib/stores/QueryBuilderValueSpecificationBuilder.d.ts.map +1 -1
  100. package/lib/stores/QueryBuilderValueSpecificationBuilder.js +54 -45
  101. package/lib/stores/QueryBuilderValueSpecificationBuilder.js.map +1 -1
  102. package/lib/stores/__test-utils__/QueryBuilderStateTestUtils.js +1 -1
  103. package/lib/stores/__test-utils__/QueryBuilderStateTestUtils.js.map +1 -1
  104. package/lib/stores/explorer/QueryBuilderExplorerState.d.ts +12 -2
  105. package/lib/stores/explorer/QueryBuilderExplorerState.d.ts.map +1 -1
  106. package/lib/stores/explorer/QueryBuilderExplorerState.js +12 -2
  107. package/lib/stores/explorer/QueryBuilderExplorerState.js.map +1 -1
  108. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts +2 -2
  109. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts.map +1 -1
  110. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.js.map +1 -1
  111. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts +2 -2
  112. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
  113. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js +4 -3
  114. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js.map +1 -1
  115. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.js +1 -1
  116. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.js.map +1 -1
  117. package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.d.ts +2 -0
  118. package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.d.ts.map +1 -1
  119. package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.js +19 -0
  120. package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.js.map +1 -1
  121. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts +7 -4
  122. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts.map +1 -1
  123. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js +59 -12
  124. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js.map +1 -1
  125. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.d.ts +16 -3
  126. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.d.ts.map +1 -1
  127. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js +102 -24
  128. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js.map +1 -1
  129. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.d.ts +2 -1
  130. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.d.ts.map +1 -1
  131. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.js +16 -1
  132. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.js.map +1 -1
  133. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js +3 -3
  134. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js.map +1 -1
  135. package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuilder.d.ts.map +1 -1
  136. package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuilder.js +11 -2
  137. package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuilder.js.map +1 -1
  138. package/lib/stores/fetch-structure/tds/projection/QueryBuilderTypedProjectionStateBuilder.d.ts.map +1 -1
  139. package/lib/stores/fetch-structure/tds/projection/QueryBuilderTypedProjectionStateBuilder.js +16 -12
  140. package/lib/stores/fetch-structure/tds/projection/QueryBuilderTypedProjectionStateBuilder.js.map +1 -1
  141. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.d.ts +4 -3
  142. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.d.ts.map +1 -1
  143. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.js +19 -9
  144. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.js.map +1 -1
  145. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.d.ts +1 -0
  146. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.d.ts.map +1 -1
  147. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.js +57 -5
  148. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.js.map +1 -1
  149. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.d.ts +4 -3
  150. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.d.ts.map +1 -1
  151. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.js +85 -6
  152. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.js.map +1 -1
  153. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator.d.ts +1 -0
  154. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator.d.ts.map +1 -1
  155. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator.js.map +1 -1
  156. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Average.d.ts +1 -0
  157. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Average.d.ts.map +1 -1
  158. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Average.js +3 -0
  159. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Average.js.map +1 -1
  160. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Count.d.ts +1 -0
  161. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Count.d.ts.map +1 -1
  162. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Count.js +3 -0
  163. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Count.js.map +1 -1
  164. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Max.d.ts +1 -0
  165. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Max.d.ts.map +1 -1
  166. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Max.js +3 -0
  167. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Max.js.map +1 -1
  168. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Min.d.ts +1 -0
  169. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Min.d.ts.map +1 -1
  170. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Min.js +3 -0
  171. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Min.js.map +1 -1
  172. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Sum.d.ts +1 -0
  173. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Sum.d.ts.map +1 -1
  174. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Sum.js +3 -0
  175. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Sum.js.map +1 -1
  176. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_AverageRank.d.ts +1 -0
  177. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_AverageRank.d.ts.map +1 -1
  178. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_AverageRank.js +4 -0
  179. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_AverageRank.js.map +1 -1
  180. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_DenseRank.d.ts +1 -0
  181. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_DenseRank.d.ts.map +1 -1
  182. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_DenseRank.js +3 -0
  183. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_DenseRank.js.map +1 -1
  184. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_Rank.d.ts +1 -0
  185. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_Rank.d.ts.map +1 -1
  186. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_Rank.js +3 -0
  187. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_Rank.js.map +1 -1
  188. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_RowNumber.d.ts +1 -0
  189. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_RowNumber.d.ts.map +1 -1
  190. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_RowNumber.js +3 -0
  191. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_RowNumber.js.map +1 -1
  192. package/lib/stores/milestoning/QueryBuilderMilestoningState.js +4 -4
  193. package/lib/stores/milestoning/QueryBuilderMilestoningState.js.map +1 -1
  194. package/lib/stores/workflows/MappingQueryBuilderState.js +2 -2
  195. package/lib/stores/workflows/MappingQueryBuilderState.js.map +1 -1
  196. package/lib/stores/workflows/ServiceQueryBuilderState.js +2 -2
  197. package/lib/stores/workflows/ServiceQueryBuilderState.js.map +1 -1
  198. package/lib/stores/workflows/accessor/AccessorQueryBuilderHelper.d.ts +18 -0
  199. package/lib/stores/workflows/accessor/AccessorQueryBuilderHelper.d.ts.map +1 -0
  200. package/lib/stores/workflows/accessor/AccessorQueryBuilderHelper.js +32 -0
  201. package/lib/stores/workflows/accessor/AccessorQueryBuilderHelper.js.map +1 -0
  202. package/lib/stores/workflows/accessor/AccessorQueryBuilderState.d.ts +57 -0
  203. package/lib/stores/workflows/accessor/AccessorQueryBuilderState.d.ts.map +1 -0
  204. package/lib/stores/workflows/accessor/AccessorQueryBuilderState.js +125 -0
  205. package/lib/stores/workflows/accessor/AccessorQueryBuilderState.js.map +1 -0
  206. package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.js +4 -4
  207. package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.js.map +1 -1
  208. package/package.json +7 -7
  209. package/src/components/QueryBuilder.tsx +2 -1
  210. package/src/components/QueryBuilderSideBar.tsx +12 -8
  211. package/src/components/explorer/QueryBuilderExplorerPanel.tsx +77 -14
  212. package/src/components/explorer/QueryBuilderRelationExplorerPanel.tsx +536 -0
  213. package/src/components/fetch-structure/QueryBuilderPostFilterPanel.tsx +1 -0
  214. package/src/components/fetch-structure/QueryBuilderResultModifierPanel.tsx +3 -3
  215. package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +62 -4
  216. package/src/components/result/QueryBuilderResultPanel.tsx +6 -2
  217. package/src/components/result/tds/QueryBuilderTDSAsyncCellSelectionStats.ts +254 -0
  218. package/src/components/result/tds/QueryBuilderTDSCellSelectionStats.ts +397 -0
  219. package/src/components/result/tds/QueryBuilderTDSCellSelectionStatsBar.tsx +439 -0
  220. package/src/components/result/tds/QueryBuilderTDSGridKeyboardShortcuts.ts +270 -0
  221. package/src/components/result/tds/QueryBuilderTDSGridResult.tsx +107 -112
  222. package/src/components/result/tds/QueryBuilderTDSGridShared.ts +76 -0
  223. package/src/components/result/tds/QueryBuilderTDSSimpleGridResult.tsx +272 -99
  224. package/src/components/workflows/AccessorQueryBuilder.tsx +211 -0
  225. package/src/components/workflows/ClassQueryBuilder.tsx +5 -5
  226. package/src/graph/QueryBuilderMetaModelConst.ts +5 -0
  227. package/src/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.ts +28 -0
  228. package/src/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.ts +223 -4
  229. package/src/index.ts +2 -0
  230. package/src/stores/QueryBuilderConfig.ts +3 -0
  231. package/src/stores/QueryBuilderResultState.ts +22 -9
  232. package/src/stores/QueryBuilderState.ts +47 -12
  233. package/src/stores/QueryBuilderStateBuilder.ts +107 -43
  234. package/src/stores/QueryBuilderStateHashUtils.ts +1 -0
  235. package/src/stores/QueryBuilderTypeaheadHelper.ts +2 -2
  236. package/src/stores/QueryBuilderValueSpecificationBuilder.ts +72 -59
  237. package/src/stores/__test-utils__/QueryBuilderStateTestUtils.ts +1 -1
  238. package/src/stores/explorer/QueryBuilderExplorerState.ts +26 -2
  239. package/src/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.ts +1 -2
  240. package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.ts +4 -3
  241. package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.ts +1 -1
  242. package/src/stores/fetch-structure/tds/QueryBuilderTDSHelper.ts +42 -0
  243. package/src/stores/fetch-structure/tds/QueryBuilderTDSState.ts +135 -19
  244. package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.ts +197 -38
  245. package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.ts +30 -0
  246. package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.ts +3 -3
  247. package/src/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuilder.ts +21 -0
  248. package/src/stores/fetch-structure/tds/projection/QueryBuilderTypedProjectionStateBuilder.ts +25 -16
  249. package/src/stores/fetch-structure/tds/window/QueryBuilderWindowState.ts +23 -9
  250. package/src/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.ts +146 -4
  251. package/src/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.ts +145 -10
  252. package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator.ts +2 -0
  253. package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Average.ts +4 -0
  254. package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Count.ts +4 -0
  255. package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Max.ts +4 -0
  256. package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Min.ts +4 -0
  257. package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Sum.ts +4 -0
  258. package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_AverageRank.ts +5 -0
  259. package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_DenseRank.ts +4 -0
  260. package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_Rank.ts +4 -0
  261. package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_RowNumber.ts +4 -0
  262. package/src/stores/milestoning/QueryBuilderMilestoningState.ts +4 -4
  263. package/src/stores/workflows/MappingQueryBuilderState.ts +2 -2
  264. package/src/stores/workflows/ServiceQueryBuilderState.ts +2 -2
  265. package/src/stores/workflows/accessor/AccessorQueryBuilderHelper.ts +51 -0
  266. package/src/stores/workflows/accessor/AccessorQueryBuilderState.ts +195 -0
  267. package/src/stores/workflows/dataProduct/DataProductQueryBuilderState.ts +4 -4
  268. package/tsconfig.json +9 -0
@@ -0,0 +1,536 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { forwardRef, useMemo, useRef, useState } from 'react';
18
+ import { observer } from 'mobx-react-lite';
19
+ import {
20
+ type TreeNodeContainerProps,
21
+ type TreeNodeViewProps,
22
+ type TreeData,
23
+ clsx,
24
+ TreeView,
25
+ BlankPanelContent,
26
+ ContextMenu,
27
+ MenuContent,
28
+ MenuContentItem,
29
+ DragPreviewLayer,
30
+ useDragPreviewLayer,
31
+ PanelHeader,
32
+ ChevronDownIcon,
33
+ ChevronRightIcon,
34
+ InfoCircleIcon,
35
+ Tooltip,
36
+ PURE_DataProductIcon,
37
+ PURE_IngestIcon,
38
+ PURE_DatabaseIcon,
39
+ PURE_UnknownElementTypeIcon,
40
+ } from '@finos/legend-art';
41
+ import { useDrag } from 'react-dnd';
42
+ import {
43
+ type Accessor,
44
+ type RelationColumn,
45
+ DataProductAccessor,
46
+ IngestionAccessor,
47
+ InstanceValue,
48
+ RelationalStoreAccessor,
49
+ } from '@finos/legend-graph';
50
+ import {
51
+ type QueryBuilderExplorerTreeRelationColumnDragSource,
52
+ type QueryBuilderExplorerTreeNodeData,
53
+ QUERY_BUILDER_EXPLORER_TREE_DND_TYPE,
54
+ QueryBuilderExplorerTreeRelationColumnNodeData,
55
+ QueryBuilderExplorerTreeRelationRootNodeData,
56
+ } from '../../stores/explorer/QueryBuilderExplorerState.js';
57
+ import type { QueryBuilderState } from '../../stores/QueryBuilderState.js';
58
+ import {
59
+ isExplorerTreeNodeAlreadyUsed,
60
+ renderPropertyTypeIcon,
61
+ } from './QueryBuilderExplorerPanel.js';
62
+ import { QUERY_BUILDER_TEST_ID } from '../../__lib__/QueryBuilderTesting.js';
63
+ import { isNonNullable, prettyCONSTName } from '@finos/legend-shared';
64
+ import { QueryBuilderBaseInfoTooltip } from '../shared/QueryBuilderPropertyInfoTooltip.js';
65
+ import { QueryBuilderTDSState } from '../../stores/fetch-structure/tds/QueryBuilderTDSState.js';
66
+ import { QueryBuilderRelationColumnProjectionColumnState } from '../../stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js';
67
+
68
+ const RELATION_ROOT_NODE_ID = '__relation_root__';
69
+
70
+ const getAccessorIcon = (accessor: Accessor): React.ReactNode => {
71
+ if (accessor instanceof DataProductAccessor) {
72
+ return <PURE_DataProductIcon />;
73
+ } else if (accessor instanceof IngestionAccessor) {
74
+ return <PURE_IngestIcon />;
75
+ } else if (accessor instanceof RelationalStoreAccessor) {
76
+ return <PURE_DatabaseIcon />;
77
+ }
78
+ return <PURE_UnknownElementTypeIcon />;
79
+ };
80
+
81
+ const getAccessorPath = (accessor: Accessor): string =>
82
+ [accessor.accessorOwner, accessor.schema, accessor.accessor]
83
+ .filter(isNonNullable)
84
+ .join('.');
85
+
86
+ const getColumnTypeLabel = (column: RelationColumn): string => {
87
+ const typeName = column.genericType.value.rawType.name;
88
+ const typeVariableValues = column.genericType.value.typeVariableValues;
89
+ if (typeVariableValues && typeVariableValues.length > 0) {
90
+ const args = typeVariableValues
91
+ .map((v) => (v instanceof InstanceValue ? v.values[0] : undefined))
92
+ .filter(isNonNullable);
93
+ if (args.length > 0) {
94
+ return `${typeName}(${args.join(', ')})`;
95
+ }
96
+ }
97
+ return typeName;
98
+ };
99
+
100
+ const buildRelationTreeData = (
101
+ accessor: Accessor,
102
+ ): TreeData<QueryBuilderExplorerTreeNodeData> => {
103
+ const rootIds: string[] = [];
104
+ const nodes = new Map<string, QueryBuilderExplorerTreeNodeData>();
105
+
106
+ const columnIds: string[] = [];
107
+ accessor.relationType.columns.forEach((column) => {
108
+ const type = column.genericType.value.rawType;
109
+ const node = new QueryBuilderExplorerTreeRelationColumnNodeData(
110
+ column.name,
111
+ column.name,
112
+ column.name,
113
+ column,
114
+ type,
115
+ { mapped: true },
116
+ );
117
+ columnIds.push(node.id);
118
+ nodes.set(node.id, node);
119
+ });
120
+
121
+ const rootNode = new QueryBuilderExplorerTreeRelationRootNodeData(
122
+ RELATION_ROOT_NODE_ID,
123
+ accessor.accessor,
124
+ accessor.accessor,
125
+ false,
126
+ accessor.relationType,
127
+ { mapped: true },
128
+ columnIds,
129
+ );
130
+ rootNode.setIsOpen(true);
131
+ rootIds.push(rootNode.id);
132
+ nodes.set(rootNode.id, rootNode);
133
+
134
+ return { rootIds, nodes };
135
+ };
136
+
137
+ const QueryBuilderRelationExplorerContextMenu = observer(
138
+ forwardRef<
139
+ HTMLDivElement,
140
+ {
141
+ queryBuilderState: QueryBuilderState;
142
+ node: QueryBuilderExplorerTreeNodeData;
143
+ accessor: Accessor;
144
+ }
145
+ >(function QueryBuilderRelationExplorerContextMenu(props, ref) {
146
+ const { queryBuilderState, node, accessor } = props;
147
+ const tdsState =
148
+ queryBuilderState.fetchStructureState.implementation instanceof
149
+ QueryBuilderTDSState
150
+ ? queryBuilderState.fetchStructureState.implementation
151
+ : undefined;
152
+
153
+ const addColumnToFetchStructure = (): void => {
154
+ if (
155
+ tdsState &&
156
+ node instanceof QueryBuilderExplorerTreeRelationColumnNodeData
157
+ ) {
158
+ tdsState.addColumn(
159
+ new QueryBuilderRelationColumnProjectionColumnState(
160
+ tdsState,
161
+ node.column,
162
+ true,
163
+ ),
164
+ );
165
+ }
166
+ };
167
+
168
+ const addAllColumnsToFetchStructure = (): void => {
169
+ if (tdsState) {
170
+ accessor.relationType.columns.forEach((column) => {
171
+ tdsState.addColumn(
172
+ new QueryBuilderRelationColumnProjectionColumnState(
173
+ tdsState,
174
+ column,
175
+ true,
176
+ ),
177
+ );
178
+ });
179
+ }
180
+ };
181
+
182
+ return (
183
+ <MenuContent ref={ref}>
184
+ {node instanceof QueryBuilderExplorerTreeRelationColumnNodeData && (
185
+ <MenuContentItem onClick={addColumnToFetchStructure}>
186
+ Add Column to Fetch Structure
187
+ </MenuContentItem>
188
+ )}
189
+ {node instanceof QueryBuilderExplorerTreeRelationRootNodeData && (
190
+ <MenuContentItem onClick={addAllColumnsToFetchStructure}>
191
+ Add Columns to Fetch Structure
192
+ </MenuContentItem>
193
+ )}
194
+ </MenuContent>
195
+ );
196
+ }),
197
+ );
198
+
199
+ const QueryBuilderRelationNodeContainer = observer(
200
+ (
201
+ props: TreeNodeContainerProps<
202
+ QueryBuilderExplorerTreeNodeData,
203
+ {
204
+ queryBuilderState: QueryBuilderState;
205
+ accessor: Accessor;
206
+ }
207
+ >,
208
+ ) => {
209
+ const { node, level, stepPaddingInRem, onNodeSelect, innerProps } = props;
210
+ const { queryBuilderState, accessor } = innerProps;
211
+ const isRoot = node instanceof QueryBuilderExplorerTreeRelationRootNodeData;
212
+ const isColumn =
213
+ node instanceof QueryBuilderExplorerTreeRelationColumnNodeData;
214
+ const [isSelectedFromContextMenu, setIsSelectedFromContextMenu] =
215
+ useState(false);
216
+
217
+ const [, dragConnector, dragPreviewConnector] =
218
+ useDrag<QueryBuilderExplorerTreeRelationColumnDragSource>(
219
+ () => ({
220
+ type: QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.RELATION_COLUMN,
221
+ item: () => ({
222
+ node: node as QueryBuilderExplorerTreeRelationColumnNodeData,
223
+ }),
224
+ }),
225
+ [node],
226
+ );
227
+ const ref = useRef<HTMLDivElement>(null);
228
+ if (isColumn) {
229
+ dragConnector(ref);
230
+ }
231
+ useDragPreviewLayer(dragPreviewConnector);
232
+
233
+ const explorerState = queryBuilderState.explorerState;
234
+ const columnLabel =
235
+ isColumn && explorerState.humanizePropertyName
236
+ ? prettyCONSTName(node.label)
237
+ : node.label;
238
+
239
+ const selectNode = (): void => onNodeSelect?.(node);
240
+ const onContextMenuOpen = (): void => setIsSelectedFromContextMenu(true);
241
+ const onContextMenuClose = (): void => setIsSelectedFromContextMenu(false);
242
+
243
+ if (isRoot) {
244
+ const isExpanded = node.isOpen === true;
245
+ const nodeExpandIcon = isExpanded ? (
246
+ <ChevronDownIcon />
247
+ ) : (
248
+ <ChevronRightIcon />
249
+ );
250
+
251
+ return (
252
+ <ContextMenu
253
+ content={
254
+ <QueryBuilderRelationExplorerContextMenu
255
+ queryBuilderState={queryBuilderState}
256
+ node={node}
257
+ accessor={accessor}
258
+ />
259
+ }
260
+ menuProps={{ elevation: 7 }}
261
+ onOpen={onContextMenuOpen}
262
+ onClose={onContextMenuClose}
263
+ >
264
+ <div
265
+ className={clsx(
266
+ 'tree-view__node__container query-builder-explorer-tree__node__container',
267
+ {
268
+ 'query-builder-explorer-tree__node__container--selected-from-context-menu':
269
+ isSelectedFromContextMenu,
270
+ 'query-builder-explorer-tree__node__container--highlighted':
271
+ explorerState.highlightUsedProperties &&
272
+ isExplorerTreeNodeAlreadyUsed(node, queryBuilderState),
273
+ },
274
+ )}
275
+ onClick={selectNode}
276
+ style={{
277
+ paddingLeft: `${(level - 1) * (stepPaddingInRem ?? 1) + 0.5}rem`,
278
+ display: 'flex',
279
+ }}
280
+ >
281
+ <div className="tree-view__node__icon query-builder-explorer-tree__node__icon">
282
+ <div className="query-builder-explorer-tree__expand-icon">
283
+ {nodeExpandIcon}
284
+ </div>
285
+ <div className="query-builder-explorer-tree__type-icon">
286
+ {getAccessorIcon(accessor)}
287
+ </div>
288
+ </div>
289
+ <div className="tree-view__node__label query-builder-explorer-tree__node__label query-builder-explorer-tree__node__label--with-action">
290
+ {node.label}
291
+ </div>
292
+ <div className="query-builder-explorer-tree__node__actions">
293
+ <Tooltip
294
+ arrow={true}
295
+ classes={{
296
+ tooltip: 'query-builder__tooltip',
297
+ arrow: 'query-builder__tooltip__arrow',
298
+ tooltipPlacementRight: 'query-builder__tooltip--right',
299
+ }}
300
+ slotProps={{
301
+ transition: { timeout: 0 },
302
+ }}
303
+ title={
304
+ <div className="query-builder__tooltip__content">
305
+ <div className="query-builder__tooltip__item">
306
+ <div className="query-builder__tooltip__item__label">
307
+ Type
308
+ </div>
309
+ <div className="query-builder__tooltip__item__value">
310
+ {accessor.accessorOwnerLabel}
311
+ </div>
312
+ </div>
313
+ <div className="query-builder__tooltip__item">
314
+ <div className="query-builder__tooltip__item__label">
315
+ Path
316
+ </div>
317
+ <div className="query-builder__tooltip__item__value">
318
+ {getAccessorPath(accessor)}
319
+ </div>
320
+ </div>
321
+ </div>
322
+ }
323
+ >
324
+ <div
325
+ className="query-builder-explorer-tree__node__action query-builder-explorer-tree__node__info"
326
+ data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_TOOLTIP_ICON}
327
+ >
328
+ <InfoCircleIcon />
329
+ </div>
330
+ </Tooltip>
331
+ </div>
332
+ </div>
333
+ </ContextMenu>
334
+ );
335
+ }
336
+
337
+ // Column node
338
+ const columnNode = isColumn ? node : undefined;
339
+ const nodeTypeIcon = isColumn
340
+ ? renderPropertyTypeIcon(node.type)
341
+ : undefined;
342
+ const columnTypeLabel = columnNode
343
+ ? getColumnTypeLabel(columnNode.column)
344
+ : node.type.path;
345
+
346
+ return (
347
+ <ContextMenu
348
+ content={
349
+ <QueryBuilderRelationExplorerContextMenu
350
+ queryBuilderState={queryBuilderState}
351
+ node={node}
352
+ accessor={accessor}
353
+ />
354
+ }
355
+ menuProps={{ elevation: 7 }}
356
+ onOpen={onContextMenuOpen}
357
+ onClose={onContextMenuClose}
358
+ >
359
+ <div
360
+ className={clsx(
361
+ 'tree-view__node__container query-builder-explorer-tree__node__container',
362
+ {
363
+ 'query-builder-explorer-tree__node__container--selected-from-context-menu':
364
+ isSelectedFromContextMenu,
365
+ 'query-builder-explorer-tree__node__container--highlighted':
366
+ explorerState.highlightUsedProperties &&
367
+ isExplorerTreeNodeAlreadyUsed(node, queryBuilderState),
368
+ },
369
+ )}
370
+ onClick={selectNode}
371
+ ref={ref}
372
+ style={{
373
+ paddingLeft: `${(level - 1) * (stepPaddingInRem ?? 1) + 0.5}rem`,
374
+ display: 'flex',
375
+ }}
376
+ >
377
+ <div className="tree-view__node__icon query-builder-explorer-tree__node__icon">
378
+ <div className="query-builder-explorer-tree__expand-icon">
379
+ <div />
380
+ </div>
381
+ <div className="query-builder-explorer-tree__type-icon">
382
+ {nodeTypeIcon}
383
+ </div>
384
+ </div>
385
+ <div className="tree-view__node__label query-builder-explorer-tree__node__label query-builder-explorer-tree__node__label--with-action">
386
+ {columnLabel}
387
+ </div>
388
+ <div className="query-builder-explorer-tree__node__actions">
389
+ <QueryBuilderBaseInfoTooltip
390
+ title={columnLabel}
391
+ data={[
392
+ {
393
+ label: 'Type',
394
+ value: columnTypeLabel,
395
+ },
396
+ {
397
+ label: 'Column',
398
+ value: node.label,
399
+ },
400
+ ]}
401
+ >
402
+ <div
403
+ className="query-builder-explorer-tree__node__action query-builder-explorer-tree__node__info"
404
+ data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_TOOLTIP_ICON}
405
+ >
406
+ <InfoCircleIcon />
407
+ </div>
408
+ </QueryBuilderBaseInfoTooltip>
409
+ </div>
410
+ </div>
411
+ </ContextMenu>
412
+ );
413
+ },
414
+ );
415
+
416
+ const QueryBuilderRelationTreeNodeView = observer(
417
+ (
418
+ props: TreeNodeViewProps<
419
+ QueryBuilderExplorerTreeNodeData,
420
+ {
421
+ queryBuilderState: QueryBuilderState;
422
+ accessor: Accessor;
423
+ }
424
+ >,
425
+ ) => {
426
+ const {
427
+ node,
428
+ level,
429
+ onNodeSelect,
430
+ getChildNodes,
431
+ stepPaddingInRem,
432
+ innerProps,
433
+ components,
434
+ } = props;
435
+
436
+ return (
437
+ <div className="tree-view__node__block">
438
+ <QueryBuilderRelationNodeContainer
439
+ node={node}
440
+ level={level + 1}
441
+ stepPaddingInRem={stepPaddingInRem}
442
+ onNodeSelect={onNodeSelect}
443
+ innerProps={innerProps}
444
+ />
445
+ {node.isOpen &&
446
+ getChildNodes(node).map((childNode) => (
447
+ <QueryBuilderRelationTreeNodeView
448
+ key={childNode.id}
449
+ node={childNode}
450
+ level={level + 1}
451
+ components={components}
452
+ onNodeSelect={onNodeSelect}
453
+ getChildNodes={getChildNodes}
454
+ innerProps={innerProps}
455
+ />
456
+ ))}
457
+ </div>
458
+ );
459
+ },
460
+ );
461
+
462
+ const QueryBuilderRelationExplorerTree = observer(
463
+ (props: { queryBuilderState: QueryBuilderState; accessor: Accessor }) => {
464
+ const { queryBuilderState, accessor } = props;
465
+ // NOTE: we must memoize tree data so node state (e.g. isOpen) persists across re-renders
466
+ const treeData = useMemo(() => buildRelationTreeData(accessor), [accessor]);
467
+ const onNodeSelect = (node: QueryBuilderExplorerTreeNodeData): void => {
468
+ if (node instanceof QueryBuilderExplorerTreeRelationRootNodeData) {
469
+ node.setIsOpen(!node.isOpen);
470
+ }
471
+ };
472
+ const getChildNodes = (
473
+ node: QueryBuilderExplorerTreeNodeData,
474
+ ): QueryBuilderExplorerTreeNodeData[] => {
475
+ if (node instanceof QueryBuilderExplorerTreeRelationRootNodeData) {
476
+ return node.childrenIds
477
+ .map((id) => treeData.nodes.get(id))
478
+ .filter(isNonNullable);
479
+ }
480
+ return [];
481
+ };
482
+
483
+ return (
484
+ <TreeView
485
+ components={{
486
+ TreeNodeContainer: QueryBuilderRelationNodeContainer,
487
+ TreeNodeView: QueryBuilderRelationTreeNodeView,
488
+ }}
489
+ className="query-builder-explorer-tree__root"
490
+ treeData={treeData}
491
+ onNodeSelect={onNodeSelect}
492
+ getChildNodes={getChildNodes}
493
+ innerProps={{
494
+ queryBuilderState,
495
+ accessor,
496
+ }}
497
+ />
498
+ );
499
+ },
500
+ );
501
+
502
+ export const QueryBuilderRelationExplorerPanel = observer(
503
+ (props: { queryBuilderState: QueryBuilderState; accessor: Accessor }) => {
504
+ const { queryBuilderState, accessor } = props;
505
+
506
+ return (
507
+ <div
508
+ data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_EXPLORER}
509
+ className="panel query-builder__explorer"
510
+ >
511
+ <PanelHeader title="columns" />
512
+ <div className="panel__content query-builder-explorer-tree__content">
513
+ <DragPreviewLayer
514
+ labelGetter={(
515
+ item: QueryBuilderExplorerTreeRelationColumnDragSource,
516
+ ): string => {
517
+ const dragNode = item.node;
518
+ return queryBuilderState.explorerState.humanizePropertyName
519
+ ? prettyCONSTName(dragNode.label)
520
+ : dragNode.label;
521
+ }}
522
+ types={[QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.RELATION_COLUMN]}
523
+ />
524
+ {accessor.relationType.columns.length === 0 ? (
525
+ <BlankPanelContent>No columns</BlankPanelContent>
526
+ ) : (
527
+ <QueryBuilderRelationExplorerTree
528
+ queryBuilderState={queryBuilderState}
529
+ accessor={accessor}
530
+ />
531
+ )}
532
+ </div>
533
+ </div>
534
+ );
535
+ },
536
+ );
@@ -106,6 +106,7 @@ import {
106
106
  QUERY_BUILDER_WINDOW_COLUMN_DND_TYPE,
107
107
  } from '../../stores/fetch-structure/tds/window/QueryBuilderWindowState.js';
108
108
  import type { QueryBuilderTDSColumnState } from '../../stores/fetch-structure/tds/QueryBuilderTDSColumnState.js';
109
+
109
110
  import { QueryBuilderTelemetryHelper } from '../../__lib__/QueryBuilderTelemetryHelper.js';
110
111
  import { QueryBuilderPanelIssueCountBadge } from '../shared/QueryBuilderPanelIssueCountBadge.js';
111
112
  import {
@@ -481,10 +481,10 @@ export const QueryResultModifierModal = observer(
481
481
  let newParamStates: LambdaParameterState[] = [];
482
482
  if (
483
483
  (!businessDate || !processingDate) &&
484
- milestoningState.queryBuilderState.class
484
+ milestoningState.queryBuilderState.sourceClass
485
485
  ) {
486
486
  const stereotype = getMilestoneTemporalStereotype(
487
- milestoningState.queryBuilderState.class,
487
+ milestoningState.queryBuilderState.sourceClass,
488
488
  milestoningState.queryBuilderState.graphManagerState.graph,
489
489
  );
490
490
  if (stereotype) {
@@ -736,7 +736,7 @@ export const QueryResultModifierModal = observer(
736
736
  milestoningState.processingDate,
737
737
  milestoningState.startDate,
738
738
  milestoningState.endDate,
739
- milestoningState.queryBuilderState.class,
739
+ milestoningState.queryBuilderState.sourceElement,
740
740
  ]);
741
741
 
742
742
  return (
@@ -48,6 +48,7 @@ import {
48
48
  type QueryBuilderExplorerTreeDragSource,
49
49
  buildPropertyExpressionFromExplorerTreeNodeData,
50
50
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE,
51
+ type QueryBuilderExplorerTreeRelationColumnNodeData,
51
52
  } from '../../stores/explorer/QueryBuilderExplorerState.js';
52
53
  import {
53
54
  type DropTargetMonitor,
@@ -60,6 +61,7 @@ import {
60
61
  type QueryBuilderProjectionColumnState,
61
62
  QueryBuilderDerivationProjectionColumnState,
62
63
  QueryBuilderSimpleProjectionColumnState,
64
+ QueryBuilderRelationColumnProjectionColumnState,
63
65
  QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
64
66
  } from '../../stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js';
65
67
  import {
@@ -133,6 +135,7 @@ import { WavgParamDNDZone } from './QueryBuilderAggParam.js';
133
135
  const CAN_DROP_MAIN_GROUP_DND_TYPES = [
134
136
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
135
137
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
138
+ QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.RELATION_COLUMN,
136
139
  QUERY_BUILDER_FILTER_DND_TYPE.CONDITION,
137
140
  QUERY_BUILDER_FUNCTION_DND_TYPE,
138
141
  ];
@@ -172,13 +175,22 @@ const QueryBuilderProjectionColumnContextMenu = observer(
172
175
  projectionColumnState.tdsState.transformSimpleProjectionToDerivation(
173
176
  projectionColumnState,
174
177
  );
178
+ } else if (
179
+ projectionColumnState instanceof
180
+ QueryBuilderRelationColumnProjectionColumnState
181
+ ) {
182
+ projectionColumnState.tdsState.transformRelationColumnProjectionToDerivation(
183
+ projectionColumnState,
184
+ );
175
185
  }
176
186
  };
177
187
 
178
188
  return (
179
189
  <MenuContent ref={ref}>
180
- {projectionColumnState instanceof
181
- QueryBuilderSimpleProjectionColumnState && (
190
+ {(projectionColumnState instanceof
191
+ QueryBuilderSimpleProjectionColumnState ||
192
+ projectionColumnState instanceof
193
+ QueryBuilderRelationColumnProjectionColumnState) && (
182
194
  <MenuContentItem onClick={convertToDerivation}>
183
195
  Convert To Derivation
184
196
  </MenuContentItem>
@@ -430,7 +442,7 @@ const QueryBuilderProjectionColumnEditor = observer(
430
442
 
431
443
  // calendar
432
444
  const aggregateCalendarFunctionDateColumns =
433
- tdsState.queryBuilderState.class?.properties.filter((p) => {
445
+ tdsState.queryBuilderState.sourceClass?.properties.filter((p) => {
434
446
  const _type = p.genericType.value.rawType.name;
435
447
  if (
436
448
  _type === PRIMITIVE_TYPE.DATE ||
@@ -804,7 +816,9 @@ const QueryBuilderProjectionColumnEditor = observer(
804
816
  disabled={
805
817
  !(
806
818
  projectionColumnState instanceof
807
- QueryBuilderSimpleProjectionColumnState
819
+ QueryBuilderSimpleProjectionColumnState ||
820
+ projectionColumnState instanceof
821
+ QueryBuilderRelationColumnProjectionColumnState
808
822
  )
809
823
  }
810
824
  className={clsx('query-builder__projection__column__context-menu', {
@@ -896,6 +910,35 @@ const QueryBuilderProjectionColumnEditor = observer(
896
910
  </div>
897
911
  </>
898
912
  )}
913
+ {projectionColumnState instanceof
914
+ QueryBuilderRelationColumnProjectionColumnState && (
915
+ <>
916
+ <QueryBuilderDerivationInfoTooltip
917
+ title={projectionColumnState.columnName}
918
+ type={projectionColumnState.getColumnType()}
919
+ placement="bottom-start"
920
+ >
921
+ <div className="query-builder-property-expression-badge__property__info">
922
+ <InfoCircleIcon />
923
+ </div>
924
+ </QueryBuilderDerivationInfoTooltip>
925
+ <div className="query-builder__projection__column__value">
926
+ <QueryBuilderEditablePropertyName
927
+ columnName={projectionColumnState.columnName}
928
+ setColumnName={setColumnName}
929
+ error={
930
+ isDuplicatedColumnName
931
+ ? 'Duplicated column'
932
+ : projectionColumnState.columnName.length === 0
933
+ ? 'Empty column name'
934
+ : undefined
935
+ }
936
+ title={projectionColumnState.columnName}
937
+ defaultColumnName="(column)"
938
+ />
939
+ </div>
940
+ </>
941
+ )}
899
942
  <div className="query-builder__projection__column__aggregate">
900
943
  <div className="query-builder__projection__column__aggregate__operator">
901
944
  {aggregateColumnState && (
@@ -1309,6 +1352,21 @@ export const QueryBuilderTDSPanel = observer(
1309
1352
  ),
1310
1353
  );
1311
1354
  break;
1355
+ case QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.RELATION_COLUMN: {
1356
+ const dragNode = (
1357
+ item as unknown as {
1358
+ node: QueryBuilderExplorerTreeRelationColumnNodeData;
1359
+ }
1360
+ ).node;
1361
+ tdsState.addColumn(
1362
+ new QueryBuilderRelationColumnProjectionColumnState(
1363
+ tdsState,
1364
+ dragNode.column,
1365
+ true,
1366
+ ),
1367
+ );
1368
+ break;
1369
+ }
1312
1370
  case QUERY_BUILDER_FILTER_DND_TYPE.CONDITION:
1313
1371
  if (item.node instanceof QueryBuilderFilterTreeConditionNodeData) {
1314
1372
  const propertyExpression = isExistsNodeChild(item.node)