@finos/legend-query-builder 4.14.96 → 4.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (134) 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/data-cube/QueryBuilderDataCube.d.ts +22 -0
  5. package/lib/components/data-cube/QueryBuilderDataCube.d.ts.map +1 -0
  6. package/lib/components/data-cube/QueryBuilderDataCube.js +48 -0
  7. package/lib/components/data-cube/QueryBuilderDataCube.js.map +1 -0
  8. package/lib/components/filter/QueryBuilderFilterPanel.js +2 -2
  9. package/lib/components/filter/QueryBuilderFilterPanel.js.map +1 -1
  10. package/lib/components/result/QueryBuilderResultPanel.d.ts.map +1 -1
  11. package/lib/components/result/QueryBuilderResultPanel.js +6 -3
  12. package/lib/components/result/QueryBuilderResultPanel.js.map +1 -1
  13. package/lib/components/result/tds/QueryBuilderTDSGridResult.d.ts.map +1 -1
  14. package/lib/components/result/tds/QueryBuilderTDSGridResult.js +2 -3
  15. package/lib/components/result/tds/QueryBuilderTDSGridResult.js.map +1 -1
  16. package/lib/components/result/tds/QueryBuilderTDSResultShared.d.ts +2 -2
  17. package/lib/components/result/tds/QueryBuilderTDSResultShared.d.ts.map +1 -1
  18. package/lib/components/result/tds/QueryBuilderTDSResultShared.js +19 -155
  19. package/lib/components/result/tds/QueryBuilderTDSResultShared.js.map +1 -1
  20. package/lib/graph-manager/QueryBuilderConfig.d.ts +5 -1
  21. package/lib/graph-manager/QueryBuilderConfig.d.ts.map +1 -1
  22. package/lib/graph-manager/QueryBuilderConfig.js +6 -1
  23. package/lib/graph-manager/QueryBuilderConfig.js.map +1 -1
  24. package/lib/index.css +1 -1
  25. package/lib/index.d.ts +2 -0
  26. package/lib/index.d.ts.map +1 -1
  27. package/lib/index.js +2 -0
  28. package/lib/index.js.map +1 -1
  29. package/lib/package.json +2 -1
  30. package/lib/stores/QueryBuilderState.d.ts +2 -0
  31. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  32. package/lib/stores/QueryBuilderState.js +9 -19
  33. package/lib/stores/QueryBuilderState.js.map +1 -1
  34. package/lib/stores/data-cube/QueryBuilderDataCubeApplicationEngine.d.ts +38 -0
  35. package/lib/stores/data-cube/QueryBuilderDataCubeApplicationEngine.d.ts.map +1 -0
  36. package/lib/stores/data-cube/QueryBuilderDataCubeApplicationEngine.js +71 -0
  37. package/lib/stores/data-cube/QueryBuilderDataCubeApplicationEngine.js.map +1 -0
  38. package/lib/stores/data-cube/QueryBuilderDataCubeEngine.d.ts +52 -0
  39. package/lib/stores/data-cube/QueryBuilderDataCubeEngine.d.ts.map +1 -0
  40. package/lib/stores/data-cube/QueryBuilderDataCubeEngine.js +149 -0
  41. package/lib/stores/data-cube/QueryBuilderDataCubeEngine.js.map +1 -0
  42. package/lib/stores/data-cube/QueryBuilderDataCubeEngineHelper.d.ts +19 -0
  43. package/lib/stores/data-cube/QueryBuilderDataCubeEngineHelper.d.ts.map +1 -0
  44. package/lib/stores/data-cube/QueryBuilderDataCubeEngineHelper.js +31 -0
  45. package/lib/stores/data-cube/QueryBuilderDataCubeEngineHelper.js.map +1 -0
  46. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts +1 -0
  47. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts.map +1 -1
  48. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.js.map +1 -1
  49. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts +1 -0
  50. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
  51. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js +3 -0
  52. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js.map +1 -1
  53. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts +1 -0
  54. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts.map +1 -1
  55. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js +3 -0
  56. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js.map +1 -1
  57. package/lib/stores/filter/QueryBuilderFilterOperator.d.ts +1 -1
  58. package/lib/stores/filter/QueryBuilderFilterOperator.d.ts.map +1 -1
  59. package/lib/stores/filter/QueryBuilderFilterState.d.ts +1 -1
  60. package/lib/stores/filter/QueryBuilderFilterState.d.ts.map +1 -1
  61. package/lib/stores/filter/QueryBuilderFilterState.js +3 -8
  62. package/lib/stores/filter/QueryBuilderFilterState.js.map +1 -1
  63. package/lib/stores/filter/QueryBuilderFilterStateBuilder.js +1 -1
  64. package/lib/stores/filter/QueryBuilderFilterStateBuilder.js.map +1 -1
  65. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Contain.d.ts +2 -2
  66. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Contain.d.ts.map +1 -1
  67. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Contain.js +3 -3
  68. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Contain.js.map +1 -1
  69. package/lib/stores/filter/operators/QueryBuilderFilterOperator_EndWith.d.ts +2 -2
  70. package/lib/stores/filter/operators/QueryBuilderFilterOperator_EndWith.d.ts.map +1 -1
  71. package/lib/stores/filter/operators/QueryBuilderFilterOperator_EndWith.js +3 -3
  72. package/lib/stores/filter/operators/QueryBuilderFilterOperator_EndWith.js.map +1 -1
  73. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Equal.d.ts +2 -2
  74. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Equal.d.ts.map +1 -1
  75. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Equal.js +2 -2
  76. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Equal.js.map +1 -1
  77. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThan.d.ts +1 -1
  78. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThan.d.ts.map +1 -1
  79. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThan.js +2 -2
  80. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThan.js.map +1 -1
  81. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThanEqual.d.ts +1 -1
  82. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThanEqual.d.ts.map +1 -1
  83. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThanEqual.js +2 -2
  84. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThanEqual.js.map +1 -1
  85. package/lib/stores/filter/operators/QueryBuilderFilterOperator_In.d.ts +2 -2
  86. package/lib/stores/filter/operators/QueryBuilderFilterOperator_In.d.ts.map +1 -1
  87. package/lib/stores/filter/operators/QueryBuilderFilterOperator_In.js +2 -2
  88. package/lib/stores/filter/operators/QueryBuilderFilterOperator_In.js.map +1 -1
  89. package/lib/stores/filter/operators/QueryBuilderFilterOperator_IsEmpty.d.ts +2 -2
  90. package/lib/stores/filter/operators/QueryBuilderFilterOperator_IsEmpty.d.ts.map +1 -1
  91. package/lib/stores/filter/operators/QueryBuilderFilterOperator_IsEmpty.js +2 -2
  92. package/lib/stores/filter/operators/QueryBuilderFilterOperator_IsEmpty.js.map +1 -1
  93. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThan.d.ts +1 -1
  94. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThan.d.ts.map +1 -1
  95. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThan.js +2 -2
  96. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThan.js.map +1 -1
  97. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThanEqual.d.ts +1 -1
  98. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThanEqual.d.ts.map +1 -1
  99. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThanEqual.js +2 -2
  100. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThanEqual.js.map +1 -1
  101. package/lib/stores/filter/operators/QueryBuilderFilterOperator_StartWith.d.ts +2 -2
  102. package/lib/stores/filter/operators/QueryBuilderFilterOperator_StartWith.d.ts.map +1 -1
  103. package/lib/stores/filter/operators/QueryBuilderFilterOperator_StartWith.js +3 -3
  104. package/lib/stores/filter/operators/QueryBuilderFilterOperator_StartWith.js.map +1 -1
  105. package/package.json +7 -6
  106. package/src/components/QueryBuilder.tsx +4 -0
  107. package/src/components/data-cube/QueryBuilderDataCube.tsx +116 -0
  108. package/src/components/filter/QueryBuilderFilterPanel.tsx +2 -2
  109. package/src/components/result/QueryBuilderResultPanel.tsx +24 -0
  110. package/src/components/result/tds/QueryBuilderTDSGridResult.tsx +2 -3
  111. package/src/components/result/tds/QueryBuilderTDSResultShared.tsx +26 -332
  112. package/src/graph-manager/QueryBuilderConfig.ts +7 -1
  113. package/src/index.ts +2 -0
  114. package/src/stores/QueryBuilderState.ts +13 -27
  115. package/src/stores/data-cube/QueryBuilderDataCubeApplicationEngine.ts +109 -0
  116. package/src/stores/data-cube/QueryBuilderDataCubeEngine.ts +255 -0
  117. package/src/stores/data-cube/QueryBuilderDataCubeEngineHelper.ts +41 -0
  118. package/src/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.ts +1 -0
  119. package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.ts +4 -0
  120. package/src/stores/fetch-structure/tds/QueryBuilderTDSState.ts +4 -0
  121. package/src/stores/filter/QueryBuilderFilterOperator.ts +1 -1
  122. package/src/stores/filter/QueryBuilderFilterState.ts +5 -10
  123. package/src/stores/filter/QueryBuilderFilterStateBuilder.ts +1 -1
  124. package/src/stores/filter/operators/QueryBuilderFilterOperator_Contain.ts +5 -3
  125. package/src/stores/filter/operators/QueryBuilderFilterOperator_EndWith.ts +5 -3
  126. package/src/stores/filter/operators/QueryBuilderFilterOperator_Equal.ts +2 -2
  127. package/src/stores/filter/operators/QueryBuilderFilterOperator_GreaterThan.ts +4 -2
  128. package/src/stores/filter/operators/QueryBuilderFilterOperator_GreaterThanEqual.ts +4 -2
  129. package/src/stores/filter/operators/QueryBuilderFilterOperator_In.ts +2 -2
  130. package/src/stores/filter/operators/QueryBuilderFilterOperator_IsEmpty.ts +2 -2
  131. package/src/stores/filter/operators/QueryBuilderFilterOperator_LessThan.ts +4 -2
  132. package/src/stores/filter/operators/QueryBuilderFilterOperator_LessThanEqual.ts +4 -2
  133. package/src/stores/filter/operators/QueryBuilderFilterOperator_StartWith.ts +5 -3
  134. package/tsconfig.json +4 -0
@@ -0,0 +1,116 @@
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 { DataCube, DataCubeProvider } from '@finos/legend-data-cube';
18
+ import type { QueryBuilderState } from '../../stores/QueryBuilderState.js';
19
+ import { observer } from 'mobx-react-lite';
20
+ import { QueryBuilderDataCubeApplicationEngine } from '../../stores/data-cube/QueryBuilderDataCubeApplicationEngine.js';
21
+ import {
22
+ clsx,
23
+ Dialog,
24
+ EmptyWindowRestoreIcon,
25
+ Modal,
26
+ TimesIcon,
27
+ WindowMaximizeIcon,
28
+ } from '@finos/legend-art';
29
+ import { useState } from 'react';
30
+ import { RuntimePointer } from '@finos/legend-graph';
31
+ import { QueryBuilderDataCubeEngine } from '../../stores/data-cube/QueryBuilderDataCubeEngine.js';
32
+
33
+ const QueryBuilderDataCube = observer(
34
+ (props: { queryBuilderState: QueryBuilderState }) => {
35
+ const { queryBuilderState } = props;
36
+ const applicationStore = new QueryBuilderDataCubeApplicationEngine(
37
+ queryBuilderState.applicationStore,
38
+ );
39
+ const runtime =
40
+ queryBuilderState.executionContextState.runtimeValue instanceof
41
+ RuntimePointer
42
+ ? queryBuilderState.executionContextState.runtimeValue
43
+ .packageableRuntime.value.path
44
+ : undefined;
45
+ if (!runtime) {
46
+ // TODO: add better message
47
+ return null;
48
+ }
49
+ const queryBuilderEngine = new QueryBuilderDataCubeEngine(
50
+ queryBuilderState.buildQuery(),
51
+ queryBuilderState.executionContextState.mapping?.path,
52
+ runtime,
53
+ queryBuilderState.graphManagerState,
54
+ );
55
+
56
+ return (
57
+ <DataCubeProvider
58
+ application={applicationStore}
59
+ engine={queryBuilderEngine}
60
+ >
61
+ <DataCube />
62
+ </DataCubeProvider>
63
+ );
64
+ },
65
+ );
66
+
67
+ export const QueryBuilderDataCubeDialog = observer(
68
+ (props: { queryBuilderState: QueryBuilderState }) => {
69
+ const { queryBuilderState } = props;
70
+ const [isMaximized, setIsMaximized] = useState(false);
71
+ const toggleMaximize = (): void => setIsMaximized(!isMaximized);
72
+ const closeModal = () => queryBuilderState.setIsCubeEnabled(false);
73
+ return (
74
+ <Dialog
75
+ open={true}
76
+ onClose={closeModal}
77
+ classes={{ container: 'dataspace-info-modal__container' }}
78
+ >
79
+ <Modal
80
+ darkMode={false}
81
+ className={clsx('editor-modal query-builder__dialog', {
82
+ 'query-builder__dialog--expanded': isMaximized,
83
+ })}
84
+ >
85
+ <div className="query-builder__dialog__header">
86
+ <div className="query-builder__dialog__header__actions">
87
+ <button
88
+ className="query-builder__dialog__header__action"
89
+ tabIndex={-1}
90
+ onClick={toggleMaximize}
91
+ title={isMaximized ? 'Minimize' : 'Maximize'}
92
+ >
93
+ {isMaximized ? (
94
+ <EmptyWindowRestoreIcon />
95
+ ) : (
96
+ <WindowMaximizeIcon />
97
+ )}
98
+ </button>
99
+ <button
100
+ className="query-builder__dialog__header__action"
101
+ tabIndex={-1}
102
+ onClick={closeModal}
103
+ title="Close"
104
+ >
105
+ <TimesIcon />
106
+ </button>
107
+ </div>
108
+ </div>
109
+ <div className="query-builder__dialog__content">
110
+ <QueryBuilderDataCube queryBuilderState={queryBuilderState} />
111
+ </div>
112
+ </Modal>
113
+ </Dialog>
114
+ );
115
+ },
116
+ );
@@ -1110,7 +1110,7 @@ const QueryBuilderFilterConditionEditor = observer(
1110
1110
  className="query-builder-filter-tree__condition-node__operator__dropdown__option"
1111
1111
  onClick={changeOperator(op)}
1112
1112
  >
1113
- {op.getLabel()}
1113
+ {op.getLabel(node.condition)}
1114
1114
  </MenuContentItem>
1115
1115
  ))}
1116
1116
  </MenuContent>
@@ -1122,7 +1122,7 @@ const QueryBuilderFilterConditionEditor = observer(
1122
1122
  }}
1123
1123
  >
1124
1124
  <div className="query-builder-filter-tree__condition-node__operator__label">
1125
- {node.condition.operator.getLabel()}
1125
+ {node.condition.operator.getLabel(node.condition)}
1126
1126
  </div>
1127
1127
  <div className="query-builder-filter-tree__condition-node__operator__dropdown__trigger">
1128
1128
  <CaretDownIcon />
@@ -46,6 +46,7 @@ import {
46
46
  CubesLoadingIndicator,
47
47
  InfoCircleIcon,
48
48
  ShareBoxIcon,
49
+ CubeIcon,
49
50
  } from '@finos/legend-art';
50
51
  import { observer } from 'mobx-react-lite';
51
52
  import { flowResult } from 'mobx';
@@ -56,6 +57,7 @@ import {
56
57
  TDSExecutionResult,
57
58
  RawExecutionResult,
58
59
  ExecutionError,
60
+ RuntimePointer,
59
61
  } from '@finos/legend-graph';
60
62
  import {
61
63
  ActionAlertActionType,
@@ -837,6 +839,28 @@ export const QueryBuilderResultPanel = observer(
837
839
  </MenuContentItemIcon>
838
840
  <MenuContentItemLabel>Others...</MenuContentItemLabel>
839
841
  </MenuContentItem>
842
+ {queryBuilderState.config?.TEMPORARY__enableExportToCube && (
843
+ <MenuContentItem
844
+ onClick={(): void =>
845
+ queryBuilderState.setIsCubeEnabled(true)
846
+ }
847
+ disabled={
848
+ !queryBuilderState.fetchStructureState.implementation
849
+ .canBeExportedToCube ||
850
+ !(
851
+ queryBuilderState.executionContextState
852
+ .runtimeValue instanceof RuntimePointer
853
+ )
854
+ }
855
+ >
856
+ <MenuContentItemIcon>
857
+ <CubeIcon />
858
+ </MenuContentItemIcon>
859
+ <MenuContentItemLabel>
860
+ Data Cube (BETA)
861
+ </MenuContentItemLabel>
862
+ </MenuContentItem>
863
+ )}
840
864
  {extraExportMenuContentItems}
841
865
  </MenuContent>
842
866
  }
@@ -346,7 +346,7 @@ export const QueryBuilderTDSGridResult = observer(
346
346
  resultState.mousedOverCell,
347
347
  true,
348
348
  fetchStructureImplementation,
349
- ).catch(queryBuilderState.applicationStore.alertUnhandledError);
349
+ );
350
350
  },
351
351
  },
352
352
  {
@@ -357,7 +357,7 @@ export const QueryBuilderTDSGridResult = observer(
357
357
  resultState.mousedOverCell,
358
358
  false,
359
359
  fetchStructureImplementation,
360
- ).catch(queryBuilderState.applicationStore.alertUnhandledError);
360
+ );
361
361
  },
362
362
  },
363
363
  'copy',
@@ -376,7 +376,6 @@ export const QueryBuilderTDSGridResult = observer(
376
376
  applicationStore,
377
377
  resultState.mousedOverCell,
378
378
  resultState.queryBuilderState.fetchStructureState.implementation,
379
- queryBuilderState.applicationStore.alertUnhandledError,
380
379
  ],
381
380
  );
382
381
 
@@ -22,13 +22,12 @@ import {
22
22
  import { observer } from 'mobx-react-lite';
23
23
  import { flowResult } from 'mobx';
24
24
  import {
25
- type AbstractPropertyExpression,
26
- type Enumeration,
27
- type ExecutionResult,
28
25
  type TDSExecutionResult,
29
- EnumValueExplicitReference,
30
- EnumValueInstanceValue,
26
+ type Enumeration,
31
27
  InstanceValue,
28
+ EnumValueInstanceValue,
29
+ EnumValueExplicitReference,
30
+ type ExecutionResult,
32
31
  RelationalExecutionActivities,
33
32
  } from '@finos/legend-graph';
34
33
  import { format as formatSQL } from 'sql-formatter';
@@ -48,7 +47,6 @@ import { forwardRef } from 'react';
48
47
  import {
49
48
  QueryBuilderDerivationProjectionColumnState,
50
49
  QueryBuilderProjectionColumnState,
51
- QueryBuilderSimpleProjectionColumnState,
52
50
  } from '../../../stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js';
53
51
  import {
54
52
  type QueryBuilderPostFilterTreeNodeData,
@@ -83,30 +81,6 @@ import {
83
81
  } from '../../../stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.js';
84
82
  import { getTDSColumnState } from '../../../stores/fetch-structure/tds/QueryBuilderTDSHelper.js';
85
83
  import type { QueryBuilderTDSColumnState } from '../../../stores/fetch-structure/tds/QueryBuilderTDSColumnState.js';
86
- import {
87
- type QueryBuilderFilterState,
88
- type QueryBuilderFilterTreeNodeData,
89
- FilterConditionState,
90
- FilterValueSpecConditionValueState,
91
- isCollectionProperty,
92
- QueryBuilderFilterTreeConditionNodeData,
93
- } from '../../../stores/filter/QueryBuilderFilterState.js';
94
- import { QueryBuilderAggregateColumnState } from '../../../stores/fetch-structure/tds/aggregation/QueryBuilderAggregationState.js';
95
- import type { QueryBuilderFilterOperator } from '../../../stores/filter/QueryBuilderFilterOperator.js';
96
- import {
97
- QueryBuilderFilterOperator_Equal,
98
- QueryBuilderFilterOperator_NotEqual,
99
- } from '../../../stores/filter/operators/QueryBuilderFilterOperator_Equal.js';
100
- import {
101
- QueryBuilderFilterOperator_In,
102
- QueryBuilderFilterOperator_NotIn,
103
- } from '../../../stores/filter/operators/QueryBuilderFilterOperator_In.js';
104
- import {
105
- QueryBuilderFilterOperator_IsEmpty,
106
- QueryBuilderFilterOperator_IsNotEmpty,
107
- } from '../../../stores/filter/operators/QueryBuilderFilterOperator_IsEmpty.js';
108
- import type { QueryBuilderState } from '../../../stores/QueryBuilderState.js';
109
- import type { QueryBuilderPropertyExpressionState } from '../../../stores/QueryBuilderPropertyEditorState.js';
110
84
 
111
85
  export const tryToFormatSql = (sql: string): string => {
112
86
  try {
@@ -165,13 +139,6 @@ export type IQueryRendererParamsWithGridType = DataGridCellRendererParams & {
165
139
  tdsExecutionResult: TDSExecutionResult;
166
140
  };
167
141
 
168
- const filterEqualOperator = new QueryBuilderFilterOperator_Equal();
169
- const filterNotEqualOperator = new QueryBuilderFilterOperator_NotEqual();
170
- const filterInOperator = new QueryBuilderFilterOperator_In();
171
- const filterNotInOperator = new QueryBuilderFilterOperator_NotIn();
172
- const filterEmptyOperator = new QueryBuilderFilterOperator_IsEmpty();
173
- const filterNotEmptyOperator = new QueryBuilderFilterOperator_IsNotEmpty();
174
-
175
142
  const postFilterEqualOperator = new QueryBuilderPostFilterOperator_Equal();
176
143
  const postFilterInOperator = new QueryBuilderPostFilterOperator_In();
177
144
  const postFilterEmptyOperator = new QueryBuilderPostFilterOperator_IsEmpty();
@@ -181,22 +148,6 @@ const postFilterNotEqualOperator =
181
148
  new QueryBuilderPostFilterOperator_NotEqual();
182
149
  const postFilterNotInOperator = new QueryBuilderPostFilterOperator_NotIn();
183
150
 
184
- const getExistingFilterNode = (
185
- operators: QueryBuilderFilterOperator[],
186
- propertyExpressionState: QueryBuilderPropertyExpressionState | undefined,
187
- filterState: QueryBuilderFilterState,
188
- ): QueryBuilderFilterTreeNodeData | undefined =>
189
- Array.from(filterState.nodes.values())
190
- .filter(filterByType(QueryBuilderFilterTreeConditionNodeData))
191
- .filter(
192
- (node) =>
193
- node.condition.propertyExpressionState.path ===
194
- propertyExpressionState?.path &&
195
- operators
196
- .map((op) => op.getLabel())
197
- .includes(node.condition.operator.getLabel()),
198
- )[0];
199
-
200
151
  const getExistingPostFilterNode = (
201
152
  operators: QueryBuilderPostFilterOperator[],
202
153
  projectionColumnName: string | undefined,
@@ -222,7 +173,7 @@ const getExistingPostFilterNode = (
222
173
  const updateFilterConditionValue = (
223
174
  conditionValue: InstanceValue,
224
175
  _cellData: QueryBuilderTDSResultCellData,
225
- queryBuilderState: QueryBuilderState,
176
+ tdsState: QueryBuilderTDSState,
226
177
  ): void => {
227
178
  if (_cellData.value) {
228
179
  instanceValue_setValue(
@@ -237,58 +188,11 @@ const updateFilterConditionValue = (
237
188
  )
238
189
  : _cellData.value,
239
190
  0,
240
- queryBuilderState.observerContext,
191
+ tdsState.queryBuilderState.observerContext,
241
192
  );
242
193
  }
243
194
  };
244
195
 
245
- const generateNewFilterConditionNodeData = (
246
- applicationStore: ApplicationStore<
247
- LegendApplicationConfig,
248
- LegendApplicationPluginManager<LegendApplicationPlugin>
249
- >,
250
- operator: QueryBuilderFilterOperator,
251
- _cellData: QueryBuilderTDSResultCellData,
252
- filterState: QueryBuilderFilterState,
253
- propertyExpression: AbstractPropertyExpression | undefined,
254
- ): void => {
255
- let filterConditionState: FilterConditionState;
256
- try {
257
- if (propertyExpression) {
258
- filterConditionState = new FilterConditionState(
259
- filterState,
260
- propertyExpression,
261
- operator,
262
- );
263
-
264
- const defaultFilterConditionValue =
265
- filterConditionState.operator.getDefaultFilterConditionValue(
266
- filterConditionState,
267
- );
268
-
269
- filterConditionState.buildRightConditionValueFromValueSpec(
270
- defaultFilterConditionValue,
271
- );
272
- updateFilterConditionValue(
273
- defaultFilterConditionValue as InstanceValue,
274
- _cellData,
275
- filterState.queryBuilderState,
276
- );
277
- filterState.addNodeFromNode(
278
- new QueryBuilderFilterTreeConditionNodeData(
279
- undefined,
280
- filterConditionState,
281
- ),
282
- undefined,
283
- );
284
- }
285
- } catch (error) {
286
- assertErrorThrown(error);
287
- applicationStore.notificationService.notifyWarning(error.message);
288
- return;
289
- }
290
- };
291
-
292
196
  const generateNewPostFilterConditionNodeData = async (
293
197
  applicationStore: ApplicationStore<
294
198
  LegendApplicationConfig,
@@ -331,7 +235,7 @@ const generateNewPostFilterConditionNodeData = async (
331
235
  updateFilterConditionValue(
332
236
  defaultFilterConditionValue as InstanceValue,
333
237
  _cellData,
334
- tdsState.queryBuilderState,
238
+ tdsState,
335
239
  );
336
240
  tdsState.postFilterState.addNodeFromNode(
337
241
  new QueryBuilderPostFilterTreeConditionNodeData(
@@ -348,91 +252,6 @@ const generateNewPostFilterConditionNodeData = async (
348
252
  }
349
253
  };
350
254
 
351
- const updateExistingFilterConditionNodeData = (
352
- existingPreFilterNode: QueryBuilderFilterTreeNodeData,
353
- isFilterBy: boolean,
354
- _cellData: QueryBuilderTDSResultCellData,
355
- operator: QueryBuilderFilterOperator,
356
- data: QueryBuilderTDSResultCellData | null,
357
- queryBuilderState: QueryBuilderState,
358
- ): void => {
359
- if (operator === filterEmptyOperator || operator === filterNotEmptyOperator) {
360
- const conditionState = (
361
- existingPreFilterNode as QueryBuilderFilterTreeConditionNodeData
362
- ).condition;
363
- if (conditionState.operator.getLabel() !== operator.getLabel()) {
364
- conditionState.changeOperator(
365
- isFilterBy ? filterEmptyOperator : filterNotEmptyOperator,
366
- );
367
- }
368
- return;
369
- }
370
- const conditionState = (
371
- existingPreFilterNode as QueryBuilderFilterTreeConditionNodeData
372
- ).condition;
373
-
374
- const rightSide = conditionState.rightConditionValue;
375
- if (rightSide instanceof FilterValueSpecConditionValueState) {
376
- if (conditionState.operator.getLabel() === operator.getLabel()) {
377
- const doesValueAlreadyExist =
378
- rightSide.value instanceof InstanceValue &&
379
- (rightSide.value instanceof EnumValueInstanceValue
380
- ? rightSide.value.values.map((ef) => ef.value.name)
381
- : rightSide.value.values
382
- ).includes(_cellData.value);
383
-
384
- if (!doesValueAlreadyExist) {
385
- const currentValueSpecificaton = rightSide.value;
386
- const newValueSpecification =
387
- conditionState.operator.getDefaultFilterConditionValue(
388
- conditionState,
389
- );
390
- updateFilterConditionValue(
391
- newValueSpecification as InstanceValue,
392
- _cellData,
393
- queryBuilderState,
394
- );
395
- conditionState.changeOperator(
396
- isFilterBy ? filterInOperator : filterNotInOperator,
397
- );
398
- instanceValue_setValues(
399
- rightSide.value as InstanceValue,
400
- [currentValueSpecificaton, newValueSpecification],
401
- queryBuilderState.observerContext,
402
- );
403
- }
404
- } else {
405
- const doesValueAlreadyExist =
406
- rightSide.value instanceof InstanceValue &&
407
- rightSide.value.values
408
- .filter((v) => v instanceof InstanceValue)
409
- .map((v) =>
410
- v instanceof EnumValueInstanceValue
411
- ? v.values.map((ef) => ef.value.name)
412
- : v.values,
413
- )
414
- .flat()
415
- .includes(_cellData.value ?? data?.value);
416
-
417
- if (!doesValueAlreadyExist) {
418
- const newValueSpecification = (
419
- isFilterBy ? filterEqualOperator : filterNotEqualOperator
420
- ).getDefaultFilterConditionValue(conditionState);
421
- updateFilterConditionValue(
422
- newValueSpecification as InstanceValue,
423
- _cellData,
424
- queryBuilderState,
425
- );
426
- instanceValue_setValues(
427
- rightSide.value as InstanceValue,
428
- [...(rightSide.value as InstanceValue).values, newValueSpecification],
429
- queryBuilderState.observerContext,
430
- );
431
- }
432
- }
433
- }
434
- };
435
-
436
255
  const updateExistingPostFilterConditionNodeData = (
437
256
  existingPostFilterNode: QueryBuilderPostFilterTreeNodeData,
438
257
  isFilterBy: boolean,
@@ -478,7 +297,7 @@ const updateExistingPostFilterConditionNodeData = (
478
297
  updateFilterConditionValue(
479
298
  newValueSpecification as InstanceValue,
480
299
  _cellData,
481
- tdsState.queryBuilderState,
300
+ tdsState,
482
301
  );
483
302
  conditionState.changeOperator(
484
303
  isFilterBy ? postFilterInOperator : postFilterNotInOperator,
@@ -509,7 +328,7 @@ const updateExistingPostFilterConditionNodeData = (
509
328
  updateFilterConditionValue(
510
329
  newValueSpecification as InstanceValue,
511
330
  _cellData,
512
- tdsState.queryBuilderState,
331
+ tdsState,
513
332
  );
514
333
  instanceValue_setValues(
515
334
  rightSide.value as InstanceValue,
@@ -524,25 +343,6 @@ const updateExistingPostFilterConditionNodeData = (
524
343
  const getFilterOperator = (
525
344
  isFilterBy: boolean,
526
345
  _cellData: QueryBuilderTDSResultCellData,
527
- ): QueryBuilderFilterOperator => {
528
- if (isFilterBy) {
529
- if (_cellData.value === null) {
530
- return filterEmptyOperator;
531
- } else {
532
- return filterEqualOperator;
533
- }
534
- } else {
535
- if (_cellData.value === null) {
536
- return filterNotEmptyOperator;
537
- } else {
538
- return filterNotEqualOperator;
539
- }
540
- }
541
- };
542
-
543
- const getPostFilterOperator = (
544
- isFilterBy: boolean,
545
- _cellData: QueryBuilderTDSResultCellData,
546
346
  ): QueryBuilderPostFilterOperator => {
547
347
  if (isFilterBy) {
548
348
  if (_cellData.value === null) {
@@ -559,54 +359,7 @@ const getPostFilterOperator = (
559
359
  }
560
360
  };
561
361
 
562
- const preFilterByOrOutValue = (
563
- applicationStore: ApplicationStore<
564
- LegendApplicationConfig,
565
- LegendApplicationPluginManager<LegendApplicationPlugin>
566
- >,
567
- isFilterBy: boolean,
568
- _cellData: QueryBuilderTDSResultCellData,
569
- data: QueryBuilderTDSResultCellData | null,
570
- propertyExpressionState: QueryBuilderPropertyExpressionState,
571
- queryBuilderState: QueryBuilderState,
572
- ): void => {
573
- queryBuilderState.filterState.setShowPanel(true);
574
- const operator = getFilterOperator(isFilterBy, _cellData);
575
- const existingPreFilterNode = getExistingFilterNode(
576
- _cellData.value === null
577
- ? [filterEmptyOperator, filterNotEmptyOperator]
578
- : isFilterBy
579
- ? [filterEqualOperator, filterInOperator]
580
- : [filterNotEqualOperator, filterNotInOperator],
581
- propertyExpressionState,
582
- queryBuilderState.filterState,
583
- );
584
- if (existingPreFilterNode) {
585
- updateExistingFilterConditionNodeData(
586
- existingPreFilterNode,
587
- isFilterBy,
588
- _cellData,
589
- operator,
590
- data,
591
- queryBuilderState,
592
- );
593
- } else {
594
- try {
595
- generateNewFilterConditionNodeData(
596
- applicationStore,
597
- operator,
598
- _cellData,
599
- queryBuilderState.filterState,
600
- propertyExpressionState.propertyExpression,
601
- );
602
- } catch (error) {
603
- assertErrorThrown(error);
604
- applicationStore.alertUnhandledError(error);
605
- }
606
- }
607
- };
608
-
609
- const postFilterByOrOutValue = async (
362
+ const filterByOrOutValue = (
610
363
  applicationStore: ApplicationStore<
611
364
  LegendApplicationConfig,
612
365
  LegendApplicationPluginManager<LegendApplicationPlugin>
@@ -614,11 +367,13 @@ const postFilterByOrOutValue = async (
614
367
  isFilterBy: boolean,
615
368
  _cellData: QueryBuilderTDSResultCellData,
616
369
  data: QueryBuilderTDSResultCellData | null,
617
- tdsColState: QueryBuilderTDSColumnState,
618
370
  tdsState: QueryBuilderTDSState,
619
- ): Promise<void> => {
371
+ ): void => {
620
372
  tdsState.setShowPostFilterPanel(true);
621
- const operator = getPostFilterOperator(isFilterBy, _cellData);
373
+ const operator = getFilterOperator(isFilterBy, _cellData);
374
+ const tdsColState = data?.columnName
375
+ ? getTDSColumnState(tdsState, data.columnName)
376
+ : undefined;
622
377
  const existingPostFilterNode = getExistingPostFilterNode(
623
378
  _cellData.value === null
624
379
  ? [postFilterEmptyOperator, postFilterNotEmptyOperator]
@@ -639,67 +394,17 @@ const postFilterByOrOutValue = async (
639
394
  tdsState,
640
395
  );
641
396
  } else {
642
- try {
643
- await generateNewPostFilterConditionNodeData(
644
- applicationStore,
645
- operator,
646
- _cellData,
647
- tdsState,
648
- tdsColState,
649
- );
650
- } catch (error) {
651
- assertErrorThrown(error);
652
- applicationStore.alertUnhandledError(error);
653
- }
654
- }
655
- };
656
-
657
- const filterByOrOutValue = async (
658
- applicationStore: ApplicationStore<
659
- LegendApplicationConfig,
660
- LegendApplicationPluginManager<LegendApplicationPlugin>
661
- >,
662
- isFilterBy: boolean,
663
- _cellData: QueryBuilderTDSResultCellData,
664
- data: QueryBuilderTDSResultCellData | null,
665
- tdsState: QueryBuilderTDSState,
666
- ): Promise<void> => {
667
- const tdsColState = data?.columnName
668
- ? getTDSColumnState(tdsState, data.columnName)
669
- : undefined;
670
- if (
671
- tdsColState instanceof QueryBuilderDerivationProjectionColumnState ||
672
- tdsColState instanceof QueryBuilderAggregateColumnState ||
673
- (tdsColState instanceof QueryBuilderSimpleProjectionColumnState &&
674
- isCollectionProperty(
675
- tdsColState.propertyExpressionState.propertyExpression,
676
- ))
677
- ) {
678
- await postFilterByOrOutValue(
397
+ generateNewPostFilterConditionNodeData(
679
398
  applicationStore,
680
- isFilterBy,
399
+ operator,
681
400
  _cellData,
682
- data,
683
- tdsColState,
684
401
  tdsState,
685
- );
686
- } else if (tdsColState instanceof QueryBuilderSimpleProjectionColumnState) {
687
- preFilterByOrOutValue(
688
- applicationStore,
689
- isFilterBy,
690
- _cellData,
691
- data,
692
- tdsColState.propertyExpressionState,
693
- tdsState.queryBuilderState,
694
- );
695
- } else {
696
- applicationStore.notificationService.notifyError(
697
- `Can't filter column '${data?.columnName}'`,
698
- );
402
+ tdsColState,
403
+ ).catch(applicationStore.alertUnhandledError);
699
404
  }
700
405
  };
701
406
 
702
- export const filterByOrOutValues = async (
407
+ export const filterByOrOutValues = (
703
408
  applicationStore: ApplicationStore<
704
409
  LegendApplicationConfig,
705
410
  LegendApplicationPluginManager<LegendApplicationPlugin>
@@ -707,17 +412,10 @@ export const filterByOrOutValues = async (
707
412
  data: QueryBuilderTDSResultCellData | null,
708
413
  isFilterBy: boolean,
709
414
  tdsState: QueryBuilderTDSState,
710
- ): Promise<void> => {
711
- for (const _cellData of tdsState.queryBuilderState.resultState
712
- .selectedCells) {
713
- await filterByOrOutValue(
714
- applicationStore,
715
- isFilterBy,
716
- _cellData,
717
- data,
718
- tdsState,
719
- );
720
- }
415
+ ): void => {
416
+ tdsState.queryBuilderState.resultState.selectedCells.forEach((_cellData) => {
417
+ filterByOrOutValue(applicationStore, isFilterBy, _cellData, data, tdsState);
418
+ });
721
419
  };
722
420
 
723
421
  export const QueryBuilderGridResultContextMenu = observer(
@@ -742,9 +440,7 @@ export const QueryBuilderGridResultContextMenu = observer(
742
440
  <MenuContentItem
743
441
  disabled={!tdsColState}
744
442
  onClick={(): void => {
745
- filterByOrOutValues(applicationStore, data, true, tdsState).catch(
746
- tdsState.queryBuilderState.applicationStore.alertUnhandledError,
747
- );
443
+ filterByOrOutValues(applicationStore, data, true, tdsState);
748
444
  }}
749
445
  >
750
446
  Filter By
@@ -752,9 +448,7 @@ export const QueryBuilderGridResultContextMenu = observer(
752
448
  <MenuContentItem
753
449
  disabled={!tdsColState}
754
450
  onClick={(): void => {
755
- filterByOrOutValues(applicationStore, data, false, tdsState).catch(
756
- tdsState.queryBuilderState.applicationStore.alertUnhandledError,
757
- );
451
+ filterByOrOutValues(applicationStore, data, false, tdsState);
758
452
  }}
759
453
  >
760
454
  Filter Out