@finos/legend-extension-dsl-data-quality
Version:
Legend extension for Data Quality
189 lines • 9.64 kB
JavaScript
/**
* Copyright (c) 2020-present, Goldman Sachs
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { NewElementDriver, } from '@finos/legend-application-studio';
import { DataQualityClassValidationsConfiguration, DataQualityServiceValidationConfiguration, DataQualityRelationValidationConfiguration, DataSpaceDataQualityExecutionContext, MappingAndRuntimeDataQualityExecutionContext, DataQualityRelationQueryLambda, DataQualityRelationValidation, } from '../graph/metamodel/pure/packageableElements/data-quality/DataQualityValidationConfiguration.js';
import { action, computed, makeObservable, observable } from 'mobx';
import { at, filterByType, guaranteeNonNullable, UnsupportedOperationError, } from '@finos/legend-shared';
import { getMappingCompatibleRuntimes, PackageableElementExplicitReference, getMappingCompatibleClasses, RawLambda, } from '@finos/legend-graph';
import { buildElementOption, } from '@finos/legend-lego/graph-editor';
import { DataSpace, resolveUsableDataSpaceClasses, } from '@finos/legend-extension-dsl-data-space/graph';
import { buildDefaultDataQualityRootGraphFetchTree } from './utils/DataQualityGraphFetchTreeUtil.js';
export var CLASS_ELEMENT_CREATION_BASIS;
(function (CLASS_ELEMENT_CREATION_BASIS) {
CLASS_ELEMENT_CREATION_BASIS["MAPPING_RUNTIME_BASED"] = "Mapping/Runtime";
CLASS_ELEMENT_CREATION_BASIS["DATASPACE_BASED"] = "DataSpace";
})(CLASS_ELEMENT_CREATION_BASIS || (CLASS_ELEMENT_CREATION_BASIS = {}));
export var DQ_VALIDATION_ELEMENT_TYPE;
(function (DQ_VALIDATION_ELEMENT_TYPE) {
DQ_VALIDATION_ELEMENT_TYPE["CLASS_VALIDATION"] = "ClassValidation";
DQ_VALIDATION_ELEMENT_TYPE["SERVICE_VALIDATION"] = "ServiceValidation";
DQ_VALIDATION_ELEMENT_TYPE["RELATION_VALIDATION"] = "RelationValidation";
})(DQ_VALIDATION_ELEMENT_TYPE || (DQ_VALIDATION_ELEMENT_TYPE = {}));
export class DataQuality_ElementDriver extends NewElementDriver {
dqValidationElementType;
dqClassElementCreationBasis;
dataSpaceSelected;
mappingSelected;
runtimeSelected;
constructor(editorStore) {
super(editorStore);
makeObservable(this, {
dataSpaceSelected: observable,
mappingSelected: observable,
runtimeSelected: observable,
dqValidationElementType: observable,
dqClassElementCreationBasis: observable,
setDataSpaceSelected: action,
setMappingSelected: action,
setRuntimeSelected: action,
setDqClassElementCreationBasis: action,
setDqValidationElementType: action,
runtimeOptions: computed,
});
this.dqValidationElementType = DQ_VALIDATION_ELEMENT_TYPE.CLASS_VALIDATION;
this.dqClassElementCreationBasis =
CLASS_ELEMENT_CREATION_BASIS.DATASPACE_BASED;
this.dataSpaceSelected = this.dataSpaceOptions[0];
this.mappingSelected = this.mappingOptions[0];
this.runtimeSelected = this.runtimeOptions[0];
}
get dataSpaceOptions() {
return this.editorStore.graphManagerState.graph.allOwnElements
.filter(filterByType(DataSpace))
.map(buildElementOption);
}
get mappingOptions() {
return this.editorStore.graphManagerState.usableMappings.map(buildElementOption);
}
get compatibleMappingRuntimes() {
return this.mappingSelected?.value
? getMappingCompatibleRuntimes(this.mappingSelected.value, this.editorStore.graphManagerState.usableRuntimes)
: [];
}
get runtimeOptions() {
return this.compatibleMappingRuntimes.map((runtime) => buildElementOption(runtime));
}
get isValid() {
if (this.dqValidationElementType ===
DQ_VALIDATION_ELEMENT_TYPE.RELATION_VALIDATION ||
this.dqValidationElementType ===
DQ_VALIDATION_ELEMENT_TYPE.SERVICE_VALIDATION) {
return true;
}
if (this.dqClassElementCreationBasis ===
CLASS_ELEMENT_CREATION_BASIS.DATASPACE_BASED) {
return Boolean(this.dataSpaceSelected);
}
return Boolean(this.mappingSelected && this.runtimeSelected);
}
setDataSpaceSelected(dataSpace) {
this.dataSpaceSelected = dataSpace;
}
setMappingSelected(mappingSelected) {
this.mappingSelected = mappingSelected;
}
setRuntimeSelected(runtimeSelected) {
this.runtimeSelected = runtimeSelected;
}
setDqClassElementCreationBasis(dqClassElementCreationBasis) {
this.dqClassElementCreationBasis = dqClassElementCreationBasis;
}
setDqValidationElementType(dqValidationElementType) {
this.dqValidationElementType = dqValidationElementType;
}
createDefaultValidation() {
const body = [
{
_type: 'boolean',
value: true,
},
];
const parameters = [
{
_type: 'var',
name: 'row',
},
];
const assertion = new RawLambda(parameters, body);
const defaultValidation = new DataQualityRelationValidation('', assertion);
return [defaultValidation];
}
createRelationValidationElement(name) {
const relationValidationConfiguration = new DataQualityRelationValidationConfiguration(name);
relationValidationConfiguration.query =
new DataQualityRelationQueryLambda();
relationValidationConfiguration.query.body =
this.editorStore.graphManagerState.graphManager.createDefaultBasicRawLambda().body;
this.editorStore.graphManagerState.graphManager.createDefaultBasicRawLambda();
relationValidationConfiguration.validations =
this.createDefaultValidation();
return relationValidationConfiguration;
}
createServiceValidationElement(name) {
return new DataQualityServiceValidationConfiguration(name);
}
createClassValidationElement(name) {
let usableClasses = [];
const dataQualityClassConstraintsConfiguration = new DataQualityClassValidationsConfiguration(name);
if (this.dqClassElementCreationBasis ===
CLASS_ELEMENT_CREATION_BASIS.DATASPACE_BASED) {
const dataSpaceToSet = PackageableElementExplicitReference.create(guaranteeNonNullable(this.dataSpaceSelected).value);
const dataSpaceExecutionContext = new DataSpaceDataQualityExecutionContext();
dataSpaceExecutionContext.context =
dataSpaceToSet.value.defaultExecutionContext.name;
dataSpaceExecutionContext.dataSpace = dataSpaceToSet;
dataQualityClassConstraintsConfiguration.context =
dataSpaceExecutionContext;
dataQualityClassConstraintsConfiguration.dataQualityRootGraphFetchTree =
undefined;
usableClasses = resolveUsableDataSpaceClasses(dataSpaceToSet.value, dataSpaceToSet.value.defaultExecutionContext.mapping.value, this.editorStore.graphManagerState);
}
else {
if (this.mappingSelected && this.runtimeSelected) {
const mappingOption = guaranteeNonNullable(this.mappingSelected);
const _mapping = mappingOption.value;
const mapping = PackageableElementExplicitReference.create(_mapping);
const runtimeOption = guaranteeNonNullable(this.runtimeSelected.value);
const runtimeValue = PackageableElementExplicitReference.create(runtimeOption);
const mappingAndRuntimeExecutionContext = new MappingAndRuntimeDataQualityExecutionContext();
mappingAndRuntimeExecutionContext.mapping = mapping;
mappingAndRuntimeExecutionContext.runtime = runtimeValue;
dataQualityClassConstraintsConfiguration.context =
mappingAndRuntimeExecutionContext;
usableClasses = getMappingCompatibleClasses(mapping.value, this.editorStore.graphManagerState.usableClasses);
}
}
if (usableClasses.length === 0) {
throw new UnsupportedOperationError('Must have at least one usable class with given mapping');
}
dataQualityClassConstraintsConfiguration.dataQualityRootGraphFetchTree =
buildDefaultDataQualityRootGraphFetchTree(at(usableClasses, 0));
return dataQualityClassConstraintsConfiguration;
}
createElement(name) {
switch (this.dqValidationElementType) {
case DQ_VALIDATION_ELEMENT_TYPE.RELATION_VALIDATION:
return this.createRelationValidationElement(name);
case DQ_VALIDATION_ELEMENT_TYPE.SERVICE_VALIDATION:
return this.createServiceValidationElement(name);
case DQ_VALIDATION_ELEMENT_TYPE.CLASS_VALIDATION:
return this.createClassValidationElement(name);
default:
throw new UnsupportedOperationError(`Can't create data quality validation configuration of type '${this.dqValidationElementType}'`);
}
}
}
//# sourceMappingURL=DSL_DataQuality_ElementDriver.js.map