Move static search ranking from DatabaseResultLoader to Search Adapter.
This will avoid unnecessary static ranking if smart ranking is used. Since loader does not need to provided sorted collection of results, the loading data type has changed from List<> to Set<>. This will also faster lookup in the Adapter. Fixes: 38447799 Test: make RunSettingsRoboTests Change-Id: I448b29bd4e8700c8ec4b5766cbeab4b3087ae39a
This commit is contained in:
@@ -45,7 +45,10 @@ import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Matchers.anyString;
|
||||
@@ -224,17 +227,19 @@ public class DatabaseResultLoaderTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSpecialCaseTwoWords_firstWordMatches_ranksHigher() {
|
||||
public void testSpecialCaseTwoWords_multipleResults() {
|
||||
final String caseOne = "Apple pear";
|
||||
final String caseTwo = "Banana apple";
|
||||
insertSpecialCase(caseOne);
|
||||
insertSpecialCase(caseTwo);
|
||||
DatabaseResultLoader loader = new DatabaseResultLoader(mContext, "App", null);
|
||||
List<? extends SearchResult> results = loader.loadInBackground();
|
||||
|
||||
assertThat(results.get(0).title).isEqualTo(caseOne);
|
||||
assertThat(results.get(1).title).isEqualTo(caseTwo);
|
||||
assertThat(results.get(0).rank).isLessThan(results.get(1).rank);
|
||||
Set<? extends SearchResult> results = loader.loadInBackground();
|
||||
Set<CharSequence> expectedTitles = new HashSet<>(Arrays.asList(caseOne, caseTwo));
|
||||
Set<CharSequence> actualTitles = new HashSet<>();
|
||||
for (SearchResult result : results) {
|
||||
actualTitles.add(result.title);
|
||||
}
|
||||
assertThat(actualTitles).isEqualTo(expectedTitles);
|
||||
}
|
||||
|
||||
private void insertSpecialCase(String specialCase) {
|
||||
|
@@ -43,7 +43,9 @@ import org.robolectric.annotation.Config;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import static android.content.pm.ApplicationInfo.FLAG_SYSTEM;
|
||||
import static android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
|
||||
@@ -185,18 +187,19 @@ public class InstalledAppResultLoaderTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void query_matchingQuery_shouldRankBasedOnSimilarity() {
|
||||
public void query_matchingQuery_multipleResults() {
|
||||
final String query = "app";
|
||||
|
||||
mLoader = new InstalledAppResultLoader(mContext, mPackageManagerWrapper, query,
|
||||
mSiteMapManager);
|
||||
final List<? extends SearchResult> results = mLoader.loadInBackground();
|
||||
final Set<? extends SearchResult> results = mLoader.loadInBackground();
|
||||
|
||||
// List is sorted by rank
|
||||
assertThat(results.get(0).rank).isAtMost(results.get(1).rank);
|
||||
assertThat(results.get(0).title).isEqualTo("app4");
|
||||
assertThat(results.get(1).title).isEqualTo("app");
|
||||
assertThat(results.get(2).title).isEqualTo("appBuffer");
|
||||
Set<CharSequence> expectedTitles = new HashSet<>(Arrays.asList("app4", "app", "appBuffer"));
|
||||
Set<CharSequence> actualTitles = new HashSet<>();
|
||||
for (SearchResult result : results) {
|
||||
actualTitles.add(result.title);
|
||||
}
|
||||
assertThat(actualTitles).isEqualTo(expectedTitles);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@@ -21,8 +21,8 @@ import android.content.Context;
|
||||
import com.android.settings.search.InstalledAppResultLoader;
|
||||
import com.android.settings.search.SearchResult;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Mock loader to subvert the requirements of returning data while also driving the Loader
|
||||
@@ -35,12 +35,12 @@ class MockAppLoader extends InstalledAppResultLoader {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<? extends SearchResult> loadInBackground() {
|
||||
return new ArrayList<>();
|
||||
public Set<? extends SearchResult> loadInBackground() {
|
||||
return new HashSet<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDiscardResult(List<? extends SearchResult> result) {
|
||||
protected void onDiscardResult(Set<? extends SearchResult> result) {
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -21,8 +21,8 @@ import android.content.Context;
|
||||
import com.android.settings.search.DatabaseResultLoader;
|
||||
import com.android.settings.search.SearchResult;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Mock loader to subvert the requirements of returning data while also driving the Loader
|
||||
@@ -35,12 +35,12 @@ class MockDBLoader extends DatabaseResultLoader {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<? extends SearchResult> loadInBackground() {
|
||||
return new ArrayList<>();
|
||||
public Set<? extends SearchResult> loadInBackground() {
|
||||
return new HashSet<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDiscardResult(List<? extends SearchResult> result) {
|
||||
protected void onDiscardResult(Set<? extends SearchResult> result) {
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -41,7 +41,7 @@ import org.robolectric.annotation.Config;
|
||||
import org.robolectric.util.ActivityController;
|
||||
import org.robolectric.util.ReflectionHelpers;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Matchers.any;
|
||||
@@ -249,7 +249,7 @@ public class SearchFragmentTest {
|
||||
|
||||
Robolectric.flushForegroundThreadScheduler();
|
||||
|
||||
verify(fragment, times(2)).onLoadFinished(any(Loader.class), any(List.class));
|
||||
verify(fragment, times(2)).onLoadFinished(any(Loader.class), any(Set.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@@ -46,8 +46,10 @@ import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
@@ -85,7 +87,7 @@ public class SearchResultsAdapterTest {
|
||||
|
||||
@Test
|
||||
public void testSingleSourceMerge_exactCopyReturned() {
|
||||
ArrayList<SearchResult> intentResults = getIntentSampleResults();
|
||||
Set<SearchResult> intentResults = getIntentSampleResults();
|
||||
mAdapter.addSearchResults(intentResults, mLoaderClassName);
|
||||
mAdapter.displaySearchResults("");
|
||||
|
||||
@@ -111,8 +113,10 @@ public class SearchResultsAdapterTest {
|
||||
|
||||
@Test
|
||||
public void testEndToEndSearch_properResultsMerged_correctOrder() {
|
||||
mAdapter.addSearchResults(getDummyAppResults(), InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(getDummyDbResults(), DatabaseResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(new HashSet<SearchResult>(getDummyAppResults()),
|
||||
InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(new HashSet<SearchResult>(getDummyDbResults()),
|
||||
DatabaseResultLoader.class.getName());
|
||||
int count = mAdapter.displaySearchResults("");
|
||||
|
||||
List<SearchResult> results = mAdapter.getSearchResults();
|
||||
@@ -130,13 +134,16 @@ public class SearchResultsAdapterTest {
|
||||
List<AppSearchResult> appResults = getDummyAppResults();
|
||||
List<SearchResult> dbResults = getDummyDbResults();
|
||||
// Add two individual items
|
||||
mAdapter.addSearchResults(appResults.subList(0,1),
|
||||
mAdapter.addSearchResults(new HashSet<SearchResult>(appResults.subList(0, 1)),
|
||||
InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(dbResults.subList(0,1), DatabaseResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(new HashSet<SearchResult>(dbResults.subList(0, 1)),
|
||||
DatabaseResultLoader.class.getName());
|
||||
mAdapter.displaySearchResults("");
|
||||
// Add super-set of items
|
||||
mAdapter.addSearchResults(appResults, InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(dbResults, DatabaseResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<SearchResult>(appResults), InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<SearchResult>(dbResults), DatabaseResultLoader.class.getName());
|
||||
int count = mAdapter.displaySearchResults("");
|
||||
|
||||
List<SearchResult> results = mAdapter.getSearchResults();
|
||||
@@ -170,13 +177,16 @@ public class SearchResultsAdapterTest {
|
||||
List<AppSearchResult> appResults = getDummyAppResults();
|
||||
List<SearchResult> dbResults = getDummyDbResults();
|
||||
// Add list of items
|
||||
mAdapter.addSearchResults(appResults, InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(dbResults, DatabaseResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(new HashSet<SearchResult>(appResults),
|
||||
InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(new HashSet<SearchResult>(dbResults),
|
||||
DatabaseResultLoader.class.getName());
|
||||
mAdapter.displaySearchResults("");
|
||||
// Add subset of items
|
||||
mAdapter.addSearchResults(appResults.subList(0,1),
|
||||
mAdapter.addSearchResults(new HashSet<SearchResult>(appResults.subList(0, 1)),
|
||||
InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(dbResults.subList(0,1), DatabaseResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(new HashSet<>(dbResults.subList(0, 1)),
|
||||
DatabaseResultLoader.class.getName());
|
||||
int count = mAdapter.displaySearchResults("");
|
||||
|
||||
List<SearchResult> results = mAdapter.getSearchResults();
|
||||
@@ -231,8 +241,8 @@ public class SearchResultsAdapterTest {
|
||||
return results;
|
||||
}
|
||||
|
||||
private ArrayList<SearchResult> getIntentSampleResults() {
|
||||
ArrayList<SearchResult> sampleResults = new ArrayList<>();
|
||||
private Set<SearchResult> getIntentSampleResults() {
|
||||
Set<SearchResult> sampleResults = new HashSet<>();
|
||||
ArrayList<String> breadcrumbs = new ArrayList<>();
|
||||
final Drawable icon = mContext.getDrawable(R.drawable.ic_search_history);
|
||||
final ResultPayload payload = new ResultPayload(null);
|
||||
|
Reference in New Issue
Block a user