]> source.dussan.org Git - sonarqube.git/commitdiff
period by number of days : search for the nearest snapshot, even if it's older than...
authorsimonbrandhof <simon.brandhof@gmail.com>
Mon, 3 Jan 2011 17:41:19 +0000 (17:41 +0000)
committersimonbrandhof <simon.brandhof@gmail.com>
Mon, 3 Jan 2011 17:41:19 +0000 (17:41 +0000)
sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshot.java
sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshotFinderByDays.java
sonar-batch/src/test/java/org/sonar/batch/components/PastSnapshotFinderByDaysTest.java
sonar-batch/src/test/resources/org/sonar/batch/components/PastSnapshotFinderByDaysTest/shouldNotFindSelf.xml [new file with mode: 0644]

index 04140ae8c16a4c0f677a858a4c52acabd51932e2..242b0def5dde5b02ba36fa051063a4323bd9b80b 100644 (file)
@@ -90,16 +90,16 @@ public class PastSnapshot {
   @Override
   public String toString() {
     if (StringUtils.equals(mode, PastSnapshotFinderByVersion.MODE)) {
-      return String.format("Compare to version " + modeParameter + "(" + targetDate + ")");
+      return String.format("Compare to version " + modeParameter + "(" + getDate() + ")");
     }
     if (StringUtils.equals(mode, PastSnapshotFinderByDays.MODE)) {
-      return String.format("Compare over " + modeParameter + " days (" + targetDate + ")");
+      return String.format("Compare over " + modeParameter + " days (" + getDate() + ")");
     }
     if (StringUtils.equals(mode, CoreProperties.TIMEMACHINE_MODE_PREVIOUS_ANALYSIS)) {
-      return String.format("Compare to previous analysis " + " (" + targetDate + ")");
+      return String.format("Compare to previous analysis " + " (" + getDate() + ")");
     }
     if (StringUtils.equals(mode, PastSnapshotFinderByDate.MODE)) {
-      return String.format("Compare to date " + targetDate);
+      return String.format("Compare to date " + getDate());
     }
     return ReflectionToStringBuilder.toString(this);
   }
index 6894a802ec110d532b3f91619a069e58e241fe20..3ab57983339f99aec08a2a95fecd4e45ae979c65 100644 (file)
@@ -39,18 +39,40 @@ public class PastSnapshotFinderByDays implements BatchExtension {
 
   PastSnapshot findFromDays(Snapshot projectSnapshot, int days) {
     Date targetDate = DateUtils.addDays(projectSnapshot.getCreatedAt(), -days);
-    String hql = "from " + Snapshot.class.getSimpleName() + " where resourceId=:resourceId AND status=:status AND createdAt>=:from AND createdAt<:to order by createdAt asc";
+    String hql = "from " + Snapshot.class.getSimpleName() + " where resourceId=:resourceId AND status=:status AND createdAt<:date order by createdAt asc";
     List<Snapshot> snapshots = session.createQuery(hql)
-        .setParameter("from", targetDate)
-        .setParameter("to", projectSnapshot.getCreatedAt())
+        .setParameter("date", projectSnapshot.getCreatedAt())
         .setParameter("resourceId", projectSnapshot.getResourceId())
         .setParameter("status", Snapshot.STATUS_PROCESSED)
-        .setMaxResults(1)
         .getResultList();
 
     if (snapshots.isEmpty()) {
       return null;
     }
-    return new PastSnapshot(MODE, targetDate, snapshots.get(0)).setModeParameter(String.valueOf(days));
+
+    Snapshot snapshot = getNearestToTarget(snapshots, targetDate);
+    return new PastSnapshot(MODE, targetDate, snapshot).setModeParameter(String.valueOf(days));
+  }
+
+  static Snapshot getNearestToTarget(List<Snapshot> snapshots, Date currentDate, int distanceInDays) {
+    Date targetDate = DateUtils.addDays(currentDate, -distanceInDays);
+    return getNearestToTarget(snapshots, targetDate);
+  }
+
+  static Snapshot getNearestToTarget(List<Snapshot> snapshots, Date targetDate) {
+    long bestDistance = Long.MAX_VALUE;
+    Snapshot nearest = null;
+    for (Snapshot snapshot : snapshots) {
+      long distance = distance(snapshot.getCreatedAt(), targetDate);
+      if (distance <= bestDistance) {
+        bestDistance = distance;
+        nearest = snapshot;
+      }
+    }
+    return nearest;
+  }
+
+  static long distance(Date d1, Date d2) {
+    return Math.abs(d1.getTime() - d2.getTime());
   }
 }
index 6db32df71c726f6310812b53c210fc357e8e9043..06c1673e95fe80533366520cb44fddcea702d55c 100644 (file)
  */
 package org.sonar.batch.components;
 
+import org.hamcrest.core.IsNull;
 import org.junit.Test;
 import org.sonar.api.database.model.Snapshot;
 import org.sonar.jpa.test.AbstractDbUnitTestCase;
 
 import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.Matchers.nullValue;
@@ -31,6 +37,8 @@ import static org.junit.Assert.assertThat;
 
 public class PastSnapshotFinderByDaysTest extends AbstractDbUnitTestCase {
 
+  private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+
   @Test
   public void shouldGetNextSnapshot() throws ParseException {
     setupData("shared");
@@ -53,7 +61,7 @@ public class PastSnapshotFinderByDaysTest extends AbstractDbUnitTestCase {
 
   @Test
   public void shouldNotFindSelf() throws ParseException {
-    setupData("shared");
+    setupData("shouldNotFindSelf");
 
     Snapshot projectSnapshot = getSession().getSingleResult(Snapshot.class, "id", 1009); // 2008-11-16
     PastSnapshotFinderByDays finder = new PastSnapshotFinderByDays(getSession());
@@ -61,4 +69,45 @@ public class PastSnapshotFinderByDaysTest extends AbstractDbUnitTestCase {
     assertThat(finder.findFromDays(projectSnapshot, 1), nullValue());
   }
 
+  @Test
+  public void shouldLocateNearestSnapshotBefore() throws ParseException {
+    Date current = dateFormat.parse("2010-10-20");
+    // distance: 15 => target is 2010-10-05
+
+    List<Snapshot> snapshots = Arrays.asList(
+        newSnapshot(1, "2010-09-30"),
+        newSnapshot(2, "2010-10-03"),// -2 days
+        newSnapshot(3, "2010-10-08"),// +3 days
+        newSnapshot(4, "2010-10-12") // + 7 days
+    );
+    assertThat(PastSnapshotFinderByDays.getNearestToTarget(snapshots, current, 15).getId(), is(2));
+  }
+
+  @Test
+  public void shouldLocateNearestSnapshotAfter() throws ParseException {
+    Date current = dateFormat.parse("2010-10-20");
+    // distance: 15 => target is 2010-10-05
+
+    List<Snapshot> snapshots = Arrays.asList(
+        newSnapshot(1, "2010-09-30"),
+        newSnapshot(2, "2010-10-01"),// -4 days
+        newSnapshot(3, "2010-10-08"),// +3 days
+        newSnapshot(4, "2010-10-12") // + 7 days
+    );
+    assertThat(PastSnapshotFinderByDays.getNearestToTarget(snapshots, current, 15).getId(), is(3));
+  }
+
+  @Test
+  public void shouldReturnNullIfNoSnapshots() throws ParseException {
+    Date current = dateFormat.parse("2010-10-20");
+    List<Snapshot> snapshots = Collections.emptyList();
+    assertThat(PastSnapshotFinderByDays.getNearestToTarget(snapshots, current, 15), IsNull.nullValue());
+  }
+
+  private Snapshot newSnapshot(int id, String date) throws ParseException {
+    Snapshot snapshot = new Snapshot();
+    snapshot.setId(id);
+    snapshot.setCreatedAt(dateFormat.parse(date));
+    return snapshot;
+  }
 }
diff --git a/sonar-batch/src/test/resources/org/sonar/batch/components/PastSnapshotFinderByDaysTest/shouldNotFindSelf.xml b/sonar-batch/src/test/resources/org/sonar/batch/components/PastSnapshotFinderByDaysTest/shouldNotFindSelf.xml
new file mode 100644 (file)
index 0000000..35b1dc3
--- /dev/null
@@ -0,0 +1,34 @@
+<dataset>
+
+  <!-- project -->
+  <projects long_name="[null]" id="1" scope="PRJ" qualifier="TRK" kee="project" name="project"
+            root_id="[null]"
+            description="[null]"
+            enabled="true" language="java" copy_resource_id="[null]"/>
+
+  <!-- package -->
+  <projects long_name="[null]" id="2" scope="DIR" qualifier="PAC" kee="project:org.foo" name="org.foo"
+            root_id="1"
+            description="[null]"
+            enabled="true" language="java" copy_resource_id="[null]"/>
+
+  <!-- file -->
+  <projects long_name="org.foo.Bar" id="3" scope="FIL" qualifier="CLA" kee="project:org.foo.Bar"
+            name="Bar" root_id="[null]"
+            description="[null]"
+            enabled="true" language="java" copy_resource_id="[null]"/>
+
+
+  <!-- current analysis : 2008-11-16 -->
+  <snapshots period1_mode="[null]" period1_param="[null]" period1_date="[null]" period2_mode="[null]" period2_param="[null]" period2_date="[null]" period3_mode="[null]" period3_param="[null]" period3_date="[null]" period4_mode="[null]" period4_param="[null]" period4_date="[null]" period5_mode="[null]" period5_param="[null]" period5_date="[null]" id="1009" project_id="1" parent_snapshot_id="[null]" root_project_id="1" root_snapshot_id="[null]"
+             scope="PRJ" qualifier="TRK" created_at="2008-11-16 13:58:00.00" version="[null]" path=""
+             status="U" islast="false" depth="0" />
+
+  <snapshots period1_mode="[null]" period1_param="[null]" period1_date="[null]" period2_mode="[null]" period2_param="[null]" period2_date="[null]" period3_mode="[null]" period3_param="[null]" period3_date="[null]" period4_mode="[null]" period4_param="[null]" period4_date="[null]" period5_mode="[null]" period5_param="[null]" period5_date="[null]" id="1010" project_id="2" parent_snapshot_id="1009" root_project_id="1" root_snapshot_id="1009"
+             scope="DIR" qualifier="PAC" created_at="2008-11-16 13:58:00.00" version="[null]" path="1009."
+             status="U" islast="false" depth="1" />
+
+  <snapshots period1_mode="[null]" period1_param="[null]" period1_date="[null]" period2_mode="[null]" period2_param="[null]" period2_date="[null]" period3_mode="[null]" period3_param="[null]" period3_date="[null]" period4_mode="[null]" period4_param="[null]" period4_date="[null]" period5_mode="[null]" period5_param="[null]" period5_date="[null]" id="1011" project_id="3" parent_snapshot_id="1010" root_project_id="1" root_snapshot_id="1009"
+             scope="FIL" qualifier="CLA" created_at="2008-11-16 13:58:00.00" version="[null]" path="1009.1010."
+             status="U" islast="false" depth="2" />
+</dataset>
\ No newline at end of file