diff --git a/src/main/java/com/epam/ta/reportportal/dao/constant/WidgetContentRepositoryConstants.java b/src/main/java/com/epam/ta/reportportal/dao/constant/WidgetContentRepositoryConstants.java index 717d9366c..9817e51ee 100644 --- a/src/main/java/com/epam/ta/reportportal/dao/constant/WidgetContentRepositoryConstants.java +++ b/src/main/java/com/epam/ta/reportportal/dao/constant/WidgetContentRepositoryConstants.java @@ -134,5 +134,6 @@ public class WidgetContentRepositoryConstants { public static final String AGGREGATED_VALUES = "aggregated_values"; public static final String CUSTOM_COLUMN = "custom_column"; public static final String CUSTOM_COLUMN_SORTING = "customColumn"; + public static final String EXCLUDE_SKIPPED_TABLE = "exclude_skipped_table"; } diff --git a/src/main/java/com/epam/ta/reportportal/dao/util/WidgetContentUtil.java b/src/main/java/com/epam/ta/reportportal/dao/util/WidgetContentUtil.java index 49ce4ab67..53e5a5b89 100644 --- a/src/main/java/com/epam/ta/reportportal/dao/util/WidgetContentUtil.java +++ b/src/main/java/com/epam/ta/reportportal/dao/util/WidgetContentUtil.java @@ -628,14 +628,11 @@ private static void proceedProductStatusAttributes(Record record, String columnN }); - resultMap.values() - .stream() - .map(content -> excludeSkippedTests(params, content)) - .forEach(content -> { - double passingRate = 100.0 * content.getStatistics().getOrDefault(EXECUTIONS_PASSED, 0) - / content.getStatistics().getOrDefault(EXECUTIONS_TOTAL, 1); - content.setPassingRate(new BigDecimal(passingRate).setScale(2, RoundingMode.HALF_UP) - .doubleValue()); + resultMap.forEach((key, content) -> { + double passingRate = 100.0 * content.getStatistics().getOrDefault(EXECUTIONS_PASSED, 0) / + content.getStatistics().getOrDefault(EXECUTIONS_TOTAL, 1); + content.setPassingRate(BigDecimal.valueOf(passingRate) + .setScale(2, RoundingMode.HALF_UP).doubleValue()); }); return resultMap; diff --git a/src/main/java/com/epam/ta/reportportal/dao/widget/healthcheck/query/StatisticsQueryProvider.java b/src/main/java/com/epam/ta/reportportal/dao/widget/healthcheck/query/StatisticsQueryProvider.java index 6ec69516f..96f38a44e 100644 --- a/src/main/java/com/epam/ta/reportportal/dao/widget/healthcheck/query/StatisticsQueryProvider.java +++ b/src/main/java/com/epam/ta/reportportal/dao/widget/healthcheck/query/StatisticsQueryProvider.java @@ -1,27 +1,33 @@ package com.epam.ta.reportportal.dao.widget.healthcheck.query; +import static com.epam.ta.reportportal.dao.constant.WidgetContentRepositoryConstants.EXCLUDE_SKIPPED_TABLE; import static com.epam.ta.reportportal.dao.constant.WidgetContentRepositoryConstants.EXECUTIONS_FAILED; import static com.epam.ta.reportportal.dao.constant.WidgetContentRepositoryConstants.EXECUTIONS_TOTAL; import static com.epam.ta.reportportal.dao.constant.WidgetContentRepositoryConstants.ITEM_ID; import static com.epam.ta.reportportal.dao.constant.WidgetContentRepositoryConstants.KEY; +import static com.epam.ta.reportportal.dao.constant.WidgetContentRepositoryConstants.NAME; import static com.epam.ta.reportportal.dao.constant.WidgetContentRepositoryConstants.SUM; import static com.epam.ta.reportportal.dao.constant.WidgetContentRepositoryConstants.VALUE; import static com.epam.ta.reportportal.dao.util.JooqFieldNameTransformer.fieldName; import static com.epam.ta.reportportal.jooq.Tables.STATISTICS; import static com.epam.ta.reportportal.jooq.Tables.STATISTICS_FIELD; +import static com.epam.ta.reportportal.jooq.Tables.TEST_ITEM_RESULTS; import com.epam.ta.reportportal.entity.widget.content.healthcheck.HealthCheckTableGetParams; +import com.epam.ta.reportportal.jooq.enums.JStatusEnum; import com.google.common.collect.Sets; import java.math.BigDecimal; import java.util.List; import java.util.Optional; import org.jooq.Condition; +import org.jooq.DSLContext; import org.jooq.Record; import org.jooq.Record3; import org.jooq.Select; import org.jooq.SelectHavingStep; import org.jooq.SortOrder; import org.jooq.impl.DSL; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Component; @@ -31,6 +37,9 @@ @Component public class StatisticsQueryProvider extends AbstractHealthCheckTableQueryProvider { + @Autowired + private DSLContext dsl; + public StatisticsQueryProvider() { super(Sets.newHashSet(EXECUTIONS_TOTAL, EXECUTIONS_FAILED)); } @@ -38,21 +47,35 @@ public StatisticsQueryProvider() { @Override protected Select contentQuery(HealthCheckTableGetParams params, List levelConditions) { + var excludeSkipped = params.isExcludeSkippedTests(); - SelectHavingStep> selectQuery = DSL.select( + var resultStatusTable = DSL.select( STATISTICS_FIELD.NAME, DSL.sum(STATISTICS.S_COUNTER).as(SUM), fieldName(VALUE) ) .from(params.getViewName()) .join(STATISTICS) - .on(fieldName(params.getViewName(), ITEM_ID).cast(Long.class).eq(STATISTICS.ITEM_ID)) + .on(fieldName(params.getViewName(), ITEM_ID) + .cast(Long.class).eq(STATISTICS.ITEM_ID)) .join(STATISTICS_FIELD) .on(STATISTICS.STATISTICS_FIELD_ID.eq(STATISTICS_FIELD.SF_ID)) + .join(TEST_ITEM_RESULTS) + .on(TEST_ITEM_RESULTS.RESULT_ID + .eq(fieldName(params.getViewName(), ITEM_ID).cast(Long.class))) .where(fieldName(KEY).cast(String.class) .eq(params.getCurrentLevelKey()) .and(levelConditions.stream().reduce(DSL.noCondition(), Condition::and))) - .groupBy(fieldName(VALUE), STATISTICS_FIELD.NAME); + .groupBy(fieldName(VALUE), STATISTICS_FIELD.NAME, TEST_ITEM_RESULTS.STATUS) + .having(filterSkippedTests(excludeSkipped)) + .asTable(EXCLUDE_SKIPPED_TABLE); + + SelectHavingStep> selectQuery = DSL.select( + fieldName(NAME).cast(String.class).as(NAME), + DSL.sum(fieldName(SUM).cast(Long.class)).as(SUM), + fieldName(VALUE).as(VALUE)) + .from(resultStatusTable) + .groupBy(resultStatusTable.field(VALUE), resultStatusTable.field(NAME)); Optional resolvedSort = params.getSort() .get() @@ -60,13 +83,22 @@ protected Select contentQuery(HealthCheckTableGetParams params .findFirst(); if (resolvedSort.isPresent()) { return selectQuery.orderBy( - DSL.when(STATISTICS_FIELD.NAME.eq(resolvedSort.get().getProperty()), - STATISTICS_FIELD.NAME), + DSL.when(fieldName(NAME).cast(String.class).eq(resolvedSort.get().getProperty()), + fieldName(NAME)), resolvedSort.get().isAscending() ? - DSL.sum(STATISTICS.S_COUNTER).sort(SortOrder.ASC) : - DSL.sum(STATISTICS.S_COUNTER).sort(SortOrder.DESC) + fieldName(SUM).sort(SortOrder.ASC) : + fieldName(SUM).sort(SortOrder.DESC) ); } return selectQuery; } + + private Condition filterSkippedTests(boolean excludeSkipped) { + Condition condition = DSL.noCondition(); + if (excludeSkipped) { + return condition + .and(TEST_ITEM_RESULTS.STATUS.notEqual(JStatusEnum.SKIPPED)); + } + return condition; + } }