]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3024 Fix PastMeasureLoader to consider path to distinguish resources with same key
authorJulien HENRY <julien.henry@sonarsource.com>
Thu, 9 Jan 2014 08:27:40 +0000 (09:27 +0100)
committerJulien HENRY <julien.henry@sonarsource.com>
Thu, 9 Jan 2014 08:28:29 +0000 (09:28 +0100)
sonar-batch/src/main/java/org/sonar/batch/components/PastMeasuresLoader.java

index 2e0225483e12a525fc22edf235e73e0801669577..3797a872bc8cd54c6edc15c375ce8383fd4f2b39 100644 (file)
@@ -21,6 +21,7 @@ package org.sonar.batch.components;
 
 import com.google.common.collect.Maps;
 import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.lang.StringUtils;
 import org.sonar.api.BatchExtension;
 import org.sonar.api.database.DatabaseSession;
 import org.sonar.api.database.model.Snapshot;
@@ -29,6 +30,9 @@ import org.sonar.api.measures.MetricFinder;
 import org.sonar.api.resources.Qualifiers;
 import org.sonar.api.resources.Resource;
 
+import javax.annotation.Nullable;
+import javax.persistence.Query;
+
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -59,23 +63,32 @@ public class PastMeasuresLoader implements BatchExtension {
 
   public List<Object[]> getPastMeasures(Resource resource, PastSnapshot projectPastSnapshot) {
     if (projectPastSnapshot != null && projectPastSnapshot.getProjectSnapshot() != null) {
-      return getPastMeasures(resource.getEffectiveKey(), projectPastSnapshot.getProjectSnapshot());
+      return getPastMeasures(resource.getEffectiveKey(), resource.getPath(), projectPastSnapshot.getProjectSnapshot());
     }
     return Collections.emptyList();
   }
 
   public List<Object[]> getPastMeasures(String resourceKey, Snapshot projectPastSnapshot) {
+    return getPastMeasures(resourceKey, null, projectPastSnapshot);
+  }
+
+  public List<Object[]> getPastMeasures(String resourceKey, @Nullable String path, Snapshot projectPastSnapshot) {
     String sql = "select m.metric_id, m.characteristic_id, m.person_id, m.rule_id, m.value from project_measures m, snapshots s" +
       " where m.snapshot_id=s.id and m.metric_id in (:metricIds) " +
       "       and (s.root_snapshot_id=:rootSnapshotId or s.id=:rootSnapshotId) " +
-      "       and s.status=:status and s.project_id=(select p.id from projects p where p.kee=:resourceKey and p.qualifier<>:lib)";
-    return session.createNativeQuery(sql)
+      "       and s.status=:status and s.project_id=(select p.id from projects p where p.kee=:resourceKey and p.qualifier<>:lib"
+      + (StringUtils.isNotBlank(path) ? " and p.path=:path" : "")
+      + ")";
+    Query q = session.createNativeQuery(sql)
       .setParameter("metricIds", metricByIds.keySet())
       .setParameter("rootSnapshotId", ObjectUtils.defaultIfNull(projectPastSnapshot.getRootId(), projectPastSnapshot.getId()))
       .setParameter("resourceKey", resourceKey)
       .setParameter("lib", Qualifiers.LIBRARY)
-      .setParameter("status", Snapshot.STATUS_PROCESSED)
-      .getResultList();
+      .setParameter("status", Snapshot.STATUS_PROCESSED);
+    if (StringUtils.isNotBlank(path)) {
+      q.setParameter("path", path);
+    }
+    return q.getResultList();
   }
 
   public static int getMetricId(Object[] row) {