jenkins-bot has submitted this change and it was merged. Change subject: Resolve redirects when doing prefixsearch. ......................................................................
Resolve redirects when doing prefixsearch. Our search experience provides the user with prefix-search and full-text search results. However, in the case of prefix-search results, if the result is a Redirect page, it may be more useful to the user to see the *target* of the redirect, rather than the redirect name itself. In addition, the redirect (source) page doesn't come with a thumbnail or pageterms, which is even less useful to the user. This patch enables automatic resolving of redirects for prefix-search, whereby the target of the redirect will be shown, complete with thumbnail and description. This is accomplished in a slightly roundabout way: - The search API allows us to specify "redirects=true" to automatically resolve redirects. Simple enough... - However, when we receive the results, any result that is a redirect target will no longer have the "index" property, which we use to sort the results in our list. - However, the query response also contains a separate "redirects" array that contains a list of all the redirected results, apparently in the correct order. - So first, I take all the results that have an "index" property, and make a list of the "holes" in the indices. I then fill the holes with the results that don't have an "index" property, in the order that they appear in the "redirects" list! This can be vastly simplified, of course, if the API includes the "index" property with the redirected results. However, this may be difficult to do on the API side, so this will have to be the solution for now. Change-Id: I65e281fa83071a4dbf288ecdd7d3bf5ee39a0aee --- M wikipedia/src/main/java/org/wikipedia/search/TitleSearchTask.java 1 file changed, 37 insertions(+), 1 deletion(-) Approvals: BearND: Looks good to me, approved Deskana: Looks good to me, but someone else must approve jenkins-bot: Verified diff --git a/wikipedia/src/main/java/org/wikipedia/search/TitleSearchTask.java b/wikipedia/src/main/java/org/wikipedia/search/TitleSearchTask.java index 31f22f2..0bdb3bc 100644 --- a/wikipedia/src/main/java/org/wikipedia/search/TitleSearchTask.java +++ b/wikipedia/src/main/java/org/wikipedia/search/TitleSearchTask.java @@ -33,6 +33,7 @@ public RequestBuilder buildRequest(Api api) { return api.action("query") .param("generator", "prefixsearch") + .param("redirects", "true") .param("gpssearch", prefix) .param("gpsnamespace", "0") .param("gpslimit", NUM_RESULTS_PER_QUERY) @@ -88,13 +89,48 @@ return new SearchResults(pageTitles, null, suggestion); } + // Collect a list of redirect targets, if available. + // This provides us with the order in which the redirects are listed in the results, + // since the redirected results don't come with an "index" property. + ArrayList<String> redirectTargetList = new ArrayList<>(); + if (queryResult.has("redirects")) { + JSONArray redirs = queryResult.getJSONArray("redirects"); + for (int i = 0; i < redirs.length(); i++) { + redirectTargetList.add(((JSONObject) redirs.get(i)).getString("to")); + } + } + + // Create a list of indices, which will be claimed by results that have an "index". + // Results that are redirects will not have an "index", so we will manually place them + // into any indices that are left over. + ArrayList<Integer> pageIndices = new ArrayList<>(); + for (int i = 0; i < pages.length(); i++) { + pageIndices.add(i + 1); + } + // First, put all the page objects into an array JSONObject[] pageArray = new JSONObject[pages.length()]; int pageIndex = 0; Iterator<String> pageIter = pages.keys(); while (pageIter.hasNext()) { - pageArray[pageIndex++] = (JSONObject)pages.get(pageIter.next()); + JSONObject page = (JSONObject)pages.get(pageIter.next()); + pageArray[pageIndex++] = page; + if (page.has("index")) { + pageIndices.remove((Integer) page.getInt("index")); + } } + // add an index to any results that didn't have one, in the order that they appear + // in the redirect map. + for (String redirTo : redirectTargetList) { + for (JSONObject page : pageArray) { + if (page.getString("title").equals(redirTo) + && !page.has("index") && pageIndices.size() > 0) { + page.put("index", pageIndices.get(0)); + pageIndices.remove(0); + } + } + } + // now sort the array based on the "index" property Arrays.sort(pageArray, new Comparator<JSONObject>() { @Override -- To view, visit https://gerrit.wikimedia.org/r/199285 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I65e281fa83071a4dbf288ecdd7d3bf5ee39a0aee Gerrit-PatchSet: 1 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: Dbrant <dbr...@wikimedia.org> Gerrit-Reviewer: BearND <bsitzm...@wikimedia.org> Gerrit-Reviewer: Brion VIBBER <br...@wikimedia.org> Gerrit-Reviewer: Deskana <dga...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits