]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-2701 Improve "Time Machine" widget
authorFabrice Bellingard <bellingard@gmail.com>
Fri, 26 Aug 2011 14:21:38 +0000 (16:21 +0200)
committerFabrice Bellingard <bellingard@gmail.com>
Fri, 26 Aug 2011 14:21:38 +0000 (16:21 +0200)
- Rename numberOfVersions into numberOfColumns
- Always take the last snapshot to display

plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/widgets/TimeMachineWidget.java
plugins/sonar-core-plugin/src/main/resources/org/sonar/plugins/core/widgets/time_machine.html.erb
sonar-server/src/main/webapp/WEB-INF/app/models/snapshot.rb

index 5d8af7e9a35960a4d001aa788e70f3c0eef480a3..185e814374c49c227a64d90eb9eb5d0c0df17777 100644 (file)
@@ -27,7 +27,7 @@ import org.sonar.api.web.WidgetPropertyType;
 
 @WidgetProperties(
     {
-        @WidgetProperty(key = "numberOfVersions", type = WidgetPropertyType.INTEGER, defaultValue = "4"),
+        @WidgetProperty(key = "numberOfColumns", type = WidgetPropertyType.INTEGER, defaultValue = "4"),
         @WidgetProperty(key = "displaySparkLine", type = WidgetPropertyType.BOOLEAN),
         @WidgetProperty(key = "metric1", type = WidgetPropertyType.METRIC, defaultValue = "ncloc"),
         @WidgetProperty(key = "metric2", type = WidgetPropertyType.METRIC),
index 5ebeab3724f3dc993c66d2ac79a4c760aa0e355a..e4244e0c700b7a84a89b0a273aeb3e5ad6d24fa2 100644 (file)
@@ -12,7 +12,7 @@
     ncloc = Metric.find(:first, :conditions => "name = 'ncloc'")
     metric_ids << ncloc.id
   end
-  numberOfVersions = widget_properties["numberOfVersions"].to_i == 0 ? 4 : widget_properties["numberOfVersions"].to_i
+  numberOfColumns = widget_properties["numberOfColumns"].to_i == 0 ? 4 : widget_properties["numberOfColumns"].to_i
   displaySparkLine = widget_properties["displaySparkLine"]
   
   # Retrieve the measures for each metric on each snapshot
@@ -21,7 +21,7 @@
   if from_date
     options[:from] = from_date
   end
-  snapshots=Snapshot.for_timemachine_widget(@resource, numberOfVersions, options)
+  snapshots=Snapshot.for_timemachine_widget(@resource, numberOfColumns, options)
   sids = snapshots.collect{|s| s.id}.uniq
   measures=ProjectMeasure.find(:all, :conditions => {:snapshot_id => sids, :metric_id => metric_ids})
 
index c50e5e54f40610f611094ef74eb3ea6edfc62e63..ab8a024f9c3397d1936a54e1dfc21a2b278ef027 100644 (file)
@@ -68,36 +68,30 @@ class Snapshot < ActiveRecord::Base
     snapshots.compact.uniq
   end
   
-  def self.for_timemachine_widget(resource, number_of_versions, options={})
+  def self.for_timemachine_widget(resource, number_of_columns, options={})
+    if number_of_columns == 1
+      # Display only the latest snapshot
+      return [resource.last_snapshot]
+    end
+    
+    # Get 1rst & latests snapshots of the period
     snapshot_conditions = ["snapshots.project_id=? AND snapshots.status=? AND snapshots.scope=? AND snapshots.qualifier=?", resource.id, STATUS_PROCESSED, resource.scope, resource.qualifier]
-    event_conditions = ["events.category=? AND events.resource_id=?", "Version", resource.id]
-    if (options[:from])
+    if options[:from]
       snapshot_conditions[0] += " AND snapshots.created_at>=?"
       snapshot_conditions << options[:from]
-      event_conditions[0] += " AND events.event_date>=?"
-      event_conditions << options[:from]
     end
-    
-    if number_of_versions == 1
-      # Display only the latest snapshot
-      last_snapshot = Snapshot.find(:last, :conditions => snapshot_conditions, :order => 'snapshots.created_at ASC')
-      return [last_snapshot]
-    end
-    
-    # Look for 1rst snapshot of the period
     first_snapshot=Snapshot.find(:first, :conditions => snapshot_conditions, :order => 'snapshots.created_at ASC')
+    last_snapshot=resource.last_snapshot
     
-    # Look for the number_of_versions-1 last events to display
-    events_to_display = Event.find(:all, :conditions => event_conditions, :order => 'events.event_date ASC').last(number_of_versions-1)
-    
-    # And retrieve the wanted snapshots corresponding to the events
-    sids = []
-    events_to_display.each() do |event|
-      sids << event.snapshot_id unless event.snapshot_id == first_snapshot.id
-    end    
-    last_snapshots=Snapshot.find(:all, :conditions => ["snapshots.id IN (?)", sids], :include => 'events', :order => 'snapshots.created_at ASC')
+    # Look for the number_of_columns-2 last snapshots to display  (they must have 'Version' events)
+    version_snapshots = []
+    if number_of_columns > 2
+      snapshot_conditions[0] += " AND events.snapshot_id=snapshots.id AND events.category='Version' AND snapshots.id NOT IN (?)"
+      snapshot_conditions << [first_snapshot.id, last_snapshot.id]
+      version_snapshots=Snapshot.find(:all, :conditions => snapshot_conditions, :include => 'events', :order => 'snapshots.created_at ASC').last(number_of_columns-2)
+    end
     
-    return [first_snapshot] + last_snapshots
+    return [first_snapshot] + version_snapshots + [last_snapshot]
   end
 
   def last?