]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10594 add RuleRepositoryDao#deleteIfKeyNotIn()
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Tue, 17 Apr 2018 17:50:42 +0000 (19:50 +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 42aaceec67f9c46b9284ea3a0588f448f8adeb82..61b06e6ab3f28fadef457a776230bb972ddb36ee 100644 (file)
@@ -23,8 +23,11 @@ import java.util.Collection;
 import java.util.List;
 import org.sonar.api.utils.System2;
 import org.sonar.db.Dao;
+import org.sonar.db.DatabaseUtils;
 import org.sonar.db.DbSession;
 
+import static com.google.common.base.Preconditions.checkArgument;
+
 public class RuleRepositoryDao implements Dao {
 
   private final System2 system2;
@@ -71,4 +74,9 @@ public class RuleRepositoryDao implements Dao {
       }
     }
   }
+
+  public void deleteIfKeyNotIn(DbSession dbSession, Collection<String> keys) {
+    checkArgument(keys.size() < DatabaseUtils.PARTITION_SIZE_FOR_ORACLE, "too many rule repositories: %s", keys.size());
+    dbSession.getMapper(RuleRepositoryMapper.class).deleteIfKeyNotIn(keys);
+  }
 }
index d08a407e12e49362aa5e29a25af9ab6016b9eb95..a33adbcf3a0b69498e7cf52db435f54e9b12f0c3 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.db.rule;
 
+import java.util.Collection;
 import java.util.List;
 import javax.annotation.CheckForNull;
 import org.apache.ibatis.annotations.Param;
@@ -37,4 +38,6 @@ public interface RuleRepositoryMapper {
   void insert(@Param("repository") RuleRepositoryDto repository, @Param("now") long now);
 
   int update(@Param("repository") RuleRepositoryDto repository);
+
+  void deleteIfKeyNotIn(@Param("keys") Collection<String> keys);
 }
index 59941de82d2860781837e6e2d6325fb75fcaace4..d15ddce28dc243c687dcb1b7a41b9930edf07aee 100644 (file)
     where
       kee = #{repository.kee, jdbcType=VARCHAR}
   </update>
+
+  <delete id="deleteIfKeyNotIn" parameterType="String">
+    delete from rule_repositories
+    <if test="!keys.isEmpty()">
+      where kee not in <foreach collection="keys" open="(" close=")" item="key" separator=",">#{key,jdbcType=VARCHAR}</foreach>
+    </if>
+  </delete>
 </mapper>
index ede67de1dc3391548615c8dafb91cf812bb262f2..8c711fa1a7a36054cbc3db663cd570e08ff644a3 100644 (file)
  */
 package org.sonar.db.rule;
 
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.ExpectedException;
 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 java.util.Collections.emptyList;
 import static org.assertj.core.api.Assertions.assertThat;
 
 public class RuleRepositoryDaoTest {
 
   private System2 system2 = new AlwaysIncreasingSystem2();
 
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
   @Rule
   public DbTester dbTester = DbTester.create(system2);
 
@@ -81,6 +89,38 @@ public class RuleRepositoryDaoTest {
       .isLessThan(selectCreatedAtByKey(dbTester.getSession(), repo3.getKey()));
   }
 
+  @Test
+  public void deleteIfKeyNotIn() {
+    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));
+
+    underTest.deleteIfKeyNotIn(dbTester.getSession(), Arrays.asList(repo2.getKey(), "unknown"));
+    assertThat(underTest.selectAll(dbTester.getSession()))
+      .extracting(RuleRepositoryDto::getKey)
+      .containsExactly(repo2.getKey());
+  }
+
+  @Test
+  public void deleteIfKeyNotIn_truncates_table_if_keys_are_empty() {
+    RuleRepositoryDto repo1 = new RuleRepositoryDto("findbugs", "java", "Findbugs");
+    RuleRepositoryDto repo2 = new RuleRepositoryDto("sonarjava", "java", "SonarJava");
+    underTest.insertOrUpdate(dbTester.getSession(), asList(repo1, repo2));
+
+    underTest.deleteIfKeyNotIn(dbTester.getSession(), emptyList());
+
+    assertThat(underTest.selectAll(dbTester.getSession())).isEmpty();
+  }
+
+  @Test
+  public void deleteIfKeyNotIn_fails_if_more_than_1000_keys() {
+    expectedException.expect(IllegalArgumentException.class);
+    expectedException.expectMessage("too many rule repositories: 1100");
+
+    Collection<String> keys = IntStream.range(0, 1_100).mapToObj(index -> "repo" + index).collect(Collectors.toSet());
+    underTest.deleteIfKeyNotIn(dbTester.getSession(), keys);
+  }
 
   @Test
   public void test_insert_and_selectAll() {