diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/apps/bundles/insights/DataInsightsReportApp.java b/openmetadata-service/src/main/java/org/openmetadata/service/apps/bundles/insights/DataInsightsReportApp.java index 6aaec8d8bf4..56f9ab11853 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/apps/bundles/insights/DataInsightsReportApp.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/apps/bundles/insights/DataInsightsReportApp.java @@ -294,6 +294,7 @@ public class DataInsightsReportApp extends AbstractNativeApplication { PERCENTAGE_OF_ENTITIES_WITH_DESCRIPTION_BY_TYPE, currentPercentCompleted, currentPercentCompleted - previousPercentCompleted, + (int) currentCompletedDescription, numberOfDaysChange, dateMap); } @@ -303,6 +304,7 @@ public class DataInsightsReportApp extends AbstractNativeApplication { PERCENTAGE_OF_ENTITIES_WITH_DESCRIPTION_BY_TYPE, 0D, 0D, + 0, numberOfDaysChange, dateMap); } @@ -362,6 +364,7 @@ public class DataInsightsReportApp extends AbstractNativeApplication { PERCENTAGE_OF_ENTITIES_WITH_OWNER_BY_TYPE, currentPercentCompleted, currentPercentCompleted - previousPercentCompleted, + (int) currentHasOwner, numberOfDaysChange, dateMap); } @@ -370,6 +373,7 @@ public class DataInsightsReportApp extends AbstractNativeApplication { PERCENTAGE_OF_ENTITIES_WITH_OWNER_BY_TYPE, 0D, 0D, + 0, numberOfDaysChange, dateMap); } @@ -408,6 +412,7 @@ public class DataInsightsReportApp extends AbstractNativeApplication { return new DataInsightDescriptionAndOwnerTemplate( DataInsightDescriptionAndOwnerTemplate.MetricType.TIER, null, + "0", 0D, KPI_NOT_SET, 0D, @@ -421,6 +426,7 @@ public class DataInsightsReportApp extends AbstractNativeApplication { return new DataInsightDescriptionAndOwnerTemplate( DataInsightDescriptionAndOwnerTemplate.MetricType.TIER, null, + "0", 0D, KPI_NOT_SET, 0D, @@ -503,6 +509,7 @@ public class DataInsightsReportApp extends AbstractNativeApplication { DataInsightChartResult.DataInsightChartType chartType, Double percentCompleted, Double percentChange, + int totalAssets, int numberOfDaysChange, Map dateMap) { @@ -524,8 +531,8 @@ public class DataInsightsReportApp extends AbstractNativeApplication { if (isKpiAvailable) { targetKpi = - String.valueOf( - Double.parseDouble(validKpi.getTargetDefinition().get(0).getValue()) * 100); + String.format( + "%.2f", Double.parseDouble(validKpi.getTargetDefinition().get(0).getValue()) * 100); KpiResult result = getKpiResult(validKpi.getName()); if (result != null) { isTargetMet = result.getTargetResult().get(0).getTargetMet(); @@ -546,6 +553,7 @@ public class DataInsightsReportApp extends AbstractNativeApplication { return new DataInsightDescriptionAndOwnerTemplate( metricType, criteria, + String.valueOf(totalAssets), percentCompleted, targetKpi, percentChange, diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/events/scheduled/template/DataInsightDescriptionAndOwnerTemplate.java b/openmetadata-service/src/main/java/org/openmetadata/service/events/scheduled/template/DataInsightDescriptionAndOwnerTemplate.java index 3925de0895d..fb34e89ac60 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/events/scheduled/template/DataInsightDescriptionAndOwnerTemplate.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/events/scheduled/template/DataInsightDescriptionAndOwnerTemplate.java @@ -29,9 +29,11 @@ public class DataInsightDescriptionAndOwnerTemplate { NOT_MET } + private String totalAssets; private final String percentCompleted; private boolean kpiAvailable; private String percentChange; + private String percentChangeMessage; private String targetKpi; private String numberOfDaysLeft; private String completeMessage; @@ -42,6 +44,7 @@ public class DataInsightDescriptionAndOwnerTemplate { public DataInsightDescriptionAndOwnerTemplate( MetricType metricType, KpiCriteria criteria, + String totalAssets, Double percentCompleted, String targetKpi, Double percentChange, @@ -53,6 +56,8 @@ public class DataInsightDescriptionAndOwnerTemplate { this.percentCompleted = String.format("%.2f", percentCompleted); this.targetKpi = targetKpi; this.percentChange = String.format("%.2f", percentChange); + this.percentChangeMessage = getFormattedPercentChangeMessage(percentChange); + this.totalAssets = totalAssets; this.kpiAvailable = isKpiAvailable; this.numberOfDaysLeft = numberOfDaysLeft; this.tierMap = tierMap; @@ -131,6 +136,22 @@ public class DataInsightDescriptionAndOwnerTemplate { this.numberOfDaysLeft = numberOfDaysLeft; } + public String getTotalAssets() { + return totalAssets; + } + + public void setTotalAssets(String totalAssets) { + this.totalAssets = totalAssets; + } + + public String getPercentChangeMessage() { + return percentChangeMessage; + } + + public void setPercentChangeMessage(String message) { + this.percentChangeMessage = message; + } + public String getCompleteMessage() { return completeMessage; } @@ -162,4 +183,18 @@ public class DataInsightDescriptionAndOwnerTemplate { public void setDateMap(Map dateMap) { this.dateMap = dateMap; } + + public static String getFormattedPercentChangeMessage(Double percent) { + String symbol = ""; + String color = "#BF0000"; + if (percent > 0) { + symbol = "+"; + color = "#008611"; + } else if (percent < 0) { + symbol = "-"; + } + + return String.format( + "%s%.2f", color, symbol, percent); + } } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/events/scheduled/template/DataInsightTotalAssetTemplate.java b/openmetadata-service/src/main/java/org/openmetadata/service/events/scheduled/template/DataInsightTotalAssetTemplate.java index 6e194fa7ea5..5f7b85749a4 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/events/scheduled/template/DataInsightTotalAssetTemplate.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/events/scheduled/template/DataInsightTotalAssetTemplate.java @@ -13,12 +13,15 @@ package org.openmetadata.service.events.scheduled.template; +import static org.openmetadata.service.events.scheduled.template.DataInsightDescriptionAndOwnerTemplate.getFormattedPercentChangeMessage; + import java.util.Map; @SuppressWarnings("unused") public class DataInsightTotalAssetTemplate { private String totalDataAssets; private String percentChangeTotalAssets; + private String percentChangeMessage; private String completeMessage; private int numberOfDaysChange; private Map dateMap; @@ -30,6 +33,7 @@ public class DataInsightTotalAssetTemplate { Map dateMap) { this.totalDataAssets = String.format("%.2f", totalDataAssets); this.percentChangeTotalAssets = String.format("%.2f", percentChangeTotalAssets); + this.percentChangeMessage = getFormattedPercentChangeMessage(percentChangeTotalAssets); this.numberOfDaysChange = numberOfDaysChange; this.dateMap = dateMap; String color = "#BF0000"; @@ -66,6 +70,14 @@ public class DataInsightTotalAssetTemplate { this.completeMessage = completeMessage; } + public String getPercentChangeMessage() { + return percentChangeMessage; + } + + public void setPercentChangeMessage(String message) { + this.percentChangeMessage = message; + } + public int getNumberOfDaysChange() { return numberOfDaysChange; } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/AppRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/AppRepository.java index a409de0392f..7789d3b2572 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/AppRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/AppRepository.java @@ -20,6 +20,7 @@ import org.openmetadata.schema.type.ProviderType; import org.openmetadata.schema.type.Relationship; import org.openmetadata.service.Entity; import org.openmetadata.service.exception.EntityNotFoundException; +import org.openmetadata.service.exception.UnhandledServerException; import org.openmetadata.service.resources.apps.AppResource; import org.openmetadata.service.security.jwt.JWTTokenGenerator; import org.openmetadata.service.util.EntityUtil; @@ -209,6 +210,9 @@ public class AppRepository extends EntityRepository { public AppRunRecord getLatestAppRuns(UUID appId) { String json = daoCollection.appExtensionTimeSeriesDao().getLatestAppRun(appId); + if (json == null) { + throw new UnhandledServerException("No Available Application Run Records."); + } return JsonUtils.readValue(json, AppRunRecord.class); } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/CollectionDAO.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/CollectionDAO.java index c0de86b8f52..421de0a4e27 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/CollectionDAO.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/CollectionDAO.java @@ -122,7 +122,6 @@ import org.openmetadata.schema.util.EntitiesCount; import org.openmetadata.schema.util.ServicesCount; import org.openmetadata.schema.utils.EntityInterfaceUtil; import org.openmetadata.service.Entity; -import org.openmetadata.service.exception.UnhandledServerException; import org.openmetadata.service.jdbi3.CollectionDAO.TagUsageDAO.TagLabelMapper; import org.openmetadata.service.jdbi3.CollectionDAO.UsageDAO.UsageDetailsMapper; import org.openmetadata.service.jdbi3.FeedRepository.FilterType; @@ -3715,7 +3714,7 @@ public interface CollectionDAO { if (!nullOrEmpty(result)) { return result.get(0); } - throw new UnhandledServerException("No Available Application Run Records."); + return null; } } diff --git a/openmetadata-service/src/main/resources/emailTemplates/dataInsightReport.ftl b/openmetadata-service/src/main/resources/emailTemplates/dataInsightReport.ftl index 7d5398121cf..489548a3d0b 100644 --- a/openmetadata-service/src/main/resources/emailTemplates/dataInsightReport.ftl +++ b/openmetadata-service/src/main/resources/emailTemplates/dataInsightReport.ftl @@ -84,7 +84,7 @@ - +
View DetailsView Report
@@ -104,46 +104,140 @@ - +
+ + + + + + + + + + +
+

Total Data Assets
${totalAssetObj.totalDataAssets}
${totalAssetObj.percentChangeMessage} [${totalAssetObj.numberOfDaysChange} Days Change]

+
+

Data Assets with Description
${descriptionObj.totalAssets}
${descriptionObj.percentChangeMessage} [${descriptionObj.numberOfDaysChange} Days Change]

+
+

Total Data Assets with Owner
${ownershipObj.totalAssets}
${ownershipObj.percentChangeMessage} [${ownershipObj.numberOfDaysChange} Days Change]

+
+

Data Assets with Tiers
${tierObj.totalAssets}
${tierObj.percentChangeMessage} [${tierObj.numberOfDaysChange} Days Change]

+
+ - @@ -507,7 +612,7 @@ <#list tierObj.dateMap?keys as key>
- + + + +
 
+ + + + + @@ -475,6 +576,10 @@ + + + +
+ - + + - + + + + + + + + + + + + + +
  + + + + + + +
Total Data Assets
+
+  
${totalAssetObj.completeMessage}
 
${totalAssetObj.percentChangeMessage} [${totalAssetObj.numberOfDaysChange} Days Change]
+
+ + + + + + + + + + @@ -337,12 +434,16 @@ - <#if ownershipObj.kpiAvailable> + <#if ownershipObj.kpiAvailable> + + + +
0
Total Data Assets
- - <#if descriptionObj.kpiAvailable> + <#if descriptionObj.kpiAvailable> - + + + + +
- + + + - - - - +
+ - + + + + + + @@ -151,12 +245,11 @@
- + + + + + +
+ - - - - - - - - - - - - - + + <#list totalAssetObj.dateMap?keys as key> + + +
 
 
Total Data Assets
${totalAssetObj.completeMessage}
${totalAssetObj.totalDataAssets} + + + + + + + + + +
 
 
+
 
+
+ + + + + + +
 
+
+ + + + + <#list totalAssetObj.dateMap?keys as key> + + + +
${key}
 
  
@@ -199,12 +292,16 @@
 
Target KPI: ${descriptionObj.targetKpi}% | Current KPI: ${descriptionObj.percentCompleted}%
${descriptionObj.percentChangeMessage} [${descriptionObj.numberOfDaysChange} Days Change]
 
Target KPI: ${ownershipObj.targetKpi}% | Current KPI: ${ownershipObj.percentCompleted}%
${ownershipObj.percentChangeMessage} [${ownershipObj.numberOfDaysChange} Days Change]
 
${tierObj.percentChangeMessage} [${tierObj.numberOfDaysChange} Days Change]
- +