@finos/legend-query-builder 0.6.21 → 0.6.23

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. package/lib/components/QueryBuilderParametersPanel.d.ts.map +1 -1
  2. package/lib/components/QueryBuilderParametersPanel.js +2 -2
  3. package/lib/components/QueryBuilderParametersPanel.js.map +1 -1
  4. package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
  5. package/lib/components/QueryBuilderResultPanel.js +8 -3
  6. package/lib/components/QueryBuilderResultPanel.js.map +1 -1
  7. package/lib/components/QueryBuilderTextEditor.d.ts.map +1 -1
  8. package/lib/components/QueryBuilderTextEditor.js +4 -3
  9. package/lib/components/QueryBuilderTextEditor.js.map +1 -1
  10. package/lib/components/explorer/QueryBuilderExplorerPanel.d.ts.map +1 -1
  11. package/lib/components/explorer/QueryBuilderExplorerPanel.js +8 -7
  12. package/lib/components/explorer/QueryBuilderExplorerPanel.js.map +1 -1
  13. package/lib/components/shared/LambdaParameterValuesEditor.d.ts.map +1 -1
  14. package/lib/components/shared/LambdaParameterValuesEditor.js +10 -4
  15. package/lib/components/shared/LambdaParameterValuesEditor.js.map +1 -1
  16. package/lib/components/shared/QueryBuilderVariableSelector.js +1 -1
  17. package/lib/components/shared/QueryBuilderVariableSelector.js.map +1 -1
  18. package/lib/graphManager/QueryBuilderSupportedFunctions.d.ts +1 -0
  19. package/lib/graphManager/QueryBuilderSupportedFunctions.d.ts.map +1 -1
  20. package/lib/graphManager/QueryBuilderSupportedFunctions.js +1 -0
  21. package/lib/graphManager/QueryBuilderSupportedFunctions.js.map +1 -1
  22. package/lib/index.css +17 -1
  23. package/lib/index.css.map +1 -1
  24. package/lib/package.json +4 -4
  25. package/lib/stores/QueryBuilderPreviewDataHelper.d.ts.map +1 -1
  26. package/lib/stores/QueryBuilderPreviewDataHelper.js +6 -2
  27. package/lib/stores/QueryBuilderPreviewDataHelper.js.map +1 -1
  28. package/lib/stores/QueryBuilderResultState.d.ts +3 -1
  29. package/lib/stores/QueryBuilderResultState.d.ts.map +1 -1
  30. package/lib/stores/QueryBuilderResultState.js +4 -1
  31. package/lib/stores/QueryBuilderResultState.js.map +1 -1
  32. package/lib/stores/QueryBuilderValueSpecificationBuilder.d.ts.map +1 -1
  33. package/lib/stores/QueryBuilderValueSpecificationBuilder.js +24 -8
  34. package/lib/stores/QueryBuilderValueSpecificationBuilder.js.map +1 -1
  35. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.d.ts +7 -1
  36. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.d.ts.map +1 -1
  37. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.js +49 -32
  38. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.js.map +1 -1
  39. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.d.ts.map +1 -1
  40. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js +2 -2
  41. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js.map +1 -1
  42. package/lib/stores/shared/LambdaParameterState.d.ts +1 -1
  43. package/lib/stores/shared/LambdaParameterState.d.ts.map +1 -1
  44. package/lib/stores/shared/LambdaParameterState.js +1 -1
  45. package/lib/stores/shared/LambdaParameterState.js.map +1 -1
  46. package/package.json +11 -11
  47. package/src/components/QueryBuilderParametersPanel.tsx +2 -3
  48. package/src/components/QueryBuilderResultPanel.tsx +17 -3
  49. package/src/components/QueryBuilderTextEditor.tsx +10 -2
  50. package/src/components/explorer/QueryBuilderExplorerPanel.tsx +12 -1
  51. package/src/components/shared/LambdaParameterValuesEditor.tsx +24 -11
  52. package/src/components/shared/QueryBuilderVariableSelector.tsx +1 -1
  53. package/src/graphManager/QueryBuilderSupportedFunctions.ts +1 -0
  54. package/src/stores/QueryBuilderPreviewDataHelper.ts +6 -2
  55. package/src/stores/QueryBuilderResultState.ts +7 -1
  56. package/src/stores/QueryBuilderValueSpecificationBuilder.ts +39 -9
  57. package/src/stores/QueryBuilderValueSpecificationBuilderHelper.ts +77 -34
  58. package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.ts +2 -0
  59. package/src/stores/shared/LambdaParameterState.ts +1 -1
@@ -19,8 +19,10 @@ import {
19
19
  Dialog,
20
20
  Modal,
21
21
  ModalBody,
22
+ ModalFooterButton,
22
23
  ModalFooter,
23
24
  ModalHeader,
25
+ ModalFooterStatus,
24
26
  } from '@finos/legend-art';
25
27
  import {
26
28
  type PureModel,
@@ -28,8 +30,8 @@ import {
28
30
  type ObserverContext,
29
31
  PrimitiveType,
30
32
  } from '@finos/legend-graph';
31
- import { prettyCONSTName } from '@finos/legend-shared';
32
33
  import { observer } from 'mobx-react-lite';
34
+ import { useState } from 'react';
33
35
  import type { LambdaParametersState } from '../../stores/shared/LambdaParameterState.js';
34
36
  import { BasicValueSpecificationEditor } from './BasicValueSpecificationEditor.js';
35
37
 
@@ -41,12 +43,18 @@ export const LambdaParameterValuesEditor = observer(
41
43
  lambdaParametersState: LambdaParametersState;
42
44
  }) => {
43
45
  const { lambdaParametersState, graph, observerContext } = props;
46
+ const [isSubmitAction, setIsSubmitAction] = useState(false);
47
+ const [isClosingAction, setIsClosingAction] = useState(false);
44
48
  const valuesEdtiorState = lambdaParametersState.parameterValuesEditorState;
45
- const close = (): void => valuesEdtiorState.close();
49
+ const close = (): void => {
50
+ setIsClosingAction(true);
51
+ valuesEdtiorState.close();
52
+ };
46
53
  const applicationStore = useApplicationStore();
47
54
  const submitAction = valuesEdtiorState.submitAction;
48
55
  const submit = applicationStore.guardUnhandledError(async () => {
49
56
  if (submitAction) {
57
+ setIsSubmitAction(true);
50
58
  close();
51
59
  await submitAction.handler();
52
60
  }
@@ -106,18 +114,23 @@ export const LambdaParameterValuesEditor = observer(
106
114
  })}
107
115
  </ModalBody>
108
116
  <ModalFooter>
117
+ {isClosingAction && (
118
+ <ModalFooterStatus> Closing...</ModalFooterStatus>
119
+ )}
109
120
  {submitAction && (
110
- <button
111
- className="btn modal__footer__close-btn"
112
- title={submitAction.label}
121
+ <ModalFooterButton
122
+ inProgress={isSubmitAction}
123
+ inProgressText={`${submitAction.label}...`}
113
124
  onClick={submit}
114
- >
115
- {prettyCONSTName(submitAction.label)}
116
- </button>
125
+ text={submitAction.label}
126
+ />
117
127
  )}
118
- <button className="btn modal__footer__close-btn" onClick={close}>
119
- Close
120
- </button>
128
+ <ModalFooterButton
129
+ inProgress={isClosingAction}
130
+ inProgressText={'Closing...'}
131
+ onClick={close}
132
+ text="Close"
133
+ />
121
134
  </ModalFooter>
122
135
  </Modal>
123
136
  </Dialog>
@@ -133,7 +133,7 @@ export const VariableViewer = observer(
133
133
  <TimesIcon />
134
134
  </button>
135
135
  <VariableInfoTooltip variable={variable}>
136
- <div className="value-spec-editor__variable__info">
136
+ <div className="query-builder__variables__variable__action value-spec-editor__variable__info">
137
137
  <InfoCircleIcon />
138
138
  </div>
139
139
  </VariableInfoTooltip>
@@ -19,6 +19,7 @@ export enum QUERY_BUILDER_SUPPORTED_FUNCTIONS {
19
19
  EXISTS = 'meta::pure::functions::collection::exists',
20
20
  FILTER = 'meta::pure::functions::collection::filter',
21
21
  GET_ALL = 'meta::pure::functions::collection::getAll',
22
+ GET_ALL_VERSIONS = 'meta::pure::functions::collection::getAllVersions',
22
23
  NOT = 'meta::pure::functions::boolean::not',
23
24
  OR = 'meta::pure::functions::boolean::or',
24
25
  TAKE = 'meta::pure::functions::collection::take',
@@ -141,7 +141,9 @@ export const buildNumericPreviewDataQuery = (
141
141
  aggregationState.changeColumnAggregateOperator(valAggOp, colState);
142
142
  });
143
143
 
144
- return builderState.resultState.buildExecutionRawLambda();
144
+ return builderState.resultState.buildExecutionRawLambda({
145
+ useAllVersionsForMilestoning: true,
146
+ });
145
147
  };
146
148
 
147
149
  export const buildNonNumericPreviewDataQuery = (
@@ -198,5 +200,7 @@ export const buildNonNumericPreviewDataQuery = (
198
200
  sortValueCount,
199
201
  new SortColumnState(valueProjectionColState),
200
202
  ];
201
- return builderState.resultState.buildExecutionRawLambda();
203
+ return builderState.resultState.buildExecutionRawLambda({
204
+ useAllVersionsForMilestoning: true,
205
+ });
202
206
  };
@@ -42,6 +42,7 @@ import {
42
42
  buildExecutionParameterValues,
43
43
  getExecutionQueryFromRawLambda,
44
44
  } from './shared/LambdaParameterState.js';
45
+ import type { LambdaFunctionBuilderOption } from './QueryBuilderValueSpecificationBuilderHelper.js';
45
46
 
46
47
  const DEFAULT_LIMIT = 1000;
47
48
 
@@ -51,6 +52,7 @@ export class QueryBuilderResultState {
51
52
  readonly executionPlanState: ExecutionPlanState;
52
53
 
53
54
  previewLimit = DEFAULT_LIMIT;
55
+ pressedRunQuery = ActionState.create();
54
56
  isRunningQuery = false;
55
57
  isGeneratingPlan = false;
56
58
  executionResult?: ExecutionResult | undefined;
@@ -113,11 +115,14 @@ export class QueryBuilderResultState {
113
115
  return false;
114
116
  }
115
117
 
116
- buildExecutionRawLambda(): RawLambda {
118
+ buildExecutionRawLambda(
119
+ executionOptions?: LambdaFunctionBuilderOption,
120
+ ): RawLambda {
117
121
  let query: RawLambda;
118
122
  if (this.queryBuilderState.isQuerySupported) {
119
123
  const lambdaFunction = buildLambdaFunction(this.queryBuilderState, {
120
124
  isBuildingExecutionQuery: true,
125
+ ...executionOptions,
121
126
  });
122
127
  query = buildRawLambdaFromLambdaFunction(
123
128
  lambdaFunction,
@@ -241,6 +246,7 @@ export class QueryBuilderResultState {
241
246
  this.queryBuilderState.applicationStore.notifyError(error);
242
247
  } finally {
243
248
  this.setIsRunningQuery(false);
249
+ this.pressedRunQuery.complete();
244
250
  }
245
251
  }
246
252
 
@@ -57,6 +57,24 @@ const buildGetAllFunction = (
57
57
  return _func;
58
58
  };
59
59
 
60
+ const buildGetAllVersionsFunction = (
61
+ _class: Class,
62
+ multiplicity: Multiplicity,
63
+ ): SimpleFunctionExpression => {
64
+ const _func = new SimpleFunctionExpression(
65
+ extractElementNameFromPath(
66
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.GET_ALL_VERSIONS,
67
+ ),
68
+ );
69
+ const classInstance = new InstanceValue(
70
+ multiplicity,
71
+ GenericTypeExplicitReference.create(new GenericType(_class)),
72
+ );
73
+ classInstance.values[0] = PackageableElementExplicitReference.create(_class);
74
+ _func.parametersValues.push(classInstance);
75
+ return _func;
76
+ };
77
+
60
78
  const buildLetExpression = (
61
79
  constantExpressionState: QueryBuilderConstantExpressionState,
62
80
  ): SimpleFunctionExpression => {
@@ -101,20 +119,32 @@ export const buildLambdaFunction = (
101
119
  ),
102
120
  );
103
121
 
104
- // build getAll()
105
- const getAllFunction = buildGetAllFunction(_class, Multiplicity.ONE);
106
-
107
- // build milestoning parameter(s) for getAll()
108
122
  const milestoningStereotype = getMilestoneTemporalStereotype(
109
123
  _class,
110
124
  queryBuilderState.graphManagerState.graph,
111
125
  );
112
- if (milestoningStereotype) {
113
- queryBuilderState.milestoningState
114
- .getMilestoningImplementation(milestoningStereotype)
115
- .buildGetAllParameters(getAllFunction);
126
+
127
+ if (milestoningStereotype && options?.useAllVersionsForMilestoning) {
128
+ // build getAllVersions() when we preview data for milestoned classes
129
+ // because if we use getAll() we need to pass in data to execute the query
130
+ // but we don't give user that option in this flow.
131
+ const getAllVersionsFunction = buildGetAllVersionsFunction(
132
+ _class,
133
+ Multiplicity.ONE,
134
+ );
135
+
136
+ lambdaFunction.expressionSequence[0] = getAllVersionsFunction;
137
+ } else {
138
+ // build getAll()
139
+ const getAllFunction = buildGetAllFunction(_class, Multiplicity.ONE);
140
+ if (milestoningStereotype) {
141
+ // build milestoning parameter(s) for getAll()
142
+ queryBuilderState.milestoningState
143
+ .getMilestoningImplementation(milestoningStereotype)
144
+ .buildGetAllParameters(getAllFunction);
145
+ }
146
+ lambdaFunction.expressionSequence[0] = getAllFunction;
116
147
  }
117
- lambdaFunction.expressionSequence[0] = getAllFunction;
118
148
 
119
149
  // build watermark
120
150
  buildWatermarkExpression(queryBuilderState.watermarkState, lambdaFunction);
@@ -16,9 +16,12 @@
16
16
 
17
17
  import {
18
18
  AbstractPropertyExpression,
19
+ Class,
19
20
  DerivedProperty,
20
21
  INTERNAL__PropagatedValue,
21
22
  matchFunctionName,
23
+ MILESTONING_VERSION_PROPERTY_SUFFIX,
24
+ PropertyExplicitReference,
22
25
  SimpleFunctionExpression,
23
26
  VariableExpression,
24
27
  type ValueSpecification,
@@ -30,7 +33,11 @@ import {
30
33
  } from '@finos/legend-shared';
31
34
  import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../graphManager/QueryBuilderSupportedFunctions.js';
32
35
  import type { QueryBuilderState } from './QueryBuilderState.js';
33
- import { variableExpression_setName } from './shared/ValueSpecificationModifierHelper.js';
36
+ import {
37
+ functionExpression_setParametersValues,
38
+ propertyExpression_setFunc,
39
+ variableExpression_setName,
40
+ } from './shared/ValueSpecificationModifierHelper.js';
34
41
 
35
42
  /**
36
43
  * Gets the value of ValueSpecification given INTERNAL__PropagatedValue is pointing to.
@@ -50,6 +57,7 @@ export const buildPropertyExpressionChain = (
50
57
  propertyExpression: AbstractPropertyExpression,
51
58
  queryBuilderState: QueryBuilderState,
52
59
  lambdaParameterName: string,
60
+ options?: LambdaFunctionBuilderOption,
53
61
  /**
54
62
  * As of now, we don't support date propagation for aggregation-class functions
55
63
  * so we have this temporary flag to disable date propagation, there could be other
@@ -81,45 +89,73 @@ export const buildPropertyExpressionChain = (
81
89
  currentExpression instanceof AbstractPropertyExpression &&
82
90
  currentExpression.func.value instanceof DerivedProperty
83
91
  ) {
84
- const currentPropertyExpression = currentExpression;
85
- const parameterValues = currentExpression.parametersValues.slice(1);
86
- parameterValues.forEach((parameterValue, index) => {
87
- if (parameterValue instanceof INTERNAL__PropagatedValue) {
88
- // Replace with argumentless derived property expression only when default date propagation is supported
89
- if (
90
- !TEMPORARY__disableDatePropagation &&
91
- parameterValue.isPropagatedValue
92
- ) {
93
- // NOTE: For `bitemporal` property check if the property expression has parameters which are not instance of
94
- // `INTERNAL_PropagatedValue` then pass the parameters as user explicitly changed values of either of the parameters.
92
+ // check if we are building the expression chain to view preview data and if the
93
+ // the property is milestoned. If that is the case we need to replace the
94
+ // `property` with `propertyAllVersions`
95
+ if (
96
+ options?.useAllVersionsForMilestoning &&
97
+ currentExpression.func.value.genericType.value.rawType instanceof
98
+ Class &&
99
+ currentExpression.func.value._OWNER._generatedMilestonedProperties
100
+ .length !== 0
101
+ ) {
102
+ const name = currentExpression.func.value.name;
103
+ const property =
104
+ currentExpression.func.value._OWNER._generatedMilestonedProperties.find(
105
+ (e) => e.name === `${name}${MILESTONING_VERSION_PROPERTY_SUFFIX}`,
106
+ );
107
+ if (property) {
108
+ propertyExpression_setFunc(
109
+ currentExpression,
110
+ PropertyExplicitReference.create(property),
111
+ );
112
+ functionExpression_setParametersValues(
113
+ currentExpression,
114
+ [guaranteeNonNullable(currentExpression.parametersValues[0])],
115
+ queryBuilderState.observableContext,
116
+ );
117
+ }
118
+ } else {
119
+ const currentPropertyExpression = currentExpression;
120
+ const parameterValues = currentExpression.parametersValues.slice(1);
121
+ parameterValues.forEach((parameterValue, index) => {
122
+ if (parameterValue instanceof INTERNAL__PropagatedValue) {
123
+ // Replace with argumentless derived property expression only when default date propagation is supported
95
124
  if (
96
- (index === 1 &&
97
- currentPropertyExpression.parametersValues.length === 3) ||
98
- (index === 0 &&
99
- currentPropertyExpression.parametersValues.length === 3 &&
100
- !(
101
- currentPropertyExpression.parametersValues[2] instanceof
102
- INTERNAL__PropagatedValue &&
103
- currentPropertyExpression.parametersValues[2]
104
- .isPropagatedValue === true
105
- ))
125
+ !TEMPORARY__disableDatePropagation &&
126
+ parameterValue.isPropagatedValue
106
127
  ) {
128
+ // NOTE: For `bitemporal` property check if the property expression has parameters which are not instance of
129
+ // `INTERNAL_PropagatedValue` then pass the parameters as user explicitly changed values of either of the parameters.
130
+ if (
131
+ (index === 1 &&
132
+ currentPropertyExpression.parametersValues.length === 3) ||
133
+ (index === 0 &&
134
+ currentPropertyExpression.parametersValues.length === 3 &&
135
+ !(
136
+ currentPropertyExpression.parametersValues[2] instanceof
137
+ INTERNAL__PropagatedValue &&
138
+ currentPropertyExpression.parametersValues[2]
139
+ .isPropagatedValue === true
140
+ ))
141
+ ) {
142
+ currentPropertyExpression.parametersValues[index + 1] =
143
+ getValueOfInternalPropagatedValue(parameterValue);
144
+ } else {
145
+ currentPropertyExpression.parametersValues = [
146
+ guaranteeNonNullable(
147
+ guaranteeType(currentExpression, AbstractPropertyExpression)
148
+ .parametersValues[0],
149
+ ),
150
+ ];
151
+ }
152
+ } else {
107
153
  currentPropertyExpression.parametersValues[index + 1] =
108
154
  getValueOfInternalPropagatedValue(parameterValue);
109
- } else {
110
- currentPropertyExpression.parametersValues = [
111
- guaranteeNonNullable(
112
- guaranteeType(currentExpression, AbstractPropertyExpression)
113
- .parametersValues[0],
114
- ),
115
- ];
116
155
  }
117
- } else {
118
- currentPropertyExpression.parametersValues[index + 1] =
119
- getValueOfInternalPropagatedValue(parameterValue);
120
156
  }
121
- }
122
- });
157
+ });
158
+ }
123
159
  }
124
160
  currentExpression = nextExpression;
125
161
  // Take care of chains of subtype (a pattern that is not useful, but we want to support and rectify)
@@ -150,5 +186,12 @@ export type LambdaFunctionBuilderOption = {
150
186
  * queryBuilderState will make the lambda function building process overrides several query values, such as the row limit.
151
187
  */
152
188
  isBuildingExecutionQuery?: boolean | undefined;
189
+
190
+ /**
191
+ * Set this to `true` when we construct query for execution within the app to view preview data.
192
+ * queryBuilderState will make the lambda function building process overrides `.all()` to `.allVersions()` if the Class
193
+ * is milestoned and `property` to `propertyAllVersions` if a property is milestoned.
194
+ */
195
+ useAllVersionsForMilestoning?: boolean | undefined;
153
196
  keepSourceInformation?: boolean | undefined;
154
197
  };
@@ -227,6 +227,7 @@ export const appendProjection = (
227
227
  projectionColumnState.propertyExpressionState.propertyExpression,
228
228
  projectionColumnState.propertyExpressionState.queryBuilderState,
229
229
  projectionColumnState.lambdaParameterName,
230
+ options,
230
231
  true,
231
232
  ),
232
233
  ],
@@ -328,6 +329,7 @@ export const appendProjection = (
328
329
  projectionColumnState.propertyExpressionState.propertyExpression,
329
330
  projectionColumnState.propertyExpressionState.queryBuilderState,
330
331
  projectionColumnState.lambdaParameterName,
332
+ options,
331
333
  ),
332
334
  ],
333
335
  queryBuilderState.graphManagerState.graph,
@@ -58,7 +58,7 @@ import {
58
58
  } from './ValueSpecificationModifierHelper.js';
59
59
 
60
60
  export enum PARAMETER_SUBMIT_ACTION {
61
- EXECUTE = 'EXECUTE',
61
+ RUN = 'RUN',
62
62
  EXPORT = 'EXPORT',
63
63
  }
64
64