From 3cf3b749c6013ca53c76d83b9e2f6513f854ab71 Mon Sep 17 00:00:00 2001 From: Stephane Gamard Date: Tue, 9 Sep 2014 11:14:46 +0200 Subject: [PATCH] SONAR-5530 - Fetching context objects for IssueResult --- .../java/org/sonar/server/db/BaseDao.java | 14 ++++++++++ .../java/org/sonar/server/db/DbClient.java | 7 +++++ .../org/sonar/server/issue/IssueService.java | 28 +++++++++++++++---- .../sonar/server/issue/index/IssueResult.java | 12 ++++++++ .../main/java/org/sonar/server/rule/Rule.java | 2 +- .../sonar/core/issue/db/ActionPlanDao.java | 3 +- 6 files changed, 59 insertions(+), 7 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java b/server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java index 44618908350..c0f8ea5b98f 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java @@ -21,6 +21,7 @@ package org.sonar.server.db; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; import org.apache.ibatis.session.ResultContext; import org.apache.ibatis.session.ResultHandler; import org.sonar.api.utils.System2; @@ -39,6 +40,7 @@ import javax.annotation.Nullable; import java.io.Serializable; import java.sql.Timestamp; +import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; @@ -154,6 +156,18 @@ public abstract class BaseDao, KEY extends Serializ return value; } + public Collection getByKeys(DbSession session, KEY... keys) { + return getByKeys(session, ImmutableList.copyOf(keys)); + } + + public Collection getByKeys(DbSession session, Collection keys) { + Collection results = new ArrayList(); + for (KEY key : keys) { + results.add(this.getByKey(session, key)); + } + return results; + } + @Override public DTO update(DbSession session, DTO item) { Date now = new Date(system2.now()); diff --git a/server/sonar-server/src/main/java/org/sonar/server/db/DbClient.java b/server/sonar-server/src/main/java/org/sonar/server/db/DbClient.java index d9fc72df394..37beefb3ceb 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/db/DbClient.java +++ b/server/sonar-server/src/main/java/org/sonar/server/db/DbClient.java @@ -21,6 +21,7 @@ package org.sonar.server.db; import com.google.common.collect.Maps; import org.sonar.api.ServerComponent; +import org.sonar.core.issue.db.ActionPlanDao; import org.sonar.core.persistence.DaoComponent; import org.sonar.core.persistence.Database; import org.sonar.core.persistence.DbSession; @@ -65,6 +66,7 @@ public class DbClient implements ServerComponent { private final UserDao userDao; private final IssueDao issueDao; private final IssueAuthorizationDao issueAuthorizationDao; + private final ActionPlanDao actionPlanDao; public DbClient(Database db, MyBatis myBatis, DaoComponent... daoComponents) { this.db = db; @@ -89,6 +91,7 @@ public class DbClient implements ServerComponent { userDao = getDao(map, UserDao.class); issueDao = getDao(map, IssueDao.class); issueAuthorizationDao = getDao(map, IssueAuthorizationDao.class); + actionPlanDao = getDao(map, ActionPlanDao.class); } public Database database() { @@ -159,6 +162,10 @@ public class DbClient implements ServerComponent { return userDao; } + public ActionPlanDao actionPlanDao() { + return actionPlanDao; + } + private K getDao(Map map, Class clazz) { return (K) map.get(clazz); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java index e8202496c58..7db59167095 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java @@ -58,6 +58,7 @@ import org.sonar.server.db.DbClient; import org.sonar.server.issue.actionplan.ActionPlanService; import org.sonar.server.issue.index.IssueIndex; import org.sonar.server.issue.index.IssueResult; +import org.sonar.server.rule.index.RuleIndex; import org.sonar.server.search.IndexClient; import org.sonar.server.search.QueryOptions; import org.sonar.server.user.UserSession; @@ -67,7 +68,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * @since 3.6 @@ -348,13 +351,28 @@ public class IssueService implements ServerComponent { // TODO Optimise // Insert the projects and component name; + Set ruleKeys = new HashSet(); + Set projectKeys = new HashSet(); + Set componentKeys = new HashSet(); + Set actionPlanKeys = new HashSet(); + List userLogins = new ArrayList(); + DbSession session = dbClient.openSession(false); + for (Issue issue : result.getHits()) { + ruleKeys.add(issue.ruleKey()); + projectKeys.add(issue.projectKey()); + componentKeys.add(issue.componentKey()); + actionPlanKeys.add(issue.actionPlanKey()); + userLogins.add(issue.authorLogin()); + } + try { - for (Issue issue : result.getHits()) { - result.addProject(dbClient.componentDao().getByKey(session, issue.projectKey())); - result.addComponent(dbClient.componentDao().getByKey(session, issue.componentKey())); - } - } finally { + indexClient.get(RuleIndex.class).getByKeys(ruleKeys); + result.projects().addAll(dbClient.componentDao().getByKeys(session, projectKeys)); + result.components().addAll(dbClient.componentDao().getByKeys(session, componentKeys)); + dbClient.userDao().selectUsersByLogins(userLogins); + dbClient.actionPlanDao().findByKeys(actionPlanKeys); + } finally { session.close(); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueResult.java b/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueResult.java index 5e2d254fc37..e01ccdee9d7 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueResult.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueResult.java @@ -143,4 +143,16 @@ public class IssueResult extends Result implements IssueQueryResult { public void addComponent(ComponentDto component) { this.components.put(component.key(), component); } + + public void addUser(User user) { + this.usersByLogin.put(user.login(), user); + } + + public void addActionPlan(ActionPlan plan) { + this.actionPlans.put(plan.key(), plan); + } + + public void addRule(Rule rule) { + this.rules.put(rule.getKey(), rule); + } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/Rule.java b/server/sonar-server/src/main/java/org/sonar/server/rule/Rule.java index 076e6c6dd57..c82386adeb9 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/Rule.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/Rule.java @@ -31,7 +31,7 @@ import java.util.List; /** * @since 4.4 */ -public interface Rule { +public interface Rule extends org.sonar.api.rules.Rule { RuleKey key(); diff --git a/sonar-core/src/main/java/org/sonar/core/issue/db/ActionPlanDao.java b/sonar-core/src/main/java/org/sonar/core/issue/db/ActionPlanDao.java index b0211fd7830..1d30a3e7926 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/db/ActionPlanDao.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/db/ActionPlanDao.java @@ -24,6 +24,7 @@ import com.google.common.collect.Lists; import org.apache.ibatis.session.SqlSession; import org.sonar.api.BatchComponent; import org.sonar.api.ServerComponent; +import org.sonar.core.persistence.DaoComponent; import org.sonar.core.persistence.MyBatis; import java.util.Collection; @@ -35,7 +36,7 @@ import static com.google.common.collect.Lists.newArrayList; /** * @since 3.6 */ -public class ActionPlanDao implements BatchComponent, ServerComponent { +public class ActionPlanDao implements BatchComponent, ServerComponent, DaoComponent { private final MyBatis mybatis; -- 2.39.5