aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-core/src
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@gmail.com>2013-06-07 13:50:43 +0200
committerJulien Lancelot <julien.lancelot@gmail.com>2013-06-07 13:50:43 +0200
commit22cf40f4dd4cc20554f25d9a322c92d2def395e5 (patch)
tree1350c4b16ebc0e38a404f5094c517c1a3557f2bd /sonar-core/src
parentbc33f4aee5e1c43e3a1784b97d464208c590943a (diff)
downloadsonarqube-22cf40f4dd4cc20554f25d9a322c92d2def395e5.tar.gz
sonarqube-22cf40f4dd4cc20554f25d9a322c92d2def395e5.zip
SONAR-3755 Fix performance issue in selectNonClosedIssuesByModule query
Diffstat (limited to 'sonar-core/src')
-rw-r--r--sonar-core/src/main/resources/org/sonar/core/issue/db/IssueMapper.xml28
-rw-r--r--sonar-core/src/test/java/org/sonar/core/issue/db/IssueDaoTest.java9
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/issue/db/IssueDaoTest/should_select_non_closed_issues_by_module.xml57
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 &lt;&gt; '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 &lt;&gt; 'BRC') or (p.id=#{id})) p on p.id=i.component_id
+ <where>
+ and i.status &lt;&gt; '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>