From aa4a3dc35721fd6fdaaa819c17fb0ec2a506a6fe Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Mon, 10 Dec 2012 23:06:29 +0100 Subject: [PATCH] SONAR-3825 display null values at the end of results, whatever the asc/desc sorting --- .../sonar/core/measure/MeasureFilterSql.java | 7 ++++-- .../measure/MeasureFilterExecutorTest.java | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/sonar-core/src/main/java/org/sonar/core/measure/MeasureFilterSql.java b/sonar-core/src/main/java/org/sonar/core/measure/MeasureFilterSql.java index e1ec30a4291..54b0d00a007 100644 --- a/sonar-core/src/main/java/org/sonar/core/measure/MeasureFilterSql.java +++ b/sonar-core/src/main/java/org/sonar/core/measure/MeasureFilterSql.java @@ -99,8 +99,11 @@ class MeasureFilterSql { } } if (filter.sort().isSortedByDatabase()) { - sql.append(" ORDER BY sortval"); - sql.append(filter.sort().isAsc() ? " ASC " : " DESC "); + if (filter.sort().isAsc()) { + sql.append(" ORDER BY sortval"); + } else { + sql.append(" ORDER BY CASE WHEN max(sortval) IS NULL THEN 1 ELSE 0 END, sortval DESC"); + } } } diff --git a/sonar-core/src/test/java/org/sonar/core/measure/MeasureFilterExecutorTest.java b/sonar-core/src/test/java/org/sonar/core/measure/MeasureFilterExecutorTest.java index 3bc247897a2..3416b62fa8e 100644 --- a/sonar-core/src/test/java/org/sonar/core/measure/MeasureFilterExecutorTest.java +++ b/sonar-core/src/test/java/org/sonar/core/measure/MeasureFilterExecutorTest.java @@ -218,6 +218,30 @@ public class MeasureFilterExecutorTest extends AbstractDaoTestCase { verifyJavaTinyFile(rows.get(1)); } + @Test + public void null_measures_are_ordered_after_descending_numeric_measures() throws SQLException { + MeasureFilter filter = new MeasureFilter().setResourceQualifiers(Arrays.asList("TRK")) + .setSortOnMetric(METRIC_COVERAGE).setSortAsc(false); + List rows = executor.execute(filter, new MeasureFilterContext()); + + // Java has coverage but not PHP + assertThat(rows).hasSize(2); + verifyJavaProject(rows.get(0)); + verifyPhpProject(rows.get(1)); + } + + @Test + public void null_measures_are_ordered_after_ascending_numeric_measures() throws SQLException { + MeasureFilter filter = new MeasureFilter().setResourceQualifiers(Arrays.asList("TRK")) + .setSortOnMetric(METRIC_COVERAGE).setSortAsc(true); + List rows = executor.execute(filter, new MeasureFilterContext()); + + // Java has coverage but not PHP + assertThat(rows).hasSize(2); + verifyJavaProject(rows.get(0)); + verifyPhpProject(rows.get(1)); + } + @Test public void sort_by_missing_numeric_measure() throws SQLException { // coverage measures are not computed -- 2.39.5