summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sonar-server/src/main/java/org/sonar/server/filters/Filter.java43
-rw-r--r--sonar-server/src/main/java/org/sonar/server/filters/FilterExecutor.java20
-rw-r--r--sonar-server/src/main/java/org/sonar/server/filters/MeasureCriterion.java2
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/helpers/filters_helper.rb5
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)