]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-249 do not save measures with best value when using the delayed mode
authorsimonbrandhof <simon.brandhof@gmail.com>
Mon, 29 Nov 2010 08:15:29 +0000 (08:15 +0000)
committersimonbrandhof <simon.brandhof@gmail.com>
Mon, 29 Nov 2010 08:15:29 +0000 (08:15 +0000)
sonar-batch/src/main/java/org/sonar/batch/index/MeasurePersister.java
sonar-batch/src/main/java/org/sonar/batch/phases/DecoratorsExecutor.java
sonar-batch/src/test/java/org/sonar/batch/index/MeasurePersisterTest.java

index 75eb3504d1f2bc5d6d7e843a42d4fb273083719e..9b5f1996a9871884fe843e144344d2694de6d906 100644 (file)
@@ -19,7 +19,7 @@
  */
 package org.sonar.batch.index;
 
-import com.google.common.collect.HashMultimap;
+import com.google.common.collect.LinkedHashMultimap;
 import com.google.common.collect.SetMultimap;
 import org.apache.commons.lang.math.NumberUtils;
 import org.slf4j.LoggerFactory;
@@ -33,12 +33,13 @@ import org.sonar.api.resources.Project;
 import org.sonar.api.resources.Resource;
 import org.sonar.api.resources.ResourceUtils;
 
+import java.util.Collection;
 import java.util.Map;
 
 public final class MeasurePersister {
 
   private boolean delayedMode = false;
-  private SetMultimap<Integer, Measure> unsavedMeasuresBySnapshotId = HashMultimap.create();
+  private SetMultimap<Resource, Measure> unsavedMeasuresByResource = LinkedHashMultimap.create();
   private DatabaseSession session;
   private ResourcePersister resourcePersister;
 
@@ -56,12 +57,12 @@ public final class MeasurePersister {
   }
 
   public void saveMeasure(Project project, Resource resource, Measure measure) {
-    Snapshot snapshot = resourcePersister.saveResource(project, resource);
-    if (snapshot != null) {
-      if (delayedMode && measure.getPersistenceMode().useMemory()) {
-        unsavedMeasuresBySnapshotId.put(snapshot.getId(), measure);
+    if (delayedMode && measure.getPersistenceMode().useMemory()) {
+      unsavedMeasuresByResource.put(resource, measure);
 
-      } else if (measure.getId() != null) {
+    } else {
+      Snapshot snapshot = resourcePersister.saveResource(project, resource);
+      if (measure.getId() != null) {
         // update
         MeasureModel model = session.reattach(MeasureModel.class, measure.getId());
         model = mergeModel(measure, model);
@@ -85,17 +86,23 @@ public final class MeasurePersister {
             metric.getBestValue() != null &&
             NumberUtils.compare(metric.getBestValue(), measure.getValue()) == 0 &&
             !measure.hasOptionalData());
+    // TODO add diff_values in hasOptionalData
   }
 
   public void dump() {
-    LoggerFactory.getLogger(getClass()).debug("{} measures to dump", unsavedMeasuresBySnapshotId.size());
-    for (Map.Entry<Integer, Measure> entry : unsavedMeasuresBySnapshotId.entries()) {
-      MeasureModel model = createModel(entry.getValue());
-      model.setSnapshotId(entry.getKey());
-      model.save(session);
+    LoggerFactory.getLogger(getClass()).debug("{} measures to dump", unsavedMeasuresByResource.size());
+    Map<Resource, Collection<Measure>> map = unsavedMeasuresByResource.asMap();
+    for (Map.Entry<Resource, Collection<Measure>> entry : map.entrySet()) {
+      Snapshot snapshot = resourcePersister.getSnapshot(entry.getKey());
+      for (Measure measure : entry.getValue()) {
+        MeasureModel model = createModel(measure);
+        model.setSnapshotId(snapshot.getId());
+        model.save(session);
+      }
     }
+
     session.commit();
-    unsavedMeasuresBySnapshotId.clear();
+    unsavedMeasuresByResource.clear();
   }
 
   MeasureModel createModel(Measure measure) {
index 0a4bc8ff0a9c0b7d5b9569806b058208b57a696a..82b5b6983a15c6e23a2c2a7abb36754cee0400fd 100644 (file)
@@ -116,7 +116,7 @@ public class DecoratorsExecutor implements BatchComponent {
     }
 
     String getMessage() {
-      StringBuilder sb = new StringBuilder("Decorators time:" + SystemUtils.LINE_SEPARATOR);
+      StringBuilder sb = new StringBuilder("Decorator time:" + SystemUtils.LINE_SEPARATOR);
       for (Decorator decorator : decorators) {
         sb.append("\t").append(decorator.toString()).append(": ").append(durations.get(decorator)).append("ms").append(SystemUtils.LINE_SEPARATOR);
       }
index 9d0e2b9e5990019343a0fec42eedf8cf42569aa8..c6f8ff9832a70a4c9663061f71776fa7076fdc52 100644 (file)
@@ -60,6 +60,8 @@ public class MeasurePersisterTest extends AbstractDbUnitTestCase {
     coverage = getSession().getSingleResult(Metric.class, "key", "coverage");
     when(resourcePersister.saveResource((Project) anyObject(), eq(project))).thenReturn(projectSnapshot);
     when(resourcePersister.saveResource((Project) anyObject(), eq(aPackage))).thenReturn(packageSnapshot);
+    when(resourcePersister.getSnapshot(project)).thenReturn(projectSnapshot);
+    when(resourcePersister.getSnapshot(aPackage)).thenReturn(packageSnapshot);
     measurePersister = new MeasurePersister(getSession(), resourcePersister);
   }