]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-249 support filter criteria on variations
authorsimonbrandhof <simon.brandhof@gmail.com>
Wed, 15 Dec 2010 16:11:35 +0000 (16:11 +0000)
committersimonbrandhof <simon.brandhof@gmail.com>
Wed, 15 Dec 2010 16:11:35 +0000 (16:11 +0000)
sonar-server/src/main/java/org/sonar/server/filters/Filter.java
sonar-server/src/main/java/org/sonar/server/filters/FilterExecutor.java
sonar-server/src/main/java/org/sonar/server/filters/MeasureCriterion.java
sonar-server/src/main/webapp/WEB-INF/app/helpers/filters_helper.rb

index c2d92af8d5b353415cc33b15937b2fc74b8e7a4f..69e2acafe9e7932a9a62fae38164a590064f54fb 100644 (file)
@@ -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);
index 874838d1bbc33fc16d08c00f24f0dbaf62cb1d63..27ad79fe38284e5c8e021310f9ba6fe2a459793d 100644 (file)
@@ -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++;
         }
 
index 4c2a9fd15062663ba53df47bee70e955c165d5fd..b6b025fab498b27e3f6a0900634ac02c4ec1f7bf 100644 (file)
@@ -60,7 +60,7 @@ public class MeasureCriterion {
     this.value = value;
   }
 
-  public Boolean getVariation() {
+  public Boolean isVariation() {
     return variation;
   }
 
index b6a2b77c04b8eeb9dac2fc13b5fe9eb0313eb345..da1002c62883e6d0a6ff8c95582ad148c67e650c 100644 (file)
@@ -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)