UNPKG

@finos/legend-extension-dsl-data-quality

Version:
189 lines 9.64 kB
/** * 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