diff options
author | Daniel Schwarz <bartfastiel@users.noreply.github.com> | 2017-01-23 16:08:49 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-23 16:08:49 +0100 |
commit | 0832a517c9b7cb70d51ba6557094a605a8a9efdc (patch) | |
tree | 2fa021674a42d7e7a0291cced2301d52e69d8489 /sonar-db | |
parent | 0584dc8d5d5d82a2035763c34afba0e12cf6e8d0 (diff) | |
download | sonarqube-0832a517c9b7cb70d51ba6557094a605a8a9efdc.tar.gz sonarqube-0832a517c9b7cb70d51ba6557094a605a8a9efdc.zip |
SONAR-8238 when updating a project, clear ALL components from index
Diffstat (limited to 'sonar-db')
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> |