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);
}
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;
}
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);
}
}
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;
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);
}
}
*/
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;
- }
}
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.*;
}
@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);
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);
+ }
+
}
--- /dev/null
+<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
+++ /dev/null
-<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