Skip to content

Commit 1ddfe68

Browse files
fix: resolve bugs and enable data quality impact ranking feature
- Fix malformed JSON query in buildTestCaseImpactQuery (missing ] bracket) - Fix wrong function name import (getTestCaseDetailPagePath) - Fix wrong import path for RouterUtils - Compute recentIncidents from grouped test case results instead of hardcoded 0 - Fix property name mismatch (entityFQN -> entityFullyQualifiedName) Fixes #26658
1 parent 5c1e40c commit 1ddfe68

4 files changed

Lines changed: 47 additions & 17 deletions

File tree

openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestSuiteRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ private String buildTestCaseImpactQuery(String testCaseStatus, long thirtyDaysAg
428428

429429
query.append(
430430
String.format(
431-
"{\"range\": {\"timestamp\": {\"gte\": %d}}}}}", thirtyDaysAgo / 1000));
431+
"{\"range\": {\"timestamp\": {\"gte\": %d}}}]}}", thirtyDaysAgo / 1000));
432432
return query.toString();
433433
}
434434

openmetadata-service/src/main/java/org/openmetadata/service/search/SearchRepository.java

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2817,23 +2817,52 @@ public List<Map<String, Object>> searchTestCasesForImpact(
28172817
return results;
28182818
}
28192819

2820+
Map<String, Map<String, Object>> groupedTestCases = new LinkedHashMap<>();
2821+
28202822
for (Iterator<JsonNode> it = hitsNode.elements(); it.hasNext(); ) {
28212823
JsonNode jsonNode = it.next();
28222824
JsonNode sourceNode = JsonUtils.extractValue(jsonNode.toString(), SEARCH_SOURCE);
28232825
if (sourceNode != null) {
2824-
Map<String, Object> doc = new HashMap<>();
2825-
doc.put("testCaseId", JsonUtils.extractValue(sourceNode.toString(), ID));
2826-
doc.put(
2827-
"testCaseFullyQualifiedName",
2828-
JsonUtils.extractValue(sourceNode.toString(), FULLY_QUALIFIED_NAME));
2829-
doc.put("entityFQN", JsonUtils.extractValue(sourceNode.toString(), "entityFQN"));
2830-
doc.put("testCaseStatus", JsonUtils.extractValue(sourceNode.toString(), "testCaseStatus"));
2831-
doc.put("timestamp", JsonUtils.extractValue(sourceNode.toString(), "timestamp"));
2832-
doc.put("downstreamUsage", 0);
2833-
doc.put("consumerCount", 0);
2834-
results.add(doc);
2826+
String testCaseFQN =
2827+
JsonUtils.extractValue(sourceNode.toString(), FULLY_QUALIFIED_NAME);
2828+
String testCaseId = JsonUtils.extractValue(sourceNode.toString(), ID);
2829+
String entityFQN = JsonUtils.extractValue(sourceNode.toString(), "entityFQN");
2830+
String testCaseStatus = JsonUtils.extractValue(sourceNode.toString(), "testCaseStatus");
2831+
String timestamp = JsonUtils.extractValue(sourceNode.toString(), "timestamp");
2832+
2833+
if (testCaseFQN == null || testCaseFQN.isEmpty()) {
2834+
continue;
2835+
}
2836+
2837+
Map<String, Object> doc;
2838+
if (groupedTestCases.containsKey(testCaseFQN)) {
2839+
doc = groupedTestCases.get(testCaseFQN);
2840+
int runCount = ((Number) doc.getOrDefault("runCount", 0)).intValue();
2841+
doc.put("runCount", runCount + 1);
2842+
2843+
int failedCount = ((Number) doc.getOrDefault("recentIncidents", 0)).intValue();
2844+
if ("failed".equalsIgnoreCase(testCaseStatus)) {
2845+
doc.put("recentIncidents", failedCount + 1);
2846+
}
2847+
} else {
2848+
doc = new HashMap<>();
2849+
doc.put("testCaseId", testCaseId);
2850+
doc.put("testCaseFullyQualifiedName", testCaseFQN);
2851+
doc.put("entityFullyQualifiedName", entityFQN);
2852+
doc.put("testCaseStatus", testCaseStatus);
2853+
doc.put("timestamp", timestamp);
2854+
doc.put("runCount", 1);
2855+
doc.put(
2856+
"recentIncidents",
2857+
"failed".equalsIgnoreCase(testCaseStatus) ? 1 : 0);
2858+
doc.put("downstreamUsage", 0);
2859+
doc.put("consumerCount", 0);
2860+
groupedTestCases.put(testCaseFQN, doc);
2861+
}
28352862
}
28362863
}
2864+
2865+
results = new ArrayList<>(groupedTestCases.values());
28372866
} catch (Exception e) {
28382867
LOG.error("Error parsing search test cases for impact", e);
28392868
}

openmetadata-ui/src/main/resources/ui/src/components/DataQuality/ImpactRanking/ImpactRanking.component.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ import {
2727
} from 'antd';
2828
import { isEmpty } from 'lodash';
2929
import { useCallback, useEffect, useState } from 'react';
30-
import { getTestCaseDetailPath } from '../../utils/RouterUtils';
30+
import { getTestCaseDetailPagePath } from '../../../utils/RouterUtils';
3131
import {
3232
DataQualityCheckImpact,
3333
getDataQualityCheckImpact,
34-
} from '../../rest/testAPI';
34+
} from '../../../rest/testAPI';
3535

3636
interface ImpactRankingProps {
3737
limit?: number;
@@ -99,8 +99,8 @@ const ImpactRanking = ({ limit = 10 }: ImpactRankingProps) => {
9999
},
100100
{
101101
title: t('label.entity'),
102-
dataIndex: 'entityFQN',
103-
key: 'entityFQN',
102+
dataIndex: 'entityFullyQualifiedName',
103+
key: 'entityFullyQualifiedName',
104104
ellipsis: true,
105105
},
106106
{

openmetadata-ui/src/main/resources/ui/src/rest/testAPI.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -501,11 +501,12 @@ export type DataQualityCheckImpactParams = {
501501
export interface DataQualityCheckImpact {
502502
testCaseId: string;
503503
testCaseFullyQualifiedName: string;
504-
entityFQN: string;
504+
entityFullyQualifiedName: string;
505505
testCaseStatus: TestCaseStatus;
506506
timestamp: number;
507507
downstreamUsage: number;
508508
consumerCount: number;
509+
recentIncidents: number;
509510
impactScore: number;
510511
}
511512

0 commit comments

Comments
 (0)