there can be more than on measure per metric key => we need to return a multimap of Measure per Metric keytags/5.2-RC1
@@ -20,7 +20,7 @@ | |||
package org.sonar.server.computation.measure; | |||
import com.google.common.base.Optional; | |||
import java.util.Map; | |||
import com.google.common.collect.Multimap; | |||
import org.sonar.server.computation.component.Component; | |||
import org.sonar.server.computation.metric.Metric; | |||
import org.sonar.server.computation.metric.MetricImpl; | |||
@@ -44,7 +44,7 @@ public interface MeasureRepository { | |||
/** | |||
* @return {@link Measure}s for the specified {@link Component} mapped by their metric key. | |||
*/ | |||
Map<String, Measure> getRawMeasures(Component component); | |||
Multimap<String, Measure> getRawMeasures(Component component); | |||
/** | |||
* Adds the specified measure for the specified Component and Metric. There can be no more than one measure for a |
@@ -22,10 +22,12 @@ package org.sonar.server.computation.measure; | |||
import com.google.common.base.Function; | |||
import com.google.common.base.Optional; | |||
import com.google.common.base.Predicate; | |||
import com.google.common.collect.ImmutableMap; | |||
import com.google.common.collect.ImmutableListMultimap; | |||
import com.google.common.collect.ImmutableSetMultimap; | |||
import com.google.common.collect.Iterables; | |||
import com.google.common.collect.Maps; | |||
import java.util.Collections; | |||
import com.google.common.collect.ListMultimap; | |||
import com.google.common.collect.Multimap; | |||
import com.google.common.collect.Multimaps; | |||
import java.util.HashMap; | |||
import java.util.Map; | |||
import javax.annotation.Nonnull; | |||
@@ -124,23 +126,25 @@ public class MeasureRepositoryImpl implements MeasureRepository { | |||
} | |||
@Override | |||
public Map<String, Measure> getRawMeasures(Component component) { | |||
public Multimap<String, Measure> getRawMeasures(Component component) { | |||
Map<String, Measure> rawMeasures = measures.get(component.getRef()); | |||
ImmutableMap<String, BatchReport.Measure> batchMeasures = from(reportReader.readComponentMeasures(component.getRef())) | |||
.uniqueIndex(BatchMeasureToMetricKey.INSTANCE); | |||
ListMultimap<String, BatchReport.Measure> batchMeasures = from(reportReader.readComponentMeasures(component.getRef())) | |||
.index(BatchMeasureToMetricKey.INSTANCE); | |||
if (rawMeasures == null && batchMeasures.isEmpty()) { | |||
return Collections.emptyMap(); | |||
return ImmutableListMultimap.of(); | |||
} | |||
Map<String, Measure> rawMeasuresFromBatch = Maps.transformValues(batchMeasures, batchMeasureToMeasureFunction); | |||
ListMultimap<String, Measure> rawMeasuresFromBatch = Multimaps.transformValues(batchMeasures, batchMeasureToMeasureFunction); | |||
if (rawMeasures == null) { | |||
return ImmutableMap.copyOf(rawMeasuresFromBatch); | |||
return ImmutableSetMultimap.copyOf(rawMeasuresFromBatch); | |||
} | |||
ImmutableMap.Builder<String, Measure> builder = ImmutableMap.builder(); | |||
ImmutableSetMultimap.Builder<String, Measure> builder = ImmutableSetMultimap.builder(); | |||
builder.putAll(rawMeasuresFromBatch); | |||
builder.putAll(rawMeasures); | |||
for (Map.Entry<String, Measure> entry : rawMeasures.entrySet()) { | |||
builder.put(entry.getKey(), entry.getValue()); | |||
} | |||
return builder.build(); | |||
} | |||
@@ -21,6 +21,8 @@ | |||
package org.sonar.server.computation.step; | |||
import com.google.common.collect.ImmutableList; | |||
import com.google.common.collect.Multimap; | |||
import java.util.Collection; | |||
import java.util.List; | |||
import java.util.Map; | |||
import org.sonar.api.measures.CoreMetrics; | |||
@@ -87,23 +89,25 @@ public class PersistMeasuresStep implements ComputationStep { | |||
@Override | |||
public void visitAny(Component component) { | |||
Map<String, Measure> measures = measureRepository.getRawMeasures(component); | |||
Multimap<String, Measure> measures = measureRepository.getRawMeasures(component); | |||
long componentId = dbIdsRepository.getComponentId(component); | |||
long snapshotId = dbIdsRepository.getSnapshotId(component); | |||
persistMeasures(measures, componentId, snapshotId); | |||
} | |||
private void persistMeasures(Map<String, Measure> batchReportMeasures, long componentId, long snapshotId) { | |||
for (Map.Entry<String, Measure> measure : batchReportMeasures.entrySet()) { | |||
String metricKey = measure.getKey(); | |||
private void persistMeasures(Multimap<String, Measure> batchReportMeasures, long componentId, long snapshotId) { | |||
for (Map.Entry<String, Collection<Measure>> measures : batchReportMeasures.asMap().entrySet()) { | |||
String metricKey = measures.getKey(); | |||
if (FORBIDDEN_METRIC_KEYS.contains(metricKey)) { | |||
throw new IllegalStateException(String.format("Measures on metric '%s' cannot be send in the report", metricKey)); | |||
} | |||
Metric metric = metricRepository.getByKey(metricKey); | |||
MeasureDto measureDto = MeasureToMeasureDto.INSTANCE.toMeasureDto(measure.getValue(), metric, componentId, snapshotId); | |||
dbClient.measureDao().insert(session, measureDto); | |||
for (Measure measure : measures.getValue()) { | |||
MeasureDto measureDto = MeasureToMeasureDto.INSTANCE.toMeasureDto(measure, metric, componentId, snapshotId); | |||
dbClient.measureDao().insert(session, measureDto); | |||
} | |||
} | |||
} | |||
} |