@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.
- package/lib/components/DataQualityRelationLambdaGUIValidationEditor.d.ts.map +1 -1
- package/lib/components/DataQualityRelationLambdaGUIValidationEditor.js +1 -1
- package/lib/components/DataQualityRelationLambdaGUIValidationEditor.js.map +1 -1
- package/lib/components/DataQualityValidationFilterEditor.d.ts.map +1 -1
- package/lib/components/DataQualityValidationFilterEditor.js +25 -14
- package/lib/components/DataQualityValidationFilterEditor.js.map +1 -1
- package/lib/components/DataQualityValidationFunctionRenderer.d.ts +5 -8
- package/lib/components/DataQualityValidationFunctionRenderer.d.ts.map +1 -1
- package/lib/components/DataQualityValidationFunctionRenderer.js +8 -5
- package/lib/components/DataQualityValidationFunctionRenderer.js.map +1 -1
- package/lib/components/DataQualityValidationHelperFunctionEditor.js +1 -1
- package/lib/components/DataQualityValidationHelperFunctionEditor.js.map +1 -1
- package/lib/components/constants/DataQualityConstants.d.ts +3 -0
- package/lib/components/constants/DataQualityConstants.d.ts.map +1 -1
- package/lib/components/constants/DataQualityConstants.js +4 -0
- package/lib/components/constants/DataQualityConstants.js.map +1 -1
- package/lib/components/states/DataQualityValidationLambdaFormState.d.ts +1 -1
- package/lib/components/states/DataQualityValidationLambdaFormState.d.ts.map +1 -1
- package/lib/components/states/DataQualityValidationLambdaFormState.js +2 -2
- package/lib/components/states/DataQualityValidationLambdaFormState.js.map +1 -1
- package/lib/components/states/LambdaEditorWithGUIState.d.ts +1 -0
- package/lib/components/states/LambdaEditorWithGUIState.d.ts.map +1 -1
- package/lib/components/states/LambdaEditorWithGUIState.js +2 -1
- package/lib/components/states/LambdaEditorWithGUIState.js.map +1 -1
- package/lib/components/utils/DataQualityFunctionDefaults.d.ts +2 -0
- package/lib/components/utils/DataQualityFunctionDefaults.d.ts.map +1 -1
- package/lib/components/utils/DataQualityFunctionDefaults.js +14 -1
- package/lib/components/utils/DataQualityFunctionDefaults.js.map +1 -1
- package/lib/components/utils/DataQualityLambdaParameterExtractorVisitor.d.ts +6 -3
- package/lib/components/utils/DataQualityLambdaParameterExtractorVisitor.d.ts.map +1 -1
- package/lib/components/utils/DataQualityLambdaParameterExtractorVisitor.js +30 -6
- package/lib/components/utils/DataQualityLambdaParameterExtractorVisitor.js.map +1 -1
- package/lib/components/utils/DataQualityLambdaParameterParser.d.ts +9 -7
- package/lib/components/utils/DataQualityLambdaParameterParser.d.ts.map +1 -1
- package/lib/components/utils/DataQualityLambdaParameterParser.js +11 -4
- package/lib/components/utils/DataQualityLambdaParameterParser.js.map +1 -1
- package/lib/components/utils/DataQualityValidateFunctionToPureLambdaVisitor.d.ts +2 -1
- package/lib/components/utils/DataQualityValidateFunctionToPureLambdaVisitor.d.ts.map +1 -1
- package/lib/components/utils/DataQualityValidateFunctionToPureLambdaVisitor.js +15 -1
- package/lib/components/utils/DataQualityValidateFunctionToPureLambdaVisitor.js.map +1 -1
- package/lib/components/utils/DataQualityValidationDescriptionGeneratorVisitor.d.ts +2 -1
- package/lib/components/utils/DataQualityValidationDescriptionGeneratorVisitor.d.ts.map +1 -1
- package/lib/components/utils/DataQualityValidationDescriptionGeneratorVisitor.js +7 -1
- package/lib/components/utils/DataQualityValidationDescriptionGeneratorVisitor.js.map +1 -1
- package/lib/components/utils/DataQualityValidationFunction.d.ts +15 -4
- package/lib/components/utils/DataQualityValidationFunction.d.ts.map +1 -1
- package/lib/components/utils/DataQualityValidationFunction.js +8 -1
- package/lib/components/utils/DataQualityValidationFunction.js.map +1 -1
- package/lib/components/utils/DataQualityValidationFunctionCloningVisitor.d.ts +17 -13
- package/lib/components/utils/DataQualityValidationFunctionCloningVisitor.d.ts.map +1 -1
- package/lib/components/utils/DataQualityValidationFunctionCloningVisitor.js +76 -45
- package/lib/components/utils/DataQualityValidationFunctionCloningVisitor.js.map +1 -1
- package/lib/components/utils/DataQualityValidationFunctionFactory.d.ts +3 -2
- package/lib/components/utils/DataQualityValidationFunctionFactory.d.ts.map +1 -1
- package/lib/components/utils/DataQualityValidationFunctionFactory.js +17 -3
- package/lib/components/utils/DataQualityValidationFunctionFactory.js.map +1 -1
- package/lib/components/utils/DataQualityValidationFunctionModifier.d.ts +7 -5
- package/lib/components/utils/DataQualityValidationFunctionModifier.d.ts.map +1 -1
- package/lib/components/utils/DataQualityValidationFunctionModifier.js +12 -7
- package/lib/components/utils/DataQualityValidationFunctionModifier.js.map +1 -1
- package/lib/components/utils/DataQualityValidationFunctionObserver.d.ts +10 -9
- package/lib/components/utils/DataQualityValidationFunctionObserver.d.ts.map +1 -1
- package/lib/components/utils/DataQualityValidationFunctionObserver.js +79 -16
- package/lib/components/utils/DataQualityValidationFunctionObserver.js.map +1 -1
- package/lib/components/utils/DataQualityValidationNameGeneratorVisitor.d.ts +2 -1
- package/lib/components/utils/DataQualityValidationNameGeneratorVisitor.d.ts.map +1 -1
- package/lib/components/utils/DataQualityValidationNameGeneratorVisitor.js +11 -1
- package/lib/components/utils/DataQualityValidationNameGeneratorVisitor.js.map +1 -1
- package/lib/data-quality-custom-selector.css +1 -1
- package/lib/index.css +1 -1
- package/lib/package.json +1 -1
- package/package.json +7 -7
- package/src/components/DataQualityRelationLambdaGUIValidationEditor.tsx +8 -1
- package/src/components/DataQualityValidationFilterEditor.tsx +49 -12
- package/src/components/DataQualityValidationFunctionRenderer.tsx +15 -13
- package/src/components/DataQualityValidationHelperFunctionEditor.tsx +1 -1
- package/src/components/constants/DataQualityConstants.ts +4 -0
- package/src/components/states/DataQualityValidationLambdaFormState.ts +5 -1
- package/src/components/states/LambdaEditorWithGUIState.ts +3 -1
- package/src/components/utils/DataQualityFunctionDefaults.ts +18 -1
- package/src/components/utils/DataQualityLambdaParameterExtractorVisitor.ts +59 -4
- package/src/components/utils/DataQualityLambdaParameterParser.ts +28 -5
- package/src/components/utils/DataQualityValidateFunctionToPureLambdaVisitor.ts +25 -8
- package/src/components/utils/DataQualityValidationDescriptionGeneratorVisitor.ts +15 -7
- package/src/components/utils/DataQualityValidationFunction.ts +29 -4
- package/src/components/utils/DataQualityValidationFunctionCloningVisitor.ts +131 -77
- package/src/components/utils/DataQualityValidationFunctionFactory.ts +24 -1
- package/src/components/utils/DataQualityValidationFunctionModifier.ts +32 -1
- package/src/components/utils/DataQualityValidationFunctionObserver.ts +206 -105
- 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
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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
|
-
|
|
131
|
+
abstract class AbstractDataQualityValidationFilterCondition<
|
|
132
|
+
T,
|
|
133
|
+
> extends DataQualityValidationFunction<T> {
|
|
124
134
|
name: string;
|
|
125
|
-
parameters:
|
|
135
|
+
parameters: T;
|
|
126
136
|
|
|
127
|
-
constructor(name: string, parameters:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
99
|
-
|
|
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
|
-
|
|
149
|
-
|
|
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
|
-
|
|
222
|
-
throw VISITOR_ERROR;
|
|
223
|
-
}
|
|
284
|
+
const body = this.cloneFactory.createFilterChildFunction(this.newName);
|
|
224
285
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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
|
-
|
|
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
|
-
|
|
252
|
-
|
|
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
|
|
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
|
+
);
|