aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-db
diff options
context:
space:
mode:
authorDaniel Schwarz <bartfastiel@users.noreply.github.com>2017-01-23 16:08:49 +0100
committerGitHub <noreply@github.com>2017-01-23 16:08:49 +0100
commit0832a517c9b7cb70d51ba6557094a605a8a9efdc (patch)
tree2fa021674a42d7e7a0291cced2301d52e69d8489 /sonar-db
parent0584dc8d5d5d82a2035763c34afba0e12cf6e8d0 (diff)
downloadsonarqube-0832a517c9b7cb70d51ba6557094a605a8a9efdc.tar.gz
sonarqube-0832a517c9b7cb70d51ba6557094a605a8a9efdc.zip
SONAR-8238 when updating a project, clear ALL components from index
Diffstat (limited to 'sonar-db')
-rw-r--r--sonar-db/src/main/java/org/sonar/db/component/ComponentDao.java11
-rw-r--r--sonar-db/src/main/java/org/sonar/db/component/ComponentMapper.java2
-rw-r--r--sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml13
-rw-r--r--sonar-db/src/test/java/org/sonar/db/component/ComponentDaoTest.java35
-rw-r--r--sonar-db/src/test/resources/org/sonar/db/component/ComponentDaoTest/selectForIndexing.xml185
5 files changed, 238 insertions, 8 deletions
diff --git a/sonar-db/src/main/java/org/sonar/db/component/ComponentDao.java b/sonar-db/src/main/java/org/sonar/db/component/ComponentDao.java
index 8ec27d1c2a6..0bc027afb7a 100644
--- a/sonar-db/src/main/java/org/sonar/db/component/ComponentDao.java
+++ b/sonar-db/src/main/java/org/sonar/db/component/ComponentDao.java
@@ -28,6 +28,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import javax.annotation.Nullable;
import org.apache.ibatis.session.ResultHandler;
@@ -230,10 +231,14 @@ public class ComponentDao implements Dao {
}
/**
- * Selects all enabled components. The result is not returned (since it is usually too big), but handed over to the <code>handler</code>
+ * Selects all components that are relevant for indexing. The result is not returned (since it is usually too big), but handed over to the <code>handler</code>
+ * @param session the database session
+ * @param projectUuid the project uuid, which is selected with all of its children
+ * @param handler the action to be applied to every result
*/
- public void selectAll(DbSession session, ResultHandler handler) {
- mapper(session).selectAll(handler);
+ public void selectForIndexing(DbSession session, @Nullable String projectUuid, ResultHandler handler) {
+ Objects.requireNonNull(handler);
+ mapper(session).selectForIndexing(projectUuid, handler);
}
/**
diff --git a/sonar-db/src/main/java/org/sonar/db/component/ComponentMapper.java b/sonar-db/src/main/java/org/sonar/db/component/ComponentMapper.java
index 7b2e26eab24..a32a4177b58 100644
--- a/sonar-db/src/main/java/org/sonar/db/component/ComponentMapper.java
+++ b/sonar-db/src/main/java/org/sonar/db/component/ComponentMapper.java
@@ -116,7 +116,7 @@ public interface ComponentMapper {
long countGhostProjects(Map<String, Object> parameters);
- void selectAll(ResultHandler handler);
+ void selectForIndexing(@Param("projectUuid") @Nullable String projectUuid, ResultHandler handler);
void insert(ComponentDto componentDto);
diff --git a/sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml b/sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml
index a9d12f01871..92c23601b28 100644
--- a/sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml
+++ b/sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml
@@ -414,11 +414,16 @@
</if>
</sql>
- <select id="selectAll" parameterType="map" resultType="Component">
- select distinct
- <include refid="componentColumns"/>
+ <select id="selectForIndexing" parameterType="map" resultType="Component">
+ select
+ <include refid="componentColumns"/>
from projects p
- where p.enabled=${_true}
+ where
+ p.enabled=${_true}
+ and p.copy_component_uuid is null
+ <if test="projectUuid != null">
+ and p.project_uuid=#{projectUuid}
+ </if>
</select>
<insert id="insert" parameterType="Component" keyColumn="id" useGeneratedKeys="true" keyProperty="id">
diff --git a/sonar-db/src/test/java/org/sonar/db/component/ComponentDaoTest.java b/sonar-db/src/test/java/org/sonar/db/component/ComponentDaoTest.java
index 039891ac0a1..8d2b2d83c66 100644
--- a/sonar-db/src/test/java/org/sonar/db/component/ComponentDaoTest.java
+++ b/sonar-db/src/test/java/org/sonar/db/component/ComponentDaoTest.java
@@ -20,9 +20,14 @@
package org.sonar.db.component;
import com.google.common.base.Optional;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import javax.annotation.Nullable;
+import org.apache.ibatis.session.ResultContext;
+import org.apache.ibatis.session.ResultHandler;
+import org.assertj.core.api.ListAssert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
@@ -564,6 +569,36 @@ public class ComponentDaoTest {
}
@Test
+ public void selectForIndexing_all() {
+ assertSelectForIndexing(null)
+ .doesNotContain("DIS7")
+ .doesNotContain("COPY8")
+ .containsOnly("U1", "U2", "U3", "U4", "U5", "U6");
+ }
+
+ @Test
+ public void selectForIndexing_project() {
+ assertSelectForIndexing("U1")
+ .doesNotContain("DIS7")
+ .doesNotContain("COPY8")
+ .containsOnly("U1", "U2", "U3", "U4");
+ }
+
+ private ListAssert<String> assertSelectForIndexing(@Nullable String projectUuid) {
+ db.prepareDbUnit(getClass(), "selectForIndexing.xml");
+
+ List<ComponentDto> components = new ArrayList<>();
+ underTest.selectForIndexing(dbSession, projectUuid, new ResultHandler() {
+
+ @Override
+ public void handleResult(ResultContext context) {
+ components.add((ComponentDto) context.getResultObject());
+ }
+ });
+ return assertThat(components).extracting(ComponentDto::uuid);
+ }
+
+ @Test
public void insert() {
db.prepareDbUnit(getClass(), "empty.xml");
diff --git a/sonar-db/src/test/resources/org/sonar/db/component/ComponentDaoTest/selectForIndexing.xml b/sonar-db/src/test/resources/org/sonar/db/component/ComponentDaoTest/selectForIndexing.xml
new file mode 100644
index 00000000000..7c4f24eda93
--- /dev/null
+++ b/sonar-db/src/test/resources/org/sonar/db/component/ComponentDaoTest/selectForIndexing.xml
@@ -0,0 +1,185 @@
+<dataset>
+
+ <organizations uuid="org1"
+ kee="org1_key"
+ name="org1_name"
+ created_at="1000"
+ updated_at="1000"/>
+
+ <!-- root project -->
+ <projects organization_uuid="org1"
+ id="1"
+ scope="PRJ"
+ qualifier="TRK"
+ kee="org.struts:struts"
+ deprecated_kee="org.struts:struts"
+ name="Struts"
+ uuid="U1"
+ uuid_path="uuid_path_of_U1"
+ root_uuid="U1"
+ project_uuid="U1"
+ module_uuid="module_uuid_of_U1"
+ module_uuid_path="module_uuid_path_of_U1"
+ description="the description"
+ long_name="Apache Struts"
+ enabled="[true]"
+ language="java"
+ copy_component_uuid="[null]"
+ developer_uuid="[null]"
+ path="path_of_U1"
+ authorization_updated_at="123456789"/>
+
+ <!-- module -->
+ <projects organization_uuid="org1"
+ id="2"
+ kee="org.struts:struts-core"
+ name="Struts Core"
+ uuid="U2"
+ uuid_path="uuid_path_of_U2"
+ project_uuid="U1"
+ root_uuid="U1"
+ module_uuid="[null]"
+ module_uuid_path="module_uuid_path_of_U2"
+ scope="PRJ"
+ qualifier="BRC"
+ long_name="Struts Core"
+ description="[null]"
+ enabled="[true]"
+ language="[null]"
+ copy_component_uuid="[null]"
+ developer_uuid="[null]"
+ authorization_updated_at="[null]"/>
+
+ <!-- directory -->
+ <projects organization_uuid="org1"
+ long_name="org.struts"
+ id="3"
+ scope="DIR"
+ qualifier="DIR"
+ kee="org.struts:struts-core:src/org/struts"
+ uuid="U3"
+ uuid_path="uuid_path_of_U3"
+ project_uuid="U1"
+ root_uuid="U1"
+ module_uuid="module_uuid_of_U3"
+ module_uuid_path="module_uuid_path_of_U3"
+ name="src/org/struts"
+ description="[null]"
+ enabled="[true]"
+ language="[null]"
+ copy_component_uuid="[null]"
+ developer_uuid="[null]"
+ path="src/org/struts"
+ authorization_updated_at="[null]"/>
+
+ <!-- file -->
+ <projects organization_uuid="org1"
+ long_name="org.struts.RequestContext"
+ id="4"
+ scope="FIL"
+ qualifier="FIL"
+ kee="org.struts:struts-core:src/org/struts/RequestContext.java"
+ uuid="U4"
+ uuid_path="uuid_path_of_U4"
+ project_uuid="U1"
+ root_uuid="U1"
+ module_uuid="module_uuid_of_U4"
+ module_uuid_path="module_uuid_path_of_U4"
+ name="RequestContext.java"
+ description="[null]"
+ enabled="[true]"
+ language="java"
+ copy_component_uuid="[null]"
+ developer_uuid="[null]"
+ path="path_of_U4"
+ authorization_updated_at="[null]"/>
+
+ <!-- root project -->
+ <projects organization_uuid="org1"
+ id="5"
+ scope="PRJ"
+ qualifier="TRK"
+ kee="org.paper:paper"
+ deprecated_kee="org.paper:paper"
+ name="Paper"
+ uuid="U5"
+ uuid_path="uuid_path_of_U5"
+ root_uuid="U5"
+ project_uuid="U5"
+ module_uuid="module_uuid_of_U5"
+ module_uuid_path="module_uuid_path_of_U5"
+ description="the description"
+ long_name="Some Paper"
+ enabled="[true]"
+ language="java"
+ copy_component_uuid="[null]"
+ developer_uuid="[null]"
+ path="path_of_U5"
+ authorization_updated_at="123456789"/>
+
+ <!-- module -->
+ <projects organization_uuid="org1"
+ id="6"
+ kee="org.paper:paper-core"
+ name="Paper Core"
+ uuid="U6"
+ uuid_path="uuid_path_of_U6"
+ project_uuid="U5"
+ root_uuid="U5"
+ module_uuid="[null]"
+ module_uuid_path="module_uuid_path_of_U6"
+ scope="PRJ"
+ qualifier="BRC"
+ long_name="Paper Core"
+ description="[null]"
+ enabled="[true]"
+ language="[null]"
+ copy_component_uuid="[null]"
+ developer_uuid="[null]"
+ authorization_updated_at="[null]"/>
+
+ <!-- Disabled projects -->
+ <projects organization_uuid="org1"
+ id="7"
+ scope="PRJ"
+ qualifier="TRK"
+ kee="org.disabled.project"
+ name="Disabled Project"
+ uuid="DIS7"
+ uuid_path="uuid_path_of_DIS7"
+ project_uuid="project_uuid_of_DIS7"
+ root_uuid="root_uuid_of_DIS7"
+ module_uuid="[null]"
+ module_uuid_path="module_uuid_path_of_DIS7"
+ description="the description"
+ long_name="Disabled project"
+ enabled="[false]"
+ language="[null]"
+ copy_component_uuid="[null]"
+ developer_uuid="[null]"
+ path="[null]"
+ authorization_updated_at="[null]"/>
+
+ <!-- copy component projects -->
+ <projects organization_uuid="org1"
+ id="8"
+ scope="PRJ"
+ qualifier="TRK"
+ kee="org.copy.project"
+ name="Copy Project"
+ uuid="COPY8"
+ uuid_path="uuid_path_of_COPY8"
+ project_uuid="project_uuid_of_COPY8"
+ root_uuid="root_uuid_of_COPY8"
+ module_uuid="[null]"
+ module_uuid_path="module_uuid_path_of_COPY8"
+ description="the description"
+ long_name="Copy project"
+ enabled="[true]"
+ language="[null]"
+ copy_component_uuid="U1"
+ developer_uuid="[null]"
+ path="[null]"
+ authorization_updated_at="[null]"/>
+
+</dataset>