Skip to content

Commit

Permalink
MR | Subtypes support in data quality class validation
Browse files Browse the repository at this point in the history
  • Loading branch information
viju4076 authored and aormerod-gs committed Oct 14, 2024
1 parent 7800906 commit 4feaaf6
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 37 deletions.
5 changes: 5 additions & 0 deletions .changeset/swift-pears-deliver.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@finos/legend-extension-dsl-data-quality': patch
---

subtypes support in data quality class validation
Original file line number Diff line number Diff line change
Expand Up @@ -85,10 +85,11 @@ export const DataQualityConstraintsTreeNodeContainer = observer(
const { node, level, stepPaddingInRem, onNodeSelect, innerProps } = props;
const { dataQualityState, isReadOnly, removeNode } = innerProps;
const { dataQualityGraphFetchTreeState } = dataQualityState;
let property, type: Type | undefined;
let property, type: Type | undefined, subType: Type | undefined;
if (node.tree instanceof PropertyGraphFetchTree) {
property = node.tree.property.value;
type = property.genericType.value.rawType;
subType = node.tree.subType?.value;
} else if (node.tree instanceof RootGraphFetchTree) {
type = node.tree.class.value;
}
Expand Down Expand Up @@ -209,6 +210,13 @@ export const DataQualityConstraintsTreeNodeContainer = observer(
onClick={toggleExpandNode}
>
{node.label}
{subType && (
<div className="data-quality-validation-graph-fetch-tree__node__sub-type">
<div className="data-quality-validation-graph-fetch-tree__node__sub-type__label">
{subType.name}
</div>
</div>
)}
{
<div className="data-quality-validation-graph-fetch-tree__node__type">
<div className="data-quality-validation-graph-fetch-tree__node__type__label">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import { flowResult } from 'mobx';
import { DATA_QUALITY_VALIDATION_TEST_ID } from './constants/DataQualityConstants.js';
import {
type QueryBuilderExplorerTreeDragSource,
type QueryBuilderExplorerTreeNodeData,
QueryBuilderExplorerTreeNodeData,
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE,
QueryBuilderExplorerTreePropertyNodeData,
QueryBuilderExplorerTreeRootNodeData,
Expand Down Expand Up @@ -71,6 +71,7 @@ import {
TYPE_CAST_TOKEN,
getAllClassDerivedProperties,
getAllClassProperties,
getAllOwnClassProperties,
} from '@finos/legend-graph';

export const QueryBuilderExplorerTreeNodeContainer = observer(
Expand Down Expand Up @@ -98,9 +99,7 @@ export const QueryBuilderExplorerTreeNodeContainer = observer(
? QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.CLASS_PROPERTY
: QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
item: () =>
node instanceof QueryBuilderExplorerTreeSubTypeNodeData
? {}
: { node },
node instanceof QueryBuilderExplorerTreeNodeData ? { node } : {},
}),
[node],
);
Expand Down Expand Up @@ -373,26 +372,27 @@ const QueryBuilderExplorerTree = observer(
node.isOpen = !node.isOpen;
if (
node.isOpen &&
node instanceof QueryBuilderExplorerTreePropertyNodeData &&
(node instanceof QueryBuilderExplorerTreePropertyNodeData ||
node instanceof QueryBuilderExplorerTreeSubTypeNodeData) &&
node.type instanceof Class
) {
getAllClassProperties(node.type)
.concat(getAllClassDerivedProperties(node.type))
.forEach((property) => {
const propertyTreeNodeData = getQueryBuilderPropertyNodeData(
property,
node,
guaranteeNonNullable(
explorerState.mappingModelCoverageAnalysisResult,
),
);
if (propertyTreeNodeData) {
treeData.nodes.set(
propertyTreeNodeData.id,
propertyTreeNodeData,
);
}
});
(node instanceof QueryBuilderExplorerTreeSubTypeNodeData
? getAllOwnClassProperties(node.type)
: getAllClassProperties(node.type).concat(
getAllClassDerivedProperties(node.type),
)
).forEach((property) => {
const propertyTreeNodeData = getQueryBuilderPropertyNodeData(
property,
node,
guaranteeNonNullable(
explorerState.mappingModelCoverageAnalysisResult,
),
);
if (propertyTreeNodeData) {
treeData.nodes.set(propertyTreeNodeData.id, propertyTreeNodeData);
}
});
node.type._subclasses.forEach((subclass) => {
const subTypeTreeNodeData = getQueryBuilderSubTypeNodeData(
subclass,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,9 @@ const buildGraphFetchSubTree = (
tree,
);
node.setIsReadOnly(isReadOnly);
if (node.type instanceof Class && fetchConstraints && !isReadOnly) {
if (subType) {
node.setConstraintsForClass(subType, tree.constraints);
} else if (node.type instanceof Class && fetchConstraints && !isReadOnly) {
node.setConstraintsForClass(node.type, tree.constraints);
}
tree.subTrees.forEach((subTree) => {
Expand Down Expand Up @@ -407,7 +409,8 @@ export const addQueryBuilderPropertyNode = (
explorerTreeData: TreeData<QueryBuilderExplorerTreeNodeData>,
node:
| QueryBuilderExplorerTreePropertyNodeData
| QueryBuilderExplorerTreeRootNodeData,
| QueryBuilderExplorerTreeRootNodeData
| QueryBuilderExplorerTreeSubTypeNodeData,
dataQualityState: DataQualityState,
): void => {
const editorStore = dataQualityState.editorStore;
Expand All @@ -417,23 +420,33 @@ export const addQueryBuilderPropertyNode = (
);
//root node and property node handled differently
//handling property node
if (node instanceof QueryBuilderExplorerTreePropertyNodeData) {
if (
node instanceof QueryBuilderExplorerTreePropertyNodeData ||
node instanceof QueryBuilderExplorerTreeSubTypeNodeData
) {
// traverse the property node all the way to the root and resolve the
// chain of property that leads to this property node
const propertyGraphFetchTrees: DataQualityPropertyGraphFetchTree[] = [
new DataQualityPropertyGraphFetchTree(
PropertyExplicitReference.create(node.property),
undefined,
),
];
const propertyGraphFetchTrees: DataQualityPropertyGraphFetchTree[] = [];
if (node instanceof QueryBuilderExplorerTreePropertyNodeData) {
propertyGraphFetchTrees.push(
new DataQualityPropertyGraphFetchTree(
PropertyExplicitReference.create(node.property),
undefined,
),
);
}
let parentExplorerTreeNode = explorerTreeData.nodes.get(node.parentId);
while (
parentExplorerTreeNode instanceof
QueryBuilderExplorerTreePropertyNodeData ||
parentExplorerTreeNode instanceof QueryBuilderExplorerTreeSubTypeNodeData
) {
let subType = undefined;
let subtypeAssigned = false;
let subType =
node instanceof QueryBuilderExplorerTreeSubTypeNodeData
? PackageableElementExplicitReference.create(node.subclass)
: undefined;
let subtypeAssigned =
node instanceof QueryBuilderExplorerTreeSubTypeNodeData;
while (
parentExplorerTreeNode instanceof
QueryBuilderExplorerTreeSubTypeNodeData
Expand Down Expand Up @@ -466,9 +479,11 @@ export const addQueryBuilderPropertyNode = (
PropertyExplicitReference.create(parentExplorerTreeNode.property),
subType,
);
propertyGraphFetchTree.subTrees.push(
propertyGraphFetchTrees[0] as DataQualityPropertyGraphFetchTree,
);
if (propertyGraphFetchTrees.length > 0) {
propertyGraphFetchTree.subTrees.push(
propertyGraphFetchTrees[0] as DataQualityPropertyGraphFetchTree,
);
}
propertyGraphFetchTrees.unshift(propertyGraphFetchTree);
parentExplorerTreeNode = explorerTreeData.nodes.get(
parentExplorerTreeNode.parentId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,4 +87,5 @@ export const V1_propertyGraphFetchTreeModelSchema = (
(val) => V1_deserializeGraphFetchTree(val, plugins),
),
),
subType: optional(primitive()),
});

0 comments on commit 4feaaf6

Please sign in to comment.