]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-1450 log comparison dates at batch startup + improve the algorithm of periods...
authorsimonbrandhof <simon.brandhof@gmail.com>
Tue, 7 Dec 2010 16:58:58 +0000 (16:58 +0000)
committersimonbrandhof <simon.brandhof@gmail.com>
Tue, 7 Dec 2010 16:58:58 +0000 (16:58 +0000)
plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/NewViolationsDecorator.java
plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PastSnapshotFinderByDays.java
plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TimeMachineConfiguration.java
plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/PastSnapshotFinderByDaysTest.java
plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TimeMachineConfigurationTest.java
plugins/sonar-core-plugin/src/test/resources/org/sonar/plugins/core/timemachine/PastSnapshotFinderByDaysTest/shared.xml [new file with mode: 0644]
plugins/sonar-core-plugin/src/test/resources/org/sonar/plugins/core/timemachine/PastSnapshotFinderByDaysTest/shouldLoadSnapshotsFromDatabase.xml [deleted file]

index 717f3b6734fd33a78bcd654b2113365ba612ecc1..a51d564024768593c393fe938091a8ba746f5dcb 100644 (file)
@@ -105,8 +105,8 @@ public class NewViolationsDecorator implements Decorator {
       Measure measure = new Measure(metric);
       for (PastSnapshot variationSnapshot : timeMachineConfiguration.getProjectPastSnapshots()) {
         int variationIndex = variationSnapshot.getIndex();
-        Collection<Measure> children = context.getChildrenMeasures(MeasuresFilters.metric(metric));
         int count = countViolations(violationsBySeverity.get(priority), variationSnapshot.getDate());
+        Collection<Measure> children = context.getChildrenMeasures(MeasuresFilters.metric(metric));
         double sum = sumChildren(variationIndex, children) + count;
         measure.setVariation(variationIndex, sum);
       }
index b3235bb8ae3286a8648f74505721078c88c9893b..9a49b23640222b391781a91a84b8bcb8b96c3bc3 100644 (file)
@@ -27,7 +27,7 @@ import org.sonar.api.database.model.Snapshot;
 import java.util.Date;
 import java.util.List;
 
-public class PastSnapshotFinderByDays implements BatchExtension{
+public class PastSnapshotFinderByDays implements BatchExtension {
   private Snapshot projectSnapshot; // TODO replace by PersistenceManager
   private DatabaseSession session;
 
@@ -37,37 +37,16 @@ public class PastSnapshotFinderByDays implements BatchExtension{
   }
 
   Snapshot findInDays(int days) {
-    List<Snapshot> snapshots = loadSnapshotsFromDatabase();
-    return getNearestToTarget(snapshots, projectSnapshot.getCreatedAt(), days);
-  }
-
-  List<Snapshot> loadSnapshotsFromDatabase() {
-    String hql = "from " + Snapshot.class.getSimpleName() + " where resourceId=:resourceId AND status=:status order by createdAt";
-    return session.createQuery(hql)
+    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";
+    List<Snapshot> snapshots = session.createQuery(hql)
+        .setParameter("from", targetDate)
+        .setParameter("to", projectSnapshot.getCreatedAt())
         .setParameter("resourceId", projectSnapshot.getResourceId())
         .setParameter("status", Snapshot.STATUS_PROCESSED)
+        .setMaxResults(1)
         .getResultList();
-  }
-
-  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());
+    return snapshots.isEmpty() ? null : snapshots.get(0);
   }
 }
index a3fe6efd7c83fad382a13d43dc90a9edcd46a245..1658381f0d43fb9ba7e669c0f8e1574cd7152968 100644 (file)
@@ -23,6 +23,7 @@ import com.google.common.collect.Lists;
 import org.apache.commons.configuration.Configuration;
 import org.sonar.api.BatchExtension;
 import org.sonar.api.CoreProperties;
+import org.sonar.api.utils.Logs;
 
 import java.util.Collections;
 import java.util.List;
@@ -44,6 +45,7 @@ public class TimeMachineConfiguration implements BatchExtension {
     for (int index = 1; index <= NUMBER_OF_VARIATION_SNAPSHOTS; index++) {
       PastSnapshot variationSnapshot = variationSnapshotFinder.find(configuration, index);
       if (variationSnapshot != null) {
+        Logs.INFO.info("Comparison date: " + variationSnapshot.getDate());
         projectPastSnapshots.add(variationSnapshot);
       }
     }
index d4f70c535ae5838516d71f9599be3eb351c049bf..a09efeda4dc6b14767a61375e8c48142a9179c77 100644 (file)
  */
 package org.sonar.plugins.core.timemachine;
 
-import com.google.common.collect.Lists;
+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.core.IsNull.nullValue;
 import static org.junit.Assert.assertThat;
-import static org.junit.internal.matchers.IsCollectionContaining.hasItems;
 
 public class PastSnapshotFinderByDaysTest extends AbstractDbUnitTestCase {
 
-  private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
-
   @Test
-  public void shouldLoadSnapshotsFromDatabase() {
-    setupData("shouldLoadSnapshotsFromDatabase");
+  public void shouldGetNextSnapshot() throws ParseException {
+    setupData("shared");
 
-    Snapshot projectSnapshot = getSession().getSingleResult(Snapshot.class, "id", 1009);
+    Snapshot projectSnapshot = getSession().getSingleResult(Snapshot.class, "id", 1009); // 2008-11-16
     PastSnapshotFinderByDays finder = new PastSnapshotFinderByDays(projectSnapshot, getSession());
-    List<Snapshot> snapshots = finder.loadSnapshotsFromDatabase();
-    List<Integer> snapshotIds = Lists.newLinkedList();
-    for (Snapshot snapshot : snapshots) {
-      snapshotIds.add(snapshot.getId());
-    }
-    assertThat(snapshotIds.size(), is(2));
-    assertThat(snapshotIds, hasItems(1000, 1003)); // project snapshots
+
+    assertThat(finder.findInDays(50).getId(), is(1000));
   }
 
   @Test
-  public void shouldGetNearestSnapshotBefore() throws ParseException {
-    Date current = dateFormat.parse("2010-10-20");
-    // distance: 15 => target is 2010-10-05
+  public void shouldIgnoreUnprocessedSnapshots() throws ParseException {
+    setupData("shared");
+
+    Snapshot projectSnapshot = getSession().getSingleResult(Snapshot.class, "id", 1009); // 2008-11-16
+    PastSnapshotFinderByDays finder = new PastSnapshotFinderByDays(projectSnapshot, getSession());
 
-    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));
+    assertThat(finder.findInDays(7).getId(), is(1006));
   }
 
   @Test
-  public void shouldgetNearestSnapshotAfter() throws ParseException {
-    Date current = dateFormat.parse("2010-10-20");
-    // distance: 15 => target is 2010-10-05
+  public void shouldNotFindSelf() throws ParseException {
+    setupData("shared");
 
-    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));
-  }
+    Snapshot projectSnapshot = getSession().getSingleResult(Snapshot.class, "id", 1009); // 2008-11-16
+    PastSnapshotFinderByDays finder = new PastSnapshotFinderByDays(projectSnapshot, getSession());
 
-  @Test
-  public void shouldReturnNullIfNoSnapshots() throws ParseException {
-    Date current = dateFormat.parse("2010-10-20");
-    List<Snapshot> snapshots = Collections.emptyList();
-    assertThat(PastSnapshotFinderByDays.getNearestToTarget(snapshots, current, 15), nullValue());
+    assertThat(finder.findInDays(1), IsNull.<Object>nullValue());
   }
 
-  private Snapshot newSnapshot(int id, String date) throws ParseException {
-    Snapshot snapshot = new Snapshot();
-    snapshot.setId(id);
-    snapshot.setCreatedAt(dateFormat.parse(date));
-    return snapshot;
-  }
 }
index 67b8f7ea1b09b4edd3935ac6c9e6db5eaeec14b4..2070bc6b0d3ee3741b397ac1aba7660f26d10219 100644 (file)
@@ -22,8 +22,13 @@ package org.sonar.plugins.core.timemachine;
 import org.apache.commons.configuration.PropertiesConfiguration;
 import org.junit.Test;
 import org.sonar.api.CoreProperties;
+import org.sonar.api.database.model.Snapshot;
 import org.sonar.jpa.test.AbstractDbUnitTestCase;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.mockito.Mockito.*;
@@ -44,11 +49,11 @@ public class TimeMachineConfigurationTest extends AbstractDbUnitTestCase {
   }
 
   @Test
-  public void shouldInitSnapshotReferences() {
+  public void shouldInitVariationSnapshots() throws ParseException {
     PropertiesConfiguration conf = new PropertiesConfiguration();
     PastSnapshotFinder snapshotReferenceFinder = mock(PastSnapshotFinder.class);
-    when(snapshotReferenceFinder.find(conf, 1)).thenReturn(new PastSnapshot(1, "days", null));
-    when(snapshotReferenceFinder.find(conf, 3)).thenReturn(new PastSnapshot(3, "days", null));
+    when(snapshotReferenceFinder.find(conf, 1)).thenReturn(new PastSnapshot(1, "days", newSnapshot("2010-10-15")));
+    when(snapshotReferenceFinder.find(conf, 3)).thenReturn(new PastSnapshot(3, "days", newSnapshot("2010-10-13")));
 
     TimeMachineConfiguration timeMachineConfiguration = new TimeMachineConfiguration(conf, snapshotReferenceFinder);
 
@@ -59,5 +64,10 @@ public class TimeMachineConfigurationTest extends AbstractDbUnitTestCase {
     assertThat(timeMachineConfiguration.getProjectPastSnapshots().size(), is(2));
   }
 
+  private Snapshot newSnapshot(String date) throws ParseException {
+    Date createdAt = new SimpleDateFormat("yyyy-MM-dd").parse(date);
+    return new Snapshot().setCreatedAt(createdAt);
+  }
+
 
 }
diff --git a/plugins/sonar-core-plugin/src/test/resources/org/sonar/plugins/core/timemachine/PastSnapshotFinderByDaysTest/shared.xml b/plugins/sonar-core-plugin/src/test/resources/org/sonar/plugins/core/timemachine/PastSnapshotFinderByDaysTest/shared.xml
new file mode 100644 (file)
index 0000000..d419e63
--- /dev/null
@@ -0,0 +1,76 @@
+<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]"/>
+
+
+  <!-- first analysis : 2008-11-01-->
+  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[null]" id="1000" project_id="1" parent_snapshot_id="[null]" root_project_id="1" root_snapshot_id="[null]"
+             scope="PRJ" qualifier="TRK" created_at="2008-11-01 13:58:00.00" version="[null]" path=""
+             status="P" islast="false" depth="0" />
+
+  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[null]" id="1001" project_id="2" parent_snapshot_id="1000" root_project_id="1" root_snapshot_id="1000"
+             scope="DIR" qualifier="PAC" created_at="2008-11-01 13:58:00.00" version="[null]" path="1000."
+             status="P" islast="false" depth="1" />
+
+  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[null]" id="1002" project_id="3" parent_snapshot_id="1001" root_project_id="1" root_snapshot_id="1000"
+             scope="FIL" qualifier="CLA" created_at="2008-11-01 13:58:00.00" version="[null]" path="1000.1001."
+             status="P" islast="false" depth="2" />
+
+
+  <!-- second unprocessed analysis - to ignore: 2008-11-12 -->
+  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[null]" id="1003" project_id="1" parent_snapshot_id="[null]" root_project_id="1" root_snapshot_id="[null]"
+             scope="PRJ" qualifier="TRK" created_at="2008-11-12 13:58:00.00" version="[null]" path=""
+             status="U" islast="false" depth="0" />
+
+  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[null]" id="1004" project_id="2" parent_snapshot_id="1003" root_project_id="1" root_snapshot_id="1003"
+             scope="DIR" qualifier="PAC" created_at="2008-11-12 13:58:00.00" version="[null]" path="1003."
+             status="U" islast="false" depth="1" />
+
+  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[null]" id="1005" project_id="3" parent_snapshot_id="1004" root_project_id="1" root_snapshot_id="1003"
+             scope="FIL" qualifier="CLA" created_at="2008-11-12 13:58:00.00" version="[null]" path="1003.1004."
+             status="P" islast="false" depth="2" />
+
+
+  <!-- second analysis : 2008-11-13-->
+  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[null]" id="1006" project_id="1" parent_snapshot_id="[null]" root_project_id="1" root_snapshot_id="[null]"
+             scope="PRJ" qualifier="TRK" created_at="2008-11-13 13:58:00.00" version="[null]" path=""
+             status="P" islast="true" depth="0" />
+
+  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[null]" id="1007" project_id="2" parent_snapshot_id="1006" root_project_id="1" root_snapshot_id="1006"
+             scope="DIR" qualifier="PAC" created_at="2008-11-13 13:58:00.00" version="[null]" path="1006."
+             status="P" islast="true" depth="1" />
+
+  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[null]" id="1008" project_id="3" parent_snapshot_id="1007" root_project_id="1" root_snapshot_id="1006"
+             scope="FIL" qualifier="CLA" created_at="2008-11-13 13:58:00.00" version="[null]" path="1006.1007."
+             status="P" islast="true" depth="2" />
+
+
+  <!-- current analysis : 2008-11-16 -->
+  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[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 variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[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 variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[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
diff --git a/plugins/sonar-core-plugin/src/test/resources/org/sonar/plugins/core/timemachine/PastSnapshotFinderByDaysTest/shouldLoadSnapshotsFromDatabase.xml b/plugins/sonar-core-plugin/src/test/resources/org/sonar/plugins/core/timemachine/PastSnapshotFinderByDaysTest/shouldLoadSnapshotsFromDatabase.xml
deleted file mode 100644 (file)
index 4429d7c..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-<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]"/>
-
-
-  <!-- first analysis -->
-  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[null]" id="1000" project_id="1" parent_snapshot_id="[null]" root_project_id="1" root_snapshot_id="[null]"
-             scope="PRJ" qualifier="TRK" created_at="2008-11-01 13:58:00.00" version="[null]" path=""
-             status="P" islast="false" depth="0" />
-
-  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[null]" id="1001" project_id="2" parent_snapshot_id="1000" root_project_id="1" root_snapshot_id="1000"
-             scope="DIR" qualifier="PAC" created_at="2008-11-01 13:58:00.00" version="[null]" path="1000."
-             status="P" islast="false" depth="1" />
-
-  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[null]" id="1002" project_id="3" parent_snapshot_id="1001" root_project_id="1" root_snapshot_id="1000"
-             scope="FIL" qualifier="CLA" created_at="2008-11-01 13:58:00.00" version="[null]" path="1000.1001."
-             status="P" islast="false" depth="2" />
-
-
-  <!-- second analysis -->
-  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[null]" id="1003" project_id="1" parent_snapshot_id="[null]" root_project_id="1" root_snapshot_id="[null]"
-             scope="PRJ" qualifier="TRK" created_at="2008-11-02 13:58:00.00" version="[null]" path=""
-             status="P" islast="true" depth="0" />
-
-  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[null]" id="1004" project_id="2" parent_snapshot_id="1003" root_project_id="1" root_snapshot_id="1003"
-             scope="DIR" qualifier="PAC" created_at="2008-11-02 13:58:00.00" version="[null]" path="1003."
-             status="P" islast="true" depth="1" />
-
-  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[null]" id="1005" project_id="3" parent_snapshot_id="1004" root_project_id="1" root_snapshot_id="1003"
-             scope="FIL" qualifier="CLA" created_at="2008-11-02 13:58:00.00" version="[null]" path="1003.1004."
-             status="P" islast="true" depth="2" />
-
-
-  <!-- unprocessed analysis (to ignore) -->
-  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[null]" id="1006" project_id="1" parent_snapshot_id="[null]" root_project_id="1" root_snapshot_id="[null]"
-             scope="PRJ" qualifier="TRK" created_at="2008-11-03 13:58:00.00" version="[null]" path=""
-             status="U" islast="false" depth="0" />
-
-  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[null]" id="1007" project_id="2" parent_snapshot_id="1006" root_project_id="1" root_snapshot_id="1006"
-             scope="DIR" qualifier="PAC" created_at="2008-11-03 13:58:00.00" version="[null]" path="1006."
-             status="U" islast="false" depth="1" />
-
-  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[null]" id="1008" project_id="3" parent_snapshot_id="1007" root_project_id="1" root_snapshot_id="1006"
-             scope="FIL" qualifier="CLA" created_at="2008-11-03 13:58:00.00" version="[null]" path="1006.1007."
-             status="U" islast="false" depth="2" />
-
-
-  <!-- current analysis -->
-  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[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-04 13:58:00.00" version="[null]" path=""
-             status="U" islast="false" depth="0" />
-
-  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[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-04 13:58:00.00" version="[null]" path="1009."
-             status="U" islast="false" depth="1" />
-
-  <snapshots variation_mode_1="[null]" variation_param_1="[null]" variation_mode_2="[null]" variation_param_2="[null]" variation_mode_3="[null]" variation_param_3="[null]" variation_mode_4="[null]" variation_param_4="[null]" variation_mode_5="[null]" variation_param_5="[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-04 13:58:00.00" version="[null]" path="1009.1010."
-             status="U" islast="false" depth="2" />
-</dataset>
\ No newline at end of file