package org.wikipedia.search; import android.support.annotation.NonNull; import org.wikipedia.Constants; import org.wikipedia.dataclient.WikiSite; import org.wikipedia.dataclient.mwapi.MwQueryPage; import org.wikipedia.page.PageTitle; import org.wikipedia.util.ReleaseUtil; import org.wikipedia.util.log.L; import java.util.ArrayList; import java.util.List; /** * Simple Data Object to hold search result data for both prefix search and full text search. */ public class SearchResults { private List<SearchResult> results; private ContinueOffset continueOffset; private String suggestion; /** * Empty results. Use for fallback when something goes wrong. */ public SearchResults() { results = new ArrayList<>(); continueOffset = null; suggestion = ""; } /** * Constructor for a list of Retrofit results from BecauseYouReadTask. */ public SearchResults(List<MwQueryPage> pages, WikiSite wiki) { List<SearchResult> searchResults = new ArrayList<>(); for (MwQueryPage page : pages) { searchResults.add(new SearchResult(page, wiki)); } this.results = searchResults; this.continueOffset = null; this.suggestion = ""; } /** * Constructor for when we get results. * @param results the actual results * @param continueOffset for search continuation * @param suggestion a search suggestion to show to the user: "Did you mean ...?" */ public SearchResults(List<SearchResult> results, ContinueOffset continueOffset, String suggestion) { this.results = results; this.continueOffset = continueOffset; this.suggestion = suggestion; } public List<SearchResult> getResults() { return results; } public String getSuggestion() { return suggestion; } public ContinueOffset getContinueOffset() { return continueOffset; } /** * Filter the list of suggestions to make sure the original page title isn't one of them, * as well as whether the suggestion contains a thumbnail. * * @param searchResults original results from server * @return filtered results */ @NonNull public static SearchResults filter(SearchResults searchResults, String title, boolean requireThumbnail) { final boolean verbose = ReleaseUtil.isDevRelease(); List<SearchResult> filteredResults = new ArrayList<>(); List<SearchResult> results = searchResults.getResults(); for (int i = 0; i < results.size() && filteredResults.size() < Constants.MAX_SUGGESTION_RESULTS; i++) { final SearchResult res = results.get(i); final PageTitle pageTitle = res.getPageTitle(); if (verbose) { L.v(pageTitle.getPrefixedText()); } if (!title.equalsIgnoreCase(pageTitle.getPrefixedText()) && (!requireThumbnail || pageTitle.getThumbUrl() != null) && !(pageTitle.isMainPage() || pageTitle.isDisambiguationPage())) { filteredResults.add(res); } } return new SearchResults(filteredResults, null, null); } /** * Continuation markers to pass around between search requests. * All internal to the actual search type, so see implementation. */ public static class ContinueOffset { } }