diff options
author | Julien Lancelot <julien.lancelot@gmail.com> | 2013-06-07 13:50:43 +0200 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@gmail.com> | 2013-06-07 13:50:43 +0200 |
commit | 22cf40f4dd4cc20554f25d9a322c92d2def395e5 (patch) | |
tree | 1350c4b16ebc0e38a404f5094c517c1a3557f2bd /sonar-core/src | |
parent | bc33f4aee5e1c43e3a1784b97d464208c590943a (diff) | |
download | sonarqube-22cf40f4dd4cc20554f25d9a322c92d2def395e5.tar.gz sonarqube-22cf40f4dd4cc20554f25d9a322c92d2def395e5.zip |
SONAR-3755 Fix performance issue in selectNonClosedIssuesByModule query
Diffstat (limited to 'sonar-core/src')
3 files changed, 77 insertions, 17 deletions
diff --git a/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueMapper.xml b/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueMapper.xml index e52ab7b8648..61246d6c239 100644 --- a/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueMapper.xml +++ b/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueMapper.xml @@ -139,8 +139,13 @@ <select id="selectByKey" parameterType="String" resultType="Issue"> select <include refid="issueColumns"/> - from issues i, rules r, projects p, projects root - where i.kee=#{kee} and i.rule_id=r.id and p.id=i.component_id and i.root_component_id=root.id + from issues i + inner join rules r on r.id=i.rule_id + inner join projects p on p.id=i.component_id + inner join projects root on root.id=i.root_component_id + <where> + and i.kee=#{kee} + </where> </select> <select id="selectNonClosedIssuesByModule" parameterType="int" resultType="Issue"> @@ -171,17 +176,21 @@ r.plugin_rule_key as ruleKey, r.plugin_name as ruleRepo, p.kee as componentKey - from issues i, rules r, projects p - where i.status <> 'CLOSED' - and (p.root_id=#{id} or (p.root_id is null and p.id=#{id})) - and i.component_id=p.id - and r.id=i.rule_id + from issues i + inner join rules r on r.id=i.rule_id + inner join (select p.id,p.kee from projects p where (p.root_id=#{id} and p.qualifier <> 'BRC') or (p.id=#{id})) p on p.id=i.component_id + <where> + and i.status <> 'CLOSED' + </where> </select> <select id="selectByIds" parameterType="map" resultType="Issue"> select <include refid="issueColumns"/> - from issues i, rules r, projects p, projects root + from issues i + inner join rules r on r.id=i.rule_id + inner join projects p on p.id=i.component_id + inner join projects root on root.id=i.root_component_id <where> and <foreach collection="ids" open="i.id in (" close=")" item="list" separator=") or i.id in ("> @@ -189,9 +198,6 @@ #{element} </foreach> </foreach> - and i.rule_id=r.id - and p.id=i.component_id - and i.root_component_id=root.id </where> order by i.id desc </select> diff --git a/sonar-core/src/test/java/org/sonar/core/issue/db/IssueDaoTest.java b/sonar-core/src/test/java/org/sonar/core/issue/db/IssueDaoTest.java index b5cbc0a65a7..504e475cdc3 100644 --- a/sonar-core/src/test/java/org/sonar/core/issue/db/IssueDaoTest.java +++ b/sonar-core/src/test/java/org/sonar/core/issue/db/IssueDaoTest.java @@ -293,21 +293,20 @@ public class IssueDaoTest extends AbstractDaoTestCase { public void should_select_non_closed_issues_by_module() { setupData("shared", "should_select_non_closed_issues_by_module"); - // 400 is a non-root module + // 400 is a non-root module, we should find 2 issues from classes and one on itself DefaultResultHandler handler = new DefaultResultHandler(); dao.selectNonClosedIssuesByModule(400, handler); - assertThat(handler.getResultList()).hasSize(2); + assertThat(handler.getResultList()).hasSize(3); IssueDto issue = (IssueDto) handler.getResultList().get(0); assertThat(issue.getRuleRepo()).isNotNull(); assertThat(issue.getRule()).isNotNull(); assertThat(issue.getComponentKey()).isNotNull(); - // 399 is the root module. It does not have issues. + // 399 is the root module, we should only find 1 issue on itself handler = new DefaultResultHandler(); dao.selectNonClosedIssuesByModule(399, handler); - assertThat(handler.getResultList()).isEmpty(); - + assertThat(handler.getResultList()).hasSize(1); } @Test diff --git a/sonar-core/src/test/resources/org/sonar/core/issue/db/IssueDaoTest/should_select_non_closed_issues_by_module.xml b/sonar-core/src/test/resources/org/sonar/core/issue/db/IssueDaoTest/should_select_non_closed_issues_by_module.xml index e276f59a2b1..c036dc7c780 100644 --- a/sonar-core/src/test/resources/org/sonar/core/issue/db/IssueDaoTest/should_select_non_closed_issues_by_module.xml +++ b/sonar-core/src/test/resources/org/sonar/core/issue/db/IssueDaoTest/should_select_non_closed_issues_by_module.xml @@ -1,5 +1,6 @@ <dataset> + <!-- Open Issue on a file --> <issues id="100" kee="100" @@ -25,6 +26,7 @@ updated_at="[null]" /> + <!-- Open Issue on a file --> <issues id="101" kee="101" @@ -37,7 +39,7 @@ line="120" effort_to_fix="[null]" status="OPEN" - resolution="FIXED" + resolution="[null]" checksum="[null]" reporter="[null]" assignee="user" @@ -50,6 +52,7 @@ updated_at="[null]" /> + <!-- Closed Issue on a file --> <issues id="102" kee="102" @@ -75,4 +78,56 @@ updated_at="[null]" /> + <!-- Open Issue on a sub module --> + <issues + id="103" + kee="103" + component_id="400" + root_component_id="399" + rule_id="501" + severity="MAJOR" + manual_severity="[false]" + message="[null]" + line="[null]" + effort_to_fix="[null]" + status="OPEN" + resolution="[null]" + checksum="[null]" + reporter="[null]" + assignee="user" + author_login="[null]" + issue_attributes="[null]" + issue_creation_date="2013-04-16" + issue_update_date="2013-04-16" + issue_close_date="2013-04-16" + created_at="2013-04-10" + updated_at="[null]" + /> + + <!-- Open Issue on a root module --> + <issues + id="104" + kee="104" + component_id="399" + root_component_id="399" + rule_id="501" + severity="MAJOR" + manual_severity="[false]" + message="[null]" + line="[null]" + effort_to_fix="[null]" + status="OPEN" + resolution="[null]" + checksum="[null]" + reporter="[null]" + assignee="user" + author_login="[null]" + issue_attributes="[null]" + issue_creation_date="2013-04-16" + issue_update_date="2013-04-16" + issue_close_date="2013-04-16" + created_at="2013-04-10" + updated_at="[null]" + /> + </dataset> |