@finos/legend-extension-dsl-data-quality 1.0.60 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (178) hide show
  1. package/lib/components/{DSL_DataQuality_ClassElementDriver.d.ts → DSL_DataQuality_ElementDriver.d.ts} +17 -7
  2. package/lib/components/DSL_DataQuality_ElementDriver.d.ts.map +1 -0
  3. package/lib/components/{DSL_DataQuality_ClassElementDriver.js → DSL_DataQuality_ElementDriver.js} +70 -23
  4. package/lib/components/DSL_DataQuality_ElementDriver.js.map +1 -0
  5. package/lib/components/DSL_DataQuality_LegendStudioApplicationPlugin.d.ts.map +1 -1
  6. package/lib/components/DSL_DataQuality_LegendStudioApplicationPlugin.js +20 -39
  7. package/lib/components/DSL_DataQuality_LegendStudioApplicationPlugin.js.map +1 -1
  8. package/lib/components/{DSL_NewDataQualityClassValidationElement.d.ts → DSL_NewDataQualityValidationElement.d.ts} +2 -2
  9. package/lib/components/DSL_NewDataQualityValidationElement.d.ts.map +1 -0
  10. package/lib/components/DSL_NewDataQualityValidationElement.js +80 -0
  11. package/lib/components/DSL_NewDataQualityValidationElement.js.map +1 -0
  12. package/lib/components/DataQualityRelationTrialRuns.d.ts +22 -0
  13. package/lib/components/DataQualityRelationTrialRuns.d.ts.map +1 -0
  14. package/lib/components/DataQualityRelationTrialRuns.js +87 -0
  15. package/lib/components/DataQualityRelationTrialRuns.js.map +1 -0
  16. package/lib/components/{DSL_NewDataQualityServiceValidationElement.d.ts → DataQualityRelationValidationConfigurationEditor.d.ts} +2 -2
  17. package/lib/components/DataQualityRelationValidationConfigurationEditor.d.ts.map +1 -0
  18. package/lib/components/DataQualityRelationValidationConfigurationEditor.js +99 -0
  19. package/lib/components/DataQualityRelationValidationConfigurationEditor.js.map +1 -0
  20. package/lib/components/DataQualityRelationValidationEditor.d.ts +30 -0
  21. package/lib/components/DataQualityRelationValidationEditor.d.ts.map +1 -0
  22. package/lib/components/DataQualityRelationValidationEditor.js +89 -0
  23. package/lib/components/DataQualityRelationValidationEditor.js.map +1 -0
  24. package/lib/components/DataQualityResultPanel.d.ts.map +1 -1
  25. package/lib/components/DataQualityResultPanel.js +1 -1
  26. package/lib/components/DataQualityResultPanel.js.map +1 -1
  27. package/lib/components/DataQualityResultValues.d.ts +0 -2
  28. package/lib/components/DataQualityResultValues.d.ts.map +1 -1
  29. package/lib/components/DataQualityResultValues.js.map +1 -1
  30. package/lib/components/DataQualitySideBar.js +2 -2
  31. package/lib/components/DataQualitySideBar.js.map +1 -1
  32. package/lib/components/DataQualityValidationDetailPanel.d.ts +36 -0
  33. package/lib/components/DataQualityValidationDetailPanel.d.ts.map +1 -0
  34. package/lib/components/DataQualityValidationDetailPanel.js +39 -0
  35. package/lib/components/DataQualityValidationDetailPanel.js.map +1 -0
  36. package/lib/components/DataQualityValidationParametersEditor.d.ts +15 -0
  37. package/lib/components/DataQualityValidationParametersEditor.d.ts.map +1 -0
  38. package/lib/components/DataQualityValidationParametersEditor.js +129 -0
  39. package/lib/components/DataQualityValidationParametersEditor.js.map +1 -0
  40. package/lib/components/states/ConstraintState.d.ts +2 -0
  41. package/lib/components/states/ConstraintState.d.ts.map +1 -1
  42. package/lib/components/states/ConstraintState.js +2 -0
  43. package/lib/components/states/ConstraintState.js.map +1 -1
  44. package/lib/components/states/DataQualityClassValidationState.d.ts +2 -2
  45. package/lib/components/states/DataQualityClassValidationState.d.ts.map +1 -1
  46. package/lib/components/states/DataQualityClassValidationState.js +4 -4
  47. package/lib/components/states/DataQualityClassValidationState.js.map +1 -1
  48. package/lib/components/states/DataQualityRelationResultState.d.ts +46 -0
  49. package/lib/components/states/DataQualityRelationResultState.d.ts.map +1 -0
  50. package/lib/components/states/DataQualityRelationResultState.js +194 -0
  51. package/lib/components/states/DataQualityRelationResultState.js.map +1 -0
  52. package/lib/components/states/DataQualityRelationValidationConfigurationState.d.ts +73 -0
  53. package/lib/components/states/DataQualityRelationValidationConfigurationState.d.ts.map +1 -0
  54. package/lib/components/states/DataQualityRelationValidationConfigurationState.js +255 -0
  55. package/lib/components/states/DataQualityRelationValidationConfigurationState.js.map +1 -0
  56. package/lib/components/states/DataQualityRelationValidationLambdaEditorState.d.ts +32 -0
  57. package/lib/components/states/DataQualityRelationValidationLambdaEditorState.d.ts.map +1 -0
  58. package/lib/components/states/DataQualityRelationValidationLambdaEditorState.js +79 -0
  59. package/lib/components/states/DataQualityRelationValidationLambdaEditorState.js.map +1 -0
  60. package/lib/components/states/DataQualityRelationValidationState.d.ts +38 -0
  61. package/lib/components/states/DataQualityRelationValidationState.d.ts.map +1 -0
  62. package/lib/components/states/DataQualityRelationValidationState.js +119 -0
  63. package/lib/components/states/DataQualityRelationValidationState.js.map +1 -0
  64. package/lib/components/states/DataQualityResultState.d.ts.map +1 -1
  65. package/lib/components/states/DataQualityResultState.js +6 -3
  66. package/lib/components/states/DataQualityResultState.js.map +1 -1
  67. package/lib/components/states/DataQualityState.js +1 -1
  68. package/lib/components/states/DataQualityState.js.map +1 -1
  69. package/lib/graph/metamodel/DSL_DataQuality_HashUtils.d.ts +5 -1
  70. package/lib/graph/metamodel/DSL_DataQuality_HashUtils.d.ts.map +1 -1
  71. package/lib/graph/metamodel/DSL_DataQuality_HashUtils.js +4 -0
  72. package/lib/graph/metamodel/DSL_DataQuality_HashUtils.js.map +1 -1
  73. package/lib/graph/metamodel/DSL_DataQuality_PureGraphPlugin.d.ts.map +1 -1
  74. package/lib/graph/metamodel/DSL_DataQuality_PureGraphPlugin.js +2 -1
  75. package/lib/graph/metamodel/DSL_DataQuality_PureGraphPlugin.js.map +1 -1
  76. package/lib/graph/metamodel/pure/packageableElements/data-quality/DataQualityValidationConfiguration.d.ts +36 -3
  77. package/lib/graph/metamodel/pure/packageableElements/data-quality/DataQualityValidationConfiguration.d.ts.map +1 -1
  78. package/lib/graph/metamodel/pure/packageableElements/data-quality/DataQualityValidationConfiguration.js +58 -4
  79. package/lib/graph/metamodel/pure/packageableElements/data-quality/DataQualityValidationConfiguration.js.map +1 -1
  80. package/lib/graph-manager/DSL_DataQuality_GraphManagerHelper.d.ts +2 -1
  81. package/lib/graph-manager/DSL_DataQuality_GraphManagerHelper.d.ts.map +1 -1
  82. package/lib/graph-manager/DSL_DataQuality_GraphManagerHelper.js +2 -1
  83. package/lib/graph-manager/DSL_DataQuality_GraphManagerHelper.js.map +1 -1
  84. package/lib/graph-manager/DSL_DataQuality_GraphModifierHelper.d.ts +13 -2
  85. package/lib/graph-manager/DSL_DataQuality_GraphModifierHelper.d.ts.map +1 -1
  86. package/lib/graph-manager/DSL_DataQuality_GraphModifierHelper.js +36 -2
  87. package/lib/graph-manager/DSL_DataQuality_GraphModifierHelper.js.map +1 -1
  88. package/lib/graph-manager/DSL_DataQuality_PureGraphManagerPlugin.d.ts.map +1 -1
  89. package/lib/graph-manager/DSL_DataQuality_PureGraphManagerPlugin.js +5 -2
  90. package/lib/graph-manager/DSL_DataQuality_PureGraphManagerPlugin.js.map +1 -1
  91. package/lib/graph-manager/action/changeDetection/DSL_DataQuality_ObserverHelper.d.ts +5 -1
  92. package/lib/graph-manager/action/changeDetection/DSL_DataQuality_ObserverHelper.d.ts.map +1 -1
  93. package/lib/graph-manager/action/changeDetection/DSL_DataQuality_ObserverHelper.js +29 -2
  94. package/lib/graph-manager/action/changeDetection/DSL_DataQuality_ObserverHelper.js.map +1 -1
  95. package/lib/graph-manager/protocol/pure/DSL_DataQuality_PureGraphManagerExtension.d.ts +6 -5
  96. package/lib/graph-manager/protocol/pure/DSL_DataQuality_PureGraphManagerExtension.d.ts.map +1 -1
  97. package/lib/graph-manager/protocol/pure/DSL_DataQuality_PureGraphManagerExtension.js.map +1 -1
  98. package/lib/graph-manager/protocol/pure/DSL_DataQuality_PureProtocolProcessorPlugin.d.ts +1 -1
  99. package/lib/graph-manager/protocol/pure/DSL_DataQuality_PureProtocolProcessorPlugin.d.ts.map +1 -1
  100. package/lib/graph-manager/protocol/pure/DSL_DataQuality_PureProtocolProcessorPlugin.js +34 -40
  101. package/lib/graph-manager/protocol/pure/DSL_DataQuality_PureProtocolProcessorPlugin.js.map +1 -1
  102. package/lib/graph-manager/protocol/pure/v1/V1_DSL_Data_Quality_PureGraphManagerExtension.d.ts +8 -6
  103. package/lib/graph-manager/protocol/pure/v1/V1_DSL_Data_Quality_PureGraphManagerExtension.d.ts.map +1 -1
  104. package/lib/graph-manager/protocol/pure/v1/V1_DSL_Data_Quality_PureGraphManagerExtension.js +19 -12
  105. package/lib/graph-manager/protocol/pure/v1/V1_DSL_Data_Quality_PureGraphManagerExtension.js.map +1 -1
  106. package/lib/graph-manager/protocol/pure/v1/{V1_DataQualityConstraintsConfiguration.d.ts → V1_DataQualityValidationConfiguration.d.ts} +26 -4
  107. package/lib/graph-manager/protocol/pure/v1/V1_DataQualityValidationConfiguration.d.ts.map +1 -0
  108. package/lib/graph-manager/protocol/pure/v1/{V1_DataQualityConstraintsConfiguration.js → V1_DataQualityValidationConfiguration.js} +49 -4
  109. package/lib/graph-manager/protocol/pure/v1/V1_DataQualityValidationConfiguration.js.map +1 -0
  110. package/lib/graph-manager/protocol/pure/v1/transformation/V1_DSL_DataQuality_ValueSpecificationBuilderHelper.d.ts +7 -3
  111. package/lib/graph-manager/protocol/pure/v1/transformation/V1_DSL_DataQuality_ValueSpecificationBuilderHelper.d.ts.map +1 -1
  112. package/lib/graph-manager/protocol/pure/v1/transformation/V1_DSL_DataQuality_ValueSpecificationBuilderHelper.js +43 -3
  113. package/lib/graph-manager/protocol/pure/v1/transformation/V1_DSL_DataQuality_ValueSpecificationBuilderHelper.js.map +1 -1
  114. package/lib/graph-manager/protocol/pure/v1/transformation/V1_DSL_DataQuality_ValueSpecificationTransformer.d.ts +6 -3
  115. package/lib/graph-manager/protocol/pure/v1/transformation/V1_DSL_DataQuality_ValueSpecificationTransformer.d.ts.map +1 -1
  116. package/lib/graph-manager/protocol/pure/v1/transformation/V1_DSL_DataQuality_ValueSpecificationTransformer.js +39 -2
  117. package/lib/graph-manager/protocol/pure/v1/transformation/V1_DSL_DataQuality_ValueSpecificationTransformer.js.map +1 -1
  118. package/lib/graph-manager/protocol/pure/v1/transformation/pureProtocol/V1_DSL_DataQuality_ProtocolHelper.d.ts +5 -2
  119. package/lib/graph-manager/protocol/pure/v1/transformation/pureProtocol/V1_DSL_DataQuality_ProtocolHelper.d.ts.map +1 -1
  120. package/lib/graph-manager/protocol/pure/v1/transformation/pureProtocol/V1_DSL_DataQuality_ProtocolHelper.js +27 -9
  121. package/lib/graph-manager/protocol/pure/v1/transformation/pureProtocol/V1_DSL_DataQuality_ProtocolHelper.js.map +1 -1
  122. package/lib/index.css +2 -2
  123. package/lib/index.css.map +1 -1
  124. package/lib/package.json +1 -1
  125. package/package.json +7 -7
  126. package/src/components/{DSL_DataQuality_ClassElementDriver.tsx → DSL_DataQuality_ElementDriver.tsx} +87 -18
  127. package/src/components/DSL_DataQuality_LegendStudioApplicationPlugin.tsx +33 -48
  128. package/src/components/DSL_NewDataQualityValidationElement.tsx +208 -0
  129. package/src/components/DataQualityRelationTrialRuns.tsx +288 -0
  130. package/src/components/DataQualityRelationValidationConfigurationEditor.tsx +364 -0
  131. package/src/components/DataQualityRelationValidationEditor.tsx +290 -0
  132. package/src/components/DataQualityResultPanel.tsx +1 -4
  133. package/src/components/DataQualityResultValues.tsx +1 -5
  134. package/src/components/DataQualitySideBar.tsx +2 -2
  135. package/src/components/DataQualityValidationDetailPanel.tsx +182 -0
  136. package/src/components/DataQualityValidationParametersEditor.tsx +355 -0
  137. package/src/components/states/ConstraintState.ts +2 -0
  138. package/src/components/states/DataQualityClassValidationState.ts +5 -5
  139. package/src/components/states/DataQualityRelationResultState.ts +274 -0
  140. package/src/components/states/DataQualityRelationValidationConfigurationState.ts +429 -0
  141. package/src/components/states/DataQualityRelationValidationLambdaEditorState.ts +138 -0
  142. package/src/components/states/DataQualityRelationValidationState.ts +180 -0
  143. package/src/components/states/DataQualityResultState.ts +6 -8
  144. package/src/components/states/DataQualityState.ts +1 -1
  145. package/src/graph/metamodel/DSL_DataQuality_HashUtils.ts +4 -0
  146. package/src/graph/metamodel/DSL_DataQuality_PureGraphPlugin.ts +2 -0
  147. package/src/graph/metamodel/pure/packageableElements/data-quality/DataQualityValidationConfiguration.ts +79 -3
  148. package/src/graph-manager/DSL_DataQuality_GraphManagerHelper.ts +13 -0
  149. package/src/graph-manager/DSL_DataQuality_GraphModifierHelper.ts +107 -0
  150. package/src/graph-manager/DSL_DataQuality_PureGraphManagerPlugin.ts +8 -0
  151. package/src/graph-manager/action/changeDetection/DSL_DataQuality_ObserverHelper.ts +54 -1
  152. package/src/graph-manager/protocol/pure/DSL_DataQuality_PureGraphManagerExtension.ts +5 -3
  153. package/src/graph-manager/protocol/pure/DSL_DataQuality_PureProtocolProcessorPlugin.ts +72 -81
  154. package/src/graph-manager/protocol/pure/v1/V1_DSL_Data_Quality_PureGraphManagerExtension.ts +20 -23
  155. package/src/graph-manager/protocol/pure/v1/{V1_DataQualityConstraintsConfiguration.ts → V1_DataQualityValidationConfiguration.ts} +63 -4
  156. package/src/graph-manager/protocol/pure/v1/transformation/V1_DSL_DataQuality_ValueSpecificationBuilderHelper.ts +116 -2
  157. package/src/graph-manager/protocol/pure/v1/transformation/V1_DSL_DataQuality_ValueSpecificationTransformer.ts +78 -1
  158. package/src/graph-manager/protocol/pure/v1/transformation/pureProtocol/V1_DSL_DataQuality_ProtocolHelper.ts +55 -8
  159. package/style/_data-quality-relation-validation-builder.scss +454 -0
  160. package/style/index.scss +6 -0
  161. package/tsconfig.json +13 -6
  162. package/lib/components/DSL_DataQuality_ClassElementDriver.d.ts.map +0 -1
  163. package/lib/components/DSL_DataQuality_ClassElementDriver.js.map +0 -1
  164. package/lib/components/DSL_DataQuality_ServiceElementDriver.d.ts +0 -27
  165. package/lib/components/DSL_DataQuality_ServiceElementDriver.d.ts.map +0 -1
  166. package/lib/components/DSL_DataQuality_ServiceElementDriver.js +0 -41
  167. package/lib/components/DSL_DataQuality_ServiceElementDriver.js.map +0 -1
  168. package/lib/components/DSL_NewDataQualityClassValidationElement.d.ts.map +0 -1
  169. package/lib/components/DSL_NewDataQualityClassValidationElement.js +0 -64
  170. package/lib/components/DSL_NewDataQualityClassValidationElement.js.map +0 -1
  171. package/lib/components/DSL_NewDataQualityServiceValidationElement.d.ts.map +0 -1
  172. package/lib/components/DSL_NewDataQualityServiceValidationElement.js +0 -41
  173. package/lib/components/DSL_NewDataQualityServiceValidationElement.js.map +0 -1
  174. package/lib/graph-manager/protocol/pure/v1/V1_DataQualityConstraintsConfiguration.d.ts.map +0 -1
  175. package/lib/graph-manager/protocol/pure/v1/V1_DataQualityConstraintsConfiguration.js.map +0 -1
  176. package/src/components/DSL_DataQuality_ServiceElementDriver.tsx +0 -57
  177. package/src/components/DSL_NewDataQualityClassValidationElement.tsx +0 -156
  178. package/src/components/DSL_NewDataQualityServiceValidationElement.tsx +0 -74
@@ -0,0 +1,288 @@
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 { observer } from 'mobx-react-lite';
18
+ import { useApplicationStore } from '@finos/legend-application';
19
+ import { flowResult } from 'mobx';
20
+ import {
21
+ ExecutionPlanViewer,
22
+ LambdaParameterValuesEditor,
23
+ } from '@finos/legend-query-builder';
24
+ import { type ExecutionResult } from '@finos/legend-graph';
25
+ import { prettyDuration } from '@finos/legend-shared';
26
+ import React, { useRef, useState } from 'react';
27
+ import { DATA_QUALITY_VALIDATION_TEST_ID } from './constants/DataQualityConstants.js';
28
+ import {
29
+ BlankPanelContent,
30
+ CaretDownIcon,
31
+ ControlledDropdownMenu,
32
+ CubesLoadingIndicator,
33
+ CubesLoadingIndicatorIcon,
34
+ DebugIcon,
35
+ ExclamationTriangleIcon,
36
+ MenuContent,
37
+ MenuContentItem,
38
+ MenuContentItemIcon,
39
+ MenuContentItemLabel,
40
+ PanelContent,
41
+ PauseCircleIcon,
42
+ PlayIcon,
43
+ ReportIcon,
44
+ } from '@finos/legend-art';
45
+ import { DataQualityResultValues } from './DataQualityResultValues.js';
46
+ import type { DataQualityRelationValidationConfigurationState } from './states/DataQualityRelationValidationConfigurationState.js';
47
+
48
+ export const DataQualityRelationTrialRuns = observer(
49
+ (props: {
50
+ dataQualityRelationValidationConfigurationState: DataQualityRelationValidationConfigurationState;
51
+ }) => {
52
+ const { dataQualityRelationValidationConfigurationState } = props;
53
+ const applicationStore = useApplicationStore();
54
+ const resultState =
55
+ dataQualityRelationValidationConfigurationState.resultState;
56
+ const executionResult = resultState.executionResult;
57
+
58
+ const runQuery = (): void => {
59
+ resultState.handleRunValidation();
60
+ };
61
+
62
+ const cancelQuery = applicationStore.guardUnhandledError(() =>
63
+ flowResult(resultState.cancelValidation()),
64
+ );
65
+
66
+ const generatePlan = applicationStore.guardUnhandledError(() => {
67
+ return flowResult(resultState.generatePlan(false));
68
+ });
69
+ const debugPlanGeneration = applicationStore.guardUnhandledError(() =>
70
+ flowResult(resultState.generatePlan(true)),
71
+ );
72
+
73
+ const isRunQueryDisabled =
74
+ resultState.isGeneratingPlan || resultState.isRunningValidation;
75
+
76
+ const getResultSetDescription = (
77
+ _executionResult: ExecutionResult,
78
+ ): string | undefined => {
79
+ const queryDuration = resultState.executionDuration
80
+ ? prettyDuration(resultState.executionDuration, {
81
+ ms: true,
82
+ })
83
+ : undefined;
84
+ if (!queryDuration) {
85
+ return undefined;
86
+ }
87
+ return `validation ran in ${queryDuration}`;
88
+ };
89
+ const resultDescription =
90
+ !resultState.isRunningValidation && executionResult
91
+ ? getResultSetDescription(executionResult)
92
+ : undefined;
93
+
94
+ const [previewLimitValue, setPreviewLimitValue] = useState(
95
+ resultState.previewLimit,
96
+ );
97
+
98
+ const changePreviewLimit: React.ChangeEventHandler<HTMLInputElement> = (
99
+ event,
100
+ ) => {
101
+ setPreviewLimitValue(parseInt(event.target.value, 10));
102
+ };
103
+
104
+ const inputRef = useRef<HTMLInputElement>(null);
105
+
106
+ const getPreviewLimit = (): void => {
107
+ if (isNaN(previewLimitValue) || previewLimitValue === 0) {
108
+ setPreviewLimitValue(1);
109
+ dataQualityRelationValidationConfigurationState.resultState.setPreviewLimit(
110
+ 1,
111
+ );
112
+ } else {
113
+ dataQualityRelationValidationConfigurationState.resultState.setPreviewLimit(
114
+ previewLimitValue,
115
+ );
116
+ }
117
+ };
118
+
119
+ const onKeyDown: React.KeyboardEventHandler<HTMLInputElement> = (event) => {
120
+ if (event.code === 'Enter') {
121
+ getPreviewLimit();
122
+ inputRef.current?.focus();
123
+ } else if (event.code === 'Escape') {
124
+ inputRef.current?.select();
125
+ }
126
+ };
127
+
128
+ const isLoading =
129
+ resultState.isRunningValidation || resultState.isGeneratingPlan;
130
+
131
+ return (
132
+ <div
133
+ data-testid={
134
+ DATA_QUALITY_VALIDATION_TEST_ID.DATA_QUALITY_VALIDATION_RESULT_PANEL
135
+ }
136
+ className="panel data-quality-validation__result"
137
+ >
138
+ <div className="panel__header">
139
+ <div className="panel__header__title">
140
+ <div className="panel__header__title__label">results</div>
141
+ {resultState.validationToRun && (
142
+ <div className="panel__header__title__label">
143
+ {resultState.validationToRun.name}
144
+ </div>
145
+ )}
146
+ {resultState.isRunningValidation && (
147
+ <div className="panel__header__title__label__status">
148
+ Running Validation...
149
+ </div>
150
+ )}
151
+ <div
152
+ data-testid={
153
+ DATA_QUALITY_VALIDATION_TEST_ID.DATA_QUALITY_VALIDATION_RESULT_ANALYTICS
154
+ }
155
+ className="data-quality-validation__result__analytics"
156
+ >
157
+ {resultDescription ?? ''}
158
+ </div>
159
+ {executionResult && resultState.checkForStaleResults && (
160
+ <div className="data-quality-validation__result__stale-status">
161
+ <div className="data-quality-validation__result__stale-status__icon">
162
+ <ExclamationTriangleIcon />
163
+ </div>
164
+ <div className="data-quality-validation__result__stale-status__label">
165
+ Preview data might be stale
166
+ </div>
167
+ </div>
168
+ )}
169
+ </div>
170
+ <div className="panel__header__actions data-quality-validation__result__header__actions">
171
+ <div className="data-quality-validation__result__limit">
172
+ <div className="data-quality-validation__result__limit__label">
173
+ preview row limit
174
+ </div>
175
+ <input
176
+ ref={inputRef}
177
+ className="input--dark data-quality-validation__result__limit__input"
178
+ spellCheck={false}
179
+ type="number"
180
+ value={previewLimitValue}
181
+ onChange={changePreviewLimit}
182
+ onBlur={getPreviewLimit}
183
+ onKeyDown={onKeyDown}
184
+ />
185
+ </div>
186
+
187
+ <div className="data-quality-validation__result__execute-btn btn__dropdown-combo btn__dropdown-combo--primary">
188
+ {resultState.isRunningValidation ? (
189
+ <button
190
+ className="btn__dropdown-combo__canceler data-quality-validation__result__execute-btn__btn"
191
+ onClick={cancelQuery}
192
+ tabIndex={-1}
193
+ >
194
+ <div className="btn--dark btn--caution btn__dropdown-combo__canceler__label data-quality-validation__result__execute-btn__btn">
195
+ <PauseCircleIcon />
196
+ Stop
197
+ </div>
198
+ </button>
199
+ ) : (
200
+ <>
201
+ <button
202
+ className="btn__dropdown-combo__label data-quality-validation__result__execute-btn__validation data-quality-validation__result__execute-btn__btn data-quality-validation__result__execute-btn__btn--green"
203
+ onClick={runQuery}
204
+ tabIndex={-1}
205
+ disabled={isRunQueryDisabled}
206
+ >
207
+ <PlayIcon />
208
+ Run Validation
209
+ </button>
210
+ <ControlledDropdownMenu
211
+ className="btn__dropdown-combo__dropdown-btn data-quality-validation__result__execute-btn__btn data-quality-validation__result__execute-btn__btn--green"
212
+ disabled={isRunQueryDisabled}
213
+ content={
214
+ <MenuContent>
215
+ <MenuContentItem
216
+ className="btn__dropdown-combo__option"
217
+ onClick={generatePlan}
218
+ disabled={isRunQueryDisabled}
219
+ >
220
+ <MenuContentItemIcon>
221
+ <ReportIcon />
222
+ </MenuContentItemIcon>
223
+ <MenuContentItemLabel>
224
+ Generate Plan
225
+ </MenuContentItemLabel>
226
+ </MenuContentItem>
227
+ <MenuContentItem
228
+ className="btn__dropdown-combo__option"
229
+ onClick={debugPlanGeneration}
230
+ disabled={isRunQueryDisabled}
231
+ >
232
+ <MenuContentItemIcon>
233
+ <DebugIcon />
234
+ </MenuContentItemIcon>
235
+ <MenuContentItemLabel>Debug</MenuContentItemLabel>
236
+ </MenuContentItem>
237
+ </MenuContent>
238
+ }
239
+ menuProps={{
240
+ anchorOrigin: { vertical: 'bottom', horizontal: 'right' },
241
+ transformOrigin: { vertical: 'top', horizontal: 'right' },
242
+ }}
243
+ >
244
+ <CaretDownIcon />
245
+ </ControlledDropdownMenu>
246
+ </>
247
+ )}
248
+ </div>
249
+ </div>
250
+ </div>
251
+ <PanelContent className="data-quality-validation__result__content">
252
+ <CubesLoadingIndicator isLoading={isLoading}>
253
+ <CubesLoadingIndicatorIcon />
254
+ </CubesLoadingIndicator>
255
+ {!executionResult && !isLoading && (
256
+ <BlankPanelContent>
257
+ Click on run validation to see the validation results
258
+ </BlankPanelContent>
259
+ )}
260
+ {executionResult && !isLoading && (
261
+ <div className="data-quality-validation__result__values">
262
+ <DataQualityResultValues executionResult={executionResult} />
263
+ </div>
264
+ )}
265
+ </PanelContent>
266
+ <ExecutionPlanViewer
267
+ executionPlanState={resultState.executionPlanState}
268
+ />
269
+ {dataQualityRelationValidationConfigurationState.parametersState
270
+ .parameterValuesEditorState.showModal && (
271
+ <LambdaParameterValuesEditor
272
+ graph={
273
+ dataQualityRelationValidationConfigurationState.editorStore
274
+ .graphManagerState.graph
275
+ }
276
+ observerContext={
277
+ dataQualityRelationValidationConfigurationState.editorStore
278
+ .changeDetectionState.observerContext
279
+ }
280
+ lambdaParametersState={
281
+ dataQualityRelationValidationConfigurationState.parametersState
282
+ }
283
+ />
284
+ )}
285
+ </div>
286
+ );
287
+ },
288
+ );
@@ -0,0 +1,364 @@
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 { observer } from 'mobx-react-lite';
18
+ import {
19
+ type UMLEditorElementDropTarget,
20
+ type ElementDragSource,
21
+ CORE_DND_TYPE,
22
+ useEditorStore,
23
+ } from '@finos/legend-application-studio';
24
+ import {
25
+ DATA_QUALITY_RELATION_VALIDATION_EDITOR_TAB,
26
+ DataQualityRelationValidationConfigurationState,
27
+ } from './states/DataQualityRelationValidationConfigurationState.js';
28
+ import React, { useCallback, useEffect } from 'react';
29
+ import {
30
+ clsx,
31
+ DragPreviewLayer,
32
+ Panel,
33
+ PanelContent,
34
+ PanelLoadingIndicator,
35
+ PlusIcon,
36
+ } from '@finos/legend-art';
37
+ import { prettyCONSTName } from '@finos/legend-shared';
38
+ import { LambdaEditor } from '@finos/legend-query-builder';
39
+ import {
40
+ type RawVariableExpression,
41
+ PrimitiveType,
42
+ stub_RawLambda,
43
+ stub_RawVariableExpression,
44
+ Type,
45
+ } from '@finos/legend-graph';
46
+ import {
47
+ useApplicationNavigationContext,
48
+ useApplicationStore,
49
+ } from '@finos/legend-application';
50
+ import {
51
+ dataQualityRelationValidation_addParameter,
52
+ dataQualityRelationValidation_addValidation,
53
+ dataQualityRelationValidation_deleteParameter,
54
+ dataQualityRelationValidation_deleteValidation,
55
+ } from '../graph-manager/DSL_DataQuality_GraphModifierHelper.js';
56
+ import { flowResult } from 'mobx';
57
+ import {
58
+ type RelationValidationDragSource,
59
+ DataQualityRelationValidationEditor,
60
+ RELATION_VALIDATION_DND_TYPE,
61
+ } from './DataQualityRelationValidationEditor.js';
62
+ import { DataQualityRelationValidation } from '../graph/metamodel/pure/packageableElements/data-quality/DataQualityValidationConfiguration.js';
63
+ import { DataQualityRelationTrialRuns } from './DataQualityRelationTrialRuns.js';
64
+ import {
65
+ type FunctionParameterDragSource,
66
+ DataQualityValidationParametersEditor,
67
+ FUNCTION_PARAMETER_DND_TYPE,
68
+ } from './DataQualityValidationParametersEditor.js';
69
+ import { useDrop } from 'react-dnd';
70
+
71
+ const RelationDefinitionEditor = observer(
72
+ (props: {
73
+ dataQualityRelationValidationState: DataQualityRelationValidationConfigurationState;
74
+ }) => {
75
+ const { dataQualityRelationValidationState } = props;
76
+ const { relationFunctionDefinitionEditorState, resultState } =
77
+ dataQualityRelationValidationState;
78
+ const validationElement =
79
+ dataQualityRelationValidationState.validationElement;
80
+
81
+ const isReadOnly = dataQualityRelationValidationState.isReadOnly;
82
+
83
+ const addRelationValidation = (): void => {
84
+ const relationValidation = new DataQualityRelationValidation(
85
+ '',
86
+ stub_RawLambda(),
87
+ );
88
+ dataQualityRelationValidation_addValidation(
89
+ validationElement,
90
+ relationValidation,
91
+ );
92
+ dataQualityRelationValidationState.addValidationState(relationValidation);
93
+ };
94
+
95
+ const deleteRelationValidation =
96
+ (validation: DataQualityRelationValidation): (() => void) =>
97
+ (): void => {
98
+ dataQualityRelationValidation_deleteValidation(
99
+ validationElement,
100
+ validation,
101
+ );
102
+ dataQualityRelationValidationState.deleteValidationState(validation);
103
+ };
104
+
105
+ const addParameter = (): void => {
106
+ dataQualityRelationValidation_addParameter(
107
+ validationElement.query.parameters,
108
+ stub_RawVariableExpression(PrimitiveType.STRING),
109
+ );
110
+ };
111
+
112
+ const deleteParameter =
113
+ (val: RawVariableExpression): (() => void) =>
114
+ (): void => {
115
+ dataQualityRelationValidation_deleteParameter(
116
+ validationElement.query.parameters,
117
+ val,
118
+ );
119
+ };
120
+
121
+ const handleDropParameter = useCallback(
122
+ (item: UMLEditorElementDropTarget): void => {
123
+ if (!isReadOnly && item.data.packageableElement instanceof Type) {
124
+ dataQualityRelationValidation_addParameter(
125
+ validationElement.query.parameters,
126
+ stub_RawVariableExpression(item.data.packageableElement),
127
+ );
128
+ }
129
+ },
130
+ [validationElement, isReadOnly],
131
+ );
132
+ const [{ isParameterDragOver }, dropParameterRef] = useDrop<
133
+ ElementDragSource,
134
+ void,
135
+ { isParameterDragOver: boolean }
136
+ >(
137
+ () => ({
138
+ accept: [
139
+ CORE_DND_TYPE.PROJECT_EXPLORER_CLASS,
140
+ CORE_DND_TYPE.PROJECT_EXPLORER_ENUMERATION,
141
+ ],
142
+ drop: (item) => handleDropParameter(item),
143
+ collect: (monitor) => ({
144
+ isParameterDragOver: monitor.isOver({ shallow: true }),
145
+ }),
146
+ }),
147
+ [handleDropParameter],
148
+ );
149
+
150
+ return (
151
+ <>
152
+ <PanelLoadingIndicator
153
+ isLoading={
154
+ resultState.isGeneratingPlan ||
155
+ dataQualityRelationValidationState.isRunningFunc
156
+ }
157
+ />
158
+ <div className="relation-validation-config-editor__definition">
159
+ <div className="relation-validation-config-editor__definition__item">
160
+ <div className="relation-validation-config-editor__definition__item__header">
161
+ <div className="relation-validation-config-editor__definition__item__header__title">
162
+ PARAMETERS
163
+ </div>
164
+ <button
165
+ className="relation-validation-config-editor__definition__item__header__add-btn btn--dark"
166
+ disabled={isReadOnly}
167
+ onClick={addParameter}
168
+ tabIndex={-1}
169
+ title="Add Parameter"
170
+ >
171
+ <PlusIcon />
172
+ </button>
173
+ </div>
174
+ <DragPreviewLayer
175
+ labelGetter={(item: FunctionParameterDragSource): string =>
176
+ item.parameter.name === '' ? '(unknown)' : item.parameter.name
177
+ }
178
+ types={[FUNCTION_PARAMETER_DND_TYPE]}
179
+ />
180
+ <div
181
+ ref={dropParameterRef}
182
+ className={clsx(
183
+ 'relation-validation-config-editor__definition__item__content',
184
+ {
185
+ 'panel__content__lists--dnd-over':
186
+ isParameterDragOver && !isReadOnly,
187
+ },
188
+ )}
189
+ >
190
+ {validationElement.query.parameters.map((param) => (
191
+ <DataQualityValidationParametersEditor
192
+ key={param._UUID}
193
+ parameter={param}
194
+ _validationConfig={validationElement}
195
+ deleteParameter={deleteParameter(param)}
196
+ isReadOnly={isReadOnly}
197
+ />
198
+ ))}
199
+ {validationElement.query.parameters.length === 0 && (
200
+ <div className="relation-validation-config-editor__definition__item__content--empty">
201
+ No parameters
202
+ </div>
203
+ )}
204
+ </div>
205
+ </div>
206
+ <div className="relation-validation-config-editor__definition__item">
207
+ <div className="relation-validation-config-editor__definition__item__header">
208
+ <div className="relation-validation-config-editor__definition__item__header__title">
209
+ LAMBDA
210
+ </div>
211
+ </div>
212
+ <div
213
+ className={clsx(
214
+ 'relation-validation-config-editor__definition__item__content',
215
+ {
216
+ backdrop__element: Boolean(
217
+ relationFunctionDefinitionEditorState.parserError,
218
+ ),
219
+ },
220
+ )}
221
+ >
222
+ <LambdaEditor
223
+ className="relation-validation-config-editor__definition__lambda-editor lambda-editor--dark"
224
+ disabled={
225
+ relationFunctionDefinitionEditorState.isConvertingFunctionBodyToString ||
226
+ false
227
+ }
228
+ lambdaEditorState={relationFunctionDefinitionEditorState}
229
+ forceBackdrop={false}
230
+ autoFocus={true}
231
+ />
232
+ </div>
233
+ </div>
234
+ <div className="relation-validation-config-editor__definition__item">
235
+ <div className="relation-validation-config-editor__definition__item__header">
236
+ <div className="relation-validation-config-editor__definition__item__header__title">
237
+ VALIDATIONS
238
+ </div>
239
+ <button
240
+ className="relation-validation-config-editor__definition__item__header__add-btn btn--dark"
241
+ disabled={isReadOnly}
242
+ onClick={addRelationValidation}
243
+ tabIndex={-1}
244
+ title="Add Relation Validation"
245
+ >
246
+ <PlusIcon />
247
+ </button>
248
+ </div>
249
+ <div className="relation-config-validations">
250
+ <DragPreviewLayer
251
+ labelGetter={(item: RelationValidationDragSource): string =>
252
+ item.validation.name === ''
253
+ ? '(unknown)'
254
+ : item.validation.name
255
+ }
256
+ types={[RELATION_VALIDATION_DND_TYPE]}
257
+ />
258
+ {validationElement.validations.map((relationValidation) => (
259
+ <DataQualityRelationValidationEditor
260
+ key={relationValidation._UUID}
261
+ validation={relationValidation}
262
+ relationValidationConfigurationState={
263
+ dataQualityRelationValidationState
264
+ }
265
+ deleteValidation={deleteRelationValidation(
266
+ relationValidation,
267
+ )}
268
+ isReadOnly={isReadOnly}
269
+ />
270
+ ))}
271
+ </div>
272
+ </div>
273
+ </div>
274
+ </>
275
+ );
276
+ },
277
+ );
278
+
279
+ export const DataQualityRelationValidationConfigurationEditor = observer(() => {
280
+ const editorStore = useEditorStore();
281
+ const applicationStore = useApplicationStore();
282
+ const dataQualityRelationValidationConfigurationState =
283
+ editorStore.tabManagerState.getCurrentEditorState(
284
+ DataQualityRelationValidationConfigurationState,
285
+ );
286
+ const dataQualityRelationValidationElement =
287
+ dataQualityRelationValidationConfigurationState.validationElement;
288
+ const selectedTab =
289
+ dataQualityRelationValidationConfigurationState.selectedTab;
290
+
291
+ const changeTab =
292
+ (tab: DATA_QUALITY_RELATION_VALIDATION_EDITOR_TAB): (() => void) =>
293
+ (): void =>
294
+ dataQualityRelationValidationConfigurationState.setSelectedTab(tab);
295
+
296
+ useEffect(() => {
297
+ flowResult(
298
+ dataQualityRelationValidationConfigurationState.relationFunctionDefinitionEditorState.convertLambdaObjectToGrammarString(
299
+ {
300
+ pretty: true,
301
+ firstLoad: true,
302
+ },
303
+ ),
304
+ ).catch(applicationStore.alertUnhandledError);
305
+ flowResult(
306
+ dataQualityRelationValidationConfigurationState.convertValidationLambdaObjects(),
307
+ ).catch(applicationStore.alertUnhandledError);
308
+ }, [applicationStore, dataQualityRelationValidationConfigurationState]);
309
+
310
+ useApplicationNavigationContext('studio.editor.dq-relation-editor');
311
+
312
+ return (
313
+ <div className="relation-validation-config-editor uml-editor uml-editor--dark">
314
+ <Panel>
315
+ <div className="panel__header">
316
+ <div className="panel__header__title">
317
+ <div className="panel__header__title__label">
318
+ dataQualityRelationValidation
319
+ </div>
320
+ <div className="panel__header__title__content">
321
+ {dataQualityRelationValidationElement.name}
322
+ </div>
323
+ </div>
324
+ </div>
325
+ <div className="panel__header relation-validation-config-editor__tabs__header">
326
+ <div className="relation-validation-config-editor__tabs">
327
+ {Object.values(DATA_QUALITY_RELATION_VALIDATION_EDITOR_TAB).map(
328
+ (tab) => (
329
+ <div
330
+ key={tab}
331
+ onClick={changeTab(tab)}
332
+ className={clsx('relation-validation-config-editor__tab', {
333
+ 'relation-validation-config-editor__tab--active':
334
+ tab === selectedTab,
335
+ })}
336
+ >
337
+ {prettyCONSTName(tab)}
338
+ </div>
339
+ ),
340
+ )}
341
+ </div>
342
+ </div>
343
+ <PanelContent>
344
+ {selectedTab ===
345
+ DATA_QUALITY_RELATION_VALIDATION_EDITOR_TAB.DEFINITION && (
346
+ <RelationDefinitionEditor
347
+ dataQualityRelationValidationState={
348
+ dataQualityRelationValidationConfigurationState
349
+ }
350
+ />
351
+ )}
352
+ {selectedTab ===
353
+ DATA_QUALITY_RELATION_VALIDATION_EDITOR_TAB.TRIAL_RUN && (
354
+ <DataQualityRelationTrialRuns
355
+ dataQualityRelationValidationConfigurationState={
356
+ dataQualityRelationValidationConfigurationState
357
+ }
358
+ />
359
+ )}
360
+ </PanelContent>
361
+ </Panel>
362
+ </div>
363
+ );
364
+ });