Filter search results in background thread
This commit is contained in:
parent
fd4d24099f
commit
2ebca53e25
3 changed files with 63 additions and 20 deletions
|
@ -42,6 +42,7 @@ public class SearchUICore {
|
||||||
|
|
||||||
private static final int TIMEOUT_BETWEEN_CHARS = 700;
|
private static final int TIMEOUT_BETWEEN_CHARS = 700;
|
||||||
private static final int TIMEOUT_BEFORE_SEARCH = 50;
|
private static final int TIMEOUT_BEFORE_SEARCH = 50;
|
||||||
|
private static final int TIMEOUT_BEFORE_FILTER = 20;
|
||||||
private static final Log LOG = PlatformUtil.getLog(SearchUICore.class);
|
private static final Log LOG = PlatformUtil.getLog(SearchUICore.class);
|
||||||
private SearchPhrase phrase;
|
private SearchPhrase phrase;
|
||||||
private SearchResultCollection currentSearchResult;
|
private SearchResultCollection currentSearchResult;
|
||||||
|
@ -364,14 +365,19 @@ public class SearchUICore {
|
||||||
searchSettings = settings;
|
searchSettings = settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<SearchResult> filterCurrentResults(List<SearchResult> rr, SearchPhrase phrase) {
|
private void filterCurrentResults(SearchPhrase phrase, ResultMatcher<SearchResult> matcher) {
|
||||||
|
if (matcher == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
List<SearchResult> l = currentSearchResult.searchResults;
|
List<SearchResult> l = currentSearchResult.searchResults;
|
||||||
for (SearchResult r : l) {
|
for (SearchResult r : l) {
|
||||||
if (filterOneResult(r, phrase)) {
|
if (filterOneResult(r, phrase)) {
|
||||||
rr.add(r);
|
matcher.publish(r);
|
||||||
|
}
|
||||||
|
if (matcher.isCancelled()) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return rr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean filterOneResult(SearchResult object, SearchPhrase phrase) {
|
private boolean filterOneResult(SearchResult object, SearchPhrase phrase) {
|
||||||
|
@ -401,14 +407,6 @@ public class SearchUICore {
|
||||||
if (debugMode) {
|
if (debugMode) {
|
||||||
LOG.info("Prepare search <" + phrase + ">");
|
LOG.info("Prepare search <" + phrase + ">");
|
||||||
}
|
}
|
||||||
SearchResultCollection quickRes = new SearchResultCollection(phrase);
|
|
||||||
if (debugMode) {
|
|
||||||
LOG.info("Filtering current data <" + phrase + "> Results=" + currentSearchResult.searchResults.size());
|
|
||||||
}
|
|
||||||
filterCurrentResults(quickRes.searchResults, phrase);
|
|
||||||
if (debugMode) {
|
|
||||||
LOG.info("Current data filtered <" + phrase + "> Results=" + quickRes.searchResults.size());
|
|
||||||
}
|
|
||||||
singleThreadedExecutor.submit(new Runnable() {
|
singleThreadedExecutor.submit(new Runnable() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -417,7 +415,7 @@ public class SearchUICore {
|
||||||
if (onSearchStart != null) {
|
if (onSearchStart != null) {
|
||||||
onSearchStart.run();
|
onSearchStart.run();
|
||||||
}
|
}
|
||||||
SearchResultMatcher rm = new SearchResultMatcher(matcher, phrase, request, requestNumber, totalLimit);
|
final SearchResultMatcher rm = new SearchResultMatcher(matcher, phrase, request, requestNumber, totalLimit);
|
||||||
if (debugMode) {
|
if (debugMode) {
|
||||||
LOG.info("Starting search <" + phrase.toString() + ">");
|
LOG.info("Starting search <" + phrase.toString() + ">");
|
||||||
}
|
}
|
||||||
|
@ -425,11 +423,13 @@ public class SearchUICore {
|
||||||
if (debugMode) {
|
if (debugMode) {
|
||||||
LOG.info("Search started <" + phrase.toString() + ">");
|
LOG.info("Search started <" + phrase.toString() + ">");
|
||||||
}
|
}
|
||||||
if (TIMEOUT_BETWEEN_CHARS > 0 && delayedExecution) {
|
if (delayedExecution) {
|
||||||
long startTime = System.currentTimeMillis();
|
long startTime = System.currentTimeMillis();
|
||||||
if (debugMode) {
|
if (debugMode) {
|
||||||
LOG.info("Wait for next char <" + phrase.toString() + ">");
|
LOG.info("Wait for next char <" + phrase.toString() + ">");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean filtered = false;
|
||||||
while (System.currentTimeMillis() - startTime <= TIMEOUT_BETWEEN_CHARS) {
|
while (System.currentTimeMillis() - startTime <= TIMEOUT_BETWEEN_CHARS) {
|
||||||
if (rm.isCancelled()) {
|
if (rm.isCancelled()) {
|
||||||
if (debugMode) {
|
if (debugMode) {
|
||||||
|
@ -437,9 +437,36 @@ public class SearchUICore {
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Thread.sleep(TIMEOUT_BEFORE_SEARCH);
|
Thread.sleep(TIMEOUT_BEFORE_FILTER);
|
||||||
|
|
||||||
|
if (!filtered) {
|
||||||
|
final SearchResultCollection quickRes = new SearchResultCollection(phrase);
|
||||||
|
if (debugMode) {
|
||||||
|
LOG.info("Filtering current data <" + phrase + "> Results=" + currentSearchResult.searchResults.size());
|
||||||
|
}
|
||||||
|
filterCurrentResults(phrase, new ResultMatcher<SearchResult>() {
|
||||||
|
@Override
|
||||||
|
public boolean publish(SearchResult object) {
|
||||||
|
quickRes.searchResults.add(object);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCancelled() {
|
||||||
|
return rm.isCancelled();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (debugMode) {
|
||||||
|
LOG.info("Current data filtered <" + phrase + "> Results=" + quickRes.searchResults.size());
|
||||||
|
}
|
||||||
|
if (!rm.isCancelled()) {
|
||||||
|
currentSearchResult = quickRes;
|
||||||
|
rm.filterFinished(phrase);
|
||||||
|
}
|
||||||
|
filtered = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (TIMEOUT_BEFORE_SEARCH > 0) {
|
} else {
|
||||||
Thread.sleep(TIMEOUT_BEFORE_SEARCH);
|
Thread.sleep(TIMEOUT_BEFORE_SEARCH);
|
||||||
}
|
}
|
||||||
if (rm.isCancelled()) {
|
if (rm.isCancelled()) {
|
||||||
|
@ -477,7 +504,7 @@ public class SearchUICore {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return quickRes;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -598,6 +625,14 @@ public class SearchUICore {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void filterFinished(SearchPhrase phrase) {
|
||||||
|
if (matcher != null) {
|
||||||
|
SearchResult sr = new SearchResult(phrase);
|
||||||
|
sr.objectType = ObjectType.FILTER_FINISHED;
|
||||||
|
matcher.publish(sr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void searchFinished(SearchPhrase phrase) {
|
public void searchFinished(SearchPhrase phrase) {
|
||||||
if (matcher != null) {
|
if (matcher != null) {
|
||||||
SearchResult sr = new SearchResult(phrase);
|
SearchResult sr = new SearchResult(phrase);
|
||||||
|
|
|
@ -16,6 +16,7 @@ public enum ObjectType {
|
||||||
REGION(true),
|
REGION(true),
|
||||||
|
|
||||||
SEARCH_STARTED(false),
|
SEARCH_STARTED(false),
|
||||||
|
FILTER_FINISHED(false),
|
||||||
SEARCH_FINISHED(false),
|
SEARCH_FINISHED(false),
|
||||||
SEARCH_API_FINISHED(false),
|
SEARCH_API_FINISHED(false),
|
||||||
SEARCH_API_REGION_FINISHED(false),
|
SEARCH_API_REGION_FINISHED(false),
|
||||||
|
|
|
@ -1530,7 +1530,7 @@ public class QuickSearchDialogFragment extends DialogFragment implements OsmAndC
|
||||||
|
|
||||||
private void runCoreSearchInternal(String text, boolean showQuickResult, boolean searchMore,
|
private void runCoreSearchInternal(String text, boolean showQuickResult, boolean searchMore,
|
||||||
final SearchResultListener resultListener) {
|
final SearchResultListener resultListener) {
|
||||||
SearchResultCollection c = searchUICore.search(text, showQuickResult, new ResultMatcher<SearchResult>() {
|
searchUICore.search(text, showQuickResult, new ResultMatcher<SearchResult>() {
|
||||||
SearchResultCollection regionResultCollection = null;
|
SearchResultCollection regionResultCollection = null;
|
||||||
SearchCoreAPI regionResultApi = null;
|
SearchCoreAPI regionResultApi = null;
|
||||||
List<SearchResult> results = new ArrayList<>();
|
List<SearchResult> results = new ArrayList<>();
|
||||||
|
@ -1580,6 +1580,16 @@ public class QuickSearchDialogFragment extends DialogFragment implements OsmAndC
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
case FILTER_FINISHED:
|
||||||
|
if (resultListener != null) {
|
||||||
|
app.runInUIThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
resultListener.publish(searchUICore.getCurrentSearchResult(), false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
break;
|
||||||
case SEARCH_API_FINISHED:
|
case SEARCH_API_FINISHED:
|
||||||
final SearchCoreAPI searchApi = (SearchCoreAPI) object.object;
|
final SearchCoreAPI searchApi = (SearchCoreAPI) object.object;
|
||||||
final List<SearchResult> apiResults;
|
final List<SearchResult> apiResults;
|
||||||
|
@ -1627,9 +1637,6 @@ public class QuickSearchDialogFragment extends DialogFragment implements OsmAndC
|
||||||
updateSearchResult(null, false);
|
updateSearchResult(null, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (showQuickResult) {
|
|
||||||
updateSearchResult(c, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showLocationToolbar() {
|
private void showLocationToolbar() {
|
||||||
|
|
Loading…
Reference in a new issue