Skip to content

Commit

Permalink
SONAR-6620 fix MeasureRepository.getRawMeasures return type
Browse files Browse the repository at this point in the history
there can be more than on measure per metric key => we need to return a multimap of Measure per Metric key
  • Loading branch information
sns-seb committed Jun 15, 2015
1 parent 54af62e commit 388dd0a
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 19 deletions.
Expand Up @@ -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;
Expand All @@ -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
Expand Down
Expand Up @@ -22,10 +22,12 @@
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;
Expand Down Expand Up @@ -124,23 +126,25 @@ public void add(Component component, Metric metric, Measure measure) {
}

@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();
}

Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -87,23 +89,25 @@ private MeasureVisitor(DbSession session) {

@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);
}
}
}
}
Expand Down

0 comments on commit 388dd0a

Please sign in to comment.