]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10594 add RuleRepositoryDao#insertOrUpdate()
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Tue, 17 Apr 2018 14:43:40 +0000 (16:43 +0200)
committerSonarTech <sonartech@sonarsource.com>
Thu, 10 May 2018 18:20:52 +0000 (20:20 +0200)
server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleRepositoryDao.java
server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleRepositoryMapper.java
server/sonar-db-dao/src/main/resources/org/sonar/db/rule/RuleRepositoryMapper.xml
server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleRepositoryDaoTest.java

index 1d9775d8a3eaeab6810c5605ae5acb58f2bff5af..42aaceec67f9c46b9284ea3a0588f448f8adeb82 100644 (file)
@@ -60,4 +60,15 @@ public class RuleRepositoryDao implements Dao {
       mapper.insert(dto, now);
     }
   }
+
+  public void insertOrUpdate(DbSession dbSession, Collection<RuleRepositoryDto> 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);
+      }
+    }
+  }
 }
index 42525fca99f135aec365e661381e169b6785527d..d08a407e12e49362aa5e29a25af9ab6016b9eb95 100644 (file)
@@ -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);
 }
index 33596dd920e3b8d7152c9ab82e46d244a53e9553..59941de82d2860781837e6e2d6325fb75fcaace4 100644 (file)
     #{now, jdbcType=BIGINT}
     )
   </insert>
+
+  <update id="update" parameterType="map">
+    update rule_repositories set
+      name = #{repository.name, jdbcType=VARCHAR},
+      language = #{repository.language, jdbcType=VARCHAR}
+    where
+      kee = #{repository.kee, jdbcType=VARCHAR}
+  </update>
 </mapper>
index 3e90955f27c70c605295b0f4cef4da54bafd6603..ede67de1dc3391548615c8dafb91cf812bb262f2 100644 (file)
@@ -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<RuleRepositoryDto> 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<RuleRepositoryDto> 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");
+  }
 }