package controllers;
import play.mvc.Result;
import uk.bl.monitrix.Global;
import uk.bl.monitrix.database.DBConnector;
import uk.bl.monitrix.model.CrawlLog;
import uk.bl.monitrix.model.KnownHostList;
import uk.bl.monitrix.model.SearchResult;
public class Search extends AbstractController {
// String constants
private static final String QUERY = "query";
private static final String TYPE = "type";
private static final String LIMIT = "limit";
private static final String OFFSET = "offset";
private static final String MIN = "min";
private static final String MAX = "max";
private static final String TYPE_TLD = "tld";
private static final String TYPE_URL = "url";
private static final String TYPE_HOST = "hostname";
private static final String TYPE_ANNOTATION = "annotation";
private static final String TYPE_AVG_FETCH_DURATION = "fetch_duration";
private static final String TYPE_COMPRESSABILITY = "compressability";
private static final String TYPE_AVG_RETRIES = "avg_retries";
private static final String TYPE_ROBOTS_PERCENTAGE = "robots_percentage";
private static final String TYPE_REDIRECT_PERCENTAGE = "redirect_percentage";
private static DBConnector db = Global.getBackend();
private static CrawlLog crawlLog = db.getCrawlLog();
private static KnownHostList knownHostList = db.getKnownHostList();
// TODO eliminate code duplication
public static Result search() {
String query = getQueryParam(QUERY);
String type = getQueryParam(TYPE);
int limit = getQueryParamAsInt(LIMIT, 20);
int offset = getQueryParamAsInt(OFFSET, 0);
if (type == null && query == null)
return ok(views.html.search.advanced.render());
if ((type == null && query != null) ||
(type.isEmpty() && query != null)) {
// Default to combined host + URL search
SearchResult hosts = knownHostList.searchHosts(query, limit, offset);
long urlPreview = crawlLog.searchByURL(query, 1, 0).totalResults();
if (hosts.totalResults() == 0 && urlPreview > 0) {
SearchResult urls = crawlLog.searchByURL(query, limit, offset);
return ok(views.html.search.urlResults.render(urls, hosts.totalResults(), null, null));
} else {
return ok(views.html.search.hostResults.render(hosts, urlPreview, null, null));
}
}
if (type.equalsIgnoreCase(TYPE_TLD) && query != null) {
return ok(views.html.search.hostResults.render(knownHostList.searchByTopLevelDomain(query, limit, offset), null, TYPE_TLD, null));
} else if (type.equalsIgnoreCase(TYPE_URL) && query != null) {
SearchResult urls = crawlLog.searchByURL(query, limit, offset);
return ok(views.html.search.urlResults.render(urls, null, TYPE_URL, null));
} else if (type.equalsIgnoreCase(TYPE_HOST) && query != null) {
SearchResult hosts = knownHostList.searchHosts(query, limit, offset);
return ok(views.html.search.hostResults.render(hosts, null, TYPE_HOST, null));
} else if (type.equalsIgnoreCase(TYPE_ANNOTATION) && query != null) {
SearchResult urls = crawlLog.searchByAnnotation(query, limit, offset);
return ok(views.html.search.urlResults.render(urls, null, TYPE_ANNOTATION, null));
} else if (type.equalsIgnoreCase(TYPE_AVG_FETCH_DURATION)) {
int min = getQueryParamAsInt(MIN, -1);
int max = getQueryParamAsInt(MAX, -1);
if (min > -1 && max > min) {
SearchResult hosts = knownHostList.searchByAverageFetchDuration(min, max, limit, offset);
return ok(views.html.search.hostResults.render(hosts, null, TYPE_AVG_FETCH_DURATION, "&min=" + min + "&max=" + max));
}
} else if (type.equalsIgnoreCase(TYPE_COMPRESSABILITY)) {
double min = getQueryParamAsDouble(MIN, -1);
double max = getQueryParamAsDouble(MAX, -1);
if (min > -1 && max > min) {
SearchResult urls = crawlLog.searchByCompressability(min, max, limit, offset);
return ok(views.html.search.urlResults.render(urls, null, TYPE_COMPRESSABILITY, "&min=" + min + "&max=" + max));
}
} else if (type.equalsIgnoreCase(TYPE_AVG_RETRIES)) {
int min = getQueryParamAsInt(MIN, -1);
int max = getQueryParamAsInt(MAX, -1);
if (min > -1 && max > min) {
SearchResult hosts = knownHostList.searchByAverageRetries(min, max, limit, offset);
return ok(views.html.search.hostResults.render(hosts, null, TYPE_AVG_RETRIES, "&min=" + min + "&max=" + max));
}
} else if (type.equalsIgnoreCase(TYPE_REDIRECT_PERCENTAGE)) {
double min = getQueryParamAsDouble(MIN, -1);
double max = getQueryParamAsDouble(MAX, -1);
if (min > -1 && max > min) {
SearchResult hosts = knownHostList.searchByRedirectPercentage(min, max, limit, offset);
return ok(views.html.search.hostResults.render(hosts, null, TYPE_REDIRECT_PERCENTAGE, "&min=" + min + "&max=" + max));
}
} else if (type.equalsIgnoreCase(TYPE_ROBOTS_PERCENTAGE)) {
double min = getQueryParamAsDouble(MIN, -1);
double max = getQueryParamAsDouble(MAX, -1);
if (min > -1 && max > min) {
SearchResult hosts = knownHostList.searchByRobotsBlockPercentage(min, max, limit, offset);
return ok(views.html.search.hostResults.render(hosts, null, TYPE_ROBOTS_PERCENTAGE, "&min=" + min + "&max=" + max));
}
}
// Only happens if someone messes with the query string manually
return ok(views.html.search.advanced.render());
}
}