@finos/legend-extension-dsl-data-quality 2.1.31 → 2.1.32

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 (90) hide show
  1. package/lib/components/DataQualityRelationLambdaGUIValidationEditor.d.ts.map +1 -1
  2. package/lib/components/DataQualityRelationLambdaGUIValidationEditor.js +1 -1
  3. package/lib/components/DataQualityRelationLambdaGUIValidationEditor.js.map +1 -1
  4. package/lib/components/DataQualityValidationFilterEditor.d.ts.map +1 -1
  5. package/lib/components/DataQualityValidationFilterEditor.js +25 -14
  6. package/lib/components/DataQualityValidationFilterEditor.js.map +1 -1
  7. package/lib/components/DataQualityValidationFunctionRenderer.d.ts +5 -8
  8. package/lib/components/DataQualityValidationFunctionRenderer.d.ts.map +1 -1
  9. package/lib/components/DataQualityValidationFunctionRenderer.js +8 -5
  10. package/lib/components/DataQualityValidationFunctionRenderer.js.map +1 -1
  11. package/lib/components/DataQualityValidationHelperFunctionEditor.js +1 -1
  12. package/lib/components/DataQualityValidationHelperFunctionEditor.js.map +1 -1
  13. package/lib/components/constants/DataQualityConstants.d.ts +3 -0
  14. package/lib/components/constants/DataQualityConstants.d.ts.map +1 -1
  15. package/lib/components/constants/DataQualityConstants.js +4 -0
  16. package/lib/components/constants/DataQualityConstants.js.map +1 -1
  17. package/lib/components/states/DataQualityValidationLambdaFormState.d.ts +1 -1
  18. package/lib/components/states/DataQualityValidationLambdaFormState.d.ts.map +1 -1
  19. package/lib/components/states/DataQualityValidationLambdaFormState.js +2 -2
  20. package/lib/components/states/DataQualityValidationLambdaFormState.js.map +1 -1
  21. package/lib/components/states/LambdaEditorWithGUIState.d.ts +1 -0
  22. package/lib/components/states/LambdaEditorWithGUIState.d.ts.map +1 -1
  23. package/lib/components/states/LambdaEditorWithGUIState.js +2 -1
  24. package/lib/components/states/LambdaEditorWithGUIState.js.map +1 -1
  25. package/lib/components/utils/DataQualityFunctionDefaults.d.ts +2 -0
  26. package/lib/components/utils/DataQualityFunctionDefaults.d.ts.map +1 -1
  27. package/lib/components/utils/DataQualityFunctionDefaults.js +14 -1
  28. package/lib/components/utils/DataQualityFunctionDefaults.js.map +1 -1
  29. package/lib/components/utils/DataQualityLambdaParameterExtractorVisitor.d.ts +6 -3
  30. package/lib/components/utils/DataQualityLambdaParameterExtractorVisitor.d.ts.map +1 -1
  31. package/lib/components/utils/DataQualityLambdaParameterExtractorVisitor.js +30 -6
  32. package/lib/components/utils/DataQualityLambdaParameterExtractorVisitor.js.map +1 -1
  33. package/lib/components/utils/DataQualityLambdaParameterParser.d.ts +9 -7
  34. package/lib/components/utils/DataQualityLambdaParameterParser.d.ts.map +1 -1
  35. package/lib/components/utils/DataQualityLambdaParameterParser.js +11 -4
  36. package/lib/components/utils/DataQualityLambdaParameterParser.js.map +1 -1
  37. package/lib/components/utils/DataQualityValidateFunctionToPureLambdaVisitor.d.ts +2 -1
  38. package/lib/components/utils/DataQualityValidateFunctionToPureLambdaVisitor.d.ts.map +1 -1
  39. package/lib/components/utils/DataQualityValidateFunctionToPureLambdaVisitor.js +15 -1
  40. package/lib/components/utils/DataQualityValidateFunctionToPureLambdaVisitor.js.map +1 -1
  41. package/lib/components/utils/DataQualityValidationDescriptionGeneratorVisitor.d.ts +2 -1
  42. package/lib/components/utils/DataQualityValidationDescriptionGeneratorVisitor.d.ts.map +1 -1
  43. package/lib/components/utils/DataQualityValidationDescriptionGeneratorVisitor.js +7 -1
  44. package/lib/components/utils/DataQualityValidationDescriptionGeneratorVisitor.js.map +1 -1
  45. package/lib/components/utils/DataQualityValidationFunction.d.ts +15 -4
  46. package/lib/components/utils/DataQualityValidationFunction.d.ts.map +1 -1
  47. package/lib/components/utils/DataQualityValidationFunction.js +8 -1
  48. package/lib/components/utils/DataQualityValidationFunction.js.map +1 -1
  49. package/lib/components/utils/DataQualityValidationFunctionCloningVisitor.d.ts +17 -13
  50. package/lib/components/utils/DataQualityValidationFunctionCloningVisitor.d.ts.map +1 -1
  51. package/lib/components/utils/DataQualityValidationFunctionCloningVisitor.js +76 -45
  52. package/lib/components/utils/DataQualityValidationFunctionCloningVisitor.js.map +1 -1
  53. package/lib/components/utils/DataQualityValidationFunctionFactory.d.ts +3 -2
  54. package/lib/components/utils/DataQualityValidationFunctionFactory.d.ts.map +1 -1
  55. package/lib/components/utils/DataQualityValidationFunctionFactory.js +17 -3
  56. package/lib/components/utils/DataQualityValidationFunctionFactory.js.map +1 -1
  57. package/lib/components/utils/DataQualityValidationFunctionModifier.d.ts +7 -5
  58. package/lib/components/utils/DataQualityValidationFunctionModifier.d.ts.map +1 -1
  59. package/lib/components/utils/DataQualityValidationFunctionModifier.js +12 -7
  60. package/lib/components/utils/DataQualityValidationFunctionModifier.js.map +1 -1
  61. package/lib/components/utils/DataQualityValidationFunctionObserver.d.ts +10 -9
  62. package/lib/components/utils/DataQualityValidationFunctionObserver.d.ts.map +1 -1
  63. package/lib/components/utils/DataQualityValidationFunctionObserver.js +79 -16
  64. package/lib/components/utils/DataQualityValidationFunctionObserver.js.map +1 -1
  65. package/lib/components/utils/DataQualityValidationNameGeneratorVisitor.d.ts +2 -1
  66. package/lib/components/utils/DataQualityValidationNameGeneratorVisitor.d.ts.map +1 -1
  67. package/lib/components/utils/DataQualityValidationNameGeneratorVisitor.js +11 -1
  68. package/lib/components/utils/DataQualityValidationNameGeneratorVisitor.js.map +1 -1
  69. package/lib/data-quality-custom-selector.css +1 -1
  70. package/lib/index.css +1 -1
  71. package/lib/package.json +1 -1
  72. package/package.json +7 -7
  73. package/src/components/DataQualityRelationLambdaGUIValidationEditor.tsx +8 -1
  74. package/src/components/DataQualityValidationFilterEditor.tsx +49 -12
  75. package/src/components/DataQualityValidationFunctionRenderer.tsx +15 -13
  76. package/src/components/DataQualityValidationHelperFunctionEditor.tsx +1 -1
  77. package/src/components/constants/DataQualityConstants.ts +4 -0
  78. package/src/components/states/DataQualityValidationLambdaFormState.ts +5 -1
  79. package/src/components/states/LambdaEditorWithGUIState.ts +3 -1
  80. package/src/components/utils/DataQualityFunctionDefaults.ts +18 -1
  81. package/src/components/utils/DataQualityLambdaParameterExtractorVisitor.ts +59 -4
  82. package/src/components/utils/DataQualityLambdaParameterParser.ts +28 -5
  83. package/src/components/utils/DataQualityValidateFunctionToPureLambdaVisitor.ts +25 -8
  84. package/src/components/utils/DataQualityValidationDescriptionGeneratorVisitor.ts +15 -7
  85. package/src/components/utils/DataQualityValidationFunction.ts +29 -4
  86. package/src/components/utils/DataQualityValidationFunctionCloningVisitor.ts +131 -77
  87. package/src/components/utils/DataQualityValidationFunctionFactory.ts +24 -1
  88. package/src/components/utils/DataQualityValidationFunctionModifier.ts +32 -1
  89. package/src/components/utils/DataQualityValidationFunctionObserver.ts +206 -105
  90. package/src/components/utils/DataQualityValidationNameGeneratorVisitor.ts +20 -8
@@ -13,7 +13,7 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import type { DataQualityValidationAssertionFunction, DataQualityValidationCustomHelperFunction, DataQualityValidationFilterCondition, DataQualityValidationFilterFunction, DataQualityValidationFunctionVisitor, DataQualityValidationLogicalGroupFunction } from './DataQualityValidationFunction.js';
16
+ import { type DataQualityValidationAssertionFunction, type DataQualityValidationCustomHelperFunction, type DataQualityValidationFilterCondition, type DataQualityValidationFilterFunction, type DataQualityValidationFunctionVisitor, type DataQualityValidationLogicalGroupFunction } from './DataQualityValidationFunction.js';
17
17
  export declare class DataQualityValidationNameGeneratorVisitor implements DataQualityValidationFunctionVisitor<string> {
18
18
  depth: number;
19
19
  visitAssertion(func: DataQualityValidationAssertionFunction): string;
@@ -21,6 +21,7 @@ export declare class DataQualityValidationNameGeneratorVisitor implements DataQu
21
21
  visitFilter(func: DataQualityValidationFilterFunction): string;
22
22
  visitFilterCondition(func: DataQualityValidationFilterCondition): string;
23
23
  visitLogicalGroup(func: DataQualityValidationLogicalGroupFunction): string;
24
+ visitPropertyGuarantee(): string;
24
25
  private composeName;
25
26
  private splitAndHashLongNames;
26
27
  private capitalizeFirstLetter;
@@ -1 +1 @@
1
- {"version":3,"file":"DataQualityValidationNameGeneratorVisitor.d.ts","sourceRoot":"","sources":["../../../src/components/utils/DataQualityValidationNameGeneratorVisitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,OAAO,KAAK,EACV,sCAAsC,EACtC,yCAAyC,EACzC,oCAAoC,EACpC,mCAAmC,EACnC,oCAAoC,EACpC,yCAAyC,EAC1C,MAAM,oCAAoC,CAAC;AAG5C,qBAAa,yCACX,YAAW,oCAAoC,CAAC,MAAM,CAAC;IAEvD,KAAK,SAAK;IACV,cAAc,CAAC,IAAI,EAAE,sCAAsC,GAAG,MAAM;IAIpE,iBAAiB,CAAC,IAAI,EAAE,yCAAyC,GAAG,MAAM;IA0B1E,WAAW,CAAC,IAAI,EAAE,mCAAmC,GAAG,MAAM;IAM9D,oBAAoB,CAAC,IAAI,EAAE,oCAAoC,GAAG,MAAM;IA0BxE,iBAAiB,CAAC,IAAI,EAAE,yCAAyC,GAAG,MAAM;IAgB1E,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,WAAW;CAwBpB"}
1
+ {"version":3,"file":"DataQualityValidationNameGeneratorVisitor.d.ts","sourceRoot":"","sources":["../../../src/components/utils/DataQualityValidationNameGeneratorVisitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,OAAO,EAEL,KAAK,sCAAsC,EAC3C,KAAK,yCAAyC,EAC9C,KAAK,oCAAoC,EACzC,KAAK,mCAAmC,EACxC,KAAK,oCAAoC,EACzC,KAAK,yCAAyC,EAC/C,MAAM,oCAAoC,CAAC;AAG5C,qBAAa,yCACX,YAAW,oCAAoC,CAAC,MAAM,CAAC;IAEvD,KAAK,SAAK;IACV,cAAc,CAAC,IAAI,EAAE,sCAAsC,GAAG,MAAM;IAIpE,iBAAiB,CAAC,IAAI,EAAE,yCAAyC,GAAG,MAAM;IA0B1E,WAAW,CAAC,IAAI,EAAE,mCAAmC,GAAG,MAAM;IAM9D,oBAAoB,CAAC,IAAI,EAAE,oCAAoC,GAAG,MAAM;IAiCxE,iBAAiB,CAAC,IAAI,EAAE,yCAAyC,GAAG,MAAM;IAgB1E,sBAAsB,IAAI,MAAM;IAIhC,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,WAAW;CAwBpB"}
@@ -15,6 +15,7 @@
15
15
  */
16
16
  import { CollectionInstanceValue, PrimitiveInstanceValue, } from '@finos/legend-graph';
17
17
  import { DataQualityFunctionDefaults } from './DataQualityFunctionDefaults.js';
18
+ import { DataQualityValidationPropertyGuarantee, } from './DataQualityValidationFunction.js';
18
19
  import { hashArray } from '@finos/legend-shared';
19
20
  export class DataQualityValidationNameGeneratorVisitor {
20
21
  depth = 0;
@@ -48,7 +49,13 @@ export class DataQualityValidationNameGeneratorVisitor {
48
49
  const { property, otherParams } = func.parameters;
49
50
  const values = [];
50
51
  const nameTemplate = DataQualityFunctionDefaults.getFunctionNameTemplate(func.name);
51
- const columnName = property.func.value.name;
52
+ let columnName = '';
53
+ if (property instanceof DataQualityValidationPropertyGuarantee) {
54
+ columnName = property.parameters.property.func.value.name;
55
+ }
56
+ else {
57
+ columnName = property.func.value.name;
58
+ }
52
59
  if (!columnName || !nameTemplate) {
53
60
  return '';
54
61
  }
@@ -72,6 +79,9 @@ export class DataQualityValidationNameGeneratorVisitor {
72
79
  }
73
80
  return `${leftName}${operator}${rightName}`;
74
81
  }
82
+ visitPropertyGuarantee() {
83
+ return '';
84
+ }
75
85
  composeName(columnName, params, nameTemplate) {
76
86
  let name = nameTemplate;
77
87
  name = name.replace(/\[column\]/gi, this.toCamelCase(columnName));
@@ -1 +1 @@
1
- {"version":3,"file":"DataQualityValidationNameGeneratorVisitor.js","sourceRoot":"","sources":["../../../src/components/utils/DataQualityValidationNameGeneratorVisitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DataQualityValidationNameGeneratorVisitor.js","sourceRoot":"","sources":["../../../src/components/utils/DataQualityValidationNameGeneratorVisitor.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /** @license @finos/legend-extension-dsl-data-quality v2.1.31
1
+ /** @license @finos/legend-extension-dsl-data-quality v2.1.32
2
2
  * Copyright (c) 2020-present, Goldman Sachs
3
3
  *
4
4
  * Licensed under the Apache License, Version 2.0 (the "License");
package/lib/index.css CHANGED
@@ -1,4 +1,4 @@
1
- /** @license @finos/legend-extension-dsl-data-quality v2.1.31
1
+ /** @license @finos/legend-extension-dsl-data-quality v2.1.32
2
2
  * Copyright (c) 2020-present, Goldman Sachs
3
3
  *
4
4
  * Licensed under the Apache License, Version 2.0 (the "License");
package/lib/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@finos/legend-extension-dsl-data-quality",
3
- "version": "2.1.31",
3
+ "version": "2.1.32",
4
4
  "description": "Legend extension for Data Quality",
5
5
  "keywords": [
6
6
  "legend",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@finos/legend-extension-dsl-data-quality",
3
- "version": "2.1.31",
3
+ "version": "2.1.32",
4
4
  "description": "Legend extension for Data Quality",
5
5
  "keywords": [
6
6
  "legend",
@@ -43,13 +43,13 @@
43
43
  },
44
44
  "dependencies": {
45
45
  "@finos/legend-application": "16.0.103",
46
- "@finos/legend-application-studio": "28.19.111",
46
+ "@finos/legend-application-studio": "28.19.112",
47
47
  "@finos/legend-art": "7.1.145",
48
- "@finos/legend-code-editor": "2.0.161",
49
- "@finos/legend-extension-dsl-data-space": "10.4.207",
50
- "@finos/legend-graph": "32.4.1",
51
- "@finos/legend-lego": "2.0.180",
52
- "@finos/legend-query-builder": "4.17.98",
48
+ "@finos/legend-code-editor": "2.0.162",
49
+ "@finos/legend-extension-dsl-data-space": "10.4.208",
50
+ "@finos/legend-graph": "32.4.2",
51
+ "@finos/legend-lego": "2.0.181",
52
+ "@finos/legend-query-builder": "4.17.99",
53
53
  "@finos/legend-shared": "11.0.23",
54
54
  "@finos/legend-storage": "3.0.144",
55
55
  "@types/react": "19.0.10",
@@ -50,7 +50,14 @@ export const DataQualityRelationLambdaGUIValidationEditor = observer(
50
50
  const { assertion, otherFunction } = dataQualityValidationLambdaFormState;
51
51
 
52
52
  return (
53
- <div className="data-quality-validation-gui-editor">
53
+ <div
54
+ className="data-quality-validation-gui-editor"
55
+ role="group"
56
+ tabIndex={-1}
57
+ onFocus={() =>
58
+ validationState.debouncedHandleValidationFormChange.cancel()
59
+ }
60
+ >
54
61
  <div className="data-quality-validation-gui-editor__functions-list">
55
62
  {otherFunction instanceof DataQualityValidationFilterFunction && (
56
63
  <DataQualityValidationFilterEditor
@@ -25,6 +25,7 @@ import {
25
25
  import {
26
26
  DataQualityValidationFilterCondition,
27
27
  DataQualityValidationLogicalGroupFunction,
28
+ DataQualityValidationPropertyGuarantee,
28
29
  type DataQualityValidationFilterFunction,
29
30
  } from './utils/DataQualityValidationFunction.js';
30
31
  import { DataQualityValidationFunctionRenderer } from './DataQualityValidationFunctionRenderer.js';
@@ -46,6 +47,7 @@ import {
46
47
  import { DataQualityValidationFunctionFactory } from './utils/DataQualityValidationFunctionFactory.js';
47
48
  import { DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS } from './constants/DataQualityConstants.js';
48
49
  import type { Option } from './DataQualityCustomSelector.js';
50
+ import { useRef } from 'react';
49
51
 
50
52
  const DataQualityValidationFilterConditionEditor = observer(
51
53
  (props: {
@@ -54,13 +56,20 @@ const DataQualityValidationFilterConditionEditor = observer(
54
56
  disabled: boolean;
55
57
  showAddButton: boolean;
56
58
  showDeleteButton: boolean;
57
- handleFunctionChange: (name: string, id: string) => void;
59
+ handleFunctionChange: (
60
+ name: string,
61
+ id: string,
62
+ isCurrentColOptional: boolean,
63
+ ) => void;
58
64
  handleColumnChange: (value: string) => void;
59
65
  handleFunctionParamChange: (
60
66
  param: PrimitiveInstanceValue | CollectionInstanceValue,
61
67
  index: number,
62
68
  ) => void;
63
- onAdd?: (operator: DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS) => void;
69
+ onAdd?: (
70
+ operator: DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS,
71
+ isCurrentColOptional: boolean,
72
+ ) => void;
64
73
  onDelete?: () => void;
65
74
  getFunctionOptions: (type: string) => Option[];
66
75
  }) => {
@@ -77,11 +86,19 @@ const DataQualityValidationFilterConditionEditor = observer(
77
86
  handleColumnChange,
78
87
  handleFunctionParamChange,
79
88
  } = props;
89
+
90
+ const functionParamsRef = useRef<
91
+ [PrimitiveInstanceValue | CollectionInstanceValue, number] | []
92
+ >([]);
80
93
  const { columnOptions } = validationState;
81
94
  const observerContext =
82
95
  validationState.editorStore.changeDetectionState.observerContext;
83
96
  const graph = validationState.editorStore.graphManagerState.graph;
84
- const column = condition.parameters.property;
97
+ const column =
98
+ condition.parameters.property instanceof
99
+ DataQualityValidationPropertyGuarantee
100
+ ? condition.parameters.property.parameters.property
101
+ : condition.parameters.property;
85
102
  const columnOption = columnOptions.find(
86
103
  ({ value }) => value === column.func.value.name,
87
104
  );
@@ -106,13 +123,20 @@ const DataQualityValidationFilterConditionEditor = observer(
106
123
  handleColumnChange(value);
107
124
  }}
108
125
  selectedColumn={columnOption}
109
- handleFunctionChange={handleFunctionChange}
126
+ handleFunctionChange={(name: string, id: string) => {
127
+ handleFunctionChange(name, id, columnOption?.isOptional ?? false);
128
+ }}
110
129
  handleFunctionParametersChange={(
111
130
  param: PrimitiveInstanceValue | CollectionInstanceValue,
112
131
  index: number,
113
132
  ) => {
114
133
  condition.parameters.otherParams[index] = param;
115
- handleFunctionParamChange(param, index);
134
+ functionParamsRef.current = [param, index];
135
+ }}
136
+ onInputBlur={() => {
137
+ if (functionParamsRef.current.length === 2) {
138
+ handleFunctionParamChange(...functionParamsRef.current);
139
+ }
116
140
  }}
117
141
  />
118
142
  {showAddButton && (
@@ -123,14 +147,20 @@ const DataQualityValidationFilterConditionEditor = observer(
123
147
  <MenuContent>
124
148
  <MenuContentItem
125
149
  onClick={() =>
126
- onAdd?.(DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS.AND)
150
+ onAdd?.(
151
+ DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS.AND,
152
+ columnOption?.isOptional ?? false,
153
+ )
127
154
  }
128
155
  >
129
156
  And
130
157
  </MenuContentItem>
131
158
  <MenuContentItem
132
159
  onClick={() => {
133
- onAdd?.(DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS.OR);
160
+ onAdd?.(
161
+ DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS.OR,
162
+ columnOption?.isOptional ?? false,
163
+ );
134
164
  }}
135
165
  >
136
166
  Or
@@ -209,7 +239,11 @@ const RenderConditionTree = observer(
209
239
  );
210
240
  }
211
241
 
212
- const handleFunctionChange = (name: string, id: string) => {
242
+ const handleFunctionChange = (
243
+ name: string,
244
+ id: string,
245
+ isCurrentColOptional: boolean,
246
+ ) => {
213
247
  const findAndChange = (
214
248
  node:
215
249
  | DataQualityValidationFilterCondition
@@ -225,6 +259,7 @@ const RenderConditionTree = observer(
225
259
  isLeftChild ? 'left' : 'right',
226
260
  functionFactory,
227
261
  observerContext,
262
+ isCurrentColOptional,
228
263
  );
229
264
  return true;
230
265
  }
@@ -267,13 +302,14 @@ const RenderConditionTree = observer(
267
302
  );
268
303
  validationState.debouncedHandleValidationFormChange();
269
304
  }}
270
- onAdd={(newOperator) => {
305
+ onAdd={(newOperator, isCurrentColOptional) => {
271
306
  dataQualityValidationFilterFunction_transformConditionToLogicalGroup(
272
307
  validationFunction,
273
308
  condition,
274
309
  newOperator,
275
310
  functionFactory,
276
311
  observerContext,
312
+ isCurrentColOptional,
277
313
  );
278
314
  validationState.debouncedHandleValidationFormChange();
279
315
  }}
@@ -327,17 +363,18 @@ export const DataQualityValidationFilterEditor = observer(
327
363
  type,
328
364
  )
329
365
  }
330
- handleFunctionChange={(name) => {
331
- handleValidationBodyChange(name);
366
+ handleFunctionChange={(name, _, isCurrentColOptional) => {
367
+ handleValidationBodyChange(name, isCurrentColOptional);
332
368
  validationState.debouncedHandleValidationFormChange();
333
369
  }}
334
- onAdd={(operator) => {
370
+ onAdd={(operator, isCurrentColOptional) => {
335
371
  dataQualityValidationFilterFunction_addLogicalOperation(
336
372
  validationFunction,
337
373
  body,
338
374
  operator,
339
375
  functionFactory,
340
376
  observerContext,
377
+ isCurrentColOptional,
341
378
  );
342
379
  }}
343
380
  handleColumnChange={() => {
@@ -30,29 +30,25 @@ import {
30
30
  } from '@finos/legend-graph';
31
31
  import type { Option } from './DataQualityCustomSelector.js';
32
32
  import { useState } from 'react';
33
-
34
- interface ColumnOption {
35
- value: string;
36
- label: string;
37
- type: string;
38
- }
33
+ import type { ColumnOption } from './states/LambdaEditorWithGUIState.js';
39
34
 
40
35
  interface DataQualityValidationFunctionRendererProps {
41
36
  id: string;
42
37
  columnOptions: ColumnOption[];
43
38
  functionOptions?: Option[];
44
- handleColChange: (value: string, type: string) => void;
39
+ handleColChange: (value: string, type: string, isOptional: boolean) => void;
45
40
  readOnly: boolean;
46
41
  selectedColumn: ColumnOption | undefined;
47
42
  functionName: string;
48
43
  functionParameters: ValueSpecification[];
49
44
  handleFunctionChange: (name: string, id: string) => void;
50
- handleFunctionParametersChange: (
45
+ handleFunctionParametersChange?: (
51
46
  param: PrimitiveInstanceValue | CollectionInstanceValue,
52
47
  index: number,
53
48
  ) => void;
54
49
  graph: PureModel;
55
50
  observerContext: ObserverContext;
51
+ onInputBlur?: () => void;
56
52
  }
57
53
 
58
54
  export function DataQualityValidationFunctionRenderer({
@@ -68,7 +64,8 @@ export function DataQualityValidationFunctionRenderer({
68
64
  functionName,
69
65
  graph,
70
66
  observerContext,
71
- }: DataQualityValidationFunctionRendererProps) {
67
+ onInputBlur,
68
+ }: Readonly<DataQualityValidationFunctionRendererProps>) {
72
69
  const [initializeAsEditable, setInitializeAsEditable] = useState(false);
73
70
 
74
71
  return (
@@ -76,8 +73,8 @@ export function DataQualityValidationFunctionRenderer({
76
73
  <div className="data-quality-validation-gui-editor__function__parameter">
77
74
  <RenderColumn
78
75
  column={selectedColumn}
79
- onChange={({ value, type }) => {
80
- handleColChange(value, type);
76
+ onChange={({ value, type, isOptional }) => {
77
+ handleColChange(value, type, isOptional);
81
78
  }}
82
79
  options={columnOptions}
83
80
  disabled={readOnly}
@@ -108,14 +105,19 @@ export function DataQualityValidationFunctionRenderer({
108
105
  className="data-quality-validation-gui-editor__function__parameter data-quality-validation-gui-editor__function__parameter--value"
109
106
  key={getParameterKey(param.hashCode, idx)}
110
107
  onFocus={() => setInitializeAsEditable(true)}
111
- onBlur={() => setInitializeAsEditable(false)}
108
+ onBlur={() => {
109
+ setInitializeAsEditable(false);
110
+ onInputBlur?.();
111
+ }}
112
+ role="group"
113
+ tabIndex={-1}
112
114
  >
113
115
  <EditableBasicValueSpecificationEditor
114
116
  valueSpecification={param}
115
117
  enableExpressionCalculation={false}
116
118
  displayAsString={!isPrimitiveNumber(type)}
117
119
  setValueSpecification={(newValue) => {
118
- handleFunctionParametersChange(
120
+ handleFunctionParametersChange?.(
119
121
  newValue as PrimitiveInstanceValue | CollectionInstanceValue,
120
122
  idx,
121
123
  );
@@ -70,7 +70,7 @@ export const DataQualityValidationHelperFunctionEditor = observer(
70
70
  handleValidationBodyChange(name);
71
71
  validationState.debouncedHandleValidationFormChange();
72
72
  }}
73
- handleFunctionParametersChange={() => {
73
+ onInputBlur={() => {
74
74
  validationState.debouncedHandleValidationFormChange();
75
75
  }}
76
76
  />
@@ -60,6 +60,10 @@ export enum DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS {
60
60
  AND = 'and',
61
61
  }
62
62
 
63
+ export enum DATA_QUALITY_VALIDATION_PROPERTY_GUARANTEE_FUNCTIONS {
64
+ TO_ONE = 'toOne',
65
+ }
66
+
63
67
  export enum PARAMETER_COMPONENTS {
64
68
  LIST = 'list',
65
69
  NUMBER = 'number',
@@ -121,7 +121,10 @@ export class DataQualityValidationLambdaFormState {
121
121
  }
122
122
  };
123
123
 
124
- handleValidationBodyChange = (name: string) => {
124
+ handleValidationBodyChange = (
125
+ name: string,
126
+ isCurrentColOptional?: boolean,
127
+ ) => {
125
128
  const currentFunc = this.rule.parameters.otherParam;
126
129
 
127
130
  if (currentFunc) {
@@ -129,6 +132,7 @@ export class DataQualityValidationLambdaFormState {
129
132
  name,
130
133
  this.validationFuncFactory,
131
134
  this.observerContext,
135
+ isCurrentColOptional ?? false,
132
136
  );
133
137
 
134
138
  this.rule.parameters.otherParam = currentFunc.accept<
@@ -48,6 +48,7 @@ export type ColumnOption = {
48
48
  value: string;
49
49
  label: string;
50
50
  type: string;
51
+ isOptional: boolean;
51
52
  };
52
53
 
53
54
  export abstract class LambdaEditorWithGUIState extends LambdaEditorState {
@@ -256,13 +257,14 @@ export abstract class LambdaEditorWithGUIState extends LambdaEditorState {
256
257
  }
257
258
 
258
259
  setColumnOptions(columns: RelationTypeColumnMetadata[]) {
259
- this.columnOptions = columns.map(({ name, type }) => {
260
+ this.columnOptions = columns.map(({ name, type, multiplicity }) => {
260
261
  return {
261
262
  value: name,
262
263
  label: name,
263
264
  type: getPrimitiveTypeEnumFromPrecisePrimitiveTypeEnum(
264
265
  type as PRECISE_PRIMITIVE_TYPE,
265
266
  ),
267
+ isOptional: multiplicity.lowerBound === 0,
266
268
  };
267
269
  });
268
270
  }
@@ -279,7 +279,7 @@ export class DataQualityFunctionDefaults {
279
279
  [DATA_QUALITY_FILTER_VALIDATION_HELPER_FUNCTIONS.ROWS_WITH_NON_EMPTY_COLUMN]:
280
280
  'Expect [column] to be null',
281
281
  [DATA_QUALITY_FILTER_VALIDATION_HELPER_FUNCTIONS.ROWS_WITH_COLUMN_LONGER_THAN]:
282
- 'Expect [column] to have length [param-1]',
282
+ 'Expect [column] to be shorter than [param-1]',
283
283
  [DATA_QUALITY_FILTER_VALIDATION_HELPER_FUNCTIONS.ROWS_WITH_NEGATIVE_VALUE]:
284
284
  'Expect [column] to be positive',
285
285
  [DATA_QUALITY_FILTER_VALIDATION_HELPER_FUNCTIONS.ROWS_WITH_COLUMN_DIFFERS_FROM_PATTERN]:
@@ -311,4 +311,21 @@ export class DataQualityFunctionDefaults {
311
311
  'Expect [column] not match [param-1]',
312
312
  [DATA_QUALITY_VALIDATION_PURE_FUNCTIONS.FILTER]: '',
313
313
  };
314
+
315
+ private static readonly FUNCTIONS_ACCEPTING_OPTIONAL: Set<string> = new Set([
316
+ DATA_QUALITY_VALIDATION_PURE_FUNCTIONS.EQUAL,
317
+ DATA_QUALITY_VALIDATION_PURE_FUNCTIONS.IS_EMPTY,
318
+ DATA_QUALITY_VALIDATION_PURE_FUNCTIONS.IS_NOT_EMPTY,
319
+ DATA_QUALITY_VALIDATION_PURE_FUNCTIONS.IN,
320
+ DATA_QUALITY_VALIDATION_PURE_FUNCTIONS.GREATER_THAN,
321
+ DATA_QUALITY_VALIDATION_PURE_FUNCTIONS.GREATER_THAN_EQUAL,
322
+ DATA_QUALITY_VALIDATION_PURE_FUNCTIONS.LESS_THAN,
323
+ DATA_QUALITY_VALIDATION_PURE_FUNCTIONS.LESS_THAN_EQUAL,
324
+ ]);
325
+
326
+ static getIsPureFunctionColumnRequired(functionName: string): boolean {
327
+ return !DataQualityFunctionDefaults.FUNCTIONS_ACCEPTING_OPTIONAL.has(
328
+ functionName,
329
+ );
330
+ }
314
331
  }
@@ -21,14 +21,16 @@ import type {
21
21
  DataQualityValidationCustomHelperFunction,
22
22
  DataQualityValidationFilterCondition,
23
23
  DataQualityValidationLogicalGroupFunction,
24
+ DataQualityValidationPropertyGuarantee,
24
25
  } from './DataQualityValidationFunction.js';
25
26
  import {
26
27
  DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS,
28
+ DATA_QUALITY_VALIDATION_PROPERTY_GUARANTEE_FUNCTIONS,
27
29
  SUPPORTED_TYPES,
28
30
  } from '../constants/DataQualityConstants.js';
29
31
  import { assertTrue, UnsupportedOperationError } from '@finos/legend-shared';
30
32
  import {
31
- type AbstractPropertyExpression,
33
+ AbstractPropertyExpression,
32
34
  type CollectionInstanceValue,
33
35
  type PrimitiveInstanceValue,
34
36
  type ObserverContext,
@@ -37,16 +39,19 @@ import {
37
39
  } from '@finos/legend-graph';
38
40
  import {
39
41
  DataQualityLambdaParameterParser,
42
+ ParsedFunctionExpression,
40
43
  type LambdaBody,
41
44
  } from './DataQualityLambdaParameterParser.js';
42
45
  import { DataQualityValidationFunctionFactory } from './DataQualityValidationFunctionFactory.js';
43
46
  import {
44
47
  observe_DataQualityValidationFilterCondition,
45
48
  observe_DataQualityValidationLogicalGroupFunction,
49
+ observe_DataQualityValidationPropertyGuarantee,
46
50
  } from './DataQualityValidationFunctionObserver.js';
47
51
 
48
52
  export class DataQualityLambdaParameterExtractorVisitor
49
- implements DataQualityValidationFunctionVisitor<void>
53
+ implements
54
+ DataQualityValidationFunctionVisitor<void | DataQualityValidationPropertyGuarantee>
50
55
  {
51
56
  private lambdaBody: LambdaBody;
52
57
  private graph: PureModel;
@@ -206,7 +211,7 @@ export class DataQualityLambdaParameterExtractorVisitor
206
211
  );
207
212
 
208
213
  const {
209
- processedParameters: [property, ...otherParams],
214
+ processedParameters: [firstParam, ...otherParams],
210
215
  } = DataQualityLambdaParameterParser.processFunctionParameter(
211
216
  this.filterBody as LambdaBody,
212
217
  this.graph,
@@ -217,10 +222,60 @@ export class DataQualityLambdaParameterExtractorVisitor
217
222
  | PrimitiveInstanceValue
218
223
  | CollectionInstanceValue
219
224
  )[];
220
- func.parameters.property = property as AbstractPropertyExpression;
225
+ if (firstParam instanceof AbstractPropertyExpression) {
226
+ func.parameters.property = firstParam;
227
+ } else if (
228
+ firstParam instanceof ParsedFunctionExpression &&
229
+ matchFunctionName(
230
+ firstParam.name,
231
+ Object.values(DATA_QUALITY_VALIDATION_PROPERTY_GUARANTEE_FUNCTIONS),
232
+ )
233
+ ) {
234
+ func.parameters.property = new DataQualityValidationFunctionFactory(
235
+ this.graph,
236
+ this.observerContext,
237
+ )
238
+ .createPropertyGuaranteeFunction(firstParam.name)
239
+ .accept(this, {
240
+ propertyGuaranteeParameters: firstParam.processedParameters,
241
+ }) as unknown as DataQualityValidationPropertyGuarantee;
242
+ } else {
243
+ throw new UnsupportedOperationError(
244
+ 'Logical function cannot be used as property parameter in filter condition',
245
+ );
246
+ }
221
247
  observe_DataQualityValidationFilterCondition(func);
222
248
  }
223
249
 
250
+ visitPropertyGuarantee(
251
+ func: DataQualityValidationPropertyGuarantee,
252
+ context: {
253
+ propertyGuaranteeParameters: ParsedFunctionExpression['processedParameters'];
254
+ },
255
+ ): DataQualityValidationPropertyGuarantee {
256
+ const { propertyGuaranteeParameters } = context;
257
+ assertTrue(
258
+ Boolean(propertyGuaranteeParameters),
259
+ `Expected ${func.name} parameters to be present`,
260
+ );
261
+
262
+ assertTrue(
263
+ propertyGuaranteeParameters.length === 1,
264
+ `Expected ${func.name} parameters to be 1, got ${propertyGuaranteeParameters.length}`,
265
+ );
266
+
267
+ const propertyParam = propertyGuaranteeParameters[0];
268
+
269
+ if (propertyParam instanceof AbstractPropertyExpression) {
270
+ func.parameters.property = propertyParam;
271
+ return observe_DataQualityValidationPropertyGuarantee(func);
272
+ }
273
+
274
+ throw new UnsupportedOperationError(
275
+ 'Expected property parameter to be an AbstractPropertyExpression',
276
+ );
277
+ }
278
+
224
279
  visitLogicalGroup(func: DataQualityValidationLogicalGroupFunction) {
225
280
  assertTrue(Boolean(this.filterBody), 'Expected filter body to be present');
226
281
 
@@ -36,6 +36,8 @@ import {
36
36
  observe_SimpleFunctionExpression,
37
37
  type ValueSpecification,
38
38
  observe_VariableExpression,
39
+ type CollectionInstanceValue,
40
+ type PrimitiveInstanceValue,
39
41
  } from '@finos/legend-graph';
40
42
  import {
41
43
  buildPrimitiveCollectionInstanceValue,
@@ -54,6 +56,24 @@ export type LambdaBody = {
54
56
  property?: string;
55
57
  };
56
58
 
59
+ export class ParsedFunctionExpression {
60
+ name: string;
61
+ processedParameters: (
62
+ | CollectionInstanceValue
63
+ | PrimitiveInstanceValue
64
+ | AbstractPropertyExpression
65
+ | ParsedFunctionExpression
66
+ )[];
67
+
68
+ constructor(
69
+ name: string,
70
+ processedParameters: ParsedFunctionExpression['processedParameters'] = [],
71
+ ) {
72
+ this.name = name;
73
+ this.processedParameters = processedParameters;
74
+ }
75
+ }
76
+
57
77
  export class DataQualityLambdaParameterParser {
58
78
  static processPrimitiveParameter(
59
79
  param: LambdaBody,
@@ -192,7 +212,7 @@ export class DataQualityLambdaParameterParser {
192
212
  { parameters = [], function: name = '' }: LambdaBody,
193
213
  graph: PureModel,
194
214
  observerContext: ObserverContext,
195
- ) {
215
+ ): ParsedFunctionExpression {
196
216
  const processedParameters = parameters.map((parameter) => {
197
217
  if (
198
218
  DataQualityLambdaParameterParser.isSupportedPrimitive(parameter._type)
@@ -215,6 +235,12 @@ export class DataQualityLambdaParameterParser {
215
235
  graph,
216
236
  observerContext,
217
237
  );
238
+ case SUPPORTED_TYPES.FUNCTION:
239
+ return DataQualityLambdaParameterParser.processFunctionParameter(
240
+ parameter,
241
+ graph,
242
+ observerContext,
243
+ );
218
244
  default:
219
245
  throw new UnsupportedOperationError(
220
246
  `Cannot process type: ${parameter._type}`,
@@ -223,10 +249,7 @@ export class DataQualityLambdaParameterParser {
223
249
  }
224
250
  });
225
251
 
226
- return {
227
- name,
228
- processedParameters,
229
- };
252
+ return new ParsedFunctionExpression(name, processedParameters);
230
253
  }
231
254
 
232
255
  static createSimpleFunctionExpression(