Skip to content

Commit

Permalink
SONAR-7106 WS api/permissions/search_project_permissions rely on reso…
Browse files Browse the repository at this point in the history
…urce_index to search for component name
  • Loading branch information
teryk committed Mar 18, 2016
1 parent 0cdd471 commit 38ce809
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 60 deletions.
Expand Up @@ -25,7 +25,6 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Table;
import com.google.common.collect.TreeBasedTable;
import java.util.Collection;
import java.util.List;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
Expand All @@ -36,10 +35,10 @@
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentQuery;
import org.sonar.db.permission.CountByProjectAndPermissionDto;
import org.sonarqube.ws.client.permission.SearchProjectPermissionsWsRequest;

import static java.util.Collections.singleton;
import static java.util.Collections.singletonList;
import static org.sonar.api.utils.Paging.forPageIndex;
import static org.sonar.server.component.ResourceTypeFunctions.RESOURCE_TYPE_TO_QUALIFIER;
Expand All @@ -49,19 +48,19 @@
public class SearchProjectPermissionsDataLoader {
private final DbClient dbClient;
private final PermissionDependenciesFinder finder;
private final Collection<String> rootQualifiers;
private final String[] rootQualifiers;

public SearchProjectPermissionsDataLoader(DbClient dbClient, PermissionDependenciesFinder finder, ResourceTypes resourceTypes) {
this.dbClient = dbClient;
this.finder = finder;
this.rootQualifiers = Collections2.transform(resourceTypes.getRoots(), RESOURCE_TYPE_TO_QUALIFIER);
this.rootQualifiers = Collections2.transform(resourceTypes.getRoots(), RESOURCE_TYPE_TO_QUALIFIER).toArray(new String[resourceTypes.getRoots().size()]);
}

SearchProjectPermissionsData load(SearchProjectPermissionsWsRequest request) {
DbSession dbSession = dbClient.openSession(false);
try {
SearchProjectPermissionsData.Builder data = newBuilder();
int countRootComponents = countRootComponents(dbSession, qualifiers(request.getQualifier()), request);
int countRootComponents = countRootComponents(dbSession, request);
List<ComponentDto> rootComponents = searchRootComponents(dbSession, request, paging(request, countRootComponents));
List<Long> rootComponentIds = Lists.transform(rootComponents, ComponentToIdFunction.INSTANCE);

Expand All @@ -82,25 +81,31 @@ private static Paging paging(SearchProjectPermissionsWsRequest request, int tota
.andTotal(total);
}

private int countRootComponents(DbSession dbSession, Collection<String> qualifiers, SearchProjectPermissionsWsRequest request) {
return dbClient.componentDao().countRootComponents(dbSession, qualifiers, request.getQuery());
private int countRootComponents(DbSession dbSession, SearchProjectPermissionsWsRequest request) {
return dbClient.componentDao().countByQuery(dbSession, toDbQuery(request));
}

private List<ComponentDto> searchRootComponents(DbSession dbSession, SearchProjectPermissionsWsRequest request, Paging paging) {
String query = request.getQuery();
Optional<WsProjectRef> project = newOptionalWsProjectRef(request.getProjectId(), request.getProjectKey());

if (project.isPresent()) {
return singletonList(finder.getRootComponentOrModule(dbSession, project.get()));
}

return dbClient.componentDao().selectComponents(dbSession, qualifiers(request.getQualifier()), paging.offset(), paging.pageSize(), query);
return dbClient.componentDao().selectByQuery(dbSession, toDbQuery(request), paging.offset(), paging.pageSize());
}

private Collection<String> qualifiers(@Nullable String requestQualifier) {
private ComponentQuery toDbQuery(SearchProjectPermissionsWsRequest wsRequest) {
return ComponentQuery.builder()
.setQualifiers(qualifiers(wsRequest.getQualifier()))
.setNameOrKeyQuery(wsRequest.getQuery())
.build();
}

private String[] qualifiers(@Nullable String requestQualifier) {
return requestQualifier == null
? rootQualifiers
: singleton(requestQualifier);
: new String[] {requestQualifier};
}

private Table<Long, String, Integer> userCountByRootComponentIdAndPermission(DbSession dbSession, List<Long> rootComponentIds) {
Expand Down
Expand Up @@ -32,6 +32,7 @@
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDbTester;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ResourceTypesRule;
import org.sonar.db.user.GroupDto;
Expand Down Expand Up @@ -71,6 +72,7 @@ public class SearchProjectPermissionsActionTest {
public UserSessionRule userSession = UserSessionRule.standalone();
@Rule
public DbTester db = DbTester.create(System2.INSTANCE);
ComponentDbTester componentDb = new ComponentDbTester(db);

WsActionTester ws;
I18nRule i18n = new I18nRule();
Expand Down Expand Up @@ -180,9 +182,9 @@ public void has_projects_ordered_by_name() {

@Test
public void search_by_query_on_name() {
insertComponent(newProjectDto().setName("project-name"));
insertComponent(newProjectDto().setName("another-name"));
commit();
componentDb.insertProjectAndSnapshot(newProjectDto().setName("project-name"));
componentDb.insertProjectAndSnapshot(newProjectDto().setName("another-name"));
componentDb.indexProjects();

String result = ws.newRequest()
.setParam(TEXT_QUERY, "project")
Expand All @@ -193,13 +195,13 @@ public void search_by_query_on_name() {
}

@Test
public void search_by_query_on_key() {
insertComponent(newProjectDto().setKey("project-key"));
insertComponent(newProjectDto().setKey("another-key"));
commit();
public void search_by_query_on_key_must_match_exactly() {
componentDb.insertProjectAndSnapshot(newProjectDto().setKey("project-key"));
componentDb.insertProjectAndSnapshot(newProjectDto().setKey("another-key"));
componentDb.indexProjects();

String result = ws.newRequest()
.setParam(TEXT_QUERY, "project")
.setParam(TEXT_QUERY, "project-key")
.execute().getInput();

assertThat(result).contains("project-key")
Expand All @@ -209,9 +211,9 @@ public void search_by_query_on_key() {
@Test
public void handle_more_than_1000_projects() {
for (int i = 1; i <= 1001; i++) {
insertComponent(newProjectDto("project-uuid-" + i));
componentDb.insertProjectAndSnapshot(newProjectDto("project-uuid-" + i));
}
commit();
componentDb.indexProjects();

String result = ws.newRequest()
.setParam(TEXT_QUERY, "project")
Expand Down
24 changes: 0 additions & 24 deletions sonar-db/src/main/java/org/sonar/db/component/ComponentDao.java
Expand Up @@ -211,26 +211,6 @@ public List<ComponentDto> selectProjects(DbSession session) {
return mapper(session).selectProjects();
}

/**
* Does not return component copies
*/
public List<ComponentDto> selectComponents(DbSession session, Collection<String> qualifiers, int offset, int limit, @Nullable String query) {
Map<String, Object> parameters = newHashMapWithExpectedSize(3);
addProjectQualifier(parameters);
addPartialQueryParameterIfNotNull(parameters, query);
addQualifiers(parameters, qualifiers);

return mapper(session).selectComponents(parameters, new RowBounds(offset, limit));
}

public int countRootComponents(DbSession session, Collection<String> qualifiers, @Nullable String query) {
Map<String, Object> parameters = newHashMapWithExpectedSize(2);
addPartialQueryParameterIfNotNull(parameters, query);
addQualifiers(parameters, qualifiers);

return mapper(session).countRootComponents(parameters);
}

public List<ComponentDto> selectProvisionedProjects(DbSession session, int offset, int limit, @Nullable String query) {
Map<String, Object> parameters = newHashMapWithExpectedSize(2);
addProjectQualifier(parameters);
Expand Down Expand Up @@ -292,10 +272,6 @@ private static void addProjectQualifier(Map<String, Object> parameters) {
parameters.put("qualifier", Qualifiers.PROJECT);
}

private static void addQualifiers(Map<String, Object> parameters, Collection<String> qualifiers) {
parameters.put("qualifiers", qualifiers);
}

public void insert(DbSession session, ComponentDto item) {
mapper(session).insert(item);
}
Expand Down
Expand Up @@ -655,21 +655,6 @@ public void delete() throws Exception {
assertThat(underTest.selectByKey(dbSession, "PROJECT_2")).isPresent();
}

@Test
public void select_components_with_paging_query_and_qualifiers() {
underTest.insert(dbSession, newProjectDto().setName("aaaa-name"));
underTest.insert(dbSession, newView());
underTest.insert(dbSession, newDeveloper("project-name"));
for (int i = 9; i >= 1; i--) {
underTest.insert(dbSession, newProjectDto().setName("project-" + i));
}

List<ComponentDto> result = underTest.selectComponents(dbSession, singleton(Qualifiers.PROJECT), 1, 3, "project");

assertThat(result).hasSize(3);
assertThat(result).extracting("name").containsExactly("project-2", "project-3", "project-4");
}

@Test
public void select_by_query_with_paging_query_and_qualifiers() {
componentDb.insertProjectAndSnapshot(newProjectDto().setName("aaaa-name"));
Expand Down

0 comments on commit 38ce809

Please sign in to comment.