From b0b8d34052b9e91b172ee38103c678524dfc93f3 Mon Sep 17 00:00:00 2001 From: simonbrandhof Date: Mon, 29 Nov 2010 08:15:29 +0000 Subject: [PATCH] SONAR-249 do not save measures with best value when using the delayed mode --- .../sonar/batch/index/MeasurePersister.java | 33 +++++++++++-------- .../batch/phases/DecoratorsExecutor.java | 2 +- .../batch/index/MeasurePersisterTest.java | 2 ++ 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/sonar-batch/src/main/java/org/sonar/batch/index/MeasurePersister.java b/sonar-batch/src/main/java/org/sonar/batch/index/MeasurePersister.java index 75eb3504d1f..9b5f1996a98 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/index/MeasurePersister.java +++ b/sonar-batch/src/main/java/org/sonar/batch/index/MeasurePersister.java @@ -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 unsavedMeasuresBySnapshotId = HashMultimap.create(); + private SetMultimap 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 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> map = unsavedMeasuresByResource.asMap(); + for (Map.Entry> 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) { diff --git a/sonar-batch/src/main/java/org/sonar/batch/phases/DecoratorsExecutor.java b/sonar-batch/src/main/java/org/sonar/batch/phases/DecoratorsExecutor.java index 0a4bc8ff0a9..82b5b6983a1 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/phases/DecoratorsExecutor.java +++ b/sonar-batch/src/main/java/org/sonar/batch/phases/DecoratorsExecutor.java @@ -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); } diff --git a/sonar-batch/src/test/java/org/sonar/batch/index/MeasurePersisterTest.java b/sonar-batch/src/test/java/org/sonar/batch/index/MeasurePersisterTest.java index 9d0e2b9e599..c6f8ff9832a 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/index/MeasurePersisterTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/index/MeasurePersisterTest.java @@ -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); } -- 2.39.5