@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
|
@@ -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
|
|
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,
|
|
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
|
-
|
|
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":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"DataQualityValidationNameGeneratorVisitor.js","sourceRoot":"","sources":["../../../src/components/utils/DataQualityValidationNameGeneratorVisitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EACL,sCAAsC,GAOvC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,OAAO,yCAAyC;IAGpD,KAAK,GAAG,CAAC,CAAC;IACV,cAAc,CAAC,IAA4C;QACzD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,iBAAiB,CAAC,IAA+C;QAC/D,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;QAChD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,2BAA2B,CAAC,uBAAuB,CACtE,IAAI,CAAC,IAAI,CACV,CAAC;QAEF,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;QAC1C,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,EAAE,CAAC;YACjC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC5B,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;gBAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAW,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7B,CAAC;YAED,IAAI,KAAK,YAAY,uBAAuB,EAAE,CAAC;gBAC7C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAC5D,CAAC;IAED,WAAW,CAAC,IAAyC;QACnD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;QAEnC,OAAO,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,oBAAoB,CAAC,IAA0C;QAC7D,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;QAClD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,2BAA2B,CAAC,uBAAuB,CACtE,IAAI,CAAC,IAAI,CACV,CAAC;QAEF,IAAI,UAAU,GAAG,EAAE,CAAC;QAEpB,IAAI,QAAQ,YAAY,sCAAsC,EAAE,CAAC;YAC/D,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,EAAE,CAAC;YACjC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC5B,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;gBAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAW,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7B,CAAC;YAED,IAAI,KAAK,YAAY,uBAAuB,EAAE,CAAC;gBAC7C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAC5D,CAAC;IAED,iBAAiB,CAAC,IAA+C;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAClC,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAC1C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CACnC,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvD,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,EAAE,CAAC;IAC9C,CAAC;IAED,sBAAsB;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,WAAW,CACjB,UAAkB,EAClB,MAAgB,EAChB,YAAoB;QAEpB,IAAI,IAAI,GAAG,YAAY,CAAC;QAExB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;QAElE,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC9B,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,YAAY,KAAK,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAClE,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,WAAW,EACX,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CACzC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,qBAAqB,CAAC,GAAW,EAAE,WAAmB,CAAC;QAC7D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEzE,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC7B,OAAO,GAAG,CAAC;QACb,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEnD,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;IACzC,CAAC;IAEO,qBAAqB,CAAC,GAAW;QACvC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAEO,WAAW,CAAC,GAAW;QAC7B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,iEAAiE;QACjE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEzE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,KAAK;aACT,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACnB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAErC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC,CAAC;aACD,IAAI,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;CACF"}
|
package/lib/index.css
CHANGED
package/lib/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@finos/legend-extension-dsl-data-quality",
|
|
3
|
-
"version": "2.1.
|
|
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.
|
|
46
|
+
"@finos/legend-application-studio": "28.19.112",
|
|
47
47
|
"@finos/legend-art": "7.1.145",
|
|
48
|
-
"@finos/legend-code-editor": "2.0.
|
|
49
|
-
"@finos/legend-extension-dsl-data-space": "10.4.
|
|
50
|
-
"@finos/legend-graph": "32.4.
|
|
51
|
-
"@finos/legend-lego": "2.0.
|
|
52
|
-
"@finos/legend-query-builder": "4.17.
|
|
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
|
|
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: (
|
|
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?: (
|
|
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 =
|
|
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={
|
|
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
|
-
|
|
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?.(
|
|
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?.(
|
|
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 = (
|
|
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
|
-
|
|
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={() =>
|
|
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
|
-
|
|
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 = (
|
|
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
|
|
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
|
-
|
|
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
|
|
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: [
|
|
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
|
-
|
|
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(
|