BearND has uploaded a new change for review. https://gerrit.wikimedia.org/r/174365
Change subject: Add SuggestionsTask ...................................................................... Add SuggestionsTask and refactor the getter for wikidataDescriptions Change-Id: I3a05e9d66519a8da4d7b677282fea15b0f96573b --- A wikipedia-it/src/main/java/org/wikipedia/test/SuggestionsTaskTests.java A wikipedia-it/src/main/java/org/wikipedia/test/WikidataDescriptionFeederTests.java A wikipedia/src/main/java/org/wikipedia/page/SuggestionsTask.java M wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java A wikipedia/src/main/java/org/wikipedia/wikidata/WikidataDescriptionFeeder.java 5 files changed, 207 insertions(+), 41 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia refs/changes/65/174365/1 diff --git a/wikipedia-it/src/main/java/org/wikipedia/test/SuggestionsTaskTests.java b/wikipedia-it/src/main/java/org/wikipedia/test/SuggestionsTaskTests.java new file mode 100644 index 0000000..d4ac13b --- /dev/null +++ b/wikipedia-it/src/main/java/org/wikipedia/test/SuggestionsTaskTests.java @@ -0,0 +1,52 @@ +package org.wikipedia.test; + +import org.wikipedia.Site; +import org.wikipedia.WikipediaApp; +import org.wikipedia.page.SuggestionsTask; +import org.wikipedia.search.FullSearchResult; +import android.content.Intent; +import android.test.ActivityUnitTestCase; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +/** + * Tests for getting suggestions for further reading. + */ +public class SuggestionsTaskTests extends ActivityUnitTestCase<TestDummyActivity> { + private static final int TASK_COMPLETION_TIMEOUT = 200000; + private static final int BATCH_SIZE = 3; + private static final Site SITE = new Site("test.wikipedia.org"); + + public SuggestionsTaskTests() { + super(TestDummyActivity.class); + } + + public void testFullTextSearchWithResults() throws Throwable { + startActivity(new Intent(), null, null); + final CountDownLatch completionLatch = new CountDownLatch(1); + runTestOnUiThread(new Runnable() { + @Override + public void run() { + final WikipediaApp app = (WikipediaApp) getInstrumentation().getTargetContext().getApplicationContext(); + new SuggestionsTask(app.getAPIForSite(SITE), SITE, "test") { + @Override + public void onCatch(Throwable caught) { + super.onCatch(caught); + } + + @Override + public void onFinish(FullSearchResults results) { + assertNotNull(results); + assertEquals(results.getResults().size(), BATCH_SIZE); + + for (FullSearchResult result : results.getResults()) { + assertFalse(result.getTitle().getPrefixedText().equals("Test")); + } + completionLatch.countDown(); + } + }.execute(); + } + }); + assertTrue(completionLatch.await(TASK_COMPLETION_TIMEOUT, TimeUnit.MILLISECONDS)); + } +} diff --git a/wikipedia-it/src/main/java/org/wikipedia/test/WikidataDescriptionFeederTests.java b/wikipedia-it/src/main/java/org/wikipedia/test/WikidataDescriptionFeederTests.java new file mode 100644 index 0000000..fdf8033 --- /dev/null +++ b/wikipedia-it/src/main/java/org/wikipedia/test/WikidataDescriptionFeederTests.java @@ -0,0 +1,55 @@ +package org.wikipedia.test; + +import org.wikipedia.Site; +import org.wikipedia.WikipediaApp; +import org.wikipedia.wikidata.WikidataDescriptionsTask; +import org.wikipedia.wikidata.WikidataSite; +import android.content.Intent; +import android.test.ActivityUnitTestCase; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +/** + * Tests retrieval of Wikidata descriptions. Talks to wikidata.org. + */ +public class WikidataDescriptionFeederTests extends ActivityUnitTestCase<TestDummyActivity> { + private static final int TASK_COMPLETION_TIMEOUT = 200000; + private static final Site SITE = new WikidataSite(); + + public WikidataDescriptionFeederTests() { + super(TestDummyActivity.class); + } + + public void testOneID() throws Throwable { + getWikidataDescriptions(new String[] {"Q42"}); + } + + public void testThreeIDs() throws Throwable { + getWikidataDescriptions(new String[] {"Q1", "Q2", "Q3"}); + } + + public void getWikidataDescriptions(final String[] ids) throws Throwable { + final ArrayList<String> idList = new ArrayList<String>(Arrays.asList(ids)); + startActivity(new Intent(), null, null); + final CountDownLatch completionLatch = new CountDownLatch(1); + runTestOnUiThread(new Runnable() { + @Override + public void run() { + final WikipediaApp app = (WikipediaApp) getInstrumentation().getTargetContext().getApplicationContext(); + new WikidataDescriptionsTask(app.getAPIForSite(SITE), "de", idList) { + @Override + public void onFinish(Map<String, String> descriptionsMap) { + assertNotNull(descriptionsMap); + assertEquals(descriptionsMap.size(), idList.size()); + completionLatch.countDown(); + } + }.execute(); + } + }); + assertTrue(completionLatch.await(TASK_COMPLETION_TIMEOUT, TimeUnit.MILLISECONDS)); + } +} + diff --git a/wikipedia/src/main/java/org/wikipedia/page/SuggestionsTask.java b/wikipedia/src/main/java/org/wikipedia/page/SuggestionsTask.java new file mode 100644 index 0000000..cc41a87 --- /dev/null +++ b/wikipedia/src/main/java/org/wikipedia/page/SuggestionsTask.java @@ -0,0 +1,40 @@ +package org.wikipedia.page; + +import org.wikipedia.Site; +import org.wikipedia.search.FullSearchArticlesTask; +import org.wikipedia.search.FullSearchResult; +import org.mediawiki.api.json.Api; +import org.mediawiki.api.json.ApiResult; +import java.util.ArrayList; +import java.util.List; + +/** + * Task for getting suggestions for further reading. + * Take page title, run full text search with that query, get four results, + * show top three that aren't the actual page title in question. + */ +public class SuggestionsTask extends FullSearchArticlesTask { + private static final int MAX_SIZE = 3; + private static final int MAX_REQUESTED = MAX_SIZE + 1; + private final String title; + + public SuggestionsTask(Api api, Site site, String title) { + super(api, site, title, MAX_REQUESTED, null); + this.title = title; + } + + @Override + public FullSearchResults processResult(final ApiResult result) throws Throwable { + FullSearchResults searchResults = super.processResult(result); + List<FullSearchResult> filteredResults = new ArrayList<FullSearchResult>(); + List<FullSearchResult> results = searchResults.getResults(); + for (int i = 0, count = 0; i < MAX_REQUESTED && count < MAX_SIZE; i++) { + final FullSearchResult res = results.get(i); + if (!title.equalsIgnoreCase(res.getTitle().getPrefixedText())) { + filteredResults.add(res); + count++; + } + } + return new FullSearchResults(filteredResults, null, null); + } +} \ No newline at end of file diff --git a/wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java b/wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java index 02bb125..6646538 100644 --- a/wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java +++ b/wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java @@ -4,8 +4,7 @@ import org.wikipedia.R; import org.wikipedia.WikipediaApp; import org.wikipedia.page.PageActivity; -import org.wikipedia.wikidata.WikidataDescriptionsTask; -import org.wikipedia.wikidata.WikidataSite; +import org.wikipedia.wikidata.WikidataDescriptionFeeder; import com.squareup.picasso.Picasso; import android.os.Bundle; import android.os.Handler; @@ -24,7 +23,6 @@ import android.widget.Toast; import java.util.ArrayList; import java.util.List; -import java.util.Map; public class FullSearchFragment extends Fragment { private static final int BATCH_SIZE = 12; @@ -186,7 +184,7 @@ searchResultsList.setVisibility(View.GONE); } else { searchResultsList.setVisibility(View.VISIBLE); - getWikidataDescriptions(lastResults.getResults()); + WikidataDescriptionFeeder.getWikidataDescriptions(lastResults.getResults(), app, (BaseAdapter) searchResultsList.getAdapter()); } if (continueOffset == null) { @@ -230,43 +228,6 @@ } } }).execute(); - } - - private void getWikidataDescriptions(List<FullSearchResult> results) { - List<String> idList = new ArrayList<String>(); - for (FullSearchResult r : results) { - if (!TextUtils.isEmpty(r.getWikiBaseId()) - && app.getWikidataCache().get(r.getWikiBaseId()) == null) { - // not in our cache yet - idList.add(r.getWikiBaseId()); - } - } - if (idList.isEmpty()) { - return; - } - - WikidataDescriptionsTask descriptionTask = new WikidataDescriptionsTask( - app.getAPIForSite(new WikidataSite()), - app.getPrimaryLanguage(), - idList) { - @Override - public void onFinish(Map<String, String> result) { - for (Map.Entry<String, String> entry : result.entrySet()) { - if (entry.getValue() == null) { - continue; - } - app.getWikidataCache().put(entry.getKey(), entry.getValue()); - } - ((BaseAdapter) searchResultsList.getAdapter()).notifyDataSetChanged(); - } - - @Override - public void onCatch(Throwable caught) { - // Don't actually do anything. - // Descriptions are expendable - } - }; - descriptionTask.execute(); } private final class SearchResultAdapter extends BaseAdapter { diff --git a/wikipedia/src/main/java/org/wikipedia/wikidata/WikidataDescriptionFeeder.java b/wikipedia/src/main/java/org/wikipedia/wikidata/WikidataDescriptionFeeder.java new file mode 100644 index 0000000..a6342b0 --- /dev/null +++ b/wikipedia/src/main/java/org/wikipedia/wikidata/WikidataDescriptionFeeder.java @@ -0,0 +1,58 @@ +package org.wikipedia.wikidata; + +import org.wikipedia.WikipediaApp; +import org.wikipedia.search.FullSearchResult; +import android.text.TextUtils; +import android.widget.BaseAdapter; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Utility to add more entries to our shared WikidataCache. + */ +public class WikidataDescriptionFeeder { + // do not instantiate! + private WikidataDescriptionFeeder() { + } + + /** + * Adds new description entries to our shared WikidataCache. + */ + public static void getWikidataDescriptions(List<FullSearchResult> results, final WikipediaApp app, final BaseAdapter adapter) { + List<String> idList = new ArrayList<String>(); + final WikidataCache cache = app.getWikidataCache(); + for (FullSearchResult r : results) { + if (!TextUtils.isEmpty(r.getWikiBaseId()) && cache.get(r.getWikiBaseId()) == null) { + // not in our cache yet + idList.add(r.getWikiBaseId()); + } + } + if (idList.isEmpty()) { + return; + } + + WikidataDescriptionsTask descriptionTask = new WikidataDescriptionsTask( + app.getAPIForSite(new WikidataSite()), + app.getPrimaryLanguage(), + idList) { + @Override + public void onFinish(Map<String, String> result) { + for (Map.Entry<String, String> entry : result.entrySet()) { + if (entry.getValue() == null) { + continue; + } + cache.put(entry.getKey(), entry.getValue()); + } + adapter.notifyDataSetChanged(); + } + + @Override + public void onCatch(Throwable caught) { + // Don't actually do anything. + // Descriptions are expendable + } + }; + descriptionTask.execute(); + } +} -- To view, visit https://gerrit.wikimedia.org/r/174365 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I3a05e9d66519a8da4d7b677282fea15b0f96573b 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