package com.door43.translationstudio.tasks;
import com.door43.translationstudio.AppContext;
import com.door43.util.tasks.ManagedTask;
import org.unfoldingword.gogsclient.Repository;
import org.unfoldingword.gogsclient.User;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* This task performs a hybrid search on gogs that includes for repositories by username as well as repository name
*/
public class AdvancedGogsRepoSearchTask extends ManagedTask {
public static final String TASK_ID = "advanced_gogs_search";
private final User authUser;
private final String userQuery;
private final String repoQuery;
private final int limit;
private final int dataPoolLimit;
private List<Repository> repositories = new ArrayList<>();
/**
*
* @param authUser the user authenticating the request
* @param userQuery the username query
* @param repoQuery the repository query
* @param limit the maximum number of results
*/
public AdvancedGogsRepoSearchTask(User authUser, String userQuery, String repoQuery, int limit) {
this.authUser = authUser;
this.userQuery = userQuery;
this.limit = limit;
// this is an adhoc search so we increase the data pool so it's more likely we find something.
this.dataPoolLimit = limit * 10;
if(repoQuery.isEmpty()) {
// wild card
this.repoQuery = "_";
} else {
this.repoQuery = repoQuery;
}
}
@Override
public void start() {
if(AppContext.context().isNetworkAvailable()) {
if(!userQuery.isEmpty()) {
// start by searching users
SearchGogsUsersTask searchUsersTask = new SearchGogsUsersTask(this.authUser, this.userQuery, this.dataPoolLimit);
delegate(searchUsersTask);
List<User> users = searchUsersTask.getUsers();
for(User user:users) {
// find repos in users
SearchGogsRepositoriesTask searchReposTask = new SearchGogsRepositoriesTask(this.authUser, user.getId(), this.repoQuery, this.dataPoolLimit);
delegate(searchReposTask);
this.repositories.addAll(searchReposTask.getRepositories());
if(this.repositories.size() >= this.limit) break;
}
} else {
// just search repos
SearchGogsRepositoriesTask searchReposTask = new SearchGogsRepositoriesTask(this.authUser, 0, this.repoQuery, this.limit);
delegate(searchReposTask);
this.repositories = searchReposTask.getRepositories();
}
}
}
/**
* Returns the repositories that were found
* @return
*/
public List<Repository> getRepositories() {
return this.repositories;
}
}