aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-server/src
diff options
context:
space:
mode:
authorsimonbrandhof <simon.brandhof@gmail.com>2010-12-10 13:37:09 +0000
committersimonbrandhof <simon.brandhof@gmail.com>2010-12-10 13:37:09 +0000
commitfe0b0a7a4ba6ecca89ee70452f22d9e9dcc1e924 (patch)
tree3eb400acc77b5173120a89acf28266c2f15ac038 /sonar-server/src
parenta55b6d2875e0386cef1c95b6e638c8dd5d9939d0 (diff)
downloadsonarqube-fe0b0a7a4ba6ecca89ee70452f22d9e9dcc1e924.tar.gz
sonarqube-fe0b0a7a4ba6ecca89ee70452f22d9e9dcc1e924.zip
SONAR-1956 improve filters in order to display variations
Diffstat (limited to 'sonar-server/src')
-rw-r--r--sonar-server/src/main/java/org/sonar/server/filters/Filter.java4
-rw-r--r--sonar-server/src/main/java/org/sonar/server/filters/MeasureCriterion.java21
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/controllers/filters_controller.rb18
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/helpers/filters_helper.rb46
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/models/criterion.rb2
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/models/filter_context.rb (renamed from sonar-server/src/main/webapp/WEB-INF/app/models/filter_result.rb)47
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/models/property.rb1
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/filters/_criterion.html.erb5
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/filters/_list.html.erb40
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/filters/index.html.erb2
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/filters/new.html.erb10
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/db/migrate/168_add_variations_to_filters.rb1
-rw-r--r--sonar-server/src/main/webapp/images/trend-up.pngbin3073 -> 566 bytes
-rw-r--r--sonar-server/src/test/java/org/sonar/server/filters/FilterExecutorTest.java30
14 files changed, 148 insertions, 79 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 4b3a456a8a4..c2d92af8d5b 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
@@ -254,8 +254,8 @@ public class Filter {
return this;
}
- public Filter createMeasureCriterionOnValue(Integer metricId, String operator, Double value) {
- this.measureCriteria.add(new MeasureCriterion(metricId, operator, value));
+ public Filter createMeasureCriterionOnValue(Integer metricId, String operator, Double value, Boolean variation) {
+ this.measureCriteria.add(new MeasureCriterion(metricId, operator, value, variation));
return this;
}
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 eb3aa5e7d7a..4c2a9fd1506 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
@@ -19,7 +19,7 @@
*/
package org.sonar.server.filters;
-import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
public class MeasureCriterion {
@@ -27,11 +27,13 @@ public class MeasureCriterion {
private Integer metricId;
private String operator;
private Double value;
+ private Boolean variation;
- public MeasureCriterion(Integer metricId, String operator, Double value) {
+ public MeasureCriterion(Integer metricId, String operator, Double value, Boolean variation) {
this.metricId = metricId;
this.operator = operator;
this.value = value;
+ this.variation = variation;
}
public Integer getMetricId() {
@@ -58,12 +60,17 @@ public class MeasureCriterion {
this.value = value;
}
+ public Boolean getVariation() {
+ return variation;
+ }
+
+ public MeasureCriterion setVariation(Boolean b) {
+ this.variation = b;
+ return this;
+ }
+
@Override
public String toString() {
- return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
- .append("metricId", metricId)
- .append("operator", operator)
- .append("value", value)
- .toString();
+ return new ReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).toString();
}
}
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/filters_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/filters_controller.rb
index 5315af9b5ef..69644b74a1f 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/controllers/filters_controller.rb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/filters_controller.rb
@@ -86,8 +86,9 @@ class FiltersController < ApplicationController
return access_denied
end
- @variation_index=params[:var].to_i
- @data=execute_filter(@filter, current_user, params)
+ options=params
+ options[:user]=current_user
+ @filter_context=execute_filter(FilterContext.new(@filter, options))
render :action => 'new'
end
@@ -398,11 +399,14 @@ class FiltersController < ApplicationController
params[:metric_ids]=[@size_metric, @color_metric]
@filter.sorted_column=FilterColumn.new('family' => 'metric', :kee => @size_metric.key, :sort_direction => (@size_metric.direction>=0 ? 'ASC' : 'DESC'))
- @data=execute_filter(@filter, current_user, params)
-
+
+ options=params
+ options[:user]=current_user
+ @filter_context=execute_filter(FilterContext.new(@filter, options))
+
@width=(params[:width]||'800').to_i
@height=(params[:height]||'500').to_i
- @treemap=Sonar::Treemap.new(@data.measures_by_snapshot, @width, @height, @size_metric, @color_metric)
+ @treemap=Sonar::Treemap.new(@filter_context.measures_by_snapshot, @width, @height, @size_metric, @color_metric)
render :action => "treemap", :layout => false
end
@@ -481,7 +485,9 @@ class FiltersController < ApplicationController
if @active
@filter=@active.filter
unless @filter.ajax_loading?
- @data=execute_filter(@filter, current_user, params)
+ options=params
+ options[:user]=current_user
+ @filter_context=execute_filter(FilterContext.new(@filter, options))
load_masterproject() if @filter.projects_homepage?
end
end
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 3aefd4295f9..35bea1ad091 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
@@ -19,7 +19,8 @@
#
module FiltersHelper
- def execute_filter(filter, user=nil, options={})
+ def execute_filter(filter_context)
+ filter=filter_context.filter
java_filter=Java::OrgSonarServerFilters::Filter.new
#----- FILTER ON RESOURCES
@@ -33,7 +34,7 @@ module FiltersHelper
end
if filter.favourites
- java_filter.setFavouriteIds((user ? user.favourite_ids : []).to_java(:Integer))
+ java_filter.setFavouriteIds((filter_context.user ? user.favourite_ids : []).to_java(:Integer))
end
date_criterion=filter.criterion('date')
@@ -66,13 +67,13 @@ module FiltersHelper
#----- FILTER ON MEASURES
filter.measure_criteria.each do |c|
- java_filter.createMeasureCriterionOnValue(c.metric.id, c.operator, c.value)
+ java_filter.createMeasureCriterionOnValue(c.metric.id, c.operator, c.value, c.variation)
end
#----- SORTED COLUMN
- if options[:sort]
- filter.sorted_column=options[:sort].to_i
+ if filter_context.sorted_column_id
+ filter.sorted_column=filter_context.sorted_column_id
end
if filter.sorted_column.on_name?
java_filter.setSortedByName()
@@ -90,25 +91,21 @@ module FiltersHelper
#----- SORTING DIRECTION
- if options[:asc]
- filter.sorted_column.ascending=(options[:asc]=='true')
+ if filter_context.ascending_sort
+ filter.sorted_column.ascending=filter_context.ascending_sort
end
java_filter.setAscendingSort(filter.sorted_column.ascending?)
#----- VARIATION
- variation_index = (options[:var] ? options[:var].to_i : filter.variation_index)
- java_filter.setSortedVariationIndex(variation_index)
+ java_filter.setSortedVariationIndex(filter_context.variation_index)
#----- EXECUTION
java_result=java_facade.execute_filter(java_filter)
snapshot_ids=extract_snapshot_ids(java_result.getRows())
-
-
- options[:snapshot_ids]=snapshot_ids
- options[:security_exclusions]=(snapshot_ids.size < java_result.size())
- FilterResult.new(filter, options)
+ has_security_exclusions=(snapshot_ids.size < java_result.size())
+ filter_context.process_results(snapshot_ids, has_security_exclusions)
end
def column_title(column, filter)
@@ -156,9 +153,30 @@ module FiltersHelper
end
end
+ def period_names
+ p1=Property.value('sonar.timemachine.variation1', nil, 'previous_analysis')
+ p2=Property.value('sonar.timemachine.variation2', nil, '5')
+ p3=Property.value('sonar.timemachine.variation3', nil, '30')
+ [period_name(p1), period_name(p2), period_name(p3)]
+ end
private
+ def period_name(property)
+ if property=='previous_analysis'
+ "Since previous analysis"
+ elsif property =~ /^[\d]+(\.[\d]+){0,1}$/
+ # is integer
+ "Previous #{property} days"
+ elsif property =~ /\d{4}-\d{2}-\d{2}/
+ "Since #{property}"
+ elsif !property.blank?
+ "Since version #{property}"
+ else
+ nil
+ end
+ end
+
def extract_snapshot_ids(sql_rows)
sids=[]
project_ids=sql_rows.map{|r| r[2] ? to_integer(r[2]) : to_integer(r[1])}.compact.uniq
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/models/criterion.rb b/sonar-server/src/main/webapp/WEB-INF/app/models/criterion.rb
index d04348a7978..68eb11767f6 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/models/criterion.rb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/models/criterion.rb
@@ -79,7 +79,7 @@ class Criterion < ActiveRecord::Base
def self.new_for_metric(options)
metric=Metric.by_id(options['metric_id'])
- new(:family => 'metric', :operator => options['operator'], :kee => (metric ? metric.name : nil), :value => options['value'])
+ new(:family => 'metric', :operator => options['operator'], :kee => (metric ? metric.name : nil), :value => options['value'], :variation => (options['type']=='variation'))
end
end
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/models/filter_result.rb b/sonar-server/src/main/webapp/WEB-INF/app/models/filter_context.rb
index 0a165acaedf..aa4541566bc 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/models/filter_result.rb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/models/filter_context.rb
@@ -17,19 +17,24 @@
# License along with {library}; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
#
- class FilterResult
- attr_accessor :page_size, :page_id, :security_exclusions, :filter, :variation_index
+ class FilterContext
+ attr_accessor :filter, :page_size, :page_id, :security_exclusions, :variation_index, :user, :sorted_column_id, :ascending_sort
def initialize(filter, options={})
@filter = filter
@page_size=options[:page_size] || @filter.page_size
@page_id=(options[:page_id] ? options[:page_id].to_i : 1)
- @sids=options[:snapshot_ids]
- @page_sids=[]
- @security_exclusions=options[:security_exclusions]
+ @sorted_column_id=(options[:sort].blank? ? nil : options[:sort].to_i)
+ @ascending_sort=(options[:asc].blank? ? nil : options[:asc]=='true')
+ @user=options[:user]
+ @variation_index = (options[:var] ? options[:var].to_i : filter.variation_index )
@metric_ids=(options[:metric_ids] || @filter.columns.map{|col| col.metric ? col.metric.id : nil}.compact.uniq)
- @variation_index = (options[:var].blank? ? filter.variation_index : options[:var].to_i)
+ end
+ def process_results(snapshot_ids, security_exclusions)
+ @sids=snapshot_ids
+ @security_exclusions=security_exclusions
+
from=(@page_id-1) * @page_size
to=(@page_id*@page_size)-1
to=@sids.size-1 if to>=@sids.size
@@ -76,14 +81,16 @@
end
end
end
+ self
end
+
def size
@sids.size
end
def empty?
- @page_sids.empty?
+ @page_sids.nil? || @page_sids.empty?
end
def page_count
@@ -128,4 +135,30 @@
def variation?
@variation_index && @variation_index>0
end
+
+
+
+ private
+
+ def extract_snapshot_ids(sql_rows)
+ sids=[]
+ project_ids=sql_rows.map{|r| r[2] ? to_integer(r[2]) : to_integer(r[1])}.compact.uniq
+ authorized_pids=select_authorized(:user, project_ids)
+ sql_rows.each do |row|
+ pid=(row[2] ? to_integer(row[2]) : to_integer(row[1]))
+ if authorized_pids.include?(pid)
+ sids<<to_integer(row[0])
+ end
+ end
+ sids
+ end
+
+ def to_integer(obj)
+ if obj.is_a?(Fixnum)
+ obj
+ else
+ # java.math.BigDecimal
+ obj.intValue()
+ end
+ end
end \ No newline at end of file
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/models/property.rb b/sonar-server/src/main/webapp/WEB-INF/app/models/property.rb
index 978b98509a9..35088298227 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/models/property.rb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/models/property.rb
@@ -35,7 +35,6 @@ class Property < ActiveRecord::Base
hash
end
-
def self.value(key, resource_id=nil, default_value=nil)
prop=Property.find(:first, :conditions => {'prop_key' => key, 'resource_id' => resource_id, 'user_id' => nil})
prop ? prop.text_value : default_value
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/filters/_criterion.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/filters/_criterion.html.erb
index c419bd58308..93067046dda 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/views/filters/_criterion.html.erb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/views/filters/_criterion.html.erb
@@ -3,6 +3,7 @@
Form.Element.clear('metric-' + id);
Form.Element.clear('op-' + id);
Form.Element.clear('val-' + id);
+ Form.Element.clear('type-' + id);
}
</script>
<select name="criteria[<%= id -%>][metric_id]" id="metric-<%= id -%>">
@@ -15,6 +16,10 @@
</optgroup>
<% end %>
</select>
+<select name="criteria[<%= id -%>][type]" id="type-<%= id -%>">
+ <option value="value" <%= 'selected' unless (criterion && criterion.variation) -%>>Value</option>
+ <option value="variation" <%= 'selected' if criterion && criterion.variation -%>>Variation</option>
+</select>
<select name="criteria[<%= id -%>][operator]" id="op-<%= id -%>">
<option value=""></option>
<option value="<" <%= 'selected' if (criterion && criterion.operator=='<') -%>>Less than</option>
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/filters/_list.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/filters/_list.html.erb
index b1a93540f36..d6016ab67d6 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/views/filters/_list.html.erb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/views/filters/_list.html.erb
@@ -1,12 +1,12 @@
-<% filter=data.filter %>
+<% filter=@filter_context.filter %>
<div>
-Periods:
+Period:
<form action="<%= url_for :overwrite_params => {:var => nil} -%>" style="display: inline" method="get">
<select name="var" onchange="submit()" class="small">
<option value="">None</option>
- <option value="1" <%= 'selected' if data.variation_index==1 -%>>Period 1</option>
- <option value="2" <%= 'selected' if data.variation_index==2 -%>>Period 2</option>
- <option value="3" <%= 'selected' if data.variation_index==3 -%>>Period 3</option>
+ <% period_names.each_with_index do |name, index| %>
+ <option value="<%= index+1 -%>" <%= 'selected' if @filter_context.variation_index==index+1 -%>><%= name -%></value>
+ <% end %>
</select>
</form>
@@ -36,15 +36,15 @@ Periods:
<tfoot>
<tr>
<td colspan="<%= filter.columns.size + 1 -%>">
- <span id="results_count"><%= pluralize(data.size, 'result') %></span>
+ <span id="results_count"><%= pluralize(@filter_context.size, 'result') %></span>
- <% if data.page_count>1 %>
+ <% if @filter_context.page_count>1 %>
|
- <%= link_to_if data.page_id>1, 'previous', {:overwrite_params => {:page_id => data.page_id-1}} %>
- <% for index in 1..data.page_count %>
- <%= link_to_unless index==data.page_id, index.to_s, {:overwrite_params => {:page_id => index}} %>
+ <%= link_to_if @filter_context.page_id>1, 'previous', {:overwrite_params => {:page_id => @filter_context.page_id-1}} %>
+ <% for index in 1..@filter_context.page_count %>
+ <%= link_to_unless index==@filter_context.page_id, index.to_s, {:overwrite_params => {:page_id => index}} %>
<% end %>
- <%= link_to_if data.page_id<data.page_count, 'next', {:overwrite_params => {:page_id => 1+data.page_id}} %>
+ <%= link_to_if @filter_context.page_id<@filter_context.page_count, 'next', {:overwrite_params => {:page_id => 1+@filter_context.page_id}} %>
<% end %>
<% if @filter.projects_homepage? %>
@@ -69,26 +69,26 @@ Periods:
<% end %>
</tr>
<% end %>
- <% if data.empty? %>
+ <% if @filter_context.empty? %>
<tr class="even"><td colspan="<%= 1+filter.columns.size -%>">No results.</td></tr>
<% else %>
<%
- data.page_sorted_snapshot_ids.each do |snapshot_id|
- snapshot=data.snapshot(snapshot_id)
+ @filter_context.page_sorted_snapshot_ids.each do |snapshot_id|
+ snapshot=@filter_context.snapshot(snapshot_id)
%>
<tr class="<%= cycle('even','odd') -%>">
<td><% if logged_in? %><%= link_to_favourite(snapshot.project) -%><% end %></td>
<% filter.columns.each do |column| %>
<td class="<%= column_align(column) -%>">
<% if column.on_metric?
- measure = data.measure(snapshot, column.metric)
+ measure = @filter_context.measure(snapshot, column.metric)
%>
<% if column.variation %>
- <%= format_variation(measure, :index => data.variation_index) -%>
+ <%= format_variation(measure, :index => @filter_context.variation_index) -%>
<% else %>
<%= format_measure(measure) -%>
- <% if data.variation? %>
- <%= format_variation(measure, :index => data.variation_index) -%>
+ <% if @filter_context.variation? %>
+ <%= format_variation(measure, :index => @filter_context.variation_index) -%>
<% else %>
<%= trend_icon(measure, :empty => true) -%>
<% end %>
@@ -100,7 +100,7 @@ Periods:
<% elsif column.on_date? %><%= human_short_date(snapshot.created_at) %>
<% elsif column.on_key? %><span class="small"><%= snapshot.project.kee -%></span>
<% elsif column.on_links?
- data.links(snapshot.project_id).each do |link| %>
+ @filter_context.links(snapshot.project_id).each do |link| %>
<%= link_to(image_tag(link.icon, :alt => link.name), link.href, :class => 'nolink', :popup => true) unless link.custom? %>
<% end
end %>
@@ -112,7 +112,7 @@ Periods:
</tbody>
</table>
<br/>
-<% if data.security_exclusions? %>
+<% if @filter_context.security_exclusions? %>
<p class="notes">Due to security settings, some results are not being displayed.</p>
<% end %>
</div> \ No newline at end of file
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/filters/index.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/filters/index.html.erb
index 0e39d5c80ad..901852cabe5 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/views/filters/index.html.erb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/views/filters/index.html.erb
@@ -1,4 +1,4 @@
<%= render :partial => 'filters/tabs', :locals => {:selected_tab=> (@active && @active.filter ? @active.filter.id : nil) } %>
<div class="tabs-panel">
-<%= render :partial => "filters/#{@filter.default_view}", :locals => {:data => @data, :edit_mode => false } if @filter %>
+<%= render :partial => "filters/#{@filter.default_view}", :locals => {:edit_mode => false } if @filter %>
</div> \ No newline at end of file
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/filters/new.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/filters/new.html.erb
index 5678afe6d69..9e4bda43fd5 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/views/filters/new.html.erb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/views/filters/new.html.erb
@@ -104,9 +104,9 @@ table#columns td {
<td>
<select id="variation_index" name="variation_index">
<option value="">None</option>
- <option value="1" <%= 'selected' if @filter.variation_index==1 -%>>Period 1</value>
- <option value="2" <%= 'selected' if @filter.variation_index==2 -%>>Period 2</value>
- <option value="3" <%= 'selected' if @filter.variation_index==3 -%>>Period 3</value>
+ <% period_names.each_with_index do |name, index| %>
+ <option value="<%= index+1 -%>" <%= 'selected' if @filter.variation_index==index+1 -%>><%= name -%></value>
+ <% end %>
</select>
</td>
</tr>
@@ -180,7 +180,7 @@ $('name').focus();
</script>
<br/>
-<% if @data %>
+<% if @filter_context %>
<h1>Display</h1>
<div class="admin">
<table class="form" id="view-form">
@@ -200,6 +200,6 @@ $('name').focus();
</table>
</div>
<br/>
- <%= render :partial => "filters/#{@filter.default_view}", :locals => {:data => @data, :edit_mode => true} %>
+ <%= render :partial => "filters/#{@filter.default_view}", :locals => {:edit_mode => true} %>
<% end %>
</div> \ No newline at end of file
diff --git a/sonar-server/src/main/webapp/WEB-INF/db/migrate/168_add_variations_to_filters.rb b/sonar-server/src/main/webapp/WEB-INF/db/migrate/168_add_variations_to_filters.rb
index 34a703a19b7..f55f55cc1f7 100644
--- a/sonar-server/src/main/webapp/WEB-INF/db/migrate/168_add_variations_to_filters.rb
+++ b/sonar-server/src/main/webapp/WEB-INF/db/migrate/168_add_variations_to_filters.rb
@@ -26,6 +26,7 @@ class AddVariationsToFilters < ActiveRecord::Migration
def self.up
add_column :filters, :variation_index, :integer, :null => true
add_column :filter_columns, :variation, :boolean, :null => true
+ add_column :criteria, :variation, :boolean, :null => true
end
end
diff --git a/sonar-server/src/main/webapp/images/trend-up.png b/sonar-server/src/main/webapp/images/trend-up.png
index 4c8be2ecb77..d7213ad67e2 100644
--- a/sonar-server/src/main/webapp/images/trend-up.png
+++ b/sonar-server/src/main/webapp/images/trend-up.png
Binary files differ
diff --git a/sonar-server/src/test/java/org/sonar/server/filters/FilterExecutorTest.java b/sonar-server/src/test/java/org/sonar/server/filters/FilterExecutorTest.java
index 72e2f1ca4e4..627561b4f4f 100644
--- a/sonar-server/src/test/java/org/sonar/server/filters/FilterExecutorTest.java
+++ b/sonar-server/src/test/java/org/sonar/server/filters/FilterExecutorTest.java
@@ -155,7 +155,7 @@ public class FilterExecutorTest extends AbstractDbUnitTestCase {
FilterExecutor executor = new FilterExecutor(getSession());
Filter filter = new Filter()
.setQualifiers(Sets.newHashSet(Resource.QUALIFIER_CLASS))
- .addMeasureCriterion(new MeasureCriterion(2, ">", 50.0));
+ .addMeasureCriterion(new MeasureCriterion(2, ">", 50.0, false));
FilterResult result = executor.execute(filter);
assertSnapshotIds(result, 5);
@@ -167,8 +167,8 @@ public class FilterExecutorTest extends AbstractDbUnitTestCase {
FilterExecutor executor = new FilterExecutor(getSession());
Filter filter = new Filter()
.setQualifiers(Sets.newHashSet(Resource.QUALIFIER_CLASS))
- .addMeasureCriterion(new MeasureCriterion(2, ">", 50.0))
- .addMeasureCriterion(new MeasureCriterion(1, ">", 100.0));
+ .addMeasureCriterion(new MeasureCriterion(2, ">", 50.0, false))
+ .addMeasureCriterion(new MeasureCriterion(1, ">", 100.0, false));
FilterResult result = executor.execute(filter);
assertSnapshotIds(result, 5);
@@ -180,8 +180,8 @@ public class FilterExecutorTest extends AbstractDbUnitTestCase {
FilterExecutor executor = new FilterExecutor(getSession());
Filter filter = new Filter()
.setQualifiers(Sets.newHashSet(Resource.QUALIFIER_CLASS))
- .addMeasureCriterion(new MeasureCriterion(2, ">", 50.0))
- .addMeasureCriterion(new MeasureCriterion(1, "<", 100.0));
+ .addMeasureCriterion(new MeasureCriterion(2, ">", 50.0, false))
+ .addMeasureCriterion(new MeasureCriterion(1, "<", 100.0, false));
FilterResult result = executor.execute(filter);
assertThat(result.size(), is(0));
@@ -193,8 +193,8 @@ public class FilterExecutorTest extends AbstractDbUnitTestCase {
FilterExecutor executor = new FilterExecutor(getSession());
Filter filter = new Filter()
.setQualifiers(Sets.newHashSet(Resource.QUALIFIER_CLASS))
- .addMeasureCriterion(new MeasureCriterion(2, ">", 5.0))
- .addMeasureCriterion(new MeasureCriterion(1, ">", 5.0))
+ .addMeasureCriterion(new MeasureCriterion(2, ">", 5.0, false))
+ .addMeasureCriterion(new MeasureCriterion(1, ">", 5.0, false))
.setSortedMetricId(2); // sort by coverage
FilterResult result = executor.execute(filter);
@@ -207,8 +207,8 @@ public class FilterExecutorTest extends AbstractDbUnitTestCase {
FilterExecutor executor = new FilterExecutor(getSession());
Filter filter = new Filter()
.setQualifiers(Sets.newHashSet(Resource.QUALIFIER_CLASS))
- .addMeasureCriterion(new MeasureCriterion(2, ">", 5.0)) // filter on coverage
- .addMeasureCriterion(new MeasureCriterion(1, ">", 5.0)) // filter on lines
+ .addMeasureCriterion(new MeasureCriterion(2, ">", 5.0, false)) // filter on coverage
+ .addMeasureCriterion(new MeasureCriterion(1, ">", 5.0, false)) // filter on lines
.setSortedMetricId(2) // sort by coverage
.setAscendingSort(false);
@@ -238,7 +238,7 @@ public class FilterExecutorTest extends AbstractDbUnitTestCase {
FilterExecutor executor = new FilterExecutor(getSession());
Filter filter = new Filter()
.setQualifiers(Sets.newHashSet(Resource.QUALIFIER_CLASS))
- .addMeasureCriterion(new MeasureCriterion(3, ">", 0.0)); // filter on duplicated lines
+ .addMeasureCriterion(new MeasureCriterion(3, ">", 0.0, false)); // filter on duplicated lines
FilterResult result = executor.execute(filter);
assertSnapshotIds(result, 6);
@@ -250,8 +250,8 @@ public class FilterExecutorTest extends AbstractDbUnitTestCase {
FilterExecutor executor = new FilterExecutor(getSession());
Filter filter = new Filter()
.setQualifiers(Sets.newHashSet(Resource.QUALIFIER_CLASS))
- .addMeasureCriterion(new MeasureCriterion(1, ">", 0.0)) // filter on lines
- .addMeasureCriterion(new MeasureCriterion(3, ">", 0.0)); // filter on duplicated lines
+ .addMeasureCriterion(new MeasureCriterion(1, ">", 0.0, false)) // filter on lines
+ .addMeasureCriterion(new MeasureCriterion(3, ">", 0.0, false)); // filter on duplicated lines
FilterResult result = executor.execute(filter);
assertSnapshotIds(result, 6);
@@ -275,7 +275,7 @@ public class FilterExecutorTest extends AbstractDbUnitTestCase {
FilterExecutor executor = new FilterExecutor(getSession());
Filter filter = new Filter()
.setQualifiers(Sets.newHashSet(Resource.QUALIFIER_CLASS))
- .addMeasureCriterion(new MeasureCriterion(1, ">", 0.0)) // lines > 0
+ .addMeasureCriterion(new MeasureCriterion(1, ">", 0.0, false)) // lines > 0
.setSortedMetricId(2); // sort by coverage
FilterResult result = executor.execute(filter);
@@ -288,8 +288,8 @@ public class FilterExecutorTest extends AbstractDbUnitTestCase {
FilterExecutor executor = new FilterExecutor(getSession());
Filter filter = new Filter()
.setQualifiers(Sets.newHashSet(Resource.QUALIFIER_CLASS))
- .addMeasureCriterion(new MeasureCriterion(1, ">", 400.0)) // lines > 400
- .addMeasureCriterion(new MeasureCriterion(1, "<", 600.0)); // lines > 400
+ .addMeasureCriterion(new MeasureCriterion(1, ">", 400.0, false)) // lines > 400
+ .addMeasureCriterion(new MeasureCriterion(1, "<", 600.0, false)); // lines > 400
FilterResult result = executor.execute(filter);
assertSnapshotIds(result, 5);