package com.qubling.sidekick.model;
import java.util.Collection;
import java.util.Collections;
import com.qubling.sidekick.fetch.Fetcher;
import com.qubling.sidekick.fetch.SubqueryFetcher;
import com.qubling.sidekick.fetch.UpdateFetcher;
import com.qubling.sidekick.fetch.cpan.CPANQueryFetcher;
import com.qubling.sidekick.fetch.cpan.ModuleDetailsFetcher;
import com.qubling.sidekick.fetch.cpan.ModuleForReleaseFetcher;
import com.qubling.sidekick.fetch.cpan.ModuleKeywordSearch;
import com.qubling.sidekick.fetch.cpan.ModulePodFetcher;
import com.qubling.sidekick.instance.Author;
import com.qubling.sidekick.instance.Module;
import com.qubling.sidekick.instance.Release;
import com.qubling.sidekick.search.ResultSet;
import com.qubling.sidekick.search.Schema;
public class ModuleModel extends Model<Module> {
public ModuleModel(Schema schema) {
super(schema);
}
protected Module constructInstance(String name) {
return new Module(this, name);
}
public Fetcher<Module> searchByKeyword(String keywords) {
return new ModuleKeywordSearch(this, keywords);
}
public Fetcher<Module> searchByKeyword(String keywords, int size) {
ModuleKeywordSearch keywordSearch = new ModuleKeywordSearch(this, keywords);
keywordSearch.setSize(size);
return keywordSearch;
}
public Fetcher<Module> fetchModulesForRelease(Release release) {
CPANQueryFetcher<Module> fetcher = new ModuleForReleaseFetcher(this, release);
fetcher.setSize(999);
return fetcher;
}
public UpdateFetcher<Module> fetchPod() {
return new ModulePodFetcher(this);
}
public UpdateFetcher<Module> fetch() {
return new ModuleDetailsFetcher(this);
}
public UpdateFetcher<Module> fetchReleaseFavorites(String myPrivateToken) {
ResultSet.Remap<Module, Release> remapper = new ResultSet.Remap<Module, Release>() {
@Override
public Collection<Release> map(Module module) {
Release release = module.getRelease();
if (release == null) {
return Collections.emptyList();
}
else {
return Collections.singleton(release);
}
}
};
UpdateFetcher<Release> fetcher = getSchema().getReleaseModel().fetchFavorites(myPrivateToken);
return new SubqueryFetcher<Module, Release>(this, fetcher, remapper);
}
public UpdateFetcher<Module> fetchReleaseRatings() {
ResultSet.Remap<Module, Release> remapper = new ResultSet.Remap<Module, Release>() {
@Override
public Collection<Release> map(Module module) {
Release release = module.getRelease();
if (release == null) {
return Collections.emptyList();
}
else {
return Collections.singleton(release);
}
}
};
UpdateFetcher<Release> fetcher = getSchema().getReleaseModel().fetchRatings();
return new SubqueryFetcher<Module, Release>(this, fetcher, remapper);
}
public UpdateFetcher<Module> fetchAuthors() {
ResultSet.Remap<Module, Author> remapper = new ResultSet.Remap<Module, Author>() {
@Override
public Collection<Author> map(Module module) {
Author author = module.getAuthor();
if (author == null) {
return Collections.emptyList();
}
else {
return Collections.singleton(author);
}
}
};
UpdateFetcher<Author> fetcher = getSchema().getAuthorModel().fetchDetails();
return new SubqueryFetcher<Module, Author>(this, fetcher, remapper);
}
public UpdateFetcher<Module> fetchGravatars(float gravatarDpSize) {
ResultSet.Remap<Module, Author> remapper = new ResultSet.Remap<Module, Author>() {
@Override
public Collection<Author> map(Module module) {
Author author = module.getAuthor();
if (author == null) {
return Collections.emptyList();
}
else {
return Collections.singleton(author);
}
}
};
UpdateFetcher<Author> fetcher = getSchema().getAuthorModel().fetchGravatars(gravatarDpSize);
return new SubqueryFetcher<Module, Author>(this, fetcher, remapper);
}
@Override
public String toString() {
return getSchema() + ":ModuleModel";
}
}