]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5827 Select all previous file lines data hash with a single SQL query
authorJulien HENRY <julien.henry@sonarsource.com>
Thu, 20 Nov 2014 14:27:39 +0000 (15:27 +0100)
committerJulien HENRY <julien.henry@sonarsource.com>
Thu, 20 Nov 2014 17:05:15 +0000 (18:05 +0100)
sonar-batch/src/main/java/org/sonar/batch/index/SourcePersister.java
sonar-core/src/main/java/org/sonar/core/source/db/FileSourceMapper.java
sonar-core/src/main/resources/org/sonar/core/source/db/FileSourceMapper.xml

index 04fb4bc66940f74b36f0e80bcbfffc850889c142..51785d0474b563df8be369455b12c15779b3f6c8 100644 (file)
@@ -23,6 +23,8 @@ import com.google.common.base.CharMatcher;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
+import org.apache.ibatis.session.ResultContext;
+import org.apache.ibatis.session.ResultHandler;
 import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.fs.InputPath;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
@@ -55,6 +57,7 @@ import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.util.Collections;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -109,11 +112,23 @@ public class SourcePersister implements ScanPersister {
   public void persist() {
     DbSession session = mybatis.openSession(false);
     try {
+
+      final Map<String, FileSourceDto> fileSourceDtoByFileUuid = new HashMap<String, FileSourceDto>();
+
+      session.select("org.sonar.core.source.db.FileSourceMapper.selectAllFileDataHashByProject", projectTree.getRootProject().getUuid(), new ResultHandler() {
+
+        @Override
+        public void handleResult(ResultContext context) {
+          FileSourceDto dto = (FileSourceDto) context.getResultObject();
+          fileSourceDtoByFileUuid.put(dto.getFileUuid(), dto);
+        }
+      });
+
       FileSourceMapper mapper = session.getMapper(FileSourceMapper.class);
 
       for (InputPath inputPath : inputPathCache.all()) {
         if (inputPath instanceof InputFile) {
-          persist(session, mapper, inputPath);
+          persist(session, mapper, inputPath, fileSourceDtoByFileUuid);
         }
       }
     } catch (Exception e) {
@@ -124,23 +139,23 @@ public class SourcePersister implements ScanPersister {
 
   }
 
-  private void persist(DbSession session, FileSourceMapper mapper, InputPath inputPath) {
+  private void persist(DbSession session, FileSourceMapper mapper, InputPath inputPath, Map<String, FileSourceDto> fileSourceDtoByFileUuid) {
     DefaultInputFile inputFile = (DefaultInputFile) inputPath;
     org.sonar.api.resources.File file = (org.sonar.api.resources.File) resourceCache.get(inputFile.key());
     String fileUuid = file.getUuid();
-    FileSourceDto previous = mapper.select(fileUuid);
+    FileSourceDto previous = fileSourceDtoByFileUuid.get(fileUuid);
     String newData = getSourceData(inputFile);
-    String dataHash = newData != null ? DigestUtils.md5Hex(newData) : "0";
+    String newDataHash = newData != null ? DigestUtils.md5Hex(newData) : "0";
     Date now = system2.newDate();
     if (previous == null) {
-      FileSourceDto newFileSource = new FileSourceDto().setProjectUuid(projectTree.getRootProject().getUuid()).setFileUuid(fileUuid).setData(newData).setDataHash(dataHash)
+      FileSourceDto newFileSource = new FileSourceDto().setProjectUuid(projectTree.getRootProject().getUuid()).setFileUuid(fileUuid).setData(newData).setDataHash(newDataHash)
         .setCreatedAt(now)
         .setUpdatedAt(now);
       mapper.insert(newFileSource);
       session.commit();
     } else {
-      if (!dataHash.equals(previous.getDataHash())) {
-        previous.setData(newData).setDataHash(dataHash).setUpdatedAt(now);
+      if (!newDataHash.equals(previous.getDataHash())) {
+        previous.setData(newData).setDataHash(newDataHash).setUpdatedAt(now);
         mapper.update(previous);
         session.commit();
       }
index 302f727e36934e0204157cb27854fe25c8e6dfa9..916d662d21289b1939ea2d8e09d7977273e51405 100644 (file)
@@ -22,8 +22,12 @@ package org.sonar.core.source.db;
 
 import javax.annotation.CheckForNull;
 
+import java.util.List;
+
 public interface FileSourceMapper {
 
+  List<FileSourceDto> selectAllFileDataHashByProject(String projectUuid);
+
   @CheckForNull
   FileSourceDto select(String fileUuid);
 
index 033ab9ed648399e43c0c3a20c0b5ed44e2563748..4b3b88465c3b7406beadf448e675ee1cf80f6777 100644 (file)
@@ -9,7 +9,13 @@
     FROM file_sources
     WHERE file_uuid = #{fileUuid}
   </select>
-
+  
+  <select id="selectAllFileDataHashByProject" parameterType="string" resultType="org.sonar.core.source.db.FileSourceDto">
+    SELECT id, file_uuid as fileUuid, data_hash as dataHash
+    FROM file_sources
+    WHERE project_uuid = #{projectUuid}
+  </select>
+  
   <insert id="insert" parameterType="org.sonar.core.source.db.FileSourceDto" useGeneratedKeys="false">
     insert into file_sources (project_uuid, file_uuid, created_at, updated_at, data, data_hash) 
     values (#{projectUuid}, #{fileUuid}, #{createdAt}, #{updatedAt}, #{data}, #{dataHash})