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

Reply via email to