aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-db
diff options
context:
space:
mode:
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2016-01-18 12:12:39 +0100
committerTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2016-01-18 18:33:40 +0100
commitddee50ce60a9cf14288e4d593adaa217d6372894 (patch)
tree36136244069cb3aa0b1318ee9b9c269c43173bca /sonar-db
parentd2f4b79ac7df4f29364d84cd9bdfc27df62c97a0 (diff)
downloadsonarqube-ddee50ce60a9cf14288e4d593adaa217d6372894.tar.gz
sonarqube-ddee50ce60a9cf14288e4d593adaa217d6372894.zip
SONAR-7205 WS users/search with token count in response
Diffstat (limited to 'sonar-db')
-rw-r--r--sonar-db/src/main/java/org/sonar/db/MyBatis.java2
-rw-r--r--sonar-db/src/main/java/org/sonar/db/user/UserTokenCount.java43
-rw-r--r--sonar-db/src/main/java/org/sonar/db/user/UserTokenDao.java21
-rw-r--r--sonar-db/src/main/java/org/sonar/db/user/UserTokenMapper.java2
-rw-r--r--sonar-db/src/main/resources/org/sonar/db/user/UserTokenMapper.xml10
-rw-r--r--sonar-db/src/test/java/org/sonar/db/user/UserTokenDaoTest.java13
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();