@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
@@ -19,13 +19,14 @@ import {
19
19
  SUPPORTED_TYPES,
20
20
  } from '../constants/DataQualityConstants.js';
21
21
  import type { LambdaBody } from './DataQualityLambdaParameterParser.js';
22
- import type {
23
- DataQualityValidationFilterFunction,
24
- DataQualityValidationCustomHelperFunction,
25
- DataQualityValidationAssertionFunction,
26
- DataQualityValidationFunctionVisitor,
27
- DataQualityValidationFilterCondition,
28
- DataQualityValidationLogicalGroupFunction,
22
+ import {
23
+ type DataQualityValidationFilterFunction,
24
+ type DataQualityValidationCustomHelperFunction,
25
+ type DataQualityValidationAssertionFunction,
26
+ type DataQualityValidationFunctionVisitor,
27
+ type DataQualityValidationFilterCondition,
28
+ type DataQualityValidationLogicalGroupFunction,
29
+ DataQualityValidationPropertyGuarantee,
29
30
  } from './DataQualityValidationFunction.js';
30
31
  import type {
31
32
  GraphManagerState,
@@ -141,7 +142,11 @@ export class DataQualityValidateFunctionToPureLambdaVisitor
141
142
  const { property, otherParams } = func.parameters;
142
143
  const functionParameters: LambdaBody[] = [];
143
144
 
144
- functionParameters.push(this.serializeValueSpecification(property));
145
+ if (property instanceof DataQualityValidationPropertyGuarantee) {
146
+ functionParameters.push(property.accept(this));
147
+ } else {
148
+ functionParameters.push(this.serializeValueSpecification(property));
149
+ }
145
150
 
146
151
  if (otherParams.length > 0) {
147
152
  otherParams.forEach((param) => {
@@ -168,4 +173,16 @@ export class DataQualityValidateFunctionToPureLambdaVisitor
168
173
  parameters: [leftLambdaBody, rightLambdaBody],
169
174
  } as LambdaBody;
170
175
  }
176
+
177
+ visitPropertyGuarantee(
178
+ func: DataQualityValidationPropertyGuarantee,
179
+ ): LambdaBody {
180
+ const { property } = func.parameters;
181
+
182
+ return {
183
+ _type: SUPPORTED_TYPES.FUNCTION,
184
+ function: func.name,
185
+ parameters: [this.serializeValueSpecification(property)],
186
+ } as LambdaBody;
187
+ }
171
188
  }
@@ -15,12 +15,13 @@
15
15
  */
16
16
 
17
17
  import { DataQualityFunctionDefaults } from './DataQualityFunctionDefaults.js';
18
- import type {
19
- DataQualityValidationFunctionVisitor,
20
- DataQualityValidationFilterFunction,
21
- DataQualityValidationCustomHelperFunction,
22
- DataQualityValidationFilterCondition,
23
- DataQualityValidationLogicalGroupFunction,
18
+ import {
19
+ type DataQualityValidationFunctionVisitor,
20
+ type DataQualityValidationFilterFunction,
21
+ type DataQualityValidationCustomHelperFunction,
22
+ type DataQualityValidationFilterCondition,
23
+ type DataQualityValidationLogicalGroupFunction,
24
+ DataQualityValidationPropertyGuarantee,
24
25
  } from './DataQualityValidationFunction.js';
25
26
  import {
26
27
  CollectionInstanceValue,
@@ -34,6 +35,10 @@ export class DataQualityValidationDescriptionGeneratorVisitor
34
35
  return '';
35
36
  }
36
37
 
38
+ visitPropertyGuarantee(func: DataQualityValidationPropertyGuarantee): string {
39
+ return '';
40
+ }
41
+
37
42
  visitFilter(func: DataQualityValidationFilterFunction): string {
38
43
  const { parameters } = func;
39
44
  const { lambda } = parameters;
@@ -78,7 +83,10 @@ export class DataQualityValidationDescriptionGeneratorVisitor
78
83
  const values: string[] = [];
79
84
  const description =
80
85
  DataQualityFunctionDefaults.getFunctionDescriptionTemplate(func.name);
81
- const columnName = property.func.value.name;
86
+ const columnName =
87
+ property instanceof DataQualityValidationPropertyGuarantee
88
+ ? property.parameters.property.func.value.name
89
+ : property.func.value.name;
82
90
 
83
91
  if (!columnName || !description) {
84
92
  return '';
@@ -61,10 +61,14 @@ export interface FilterValidationParameters extends BaseValidationParameters {
61
61
  }
62
62
 
63
63
  export interface FilterConditionParameters {
64
- property: AbstractPropertyExpression;
64
+ property: AbstractPropertyExpression | DataQualityValidationPropertyGuarantee;
65
65
  otherParams: (PrimitiveInstanceValue | CollectionInstanceValue)[];
66
66
  }
67
67
 
68
+ export interface PropertyGuaranteeParameters {
69
+ property: AbstractPropertyExpression;
70
+ }
71
+
68
72
  export interface LogicalGroupValidationParameters {
69
73
  left:
70
74
  | DataQualityValidationFilterCondition
@@ -103,6 +107,10 @@ export interface DataQualityValidationFunctionVisitor<T> {
103
107
  visitCustomHelper(func: DataQualityValidationCustomHelperFunction): T;
104
108
  visitFilterCondition(func: DataQualityValidationFilterCondition): T;
105
109
  visitLogicalGroup(func: DataQualityValidationLogicalGroupFunction): T;
110
+ visitPropertyGuarantee(
111
+ func: DataQualityValidationPropertyGuarantee,
112
+ context?: unknown,
113
+ ): T;
106
114
  }
107
115
 
108
116
  export class DataQualityValidationFilterFunction extends DataQualityValidationFunction<FilterValidationParameters> {
@@ -120,21 +128,38 @@ export class DataQualityValidationFilterFunction extends DataQualityValidationFu
120
128
  }
121
129
  }
122
130
 
123
- export class DataQualityValidationFilterCondition extends DataQualityValidationFunction<FilterConditionParameters> {
131
+ abstract class AbstractDataQualityValidationFilterCondition<
132
+ T,
133
+ > extends DataQualityValidationFunction<T> {
124
134
  name: string;
125
- parameters: FilterConditionParameters;
135
+ parameters: T;
126
136
 
127
- constructor(name: string, parameters: FilterConditionParameters) {
137
+ constructor(name: string, parameters: T) {
128
138
  super();
129
139
  this.name = name;
130
140
  this.parameters = parameters;
131
141
  }
132
142
 
143
+ abstract override accept<R>(
144
+ visitor: DataQualityValidationFunctionVisitor<R>,
145
+ ): R;
146
+ }
147
+
148
+ export class DataQualityValidationFilterCondition extends AbstractDataQualityValidationFilterCondition<FilterConditionParameters> {
133
149
  accept<R>(visitor: DataQualityValidationFunctionVisitor<R>): R {
134
150
  return visitor.visitFilterCondition(this);
135
151
  }
136
152
  }
137
153
 
154
+ export class DataQualityValidationPropertyGuarantee extends AbstractDataQualityValidationFilterCondition<PropertyGuaranteeParameters> {
155
+ override accept<R>(
156
+ visitor: DataQualityValidationFunctionVisitor<R>,
157
+ context?: unknown,
158
+ ): R {
159
+ return visitor.visitPropertyGuarantee(this, context);
160
+ }
161
+ }
162
+
138
163
  export class DataQualityValidationLogicalGroupFunction extends DataQualityValidationFunction<LogicalGroupValidationParameters> {
139
164
  name: DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS;
140
165
  parameters: LogicalGroupValidationParameters;
@@ -19,6 +19,7 @@ import {
19
19
  type DataQualityValidationFunctionVisitor,
20
20
  DataQualityValidationFilterCondition,
21
21
  type DataQualityValidationLogicalGroupFunction,
22
+ DataQualityValidationPropertyGuarantee,
22
23
  } from '../utils/DataQualityValidationFunction.js';
23
24
  import { assertType, UnsupportedOperationError } from '@finos/legend-shared';
24
25
  import type { DataQualityValidationFunctionFactory } from './DataQualityValidationFunctionFactory.js';
@@ -34,25 +35,112 @@ import {
34
35
  type AbstractProperty,
35
36
  Multiplicity,
36
37
  } from '@finos/legend-graph';
37
- import { DATA_QUALITY_FILTER_VALIDATION_HELPER_FUNCTIONS } from '../constants/DataQualityConstants.js';
38
38
  import {
39
- cloneAbstractPropertyExpression,
39
+ DATA_QUALITY_FILTER_VALIDATION_HELPER_FUNCTIONS,
40
+ DATA_QUALITY_VALIDATION_PROPERTY_GUARANTEE_FUNCTIONS,
41
+ } from '../constants/DataQualityConstants.js';
42
+ import {
40
43
  cloneValueSpecification,
41
44
  instanceValue_setValues,
42
- propertyExpression_setFunc,
43
45
  } from '@finos/legend-query-builder';
44
46
  import {
45
47
  observe_DataQualityValidationCustomHelperFunction,
46
48
  observe_DataQualityValidationFilterCondition,
47
49
  observe_DataQualityValidationFilterFunction,
50
+ observe_DataQualityValidationPropertyGuarantee,
48
51
  } from './DataQualityValidationFunctionObserver.js';
52
+ import { dataQualityValidationLogicalGroupFunction_setParametersValues } from './DataQualityValidationFunctionModifier.js';
53
+ import { DataQualityFunctionDefaults } from './DataQualityFunctionDefaults.js';
54
+
55
+ const VISITOR_ERROR = new UnsupportedOperationError('Visitor not implemented');
56
+
57
+ export type DataQualityValidationFilterFunctions =
58
+ | DataQualityValidationFilterCondition
59
+ | DataQualityValidationLogicalGroupFunction;
60
+
61
+ export class DataQualityValidationFilterFunctionsCloningVisitor
62
+ implements
63
+ DataQualityValidationFunctionVisitor<DataQualityValidationFilterFunctions>
64
+ {
65
+ private newName: string;
66
+ private cloneFactory: DataQualityValidationFunctionFactory;
67
+ private observerContext: ObserverContext;
68
+ private readonly isCurrentColOptional: boolean;
69
+
70
+ constructor(
71
+ newName: string,
72
+ cloneFactory: DataQualityValidationFunctionFactory,
73
+ observerContext: ObserverContext,
74
+ isCurrentColOptional: boolean,
75
+ ) {
76
+ this.newName = newName;
77
+ this.cloneFactory = cloneFactory;
78
+ this.observerContext = observerContext;
79
+ this.isCurrentColOptional = isCurrentColOptional;
80
+ }
81
+
82
+ visitAssertion(): DataQualityValidationFilterFunctions {
83
+ throw VISITOR_ERROR;
84
+ }
85
+
86
+ visitCustomHelper(): DataQualityValidationFilterFunctions {
87
+ throw VISITOR_ERROR;
88
+ }
89
+
90
+ visitFilter(): DataQualityValidationFilterFunctions {
91
+ throw VISITOR_ERROR;
92
+ }
93
+
94
+ visitFilterCondition(func: DataQualityValidationFilterCondition) {
95
+ const currentColumn =
96
+ func.parameters.property instanceof AbstractPropertyExpression
97
+ ? func.parameters.property
98
+ : func.parameters.property.parameters.property;
99
+ const clone = this.cloneFactory.createFilterConditionFunction(
100
+ this.newName,
101
+ currentColumn.func.value.name,
102
+ );
103
+
104
+ const isPureFunctionColumnRequired =
105
+ DataQualityFunctionDefaults.getIsPureFunctionColumnRequired(this.newName);
106
+
107
+ if (isPureFunctionColumnRequired && this.isCurrentColOptional) {
108
+ clone.parameters.property =
109
+ this.cloneFactory.createPropertyGuaranteeFunction(
110
+ DATA_QUALITY_VALIDATION_PROPERTY_GUARANTEE_FUNCTIONS.TO_ONE,
111
+ currentColumn.func.value.name,
112
+ );
113
+ dataQualityValidationLogicalGroupFunction_setParametersValues(
114
+ clone.parameters.property.parameters.property,
115
+ currentColumn.parametersValues.map((param) =>
116
+ cloneValueSpecification(param, this.observerContext),
117
+ ),
118
+ );
119
+ } else {
120
+ dataQualityValidationLogicalGroupFunction_setParametersValues(
121
+ clone.parameters.property as AbstractPropertyExpression,
122
+ currentColumn.parametersValues.map((param) =>
123
+ cloneValueSpecification(param, this.observerContext),
124
+ ),
125
+ );
126
+ }
127
+
128
+ return observe_DataQualityValidationFilterCondition(clone);
129
+ }
130
+
131
+ visitPropertyGuarantee(): DataQualityValidationFilterCondition {
132
+ throw VISITOR_ERROR;
133
+ }
134
+
135
+ visitLogicalGroup(func: DataQualityValidationLogicalGroupFunction) {
136
+ return func;
137
+ }
138
+ }
49
139
 
50
140
  type AnyDataQualityValidationFunction =
51
141
  | DataQualityValidationFilterFunction
52
142
  | DataQualityValidationCustomHelperFunction;
53
143
 
54
- const VISITOR_ERROR = new UnsupportedOperationError('Visitor not implemented');
55
-
56
144
  export class DataQualityValidationFunctionCloningVisitor
57
145
  implements
58
146
  DataQualityValidationFunctionVisitor<AnyDataQualityValidationFunction>
@@ -60,15 +148,18 @@ export class DataQualityValidationFunctionCloningVisitor
60
148
  private newName: string;
61
149
  private cloneFactory: DataQualityValidationFunctionFactory;
62
150
  private observerContext: ObserverContext;
151
+ private readonly isCurrentColOptional: boolean;
63
152
 
64
153
  constructor(
65
154
  newName: string,
66
155
  cloneFactory: DataQualityValidationFunctionFactory,
67
156
  observerContext: ObserverContext,
157
+ isCurrentColOptional: boolean,
68
158
  ) {
69
159
  this.newName = newName;
70
160
  this.cloneFactory = cloneFactory;
71
161
  this.observerContext = observerContext;
162
+ this.isCurrentColOptional = isCurrentColOptional;
72
163
  }
73
164
 
74
165
  visitAssertion(): AnyDataQualityValidationFunction {
@@ -83,24 +174,32 @@ export class DataQualityValidationFunctionCloningVisitor
83
174
  throw VISITOR_ERROR;
84
175
  }
85
176
 
177
+ visitPropertyGuarantee(): AnyDataQualityValidationFunction {
178
+ throw VISITOR_ERROR;
179
+ }
180
+
86
181
  visitFilter(func: DataQualityValidationFilterFunction) {
87
- const clone = this.createFunctionForCloning();
88
182
  const body = func.parameters.lambda.body;
89
183
  assertType(body, DataQualityValidationFilterCondition);
90
- const property = body.parameters.property;
184
+ let property = body.parameters.property;
185
+ if (property instanceof DataQualityValidationPropertyGuarantee) {
186
+ property = property.parameters.property;
187
+ }
188
+ const clone = this.createFunctionForCloning();
91
189
  clone.id = func.id;
92
190
 
93
191
  if (clone instanceof DataQualityValidationCustomHelperFunction) {
94
192
  return this.updateCustomHelpFunctionCol(clone, property.func.value.name);
95
193
  }
96
194
 
97
- (
98
- clone.parameters.lambda.body as DataQualityValidationFilterCondition
99
- ).parameters.property = cloneAbstractPropertyExpression(
100
- property,
195
+ const visitor = new DataQualityValidationFilterFunctionsCloningVisitor(
196
+ this.newName,
197
+ this.cloneFactory,
101
198
  this.observerContext,
199
+ this.isCurrentColOptional,
102
200
  );
103
201
 
202
+ clone.parameters.lambda.body = body.accept(visitor);
104
203
  return clone;
105
204
  }
106
205
 
@@ -145,12 +244,9 @@ export class DataQualityValidationFunctionCloningVisitor
145
244
  );
146
245
  }
147
246
 
148
- const clone = this.cloneFactory.createFilterFunction();
149
- clone.parameters.lambda.body = observe_DataQualityValidationFilterCondition(
150
- this.cloneFactory.createFilterChildFunction(this.newName),
247
+ return observe_DataQualityValidationFilterFunction(
248
+ this.cloneFactory.createFilterFunction(),
151
249
  );
152
-
153
- return observe_DataQualityValidationFilterFunction(clone);
154
250
  }
155
251
 
156
252
  private updateCustomHelpFunctionCol(
@@ -173,82 +269,40 @@ export class DataQualityValidationFunctionCloningVisitor
173
269
  col: string,
174
270
  variableRef?: VariableExpression,
175
271
  ) {
176
- assertType(
177
- clone.parameters.lambda.body,
178
- DataQualityValidationFilterCondition,
179
- );
180
-
181
272
  const property = new AbstractPropertyExpression('');
182
273
  property.func = PropertyExplicitReference.create({
183
274
  name: col,
184
275
  } as AbstractProperty);
185
-
186
276
  property.parametersValues = [
187
277
  cloneValueSpecification(
188
278
  variableRef ?? new VariableExpression('row', Multiplicity.ZERO),
189
279
  this.observerContext,
190
280
  ),
191
281
  ];
192
-
193
282
  observe_AbstractPropertyExpression(property, this.observerContext);
194
- clone.parameters.lambda.body.parameters.property = property;
195
- return clone;
196
- }
197
- }
198
-
199
- export type DataQualityValidationFilterFunctions =
200
- | DataQualityValidationFilterCondition
201
- | DataQualityValidationLogicalGroupFunction;
202
-
203
- export class DataQualityValidationFilterFunctionsCloningVisitor
204
- implements
205
- DataQualityValidationFunctionVisitor<DataQualityValidationFilterFunctions>
206
- {
207
- private newName: string;
208
- private cloneFactory: DataQualityValidationFunctionFactory;
209
- private observerContext: ObserverContext;
210
-
211
- constructor(
212
- newName: string,
213
- cloneFactory: DataQualityValidationFunctionFactory,
214
- observerContext: ObserverContext,
215
- ) {
216
- this.newName = newName;
217
- this.cloneFactory = cloneFactory;
218
- this.observerContext = observerContext;
219
- }
220
283
 
221
- visitAssertion(): DataQualityValidationFilterFunctions {
222
- throw VISITOR_ERROR;
223
- }
284
+ const body = this.cloneFactory.createFilterChildFunction(this.newName);
224
285
 
225
- visitCustomHelper(): DataQualityValidationFilterFunctions {
226
- throw VISITOR_ERROR;
227
- }
228
-
229
- visitFilter(): DataQualityValidationFilterFunctions {
230
- throw VISITOR_ERROR;
231
- }
232
-
233
- visitFilterCondition(func: DataQualityValidationFilterCondition) {
234
- const clone = this.cloneFactory.createFilterConditionFunction(this.newName);
235
- const currentColumn = func.parameters.property;
236
-
237
- propertyExpression_setFunc(
238
- clone.parameters.property,
239
- PropertyExplicitReference.create({
240
- name: currentColumn.func.value.name,
241
- } as AbstractProperty),
242
- );
243
- clone.parameters.property.parametersValues =
244
- currentColumn.parametersValues.map((param) =>
245
- cloneValueSpecification(param, this.observerContext),
286
+ if (
287
+ DataQualityFunctionDefaults.getIsPureFunctionColumnRequired(
288
+ this.newName,
289
+ ) &&
290
+ this.isCurrentColOptional
291
+ ) {
292
+ const guarantee = this.cloneFactory.createPropertyGuaranteeFunction(
293
+ DATA_QUALITY_VALIDATION_PROPERTY_GUARANTEE_FUNCTIONS.TO_ONE,
246
294
  );
247
295
 
248
- return observe_DataQualityValidationFilterCondition(clone);
249
- }
296
+ guarantee.parameters.property = property;
297
+ body.parameters.property =
298
+ observe_DataQualityValidationPropertyGuarantee(guarantee);
299
+ } else {
300
+ body.parameters.property = property;
301
+ }
250
302
 
251
- visitLogicalGroup(func: DataQualityValidationLogicalGroupFunction) {
252
- return func;
303
+ clone.parameters.lambda.body =
304
+ observe_DataQualityValidationFilterCondition(body);
305
+
306
+ return clone;
253
307
  }
254
308
  }
@@ -33,6 +33,7 @@ import {
33
33
  DataQualityValidationFilterCondition,
34
34
  DataQualityValidationFilterFunction,
35
35
  DataQualityValidationLogicalGroupFunction,
36
+ DataQualityValidationPropertyGuarantee,
36
37
  } from './DataQualityValidationFunction.js';
37
38
  import { UnsupportedOperationError } from '@finos/legend-shared';
38
39
  import { DataQualityFunctionDefaults } from './DataQualityFunctionDefaults.js';
@@ -82,6 +83,7 @@ export class DataQualityValidationFunctionFactory {
82
83
 
83
84
  createFilterConditionFunction(
84
85
  name: string,
86
+ propertyName?: string,
85
87
  ): DataQualityValidationFilterCondition {
86
88
  const otherParams = DataQualityFunctionDefaults.getPureFunctionDefaults(
87
89
  name,
@@ -90,7 +92,7 @@ export class DataQualityValidationFunctionFactory {
90
92
  );
91
93
  const property = DataQualityLambdaParameterParser.processPropertyParameter(
92
94
  {
93
- property: '',
95
+ property: propertyName ?? '',
94
96
  parameters: [
95
97
  {
96
98
  name: 'row',
@@ -106,6 +108,27 @@ export class DataQualityValidationFunctionFactory {
106
108
  });
107
109
  }
108
110
 
111
+ createPropertyGuaranteeFunction(
112
+ name: string,
113
+ propertyName?: string,
114
+ ): DataQualityValidationPropertyGuarantee {
115
+ const property = DataQualityLambdaParameterParser.processPropertyParameter(
116
+ {
117
+ property: propertyName ?? '',
118
+ parameters: [
119
+ {
120
+ name: 'row',
121
+ _type: SUPPORTED_TYPES.VAR,
122
+ },
123
+ ],
124
+ } as LambdaBody,
125
+ this.observerContext,
126
+ );
127
+ return new DataQualityValidationPropertyGuarantee(name, {
128
+ property,
129
+ });
130
+ }
131
+
109
132
  createLogicalFunction(
110
133
  name: DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS,
111
134
  ): DataQualityValidationLogicalGroupFunction {
@@ -18,10 +18,15 @@ import {
18
18
  type DataQualityValidationFilterCondition,
19
19
  type DataQualityValidationFilterFunction,
20
20
  DataQualityValidationLogicalGroupFunction,
21
+ type DataQualityValidationPropertyGuarantee,
21
22
  } from '../utils/DataQualityValidationFunction.js';
22
23
  import type { DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS } from '../constants/DataQualityConstants.js';
23
24
  import type { DataQualityValidationFunctionFactory } from './DataQualityValidationFunctionFactory.js';
24
- import { type ObserverContext } from '@finos/legend-graph';
25
+ import type {
26
+ AbstractPropertyExpression,
27
+ ValueSpecification,
28
+ ObserverContext,
29
+ } from '@finos/legend-graph';
25
30
  import { observe_DataQualityValidationLogicalGroupFunction } from './DataQualityValidationFunctionObserver.js';
26
31
  import { DataQualityValidationFilterFunctionsCloningVisitor } from './DataQualityValidationFunctionCloningVisitor.js';
27
32
  import { action } from 'mobx';
@@ -33,11 +38,13 @@ export const dataQualityValidationFilterFunction_addLogicalOperation = action(
33
38
  operator: DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS,
34
39
  factory: DataQualityValidationFunctionFactory,
35
40
  observerContext: ObserverContext,
41
+ isCurrentColOptional: boolean,
36
42
  ): void => {
37
43
  const visitor = new DataQualityValidationFilterFunctionsCloningVisitor(
38
44
  currentCondition.name,
39
45
  factory,
40
46
  observerContext,
47
+ isCurrentColOptional,
41
48
  );
42
49
  const newCondition = currentCondition.accept(visitor);
43
50
 
@@ -59,12 +66,14 @@ export const dataQualityValidationFilterFunction_transformConditionToLogicalGrou
59
66
  operator: DATA_QUALITY_VALIDATION_LOGICAL_FUNCTIONS,
60
67
  factory: DataQualityValidationFunctionFactory,
61
68
  observerContext: ObserverContext,
69
+ isCurrentColOptional: boolean,
62
70
  ): void => {
63
71
  const createGroup = () => {
64
72
  const visitor = new DataQualityValidationFilterFunctionsCloningVisitor(
65
73
  conditionToTransform.name,
66
74
  factory,
67
75
  observerContext,
76
+ isCurrentColOptional,
68
77
  );
69
78
  const newCondition = conditionToTransform.accept(visitor);
70
79
  const logicalGroup = factory.createLogicalFunction(operator);
@@ -174,6 +183,7 @@ export const dataQualityValidationLogicalGroupFunction_changeGroupFunction =
174
183
  childToChange: 'left' | 'right',
175
184
  factory: DataQualityValidationFunctionFactory,
176
185
  observerContext: ObserverContext,
186
+ isCurrentColOptional: boolean,
177
187
  ) => {
178
188
  const currentChild =
179
189
  childToChange === 'left'
@@ -184,6 +194,7 @@ export const dataQualityValidationLogicalGroupFunction_changeGroupFunction =
184
194
  newFunctionName,
185
195
  factory,
186
196
  observerContext,
197
+ isCurrentColOptional,
187
198
  );
188
199
 
189
200
  if (childToChange === 'left') {
@@ -193,3 +204,23 @@ export const dataQualityValidationLogicalGroupFunction_changeGroupFunction =
193
204
  }
194
205
  },
195
206
  );
207
+
208
+ export const dataQualityValidationLogicalGroupFunction_setPropertyGuaranteeFunction =
209
+ action(
210
+ (
211
+ target: DataQualityValidationFilterCondition['parameters'],
212
+ property: DataQualityValidationPropertyGuarantee,
213
+ ) => {
214
+ target.property = property;
215
+ },
216
+ );
217
+
218
+ export const dataQualityValidationLogicalGroupFunction_setParametersValues =
219
+ action(
220
+ (
221
+ target: AbstractPropertyExpression,
222
+ parametersValues: ValueSpecification[],
223
+ ) => {
224
+ target.parametersValues = parametersValues;
225
+ },
226
+ );