BearND has uploaded a new change for review. https://gerrit.wikimedia.org/r/173638
Change subject: Full text search results in correct order ...................................................................... Full text search results in correct order Also avoiding an extra request per full text search to get the thumbnail URLs. This should make the thumbnails appear much faster. Using similar request as iOS app. Bug: 72781 Change-Id: Ic6742bd8ae796c1c0ee4879e22cae0063efd564b --- M wikipedia/src/main/java/org/wikipedia/search/FullSearchArticlesTask.java M wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java M wikipedia/src/main/java/org/wikipedia/search/FullSearchResult.java M wikipedia/src/main/java/org/wikipedia/search/TitleSearchTask.java 4 files changed, 62 insertions(+), 60 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia refs/changes/38/173638/1 diff --git a/wikipedia/src/main/java/org/wikipedia/search/FullSearchArticlesTask.java b/wikipedia/src/main/java/org/wikipedia/search/FullSearchArticlesTask.java index 9d09734..363422e 100644 --- a/wikipedia/src/main/java/org/wikipedia/search/FullSearchArticlesTask.java +++ b/wikipedia/src/main/java/org/wikipedia/search/FullSearchArticlesTask.java @@ -3,18 +3,23 @@ import org.wikipedia.ApiTask; import org.wikipedia.PageTitle; import org.wikipedia.Site; +import org.wikipedia.WikipediaApp; import org.mediawiki.api.json.Api; import org.mediawiki.api.json.ApiException; import org.mediawiki.api.json.ApiResult; import org.mediawiki.api.json.RequestBuilder; +import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; public class FullSearchArticlesTask extends ApiTask<FullSearchArticlesTask.FullSearchResults> { + private static final int MAX_RESULTS = 12; private static final String NUM_RESULTS_PER_QUERY = "12"; private final Site site; @@ -30,17 +35,29 @@ @Override public RequestBuilder buildRequest(Api api) { + final String offset = Integer.toString(continueOffset); return api.action("query") - .param("prop", "pageprops") + .param("prop", "pageprops|pageimages") .param("ppprop", "wikibase_item") // only interested in wikibase_item .param("generator", "search") .param("gsrsearch", searchTerm) .param("gsrnamespace", "0") .param("gsrwhat", "text") - .param("gsrinfo", "totalhits|suggestion") + .param("gsrinfo", "") .param("gsrprop", "redirecttitle") - .param("gsroffset", Integer.toString(continueOffset)) - .param("gsrlimit", NUM_RESULTS_PER_QUERY); + .param("gsroffset", offset) + .param("gsrlimit", NUM_RESULTS_PER_QUERY) + .param("list", "search") // for correct order + .param("srsearch", searchTerm) + .param("srnamespace", "0") + .param("srwhat", "text") + .param("srinfo", "suggestion") + .param("srprop", "") + .param("sroffset", offset) + .param("srlimit", NUM_RESULTS_PER_QUERY) + .param("piprop", "thumbnail") // for thumbnail URLs + .param("pithumbsize", Integer.toString(WikipediaApp.PREFERRED_THUMB_SIZE)) + .param("pilimit", NUM_RESULTS_PER_QUERY); } @Override @@ -77,7 +94,19 @@ return emptyResults(); } - ArrayList<FullSearchResult> resultList = new ArrayList<FullSearchResult>(); + /* + So here's what we're doing here: + We're requesting two sets of results with our API query. They both contain the same titles, + but in different orders. The results given by "list=search" give us the results in + the correct order, but with no thumbnails or wikidata ID. The results given by "generator=search" + give the results in the wrong order, but with thumbnails and wikidata IDs! + So, all we have to do is use the first list, and correlate the titles with the second list to + extract the thumbnails. Unfortunately, the search generator only gives us titles and not pageids. + This is why we need a Map of titles to results. + */ + + // build a map of full result objects + Map<String, FullSearchResult> map = new HashMap<String, FullSearchResult>(MAX_RESULTS + 1, 1.0f); Iterator<String> keys = pages.keys(); while (keys.hasNext()) { String key = keys.next(); @@ -89,7 +118,20 @@ JSONObject pageProps = pageData.getJSONObject("pageprops"); wikiBaseId = pageProps.optString("wikibase_item", null); } - resultList.add(new FullSearchResult(pageTitle, wikiBaseId)); + String thumbUrl = null; + if (pageData.has("thumbnail")) { + JSONObject thumbnail = pageData.getJSONObject("thumbnail"); + thumbUrl = thumbnail.optString("source", null); + } + + map.put(titleString, new FullSearchResult(pageTitle, thumbUrl, wikiBaseId)); + } + + // put them into the list in the correct order + ArrayList<FullSearchResult> resultList = new ArrayList<FullSearchResult>(); + JSONArray search = queryResult.getJSONArray("search"); + for (int i = 0; i < search.length(); i++) { + resultList.add(map.get(search.getJSONObject(i).getString("title"))); } return new FullSearchResults(resultList, newOffset, suggestion); diff --git a/wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java b/wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java index fb0c0a9..5f417a4 100644 --- a/wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java +++ b/wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java @@ -1,11 +1,9 @@ package org.wikipedia.search; import org.wikipedia.PageTitle; -import org.wikipedia.ParcelableLruCache; import org.wikipedia.R; import org.wikipedia.WikipediaApp; import org.wikipedia.page.PageActivity; -import org.wikipedia.pageimages.PageImagesTask; import org.wikipedia.wikidata.WikidataDescriptionsTask; import org.wikipedia.wikidata.WikidataSite; import com.squareup.picasso.Picasso; @@ -30,8 +28,6 @@ public class FullSearchFragment extends Fragment { private static final int DELAY_MILLIS = 1000; - private static final int MAX_CACHE_SIZE_IMAGES = 48; - private static final int MAX_CACHE_SIZE_DESCRIPTIONS = 96; private static final int MESSAGE_SEARCH = 1; private WikipediaApp app; @@ -39,7 +35,6 @@ private SearchArticlesFragment searchFragment; private View searchResultsContainer; private ListView searchResultsList; - private SearchResultAdapter adapter; private String currentSearchTerm = ""; private View searchFullContainer; @@ -51,9 +46,6 @@ private FullSearchArticlesTask.FullSearchResults lastResults; private List<FullSearchResult> totalResults; - - private ParcelableLruCache<String> pageImagesCache - = new ParcelableLruCache<String>(MAX_CACHE_SIZE_IMAGES, String.class); public FullSearchFragment() { } @@ -81,7 +73,7 @@ } }); - adapter = new SearchResultAdapter(inflater); + SearchResultAdapter adapter = new SearchResultAdapter(inflater); searchResultsList.setAdapter(adapter); searchSuggestion = (TextView) rootView.findViewById(R.id.search_suggestion); @@ -194,7 +186,6 @@ } else { searchResultsList.setVisibility(View.VISIBLE); getWikidataDescriptions(lastResults.getResults()); - getPageThumbnails(lastResults.getResults()); } if (continueOffset == 0) { @@ -277,43 +268,6 @@ descriptionTask.execute(); } - private void getPageThumbnails(List<FullSearchResult> results) { - List<PageTitle> titleList = new ArrayList<PageTitle>(); - for (FullSearchResult r : results) { - if (pageImagesCache.get(r.getTitle().getPrefixedText()) == null) { - // not in our cache yet - titleList.add(r.getTitle()); - } - } - if (titleList.isEmpty()) { - return; - } - - PageImagesTask imagesTask = new PageImagesTask( - app.getAPIForSite(app.getPrimarySite()), - app.getPrimarySite(), - titleList, - (int)(WikipediaApp.PREFERRED_THUMB_SIZE * WikipediaApp.getInstance().getScreenDensity())) { - @Override - public void onFinish(Map<PageTitle, String> result) { - for (Map.Entry<PageTitle, String> entry : result.entrySet()) { - if (entry.getValue() == null) { - continue; - } - pageImagesCache.put(entry.getKey().getPrefixedText(), entry.getValue()); - } - ((BaseAdapter) searchResultsList.getAdapter()).notifyDataSetChanged(); - } - - @Override - public void onCatch(Throwable caught) { - // Don't actually do anything. - // Thumbnails are expendable - } - }; - imagesTask.execute(); - } - private final class SearchResultAdapter extends BaseAdapter { private List<FullSearchResult> results; private final LayoutInflater inflater; @@ -357,7 +311,7 @@ } ImageView imageView = (ImageView) convertView.findViewById(R.id.result_image); - String thumbnail = pageImagesCache.get(result.getTitle().getPrefixedText()); + String thumbnail = result.getThumbUrl(); if (thumbnail == null) { Picasso.with(parent.getContext()) .load(R.drawable.ic_pageimage_placeholder) diff --git a/wikipedia/src/main/java/org/wikipedia/search/FullSearchResult.java b/wikipedia/src/main/java/org/wikipedia/search/FullSearchResult.java index daa7e50..c84a104 100644 --- a/wikipedia/src/main/java/org/wikipedia/search/FullSearchResult.java +++ b/wikipedia/src/main/java/org/wikipedia/search/FullSearchResult.java @@ -4,9 +4,11 @@ public class FullSearchResult { private final PageTitle title; + private final String thumbUrl; private final String wikiBaseId; - public FullSearchResult(PageTitle title, String wikiBaseId) { + public FullSearchResult(PageTitle title, String thumbUrl, String wikiBaseId) { + this.thumbUrl = thumbUrl; this.wikiBaseId = wikiBaseId; this.title = title; } @@ -15,6 +17,10 @@ return title; } + public String getThumbUrl() { + return thumbUrl; + } + public String getWikiBaseId() { return wikiBaseId; } diff --git a/wikipedia/src/main/java/org/wikipedia/search/TitleSearchTask.java b/wikipedia/src/main/java/org/wikipedia/search/TitleSearchTask.java index a2287d0..7322082 100644 --- a/wikipedia/src/main/java/org/wikipedia/search/TitleSearchTask.java +++ b/wikipedia/src/main/java/org/wikipedia/search/TitleSearchTask.java @@ -66,16 +66,16 @@ give the results in the wrong order, but with thumbnails! So, all we have to do is use the first list, and correlate the pageids with the second list to extract the thumbnails. */ - JSONObject query = data.optJSONObject("query"); - JSONObject pages = query.optJSONObject("pages"); + JSONObject queryResult = data.optJSONObject("query"); + JSONObject pages = queryResult.optJSONObject("pages"); if (pages == null) { return pageTitles; } - JSONArray prefixsearch = query.getJSONArray("prefixsearch"); + JSONArray search = queryResult.getJSONArray("prefixsearch"); - for (int i = 0; i < prefixsearch.length(); i++) { + for (int i = 0; i < search.length(); i++) { String thumbUrl = null; - JSONObject item = prefixsearch.getJSONObject(i); + JSONObject item = search.getJSONObject(i); String pageid = item.getString("pageid"); if (pages.has(pageid) && pages.getJSONObject(pageid).has("thumbnail")) { thumbUrl = pages.getJSONObject(pageid) -- To view, visit https://gerrit.wikimedia.org/r/173638 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ic6742bd8ae796c1c0ee4879e22cae0063efd564b Gerrit-PatchSet: 1 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: BearND <bsitzm...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits