@finos/legend-query-builder 4.10.1 → 4.11.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 (109) hide show
  1. package/lib/__lib__/QueryBuilderDocumentation.d.ts +2 -1
  2. package/lib/__lib__/QueryBuilderDocumentation.d.ts.map +1 -1
  3. package/lib/__lib__/QueryBuilderDocumentation.js +1 -0
  4. package/lib/__lib__/QueryBuilderDocumentation.js.map +1 -1
  5. package/lib/__lib__/QueryBuilderEvent.d.ts +2 -1
  6. package/lib/__lib__/QueryBuilderEvent.d.ts.map +1 -1
  7. package/lib/__lib__/QueryBuilderEvent.js +1 -0
  8. package/lib/__lib__/QueryBuilderEvent.js.map +1 -1
  9. package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
  10. package/lib/components/QueryBuilderResultPanel.js +165 -57
  11. package/lib/components/QueryBuilderResultPanel.js.map +1 -1
  12. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.d.ts.map +1 -1
  13. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js +2 -1
  14. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js.map +1 -1
  15. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js +1 -1
  16. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js.map +1 -1
  17. package/lib/graph/QueryBuilderMetaModelConst.d.ts +22 -1
  18. package/lib/graph/QueryBuilderMetaModelConst.d.ts.map +1 -1
  19. package/lib/graph/QueryBuilderMetaModelConst.js +24 -0
  20. package/lib/graph/QueryBuilderMetaModelConst.js.map +1 -1
  21. package/lib/index.css +2 -2
  22. package/lib/index.css.map +1 -1
  23. package/lib/index.d.ts +2 -1
  24. package/lib/index.d.ts.map +1 -1
  25. package/lib/index.js +2 -1
  26. package/lib/index.js.map +1 -1
  27. package/lib/package.json +1 -1
  28. package/lib/stores/QueryBuilderPreviewDataHelper.d.ts.map +1 -1
  29. package/lib/stores/QueryBuilderPreviewDataHelper.js +2 -1
  30. package/lib/stores/QueryBuilderPreviewDataHelper.js.map +1 -1
  31. package/lib/stores/QueryBuilderResultState.d.ts +8 -3
  32. package/lib/stores/QueryBuilderResultState.d.ts.map +1 -1
  33. package/lib/stores/QueryBuilderResultState.js +11 -30
  34. package/lib/stores/QueryBuilderResultState.js.map +1 -1
  35. package/lib/stores/QueryBuilderState.d.ts +2 -0
  36. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  37. package/lib/stores/QueryBuilderState.js +8 -0
  38. package/lib/stores/QueryBuilderState.js.map +1 -1
  39. package/lib/stores/QueryBuilderTypeaheadHelper.d.ts.map +1 -1
  40. package/lib/stores/QueryBuilderTypeaheadHelper.js +1 -1
  41. package/lib/stores/QueryBuilderTypeaheadHelper.js.map +1 -1
  42. package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.d.ts +4 -1
  43. package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.d.ts.map +1 -1
  44. package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.js +37 -3
  45. package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.js.map +1 -1
  46. package/lib/stores/fetch-structure/tds/QueryResultSetModifierState.d.ts +1 -4
  47. package/lib/stores/fetch-structure/tds/QueryResultSetModifierState.d.ts.map +1 -1
  48. package/lib/stores/fetch-structure/tds/QueryResultSetModifierState.js +1 -5
  49. package/lib/stores/fetch-structure/tds/QueryResultSetModifierState.js.map +1 -1
  50. package/lib/stores/fetch-structure/tds/aggregation/QueryBuilderAggregateOperator.d.ts +1 -1
  51. package/lib/stores/fetch-structure/tds/aggregation/QueryBuilderAggregateOperator.d.ts.map +1 -1
  52. package/lib/stores/fetch-structure/tds/aggregation/QueryBuilderAggregateOperator.js +2 -2
  53. package/lib/stores/fetch-structure/tds/aggregation/QueryBuilderAggregateOperator.js.map +1 -1
  54. package/lib/stores/fetch-structure/tds/aggregation/QueryBuilderAggregationState.d.ts +3 -2
  55. package/lib/stores/fetch-structure/tds/aggregation/QueryBuilderAggregationState.d.ts.map +1 -1
  56. package/lib/stores/fetch-structure/tds/aggregation/QueryBuilderAggregationState.js +9 -0
  57. package/lib/stores/fetch-structure/tds/aggregation/QueryBuilderAggregationState.js.map +1 -1
  58. package/lib/stores/fetch-structure/tds/aggregation/operators/QueryBuilderAggregateOperator_DistinctCount.d.ts.map +1 -1
  59. package/lib/stores/fetch-structure/tds/aggregation/operators/QueryBuilderAggregateOperator_DistinctCount.js +2 -4
  60. package/lib/stores/fetch-structure/tds/aggregation/operators/QueryBuilderAggregateOperator_DistinctCount.js.map +1 -1
  61. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterOperator.d.ts +2 -1
  62. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterOperator.d.ts.map +1 -1
  63. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.d.ts +1 -15
  64. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.d.ts.map +1 -1
  65. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js +3 -44
  66. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js.map +1 -1
  67. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterStateBuilder.d.ts.map +1 -1
  68. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterStateBuilder.js +13 -3
  69. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterStateBuilder.js.map +1 -1
  70. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.d.ts.map +1 -1
  71. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.js +3 -2
  72. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.js.map +1 -1
  73. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.d.ts +2 -1
  74. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.d.ts.map +1 -1
  75. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.js +2 -1
  76. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.js.map +1 -1
  77. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.d.ts.map +1 -1
  78. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.js +2 -2
  79. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.js.map +1 -1
  80. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.d.ts.map +1 -1
  81. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js +3 -10
  82. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js.map +1 -1
  83. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.d.ts +1 -1
  84. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.d.ts.map +1 -1
  85. package/package.json +5 -5
  86. package/src/__lib__/QueryBuilderDocumentation.ts +1 -0
  87. package/src/__lib__/QueryBuilderEvent.ts +1 -0
  88. package/src/components/QueryBuilderResultPanel.tsx +269 -90
  89. package/src/components/fetch-structure/QueryBuilderResultModifierPanel.tsx +2 -4
  90. package/src/components/fetch-structure/QueryBuilderTDSWindowPanel.tsx +1 -1
  91. package/src/graph/QueryBuilderMetaModelConst.ts +25 -0
  92. package/src/index.ts +9 -2
  93. package/src/stores/QueryBuilderPreviewDataHelper.ts +2 -4
  94. package/src/stores/QueryBuilderResultState.ts +17 -34
  95. package/src/stores/QueryBuilderState.ts +12 -0
  96. package/src/stores/QueryBuilderTypeaheadHelper.ts +2 -4
  97. package/src/stores/fetch-structure/tds/QueryBuilderTDSHelper.ts +58 -2
  98. package/src/stores/fetch-structure/tds/QueryResultSetModifierState.ts +1 -5
  99. package/src/stores/fetch-structure/tds/aggregation/QueryBuilderAggregateOperator.ts +5 -9
  100. package/src/stores/fetch-structure/tds/aggregation/QueryBuilderAggregationState.ts +16 -2
  101. package/src/stores/fetch-structure/tds/aggregation/operators/QueryBuilderAggregateOperator_DistinctCount.ts +2 -4
  102. package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterOperator.ts +1 -1
  103. package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.ts +1 -50
  104. package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterStateBuilder.ts +22 -4
  105. package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.ts +4 -4
  106. package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.ts +1 -1
  107. package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.ts +5 -5
  108. package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.ts +5 -15
  109. package/src/stores/fetch-structure/tds/window/QueryBuilderWindowState.ts +1 -1
@@ -17,15 +17,14 @@
17
17
  import { action, flow, makeObservable, observable } from 'mobx';
18
18
  import {
19
19
  type GeneratorFn,
20
- type ContentType,
21
20
  assertErrorThrown,
22
21
  LogEvent,
23
22
  guaranteeNonNullable,
23
+ type ContentType,
24
24
  downloadFileUsingDataURI,
25
25
  ActionState,
26
26
  StopWatch,
27
27
  getContentTypeFileExtension,
28
- isBoolean,
29
28
  } from '@finos/legend-shared';
30
29
  import type { QueryBuilderState } from './QueryBuilderState.js';
31
30
  import {
@@ -38,7 +37,6 @@ import {
38
37
  buildRawLambdaFromLambdaFunction,
39
38
  reportGraphAnalytics,
40
39
  extractExecutionResultValues,
41
- TDSExecutionResult,
42
40
  } from '@finos/legend-graph';
43
41
  import { buildLambdaFunction } from './QueryBuilderValueSpecificationBuilder.js';
44
42
  import { DEFAULT_TAB_SIZE } from '@finos/legend-application';
@@ -50,6 +48,7 @@ import type { LambdaFunctionBuilderOption } from './QueryBuilderValueSpecificati
50
48
  import { QueryBuilderTelemetryHelper } from '../__lib__/QueryBuilderTelemetryHelper.js';
51
49
  import { QUERY_BUILDER_EVENT } from '../__lib__/QueryBuilderEvent.js';
52
50
  import { ExecutionPlanState } from './execution-plan/ExecutionPlanState.js';
51
+ import type { DataGridColumnState } from '@finos/legend-lego/data-grid';
53
52
 
54
53
  export const DEFAULT_LIMIT = 1000;
55
54
 
@@ -69,6 +68,11 @@ export interface QueryBuilderTDSResultCellCoordinate {
69
68
  colIndex: number;
70
69
  }
71
70
 
71
+ type QueryBuilderDataGridConfig = {
72
+ columns: DataGridColumnState[];
73
+ isPivotModeEnabled: boolean;
74
+ };
75
+
72
76
  export class QueryBuilderResultState {
73
77
  readonly queryBuilderState: QueryBuilderState;
74
78
  readonly exportDataState = ActionState.create();
@@ -83,12 +87,13 @@ export class QueryBuilderResultState {
83
87
  latestRunHashCode?: string | undefined;
84
88
  queryRunPromise: Promise<ExecutionResult> | undefined = undefined;
85
89
  isQueryUsageViewerOpened = false;
86
- rowData: Record<string, string | number | boolean | null>[] = [];
87
90
 
88
91
  selectedCells: QueryBuilderTDSResultCellData[];
89
92
  mousedOverCell: QueryBuilderTDSResultCellData | null = null;
90
93
  isSelectingCells: boolean;
91
94
 
95
+ gridConfig!: QueryBuilderDataGridConfig;
96
+
92
97
  constructor(queryBuilderState: QueryBuilderState) {
93
98
  makeObservable(this, {
94
99
  executionResult: observable,
@@ -102,6 +107,8 @@ export class QueryBuilderResultState {
102
107
  isRunningQuery: observable,
103
108
  isSelectingCells: observable,
104
109
  isQueryUsageViewerOpened: observable,
110
+ gridConfig: observable,
111
+ setGridConfig: action,
105
112
  setIsSelectingCells: action,
106
113
  setIsRunningQuery: action,
107
114
  setExecutionResult: action,
@@ -113,8 +120,6 @@ export class QueryBuilderResultState {
113
120
  setQueryRunPromise: action,
114
121
  setIsQueryUsageViewerOpened: action,
115
122
  exportData: flow,
116
- getRowData: action,
117
- setRowData: action,
118
123
  runQuery: flow,
119
124
  cancelQuery: flow,
120
125
  generatePlan: flow,
@@ -122,6 +127,10 @@ export class QueryBuilderResultState {
122
127
  this.isSelectingCells = false;
123
128
 
124
129
  this.selectedCells = [];
130
+ this.gridConfig = {
131
+ columns: [],
132
+ isPivotModeEnabled: false,
133
+ };
125
134
  this.queryBuilderState = queryBuilderState;
126
135
  this.executionPlanState = new ExecutionPlanState(
127
136
  this.queryBuilderState.applicationStore,
@@ -129,34 +138,8 @@ export class QueryBuilderResultState {
129
138
  );
130
139
  }
131
140
 
132
- getRowData(): Record<string, string | number | boolean | null>[] {
133
- if (
134
- this.executionResult &&
135
- this.executionResult instanceof TDSExecutionResult
136
- ) {
137
- const data = this.executionResult.result.rows.map((_row, rowIdx) => {
138
- const row: Record<string, string | number | boolean | null> = {};
139
- const cols = (this.executionResult as TDSExecutionResult).result
140
- .columns;
141
- _row.values.forEach((value, colIdx) => {
142
- // `ag-grid` shows `false` value as empty string so we have
143
- // call `.toString()` to avoid this behavior.
144
- // See https://github.com/finos/legend-studio/issues/1008
145
- row[cols[colIdx] as string] = isBoolean(value)
146
- ? String(value)
147
- : value;
148
- });
149
- row.rowNumber = rowIdx;
150
- return row;
151
- });
152
- this.rowData = data;
153
- return data;
154
- }
155
- return [];
156
- }
157
-
158
- setRowData(val: Record<string, string | number | boolean | null>[]): void {
159
- this.rowData = val;
141
+ setGridConfig(val: QueryBuilderDataGridConfig): void {
142
+ this.gridConfig = val;
160
143
  }
161
144
 
162
145
  setIsSelectingCells(val: boolean): void {
@@ -100,6 +100,7 @@ import {
100
100
  type QueryBuilderExecutionContextState,
101
101
  } from './QueryBuilderExecutionContextState.js';
102
102
  import type { QueryBuilderConfig } from '../graph-manager/QueryBuilderConfig.js';
103
+ import { QUERY_BUILDER_EVENT } from '../__lib__/QueryBuilderEvent.js';
103
104
 
104
105
  export abstract class QueryBuilderState implements CommandRegistrar {
105
106
  readonly applicationStore: GenericLegendApplicationStore;
@@ -130,6 +131,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
130
131
  isCheckingEntitlments = false;
131
132
  isCalendarEnabled = false;
132
133
  isQueryChatOpened = false;
134
+ isAdvancedModeEnabled = false;
133
135
 
134
136
  class?: Class | undefined;
135
137
  executionContextState: QueryBuilderExecutionContextState;
@@ -165,6 +167,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
165
167
  executionContextState: observable,
166
168
  class: observable,
167
169
  isQueryChatOpened: observable,
170
+ isAdvancedModeEnabled: observable,
168
171
 
169
172
  sideBarClassName: computed,
170
173
  isQuerySupported: computed,
@@ -177,6 +180,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
177
180
  setIsCheckingEntitlments: action,
178
181
  setClass: action,
179
182
  setIsQueryChatOpened: action,
183
+ setIsAdvancedModeEnabled: action,
180
184
 
181
185
  resetQueryResult: action,
182
186
  resetQueryContent: action,
@@ -259,6 +263,10 @@ export abstract class QueryBuilderState implements CommandRegistrar {
259
263
  this.isQueryChatOpened = val;
260
264
  }
261
265
 
266
+ setIsAdvancedModeEnabled(val: boolean): void {
267
+ this.isAdvancedModeEnabled = val;
268
+ }
269
+
262
270
  setInternalize(val: QueryBuilderInternalizeState | undefined): void {
263
271
  this.internalizeState = val;
264
272
  }
@@ -555,6 +563,10 @@ export abstract class QueryBuilderState implements CommandRegistrar {
555
563
  this.fetchStructureState.initializeWithQuery();
556
564
  } catch (error) {
557
565
  assertErrorThrown(error);
566
+ this.applicationStore.logService.error(
567
+ LogEvent.create(QUERY_BUILDER_EVENT.UNSUPPORTED_QUERY_LAUNCH),
568
+ error,
569
+ );
558
570
  this.resetQueryResult({ preserveResult: options?.preserveResult });
559
571
  this.resetQueryContent();
560
572
  this.unsupportedQueryState.setLambdaError(error);
@@ -58,10 +58,6 @@ import {
58
58
  } from '@finos/legend-shared';
59
59
  import { QueryBuilderPostFilterOperator_StartWith } from './fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_StartWith.js';
60
60
  import type { QueryBuilderAggregateColumnState } from './fetch-structure/tds/aggregation/QueryBuilderAggregationState.js';
61
- import {
62
- getTDSColumnDerivedProperyFromType,
63
- type TDS_COLUMN_GETTER,
64
- } from './fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js';
65
61
  import {
66
62
  QueryBuilderDerivationProjectionColumnState,
67
63
  QueryBuilderProjectionColumnState,
@@ -75,6 +71,7 @@ import {
75
71
  import {
76
72
  QUERY_BUILDER_PURE_PATH,
77
73
  QUERY_BUILDER_SUPPORTED_FUNCTIONS,
74
+ type TDS_COLUMN_GETTER,
78
75
  } from '../graph/QueryBuilderMetaModelConst.js';
79
76
  import {
80
77
  functionExpression_setParametersValues,
@@ -89,6 +86,7 @@ import {
89
86
  DEFAULT_POST_FILTER_LAMBDA_VARIABLE_NAME,
90
87
  } from './QueryBuilderConfig.js';
91
88
  import type { QueryBuilderAggregateOperator } from './fetch-structure/tds/aggregation/QueryBuilderAggregateOperator.js';
89
+ import { getTDSColumnDerivedProperyFromType } from './fetch-structure/tds/QueryBuilderTDSHelper.js';
92
90
 
93
91
  const buildPropertyExpressionChainWithDefaultMilestoningDates = (
94
92
  propertyExpression: AbstractPropertyExpression,
@@ -15,6 +15,11 @@
15
15
  */
16
16
 
17
17
  import {
18
+ type Type,
19
+ Enumeration,
20
+ PRIMITIVE_TYPE,
21
+ SimpleFunctionExpression,
22
+ createPrimitiveInstance_String,
18
23
  extractElementNameFromPath,
19
24
  matchFunctionName,
20
25
  } from '@finos/legend-graph';
@@ -22,10 +27,13 @@ import {
22
27
  guaranteeNonNullable,
23
28
  UnsupportedOperationError,
24
29
  } from '@finos/legend-shared';
25
- import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../../graph/QueryBuilderMetaModelConst.js';
30
+ import {
31
+ COLUMN_SORT_TYPE,
32
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS,
33
+ TDS_COLUMN_GETTER,
34
+ } from '../../../graph/QueryBuilderMetaModelConst.js';
26
35
  import type { QueryBuilderTDSState } from './QueryBuilderTDSState.js';
27
36
  import type { QueryBuilderTDSColumnState } from './QueryBuilderTDSColumnState.js';
28
- import { COLUMN_SORT_TYPE } from './QueryResultSetModifierState.js';
29
37
 
30
38
  export const findTDSColumnState = (
31
39
  projectionState: QueryBuilderTDSState,
@@ -77,3 +85,51 @@ export const getFunctionNameFromTDSSortColumn = (
77
85
  );
78
86
  }
79
87
  };
88
+
89
+ export const buildTDSSortTypeExpression = (
90
+ sortType: COLUMN_SORT_TYPE,
91
+ column: string,
92
+ ): SimpleFunctionExpression => {
93
+ const sortColumnFunction = new SimpleFunctionExpression(
94
+ extractElementNameFromPath(
95
+ sortType === COLUMN_SORT_TYPE.ASC
96
+ ? QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_ASC
97
+ : QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_DESC,
98
+ ),
99
+ );
100
+ const sortColumnName = createPrimitiveInstance_String(column);
101
+ sortColumnFunction.parametersValues[0] = sortColumnName;
102
+ return sortColumnFunction;
103
+ };
104
+
105
+ export const getTDSColumnDerivedProperyFromType = (
106
+ type: Type,
107
+ ): TDS_COLUMN_GETTER => {
108
+ if (type instanceof Enumeration) {
109
+ return TDS_COLUMN_GETTER.GET_ENUM;
110
+ }
111
+ switch (type.path) {
112
+ case PRIMITIVE_TYPE.STRING:
113
+ return TDS_COLUMN_GETTER.GET_STRING;
114
+ case PRIMITIVE_TYPE.NUMBER:
115
+ return TDS_COLUMN_GETTER.GET_NUMBER;
116
+ case PRIMITIVE_TYPE.INTEGER:
117
+ return TDS_COLUMN_GETTER.GET_INTEGER;
118
+ case PRIMITIVE_TYPE.FLOAT:
119
+ return TDS_COLUMN_GETTER.GET_FLOAT;
120
+ case PRIMITIVE_TYPE.DECIMAL:
121
+ return TDS_COLUMN_GETTER.GET_DECIMAL;
122
+ case PRIMITIVE_TYPE.DATE:
123
+ return TDS_COLUMN_GETTER.GET_DATE;
124
+ case PRIMITIVE_TYPE.DATETIME:
125
+ return TDS_COLUMN_GETTER.GET_DATETIME;
126
+ case PRIMITIVE_TYPE.STRICTDATE:
127
+ return TDS_COLUMN_GETTER.GET_STRICTDATE;
128
+ case PRIMITIVE_TYPE.BOOLEAN:
129
+ return TDS_COLUMN_GETTER.GET_BOOLEAN;
130
+ default:
131
+ throw new UnsupportedOperationError(
132
+ `Can't find TDS column derived property name for type: '${type.path}'`,
133
+ );
134
+ }
135
+ };
@@ -24,11 +24,7 @@ import {
24
24
  } from '@finos/legend-shared';
25
25
  import { QUERY_BUILDER_STATE_HASH_STRUCTURE } from '../../QueryBuilderStateHashUtils.js';
26
26
  import type { QueryBuilderTDSColumnState } from './QueryBuilderTDSColumnState.js';
27
-
28
- export enum COLUMN_SORT_TYPE {
29
- ASC = 'ASC',
30
- DESC = 'DESC',
31
- }
27
+ import { COLUMN_SORT_TYPE } from '../../../graph/QueryBuilderMetaModelConst.js';
32
28
 
33
29
  export class SortColumnState implements Hashable {
34
30
  columnState: QueryBuilderTDSColumnState;
@@ -14,11 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import {
18
- uuid,
19
- guaranteeNonNullable,
20
- type Hashable,
21
- } from '@finos/legend-shared';
17
+ import { uuid, type Hashable } from '@finos/legend-shared';
22
18
  import type {
23
19
  AbstractPropertyExpression,
24
20
  PureModel,
@@ -82,10 +78,10 @@ export abstract class QueryBuilderAggregateOperator implements Hashable {
82
78
  * Returns the expected return type of the operator.
83
79
  * defaults to using the return type of the projection column state which is being aggregated.
84
80
  */
85
- getReturnType(aggregateColumnState: QueryBuilderAggregateColumnState): Type {
86
- return guaranteeNonNullable(
87
- aggregateColumnState.projectionColumnState.getColumnType(),
88
- );
81
+ getReturnType(
82
+ aggregateColumnState: QueryBuilderAggregateColumnState,
83
+ ): Type | undefined {
84
+ return aggregateColumnState.projectionColumnState.getColumnType();
89
85
  }
90
86
 
91
87
  abstract get hashCode(): string;
@@ -25,7 +25,10 @@ import type { Type } from '@finos/legend-graph';
25
25
  import { DEFAULT_LAMBDA_VARIABLE_NAME } from '../../../QueryBuilderConfig.js';
26
26
  import type { QueryBuilderTDSState } from '../QueryBuilderTDSState.js';
27
27
  import type { QueryBuilderAggregateOperator } from './QueryBuilderAggregateOperator.js';
28
- import type { QueryBuilderProjectionColumnState } from '../projection/QueryBuilderProjectionColumnState.js';
28
+ import {
29
+ QueryBuilderDerivationProjectionColumnState,
30
+ type QueryBuilderProjectionColumnState,
31
+ } from '../projection/QueryBuilderProjectionColumnState.js';
29
32
  import { QUERY_BUILDER_STATE_HASH_STRUCTURE } from '../../../QueryBuilderStateHashUtils.js';
30
33
  import { QueryBuilderTDSColumnState } from '../QueryBuilderTDSColumnState.js';
31
34
  import type { QueryBuilderAggregateCalendarFunction } from './QueryBuilderAggregateCalendarFunction.js';
@@ -58,6 +61,7 @@ export class QueryBuilderAggregateColumnState
58
61
  setLambdaParameterName: action,
59
62
  setOperator: action,
60
63
  setCalendarFunction: action,
64
+ handleUsedPostFilterType: action,
61
65
  hashCode: computed,
62
66
  });
63
67
 
@@ -88,10 +92,20 @@ export class QueryBuilderAggregateColumnState
88
92
  this.operator = val;
89
93
  }
90
94
 
91
- getColumnType(): Type {
95
+ getColumnType(): Type | undefined {
92
96
  return this.operator.getReturnType(this);
93
97
  }
94
98
 
99
+ handleUsedPostFilterType(type: Type): void {
100
+ if (
101
+ this.getColumnType() === undefined &&
102
+ this.projectionColumnState instanceof
103
+ QueryBuilderDerivationProjectionColumnState
104
+ ) {
105
+ this.projectionColumnState.setReturnType(type);
106
+ }
107
+ }
108
+
95
109
  get hashCode(): string {
96
110
  return hashArray([
97
111
  QUERY_BUILDER_STATE_HASH_STRUCTURE.AGGREGATE_COLUMN_STATE,
@@ -26,6 +26,7 @@ import {
26
26
  type Type,
27
27
  Enumeration,
28
28
  Multiplicity,
29
+ PrimitiveType,
29
30
  } from '@finos/legend-graph';
30
31
  import {
31
32
  assertTrue,
@@ -169,10 +170,7 @@ export class QueryBuilderAggregateOperator_DistinctCount
169
170
  override getReturnType(
170
171
  aggregateColumnState: QueryBuilderAggregateColumnState,
171
172
  ): Type {
172
- const graph =
173
- aggregateColumnState.aggregationState.tdsState.queryBuilderState
174
- .graphManagerState.graph;
175
- return graph.getType(PRIMITIVE_TYPE.INTEGER);
173
+ return PrimitiveType.INTEGER;
176
174
  }
177
175
 
178
176
  get hashCode(): string {
@@ -23,8 +23,8 @@ import { type Hashable, uuid } from '@finos/legend-shared';
23
23
  import type {
24
24
  PostFilterConditionState,
25
25
  QueryBuilderPostFilterState,
26
- TDS_COLUMN_GETTER,
27
26
  } from './QueryBuilderPostFilterState.js';
27
+ import type { TDS_COLUMN_GETTER } from '../../../../graph/QueryBuilderMetaModelConst.js';
28
28
 
29
29
  export abstract class QueryBuilderPostFilterOperator implements Hashable {
30
30
  readonly uuid = uuid();
@@ -22,8 +22,6 @@ import {
22
22
  type ExecutionResult,
23
23
  type VariableExpression,
24
24
  type SimpleFunctionExpression,
25
- Enumeration,
26
- PRIMITIVE_TYPE,
27
25
  observe_ValueSpecification,
28
26
  PrimitiveType,
29
27
  CollectionInstanceValue,
@@ -38,7 +36,6 @@ import {
38
36
  guaranteeNonNullable,
39
37
  guaranteeType,
40
38
  IllegalStateError,
41
- UnsupportedOperationError,
42
39
  uuid,
43
40
  filterByType,
44
41
  ActionState,
@@ -78,6 +75,7 @@ import {
78
75
  isValueExpressionReferencedInValue,
79
76
  } from '../../../QueryBuilderValueSpecificationHelper.js';
80
77
  import { buildtdsPropertyExpressionFromColState } from './operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.js';
78
+ import { TDS_COLUMN_GETTER } from '../../../../graph/QueryBuilderMetaModelConst.js';
81
79
 
82
80
  export enum QUERY_BUILDER_POST_FILTER_DND_TYPE {
83
81
  GROUP_CONDITION = 'GROUP_CONDITION',
@@ -85,53 +83,6 @@ export enum QUERY_BUILDER_POST_FILTER_DND_TYPE {
85
83
  BLANK_CONDITION = 'BLANK_CONDITION',
86
84
  }
87
85
 
88
- export enum TDS_COLUMN_GETTER {
89
- GET_STRING = 'getString',
90
- GET_NUMBER = 'getNumber',
91
- GET_INTEGER = 'getInteger',
92
- GET_FLOAT = 'getFloat',
93
- GET_DECIMAL = 'getDecimal',
94
- GET_DATE = 'getDate',
95
- GET_DATETIME = 'getDateTime',
96
- GET_STRICTDATE = 'getStrictDate',
97
- GET_BOOLEAN = 'getBoolean',
98
- GET_ENUM = 'getEnum',
99
- IS_NULL = 'isNull',
100
- IS_NOT_NULL = 'isNotNull',
101
- }
102
-
103
- export const getTDSColumnDerivedProperyFromType = (
104
- type: Type,
105
- ): TDS_COLUMN_GETTER => {
106
- if (type instanceof Enumeration) {
107
- return TDS_COLUMN_GETTER.GET_ENUM;
108
- }
109
- switch (type.path) {
110
- case PRIMITIVE_TYPE.STRING:
111
- return TDS_COLUMN_GETTER.GET_STRING;
112
- case PRIMITIVE_TYPE.NUMBER:
113
- return TDS_COLUMN_GETTER.GET_NUMBER;
114
- case PRIMITIVE_TYPE.INTEGER:
115
- return TDS_COLUMN_GETTER.GET_INTEGER;
116
- case PRIMITIVE_TYPE.FLOAT:
117
- return TDS_COLUMN_GETTER.GET_FLOAT;
118
- case PRIMITIVE_TYPE.DECIMAL:
119
- return TDS_COLUMN_GETTER.GET_DECIMAL;
120
- case PRIMITIVE_TYPE.DATE:
121
- return TDS_COLUMN_GETTER.GET_DATE;
122
- case PRIMITIVE_TYPE.DATETIME:
123
- return TDS_COLUMN_GETTER.GET_DATETIME;
124
- case PRIMITIVE_TYPE.STRICTDATE:
125
- return TDS_COLUMN_GETTER.GET_STRICTDATE;
126
- case PRIMITIVE_TYPE.BOOLEAN:
127
- return TDS_COLUMN_GETTER.GET_BOOLEAN;
128
- default:
129
- throw new UnsupportedOperationError(
130
- `Can't find TDS column derived property name for type: '${type.path}'`,
131
- );
132
- }
133
- };
134
-
135
86
  export const getTypeFromDerivedProperty = (
136
87
  derivedProperty: TDS_COLUMN_GETTER,
137
88
  graph: PureModel,
@@ -36,24 +36,29 @@ import {
36
36
  } from '@finos/legend-shared';
37
37
  import { QueryBuilderDerivationProjectionColumnState } from '../projection/QueryBuilderProjectionColumnState.js';
38
38
  import type { QueryBuilderTDSColumnState } from '../QueryBuilderTDSColumnState.js';
39
- import { getTDSColumnState } from '../QueryBuilderTDSHelper.js';
39
+ import {
40
+ getTDSColumnDerivedProperyFromType,
41
+ getTDSColumnState,
42
+ } from '../QueryBuilderTDSHelper.js';
40
43
  import type { QueryBuilderPostFilterOperator } from './QueryBuilderPostFilterOperator.js';
41
44
  import {
42
45
  type QueryBuilderPostFilterState,
43
- getTDSColumnDerivedProperyFromType,
44
46
  PostFilterConditionState,
45
47
  QueryBuilderPostFilterTreeConditionNodeData,
46
48
  QueryBuilderPostFilterTreeGroupNodeData,
47
- TDS_COLUMN_GETTER,
48
49
  getTypeFromDerivedProperty,
49
50
  PostFilterValueSpecConditionValueState,
50
51
  PostFilterTDSColumnValueConditionValueState,
51
52
  } from './QueryBuilderPostFilterState.js';
52
- import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../../../graph/QueryBuilderMetaModelConst.js';
53
+ import {
54
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS,
55
+ TDS_COLUMN_GETTER,
56
+ } from '../../../../graph/QueryBuilderMetaModelConst.js';
53
57
  import type { QueryBuilderState } from '../../../QueryBuilderState.js';
54
58
  import { QueryBuilderTDSState } from '../QueryBuilderTDSState.js';
55
59
  import { toGroupOperation } from '../../../QueryBuilderGroupOperationHelper.js';
56
60
  import { simplifyValueExpression } from '../../../QueryBuilderValueSpecificationHelper.js';
61
+ import { QueryBuilderAggregateColumnState } from '../aggregation/QueryBuilderAggregationState.js';
57
62
 
58
63
  const findProjectionColumnState = (
59
64
  propertyExpression: AbstractPropertyExpression,
@@ -93,6 +98,19 @@ const findProjectionColumnState = (
93
98
  columnState.setReturnType(type);
94
99
  }
95
100
  return columnState;
101
+ } else if (
102
+ columnState instanceof QueryBuilderAggregateColumnState &&
103
+ columnState.projectionColumnState instanceof
104
+ QueryBuilderDerivationProjectionColumnState
105
+ ) {
106
+ const type = getTypeFromDerivedProperty(
107
+ tdsColumnGetter,
108
+ postFilterState.tdsState.queryBuilderState.graphManagerState.graph,
109
+ );
110
+ if (type) {
111
+ columnState.handleUsedPostFilterType(type);
112
+ }
113
+ return columnState;
96
114
  }
97
115
  const columnType = guaranteeNonNullable(columnState.getColumnType());
98
116
  assertTrue(
@@ -31,13 +31,13 @@ import {
31
31
  } from '@finos/legend-graph';
32
32
  import { guaranteeNonNullable } from '@finos/legend-shared';
33
33
  import type { QueryBuilderPostFilterOperator } from '../QueryBuilderPostFilterOperator.js';
34
+ import { type PostFilterConditionState } from '../QueryBuilderPostFilterState.js';
34
35
  import {
35
- type PostFilterConditionState,
36
+ QUERY_BUILDER_PURE_PATH,
36
37
  type TDS_COLUMN_GETTER,
37
- getTDSColumnDerivedProperyFromType,
38
- } from '../QueryBuilderPostFilterState.js';
39
- import { QUERY_BUILDER_PURE_PATH } from '../../../../../graph/QueryBuilderMetaModelConst.js';
38
+ } from '../../../../../graph/QueryBuilderMetaModelConst.js';
40
39
  import type { QueryBuilderTDSColumnState } from '../../QueryBuilderTDSColumnState.js';
40
+ import { getTDSColumnDerivedProperyFromType } from '../../QueryBuilderTDSHelper.js';
41
41
 
42
42
  export const buildtdsPropertyExpressionFromColState = (
43
43
  filterConditionState: PostFilterConditionState,
@@ -26,7 +26,6 @@ import { buildPostFilterConditionState } from '../QueryBuilderPostFilterStateBui
26
26
  import {
27
27
  type PostFilterConditionState,
28
28
  type QueryBuilderPostFilterState,
29
- TDS_COLUMN_GETTER,
30
29
  PostFilterValueSpecConditionValueState,
31
30
  } from '../QueryBuilderPostFilterState.js';
32
31
  import { QueryBuilderSimpleProjectionColumnState } from '../../projection/QueryBuilderProjectionColumnState.js';
@@ -34,6 +33,7 @@ import { buildPostFilterConditionExpression } from './QueryBuilderPostFilterOper
34
33
  import { isPropertyExpressionChainOptional } from '../../../../QueryBuilderValueSpecificationHelper.js';
35
34
  import { type Hashable, hashArray } from '@finos/legend-shared';
36
35
  import { QUERY_BUILDER_STATE_HASH_STRUCTURE } from '../../../../QueryBuilderStateHashUtils.js';
36
+ import { TDS_COLUMN_GETTER } from '../../../../../graph/QueryBuilderMetaModelConst.js';
37
37
 
38
38
  export class QueryBuilderPostFilterOperator_IsEmpty
39
39
  extends QueryBuilderPostFilterOperator
@@ -37,7 +37,10 @@ import {
37
37
  isNonNullable,
38
38
  returnUndefOnError,
39
39
  } from '@finos/legend-shared';
40
- import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../../../graph/QueryBuilderMetaModelConst.js';
40
+ import {
41
+ COLUMN_SORT_TYPE,
42
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS,
43
+ } from '../../../../graph/QueryBuilderMetaModelConst.js';
41
44
  import type { QueryBuilderState } from '../../../QueryBuilderState.js';
42
45
  import { QueryBuilderValueSpecificationProcessor } from '../../../QueryBuilderStateBuilder.js';
43
46
  import {
@@ -51,10 +54,7 @@ import {
51
54
  QueryBuilderSimpleProjectionColumnState,
52
55
  } from './QueryBuilderProjectionColumnState.js';
53
56
  import { QueryBuilderTDSState } from '../QueryBuilderTDSState.js';
54
- import {
55
- COLUMN_SORT_TYPE,
56
- SortColumnState,
57
- } from '../QueryResultSetModifierState.js';
57
+ import { SortColumnState } from '../QueryResultSetModifierState.js';
58
58
 
59
59
  export const processTDSProjectExpression = (
60
60
  expression: SimpleFunctionExpression,
@@ -40,7 +40,6 @@ import {
40
40
  } from './QueryBuilderProjectionColumnState.js';
41
41
  import type { QueryBuilderTDSState } from '../QueryBuilderTDSState.js';
42
42
  import {
43
- COLUMN_SORT_TYPE,
44
43
  type QueryResultSetModifierState,
45
44
  type SortColumnState,
46
45
  } from '../QueryResultSetModifierState.js';
@@ -49,24 +48,15 @@ import { buildGenericLambdaFunctionInstanceValue } from '../../../QueryBuilderVa
49
48
  import { buildPropertyExpressionChain } from '../../../QueryBuilderValueSpecificationBuilderHelper.js';
50
49
  import { appendOLAPGroupByState } from '../window/QueryBuilderWindowValueSpecificationBuilder.js';
51
50
  import { appendPostFilter } from '../post-filter/QueryBuilderPostFilterValueSpecificationBuilder.js';
51
+ import { buildTDSSortTypeExpression } from '../QueryBuilderTDSHelper.js';
52
52
 
53
53
  const buildSortExpression = (
54
54
  sortColumnState: SortColumnState,
55
- ): SimpleFunctionExpression => {
56
- const sortColumnFunction = new SimpleFunctionExpression(
57
- extractElementNameFromPath(
58
- sortColumnState.sortType === COLUMN_SORT_TYPE.ASC
59
- ? QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_ASC
60
- : QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_DESC,
61
- ),
55
+ ): SimpleFunctionExpression =>
56
+ buildTDSSortTypeExpression(
57
+ sortColumnState.sortType,
58
+ sortColumnState.columnState.columnName,
62
59
  );
63
- const sortColumnName = new PrimitiveInstanceValue(
64
- GenericTypeExplicitReference.create(new GenericType(PrimitiveType.STRING)),
65
- );
66
- sortColumnName.values = [sortColumnState.columnState.columnName];
67
- sortColumnFunction.parametersValues[0] = sortColumnName;
68
- return sortColumnFunction;
69
- };
70
60
 
71
61
  const appendResultSetModifier = (
72
62
  resultModifierState: QueryResultSetModifierState,
@@ -29,8 +29,8 @@ import { DEFAULT_LAMBDA_VARIABLE_NAME } from '../../../QueryBuilderConfig.js';
29
29
  import type { QueryBuilderProjectionColumnDragSource } from '../projection/QueryBuilderProjectionColumnState.js';
30
30
  import { QueryBuilderTDSColumnState } from '../QueryBuilderTDSColumnState.js';
31
31
  import type { QueryBuilderTDSState } from '../QueryBuilderTDSState.js';
32
- import type { COLUMN_SORT_TYPE } from '../QueryResultSetModifierState.js';
33
32
  import type { QueryBuilderTDS_WindowOperator } from './operators/QueryBuilderTDS_WindowOperator.js';
33
+ import type { COLUMN_SORT_TYPE } from '../../../../graph/QueryBuilderMetaModelConst.js';
34
34
 
35
35
  export const QUERY_BUILDER_WINDOW_COLUMN_DND_TYPE = 'WINDOW_COLUMN';
36
36