From 871a84da06a5d7f7d503376c0bad716e01a1d14d Mon Sep 17 00:00:00 2001 From: Julien HENRY Date: Thu, 20 Nov 2014 15:27:39 +0100 Subject: [PATCH] SONAR-5827 Select all previous file lines data hash with a single SQL query --- .../sonar/batch/index/SourcePersister.java | 29 ++++++++++++++----- .../core/source/db/FileSourceMapper.java | 4 +++ .../sonar/core/source/db/FileSourceMapper.xml | 8 ++++- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/sonar-batch/src/main/java/org/sonar/batch/index/SourcePersister.java b/sonar-batch/src/main/java/org/sonar/batch/index/SourcePersister.java index 04fb4bc6694..51785d0474b 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/index/SourcePersister.java +++ b/sonar-batch/src/main/java/org/sonar/batch/index/SourcePersister.java @@ -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 fileSourceDtoByFileUuid = new HashMap(); + + 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 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(); } diff --git a/sonar-core/src/main/java/org/sonar/core/source/db/FileSourceMapper.java b/sonar-core/src/main/java/org/sonar/core/source/db/FileSourceMapper.java index 302f727e369..916d662d212 100644 --- a/sonar-core/src/main/java/org/sonar/core/source/db/FileSourceMapper.java +++ b/sonar-core/src/main/java/org/sonar/core/source/db/FileSourceMapper.java @@ -22,8 +22,12 @@ package org.sonar.core.source.db; import javax.annotation.CheckForNull; +import java.util.List; + public interface FileSourceMapper { + List selectAllFileDataHashByProject(String projectUuid); + @CheckForNull FileSourceDto select(String fileUuid); diff --git a/sonar-core/src/main/resources/org/sonar/core/source/db/FileSourceMapper.xml b/sonar-core/src/main/resources/org/sonar/core/source/db/FileSourceMapper.xml index 033ab9ed648..4b3b88465c3 100644 --- a/sonar-core/src/main/resources/org/sonar/core/source/db/FileSourceMapper.xml +++ b/sonar-core/src/main/resources/org/sonar/core/source/db/FileSourceMapper.xml @@ -9,7 +9,13 @@ FROM file_sources WHERE file_uuid = #{fileUuid} - + + + insert into file_sources (project_uuid, file_uuid, created_at, updated_at, data, data_hash) values (#{projectUuid}, #{fileUuid}, #{createdAt}, #{updatedAt}, #{data}, #{dataHash}) -- 2.39.5