aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2016-04-15 09:12:13 +0200
committerJulien Lancelot <julien.lancelot@sonarsource.com>2016-04-15 09:32:14 +0200
commite328fb0091fc78011b5ffe30942620ce5bff1467 (patch)
tree522f48e958560c982ad59bd40dbf057caf9e2049
parent9a3d3fc2d03cf39ff102068124681b9bc78dc4b6 (diff)
downloadsonarqube-e328fb0091fc78011b5ffe30942620ce5bff1467.tar.gz
sonarqube-e328fb0091fc78011b5ffe30942620ce5bff1467.zip
Add UserDao.selectByIds
-rw-r--r--sonar-db/src/main/java/org/sonar/db/user/UserDao.java24
-rw-r--r--sonar-db/src/main/java/org/sonar/db/user/UserMapper.java5
-rw-r--r--sonar-db/src/main/resources/org/sonar/db/user/UserMapper.xml16
-rw-r--r--sonar-db/src/test/java/org/sonar/db/user/UserDaoTest.java11
-rw-r--r--sonar-db/src/test/resources/org/sonar/db/user/UserDaoTest/selectUsersByIds.xml9
5 files changed, 51 insertions, 14 deletions
diff --git a/sonar-db/src/main/java/org/sonar/db/user/UserDao.java b/sonar-db/src/main/java/org/sonar/db/user/UserDao.java
index 5d0eada9cc7..7d746d50bdf 100644
--- a/sonar-db/src/main/java/org/sonar/db/user/UserDao.java
+++ b/sonar-db/src/main/java/org/sonar/db/user/UserDao.java
@@ -62,6 +62,16 @@ public class UserDao implements Dao {
}
/**
+ * Select users by ids, including disabled users. An empty list is returned
+ * if list of ids is empty, without any db round trips.
+ *
+ * Used by the Governance plugin
+ */
+ public List<UserDto> selectByIds(DbSession session, Collection<Long> ids) {
+ return DatabaseUtils.executeLargeInputs(ids, new SelectByIds(mapper(session)));
+ }
+
+ /**
* Search for user by login. Disabled users are ignored.
*
* @return the user, null if user not found
@@ -219,4 +229,18 @@ public class UserDao implements Dao {
return map.get(login);
}
}
+
+ private static class SelectByIds implements Function<List<Long>, List<UserDto>> {
+ private final UserMapper mapper;
+
+ private SelectByIds(UserMapper mapper) {
+ this.mapper = mapper;
+ }
+
+ @Override
+ public List<UserDto> apply(@Nonnull List<Long> partitionOfLogins) {
+ return mapper.selectByIds(partitionOfLogins);
+ }
+ }
+
}
diff --git a/sonar-db/src/main/java/org/sonar/db/user/UserMapper.java b/sonar-db/src/main/java/org/sonar/db/user/UserMapper.java
index e3c32da3ad6..e577c57e241 100644
--- a/sonar-db/src/main/java/org/sonar/db/user/UserMapper.java
+++ b/sonar-db/src/main/java/org/sonar/db/user/UserMapper.java
@@ -45,14 +45,11 @@ public interface UserMapper {
@CheckForNull
UserDto selectUserByLogin(String login);
- List<UserDto> selectUsersByLogins(@Param("logins") List<String> logins);
-
List<UserDto> selectUsers(UserQuery query);
List<UserDto> selectByLogins(List<String> logins);
- @CheckForNull
- GroupDto selectGroupByName(String name);
+ List<UserDto> selectByIds(@Param("ids") List<Long> ids);
long countByEmail(String email);
diff --git a/sonar-db/src/main/resources/org/sonar/db/user/UserMapper.xml b/sonar-db/src/main/resources/org/sonar/db/user/UserMapper.xml
index 7d9e4d69230..36f61886772 100644
--- a/sonar-db/src/main/resources/org/sonar/db/user/UserMapper.xml
+++ b/sonar-db/src/main/resources/org/sonar/db/user/UserMapper.xml
@@ -62,13 +62,14 @@
</foreach>
</select>
- <select id="selectUsersByLogins" parameterType="map" resultType="User">
+ <select id="selectByIds" parameterType="string" resultType="User">
SELECT
<include refid="userColumns"/>
- FROM users u WHERE
- (<foreach item="login" index="index" collection="logins" open="(" separator=" or " close=")">
- u.login=#{login}
- </foreach>)
+ FROM users u
+ WHERE u.id in
+ <foreach collection="ids" open="(" close=")" item="id" separator=",">
+ #{id}
+ </foreach>
</select>
<select id="selectUsers" parameterType="map" resultType="User">
@@ -98,11 +99,6 @@
where lower(u.email)=#{email} AND u.active=${_true}
</select>
- <select id="selectGroupByName" parameterType="string" resultType="Group">
- SELECT id, name, description, created_at AS "createdAt", updated_at AS "updatedAt"
- FROM groups WHERE name=#{id}
- </select>
-
<delete id="removeUserFromGroups" parameterType="long">
DELETE FROM groups_users WHERE user_id=#{id}
</delete>
diff --git a/sonar-db/src/test/java/org/sonar/db/user/UserDaoTest.java b/sonar-db/src/test/java/org/sonar/db/user/UserDaoTest.java
index 6afef4c64b3..2e5f9ecd41b 100644
--- a/sonar-db/src/test/java/org/sonar/db/user/UserDaoTest.java
+++ b/sonar-db/src/test/java/org/sonar/db/user/UserDaoTest.java
@@ -77,6 +77,17 @@ public class UserDaoTest {
}
@Test
+ public void selectUsersIds() {
+ db.prepareDbUnit(getClass(), "selectUsersByIds.xml");
+
+ Collection<UserDto> users = underTest.selectByIds(session, asList(100L, 101L, 987L));
+ assertThat(users).hasSize(2);
+ assertThat(users).extracting("login").containsOnly("marius", "inactive_user");
+
+ assertThat(underTest.selectByIds(session, Collections.<Long>emptyList())).isEmpty();
+ }
+
+ @Test
public void selectUserByLogin_ignore_inactive() {
db.prepareDbUnit(getClass(), "selectActiveUserByLogin.xml");
diff --git a/sonar-db/src/test/resources/org/sonar/db/user/UserDaoTest/selectUsersByIds.xml b/sonar-db/src/test/resources/org/sonar/db/user/UserDaoTest/selectUsersByIds.xml
new file mode 100644
index 00000000000..3be84a27b69
--- /dev/null
+++ b/sonar-db/src/test/resources/org/sonar/db/user/UserDaoTest/selectUsersByIds.xml
@@ -0,0 +1,9 @@
+<dataset>
+ <users id="100" login="inactive_user" name="Disabled" email="inactive@lesbronzes.fr" created_at="1418215735482"
+ updated_at="1418215735485" active="[false]"/>
+ <users id="101" login="marius" name="Marius" email="marius@lesbronzes.fr" created_at="1418215735482"
+ updated_at="1418215735485" active="[true]"/>
+ <users id="102" login="jcdus" name="Jean-Claude Dus" email="jcdus@lesbronzes.fr" created_at="1418215735482"
+ updated_at="1418215735485" active="[true]"/>
+
+</dataset>