diff options
4 files changed, 50 insertions, 20 deletions
diff --git a/sonar-server/src/main/java/org/sonar/server/filters/Filter.java b/sonar-server/src/main/java/org/sonar/server/filters/Filter.java index c2d92af8d5b..69e2acafe9e 100644 --- a/sonar-server/src/main/java/org/sonar/server/filters/Filter.java +++ b/sonar-server/src/main/java/org/sonar/server/filters/Filter.java @@ -47,10 +47,11 @@ public class Filter { // filters on measures private List<MeasureCriterion> measureCriteria = Lists.newLinkedList(); + private int periodIndex = 0; // sorting private Integer sortedMetricId; - private int sortedVariationIndex = 0; // >0 only when sortedMetricId not null + private boolean sortedByMeasureVariation = false; private boolean sortedByLanguage; private boolean sortedByName; private boolean sortedByDate; @@ -177,13 +178,14 @@ public class Filter { } public Filter setSortedMetricId(Integer id) { - return setSortedMetricId(id, true); + return setSortedMetricId(id, true, false); } - public Filter setSortedMetricId(Integer id, boolean useValue) { + public Filter setSortedMetricId(Integer id, boolean isNumericValue, boolean isVariation) { unsetSorts(); this.sortedMetricId = id; - this.useMeasureValueToSort = useValue; + this.useMeasureValueToSort = isNumericValue; + this.sortedByMeasureVariation = isVariation; return this; } @@ -319,17 +321,24 @@ public class Filter { return this; } - public int getSortedVariationIndex() { - return sortedVariationIndex; + public int getPeriodIndex() { + return periodIndex; } - public Filter setSortedVariationIndex(int i) { - this.sortedVariationIndex = i; - return this; + public void setPeriodIndex(int i) { + this.periodIndex = i; + } + + public boolean isOnPeriod() { + return periodIndex>0; + } + + public void setSortedByMeasureVariation(boolean b) { + this.sortedByMeasureVariation = b; } - static String getVariationColumn(int variationIndex) { - switch (variationIndex) { + static String getVariationColumn(int periodIndex) { + switch (periodIndex) { case 1: return "variation_value_1"; case 2: @@ -347,11 +356,21 @@ public class Filter { String getColumnToSort() { String col = "text_value"; if (useMeasureValueToSort()) { - col = (sortedVariationIndex>0 ? getVariationColumn (sortedVariationIndex) : "value"); + col = (sortedByMeasureVariation ? getVariationColumn (periodIndex) : "value"); } return col; } + public boolean mustReturnEmptyResult() { + boolean hasCriterionOnVariation = false; + for (MeasureCriterion criterion : measureCriteria) { + if (criterion.isVariation()) { + hasCriterionOnVariation = true; + } + } + return (hasCriterionOnVariation && !isOnPeriod()); + } + @Override public String toString() { return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE); diff --git a/sonar-server/src/main/java/org/sonar/server/filters/FilterExecutor.java b/sonar-server/src/main/java/org/sonar/server/filters/FilterExecutor.java index 874838d1bbc..27ad79fe382 100644 --- a/sonar-server/src/main/java/org/sonar/server/filters/FilterExecutor.java +++ b/sonar-server/src/main/java/org/sonar/server/filters/FilterExecutor.java @@ -29,6 +29,7 @@ import org.sonar.api.utils.SonarException; import org.sonar.api.utils.TimeProfiler; import javax.persistence.Query; +import java.util.Collections; public class FilterExecutor implements ServerComponent { private static final Logger LOG = LoggerFactory.getLogger(FilterExecutor.class); @@ -40,6 +41,10 @@ public class FilterExecutor implements ServerComponent { } public FilterResult execute(Filter filter) { + if (filter.mustReturnEmptyResult()) { + return new FilterResult(filter, Collections.emptyList()); + } + String sql = null; try { TimeProfiler profiler = new TimeProfiler(FilterExecutor.class).start("Build/execute SQL query"); @@ -96,12 +101,16 @@ public class FilterExecutor implements ServerComponent { } for (int index = 0; index < filter.getMeasureCriteria().size(); index++) { MeasureCriterion criterion = filter.getMeasureCriteria().get(index); + String column = (criterion.isVariation() ? Filter.getVariationColumn(filter.getPeriodIndex()) : "value"); sql.append(", MAX(CASE WHEN pm.metric_id="); sql.append(criterion.getMetricId()); - sql.append(" AND pm.value"); + sql.append(" AND pm."); + sql.append(column); sql.append(criterion.getOperator()); sql.append(criterion.getValue()); - sql.append(" THEN value ELSE NULL END) AS crit_"); + sql.append(" THEN "); + sql.append(column); + sql.append(" ELSE NULL END) AS crit_"); sql.append(index); sql.append(" "); } @@ -125,9 +134,10 @@ public class FilterExecutor implements ServerComponent { if (index > 0) { sql.append(" OR "); } - MeasureCriterion criteria = filter.getMeasureCriteria().get(index); - sql.append("(pm.metric_id=").append(criteria.getMetricId()).append(" and pm.value") - .append(criteria.getOperator()).append(criteria.getValue()).append(")"); + MeasureCriterion criterion = filter.getMeasureCriteria().get(index); + String column = (criterion.isVariation() ? Filter.getVariationColumn(filter.getPeriodIndex()) : "value"); + sql.append("(pm.metric_id=").append(criterion.getMetricId()).append(" and pm.").append(column) + .append(criterion.getOperator()).append(criterion.getValue()).append(")"); index++; } diff --git a/sonar-server/src/main/java/org/sonar/server/filters/MeasureCriterion.java b/sonar-server/src/main/java/org/sonar/server/filters/MeasureCriterion.java index 4c2a9fd1506..b6b025fab49 100644 --- a/sonar-server/src/main/java/org/sonar/server/filters/MeasureCriterion.java +++ b/sonar-server/src/main/java/org/sonar/server/filters/MeasureCriterion.java @@ -60,7 +60,7 @@ public class MeasureCriterion { this.value = value; } - public Boolean getVariation() { + public Boolean isVariation() { return variation; } diff --git a/sonar-server/src/main/webapp/WEB-INF/app/helpers/filters_helper.rb b/sonar-server/src/main/webapp/WEB-INF/app/helpers/filters_helper.rb index b6a2b77c04b..da1002c6288 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/helpers/filters_helper.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/helpers/filters_helper.rb @@ -86,7 +86,8 @@ module FiltersHelper elsif filter.sorted_column.on_metric? && filter.sorted_column.metric metric=filter.sorted_column.metric - java_filter.setSortedMetricId(metric.id, metric.numeric?) + java_filter.setSortedMetricId(metric.id, metric.numeric?, filter.sorted_column.variation) + end @@ -98,7 +99,7 @@ module FiltersHelper #----- VARIATION - java_filter.setSortedVariationIndex(filter_context.period_index) + java_filter.setPeriodIndex(filter_context.period_index) #----- EXECUTION java_result=java_facade.execute_filter(java_filter) |