From: Simon Brandhof Date: Tue, 17 Apr 2018 14:43:40 +0000 (+0200) Subject: SONAR-10594 add RuleRepositoryDao#insertOrUpdate() X-Git-Tag: 7.5~1239 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=53b6241c7bebbca959646014720006fc3873c687;p=sonarqube.git SONAR-10594 add RuleRepositoryDao#insertOrUpdate() --- diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleRepositoryDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleRepositoryDao.java index 1d9775d8a3e..42aaceec67f 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleRepositoryDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleRepositoryDao.java @@ -60,4 +60,15 @@ public class RuleRepositoryDao implements Dao { mapper.insert(dto, now); } } + + public void insertOrUpdate(DbSession dbSession, Collection dtos) { + RuleRepositoryMapper mapper = dbSession.getMapper(RuleRepositoryMapper.class); + long now = system2.now(); + for (RuleRepositoryDto dto : dtos) { + int updated = mapper.update(dto); + if (updated == 0) { + mapper.insert(dto, now); + } + } + } } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleRepositoryMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleRepositoryMapper.java index 42525fca99f..d08a407e12e 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleRepositoryMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleRepositoryMapper.java @@ -35,4 +35,6 @@ public interface RuleRepositoryMapper { void truncate(); void insert(@Param("repository") RuleRepositoryDto repository, @Param("now") long now); + + int update(@Param("repository") RuleRepositoryDto repository); } diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/rule/RuleRepositoryMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/rule/RuleRepositoryMapper.xml index 33596dd920e..59941de82d2 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/rule/RuleRepositoryMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/rule/RuleRepositoryMapper.xml @@ -33,4 +33,12 @@ #{now, jdbcType=BIGINT} ) + + + update rule_repositories set + name = #{repository.name, jdbcType=VARCHAR}, + language = #{repository.language, jdbcType=VARCHAR} + where + kee = #{repository.kee, jdbcType=VARCHAR} + diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleRepositoryDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleRepositoryDaoTest.java index 3e90955f27c..ede67de1dc3 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleRepositoryDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleRepositoryDaoTest.java @@ -23,22 +23,65 @@ import java.util.List; import org.junit.Rule; import org.junit.Test; import org.sonar.api.utils.System2; +import org.sonar.api.utils.internal.AlwaysIncreasingSystem2; import org.sonar.db.DbSession; import org.sonar.db.DbTester; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; public class RuleRepositoryDaoTest { - private System2 system2 = mock(System2.class); + private System2 system2 = new AlwaysIncreasingSystem2(); @Rule public DbTester dbTester = DbTester.create(system2); private RuleRepositoryDao underTest = new RuleRepositoryDao(system2); + @Test + public void insertOrUpdate_insert_rows_that_do_not_exist() { + RuleRepositoryDto repo1 = new RuleRepositoryDto("findbugs", "java", "Findbugs"); + RuleRepositoryDto repo2 = new RuleRepositoryDto("sonarjava", "java", "SonarJava"); + RuleRepositoryDto repo3 = new RuleRepositoryDto("sonarcobol", "cobol", "SonarCobol"); + underTest.insertOrUpdate(dbTester.getSession(), asList(repo1, repo2, repo3)); + + List rows = underTest.selectAll(dbTester.getSession()); + assertThat(rows).hasSize(3); + // ordered by keys + assertThat(rows.get(0)).isEqualToComparingFieldByField(repo1); + assertThat(rows.get(1)).isEqualToComparingFieldByField(repo3); + assertThat(rows.get(2)).isEqualToComparingFieldByField(repo2); + + assertThat(selectCreatedAtByKey(dbTester.getSession(), repo1.getKey())) + .isEqualTo(selectCreatedAtByKey(dbTester.getSession(), repo2.getKey())) + .isEqualTo(selectCreatedAtByKey(dbTester.getSession(), repo3.getKey())); + } + + @Test + public void insertOrUpdate_update_rows_that_exist() { + RuleRepositoryDto repo1 = new RuleRepositoryDto("findbugs", "java", "Findbugs"); + RuleRepositoryDto repo2 = new RuleRepositoryDto("sonarjava", "java", "SonarJava"); + underTest.insertOrUpdate(dbTester.getSession(), asList(repo1, repo2)); + + // update sonarjava, insert sonarcobol + RuleRepositoryDto repo2bis = new RuleRepositoryDto("sonarjava", "java", "SonarJava"); + RuleRepositoryDto repo3 = new RuleRepositoryDto("sonarcobol", "cobol", "SonarCobol"); + underTest.insertOrUpdate(dbTester.getSession(), asList(repo2bis, repo3)); + + List rows = underTest.selectAll(dbTester.getSession()); + assertThat(rows).hasSize(3); + // ordered by keys + assertThat(rows.get(0)).isEqualToComparingFieldByField(repo1); + assertThat(rows.get(1)).isEqualToComparingFieldByField(repo3); + assertThat(rows.get(2)).isEqualToComparingFieldByField(repo2bis); + + assertThat(selectCreatedAtByKey(dbTester.getSession(), repo1.getKey())) + .isEqualTo(selectCreatedAtByKey(dbTester.getSession(), repo2.getKey())) + .isLessThan(selectCreatedAtByKey(dbTester.getSession(), repo3.getKey())); + } + + @Test public void test_insert_and_selectAll() { DbSession dbSession = dbTester.getSession(); @@ -100,4 +143,9 @@ public class RuleRepositoryDaoTest { assertThat(underTest.selectAll(dbSession)).isEmpty(); } + + private long selectCreatedAtByKey(DbSession dbSession, String key) { + return (long) dbTester.selectFirst(dbSession, "select created_at as \"created_at\" from rule_repositories where kee='" + key + "'") + .get("created_at"); + } }