diff options
author | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2016-01-18 12:12:39 +0100 |
---|---|---|
committer | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2016-01-18 18:33:40 +0100 |
commit | ddee50ce60a9cf14288e4d593adaa217d6372894 (patch) | |
tree | 36136244069cb3aa0b1318ee9b9c269c43173bca /sonar-db | |
parent | d2f4b79ac7df4f29364d84cd9bdfc27df62c97a0 (diff) | |
download | sonarqube-ddee50ce60a9cf14288e4d593adaa217d6372894.tar.gz sonarqube-ddee50ce60a9cf14288e4d593adaa217d6372894.zip |
SONAR-7205 WS users/search with token count in response
Diffstat (limited to 'sonar-db')
6 files changed, 91 insertions, 0 deletions
diff --git a/sonar-db/src/main/java/org/sonar/db/MyBatis.java b/sonar-db/src/main/java/org/sonar/db/MyBatis.java index 23065bfde9d..9cf94000504 100644 --- a/sonar-db/src/main/java/org/sonar/db/MyBatis.java +++ b/sonar-db/src/main/java/org/sonar/db/MyBatis.java @@ -126,6 +126,7 @@ import org.sonar.db.user.UserGroupDto; import org.sonar.db.user.UserGroupMapper; import org.sonar.db.user.UserMapper; import org.sonar.db.user.UserRoleDto; +import org.sonar.db.user.UserTokenCount; import org.sonar.db.user.UserTokenDto; import org.sonar.db.user.UserTokenMapper; import org.sonar.db.version.SchemaMigrationDto; @@ -216,6 +217,7 @@ public class MyBatis { confBuilder.loadAlias("CustomMeasure", CustomMeasureDto.class); confBuilder.loadAlias("ViewsSnapshot", ViewsSnapshotDto.class); confBuilder.loadAlias("UserToken", UserTokenDto.class); + confBuilder.loadAlias("UserTokenCount", UserTokenCount.class); // AuthorizationMapper has to be loaded before IssueMapper because this last one used it confBuilder.loadMapper("org.sonar.db.user.AuthorizationMapper"); diff --git a/sonar-db/src/main/java/org/sonar/db/user/UserTokenCount.java b/sonar-db/src/main/java/org/sonar/db/user/UserTokenCount.java new file mode 100644 index 00000000000..44896754915 --- /dev/null +++ b/sonar-db/src/main/java/org/sonar/db/user/UserTokenCount.java @@ -0,0 +1,43 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.db.user; + +public class UserTokenCount { + private String login; + private Integer tokenCount; + + public String getLogin() { + return login; + } + + public UserTokenCount setLogin(String login) { + this.login = login; + return this; + } + + public Integer tokenCount() { + return tokenCount; + } + + public UserTokenCount setTokenCount(Integer tokenCount) { + this.tokenCount = tokenCount; + return this; + } +} diff --git a/sonar-db/src/main/java/org/sonar/db/user/UserTokenDao.java b/sonar-db/src/main/java/org/sonar/db/user/UserTokenDao.java index eb494dc983d..ff6a69c0bed 100644 --- a/sonar-db/src/main/java/org/sonar/db/user/UserTokenDao.java +++ b/sonar-db/src/main/java/org/sonar/db/user/UserTokenDao.java @@ -19,9 +19,14 @@ */ package org.sonar.db.user; +import com.google.common.base.Function; import com.google.common.base.Optional; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import javax.annotation.Nonnull; import org.sonar.db.Dao; +import org.sonar.db.DatabaseUtils; import org.sonar.db.DbSession; import org.sonar.db.RowNotFoundException; @@ -53,6 +58,22 @@ public class UserTokenDao implements Dao { return mapper(dbSession).selectByLogin(login); } + public Map<String, Integer> countTokensByLogins(final DbSession dbSession, List<String> logins) { + final Map<String, Integer> result = new HashMap<>(); + DatabaseUtils.executeLargeInputs(logins, new Function<List<String>, List<UserTokenCount>>() { + @Override + public List<UserTokenCount> apply(@Nonnull List<String> input) { + List<UserTokenCount> userTokenCounts = mapper(dbSession).countTokensByLogins(input); + for (UserTokenCount userTokenCount : userTokenCounts) { + result.put(userTokenCount.getLogin(), userTokenCount.tokenCount()); + } + return userTokenCounts; + } + }); + + return result; + } + public void deleteByLogin(DbSession dbSession, String login) { mapper(dbSession).deleteByLogin(login); } diff --git a/sonar-db/src/main/java/org/sonar/db/user/UserTokenMapper.java b/sonar-db/src/main/java/org/sonar/db/user/UserTokenMapper.java index f8ace95818f..bb814b86e4c 100644 --- a/sonar-db/src/main/java/org/sonar/db/user/UserTokenMapper.java +++ b/sonar-db/src/main/java/org/sonar/db/user/UserTokenMapper.java @@ -34,4 +34,6 @@ public interface UserTokenMapper { void deleteByLogin(String login); void deleteByLoginAndName(@Param("login") String login, @Param("name") String name); + + List<UserTokenCount> countTokensByLogins(@Param("logins") List<String> logins); } diff --git a/sonar-db/src/main/resources/org/sonar/db/user/UserTokenMapper.xml b/sonar-db/src/main/resources/org/sonar/db/user/UserTokenMapper.xml index 1b74df52c2a..3078c44137e 100644 --- a/sonar-db/src/main/resources/org/sonar/db/user/UserTokenMapper.xml +++ b/sonar-db/src/main/resources/org/sonar/db/user/UserTokenMapper.xml @@ -35,6 +35,16 @@ FROM user_tokens t WHERE t.login=#{login} </select> + + <select id="countTokensByLogins" parameterType="map" resultType="UserTokenCount"> + SELECT t.login as "login", count(t.name) as "tokenCount" + FROM user_tokens t + WHERE t.login in + <foreach collection="logins" open="(" close=")" item="login" separator=","> + #{login} + </foreach> + GROUP BY t.login + </select> <delete id="deleteByLogin"> DELETE FROM user_tokens WHERE login=#{login} diff --git a/sonar-db/src/test/java/org/sonar/db/user/UserTokenDaoTest.java b/sonar-db/src/test/java/org/sonar/db/user/UserTokenDaoTest.java index 9b25fe6c28f..bfe27081188 100644 --- a/sonar-db/src/test/java/org/sonar/db/user/UserTokenDaoTest.java +++ b/sonar-db/src/test/java/org/sonar/db/user/UserTokenDaoTest.java @@ -20,6 +20,7 @@ package org.sonar.db.user; import com.google.common.base.Optional; +import java.util.Map; import org.assertj.guava.api.Assertions; import org.junit.Before; import org.junit.Rule; @@ -32,6 +33,7 @@ import org.sonar.db.DbTester; import org.sonar.db.RowNotFoundException; import org.sonar.test.DbTests; +import static com.google.common.collect.Lists.newArrayList; import static org.assertj.core.api.Assertions.assertThat; import static org.sonar.db.user.UserTokenTesting.newUserToken; @@ -129,6 +131,17 @@ public class UserTokenDaoTest { Assertions.assertThat(underTest.selectByLoginAndName(dbSession, "another-login", "name")).isPresent(); } + @Test + public void count_tokens_by_login() { + insertToken(newUserToken().setLogin("login").setName("name")); + insertToken(newUserToken().setLogin("login").setName("another-name")); + + Map<String, Integer> result = underTest.countTokensByLogins(dbSession, newArrayList("login")); + + assertThat(result.get("login")).isEqualTo(2); + assertThat(result.get("unknown-login")).isNull(); + } + private void insertToken(UserTokenDto userToken) { underTest.insert(dbSession, userToken); dbSession.commit(); |