diff options
Diffstat (limited to 'gerrit-gwtui/src/main/java/com/google/gerrit/client/SearchSuggestOracle.java')
-rw-r--r-- | gerrit-gwtui/src/main/java/com/google/gerrit/client/SearchSuggestOracle.java | 141 |
1 files changed, 133 insertions, 8 deletions
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/SearchSuggestOracle.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/SearchSuggestOracle.java index 172a2af901..dd4de33f34 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/SearchSuggestOracle.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/SearchSuggestOracle.java @@ -14,13 +14,54 @@ package com.google.gerrit.client; +import com.google.gerrit.client.ui.AccountGroupSuggestOracle; +import com.google.gerrit.client.ui.AccountSuggestOracle; +import com.google.gerrit.client.ui.ProjectNameSuggestOracle; import com.google.gwt.user.client.ui.SuggestOracle; import com.google.gwtexpui.safehtml.client.HighlightSuggestOracle; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; import java.util.TreeSet; public class SearchSuggestOracle extends HighlightSuggestOracle { + private static final List<ParamSuggester> paramSuggester = Arrays.asList( + new ParamSuggester("project:", new ProjectNameSuggestOracle()), + new ParamSuggester(Arrays.asList("owner:", "reviewer:"), + new AccountSuggestOracle() { + @Override + public void onRequestSuggestions(final Request request, final Callback done) { + super.onRequestSuggestions(request, new Callback() { + @Override + public void onSuggestionsReady(final Request request, + final Response response) { + if ("self".startsWith(request.getQuery())) { + final ArrayList<SuggestOracle.Suggestion> r = + new ArrayList<SuggestOracle.Suggestion>(response + .getSuggestions().size() + 1); + r.addAll(response.getSuggestions()); + r.add(new SuggestOracle.Suggestion() { + @Override + public String getDisplayString() { + return getReplacementString(); + } + @Override + public String getReplacementString() { + return "self"; + } + }); + response.setSuggestions(r); + } + done.onSuggestionsReady(request, response); + } + }); + } + }), + new ParamSuggester(Arrays.asList("ownerin:", "reviewerin:"), + new AccountGroupSuggestOracle())); + private static final TreeSet<String> suggestions = new TreeSet<String>(); static { @@ -93,17 +134,19 @@ public class SearchSuggestOracle extends HighlightSuggestOracle { @Override protected void onRequestSuggestions(Request request, Callback done) { final String query = request.getQuery(); - int lastSpace = query.lastIndexOf(' '); - final String lastWord; - // NOTE: this method is not called if the query is empty. - if (lastSpace == query.length() - 1) { + + final String lastWord = getLastWord(query); + if (lastWord == null) { // Starting a new word - don't show suggestions yet. done.onSuggestionsReady(request, null); return; - } else if (lastSpace == -1) { - lastWord = query; - } else { - lastWord = query.substring(lastSpace + 1); + } + + for (final ParamSuggester ps : paramSuggester) { + if (ps.applicable(lastWord)) { + ps.suggest(lastWord, request, done); + return; + } } final ArrayList<SearchSuggestion> r = new ArrayList<SearchSuggestOracle.SearchSuggestion>(); @@ -118,6 +161,27 @@ public class SearchSuggestOracle extends HighlightSuggestOracle { done.onSuggestionsReady(request, new Response(r)); } + private String getLastWord(final String query) { + final int lastSpace = query.lastIndexOf(' '); + if (lastSpace == query.length() - 1) { + return null; + } + if (lastSpace == -1) { + return query; + } + return query.substring(lastSpace + 1); + } + + @Override + protected String getQueryPattern(final String query) { + return super.getQueryPattern(getLastWord(query)); + } + + @Override + protected boolean isHTML() { + return true; + } + private static class SearchSuggestion implements SuggestOracle.Suggestion { private final String suggestion; private final String fullQuery; @@ -137,4 +201,65 @@ public class SearchSuggestOracle extends HighlightSuggestOracle { return fullQuery; } } + + private static class ParamSuggester { + private final List<String> operators; + private final SuggestOracle parameterSuggestionOracle; + + ParamSuggester(final String operator, + final SuggestOracle parameterSuggestionOracle) { + this(Collections.singletonList(operator), parameterSuggestionOracle); + } + + ParamSuggester(final List<String> operators, + final SuggestOracle parameterSuggestionOracle) { + this.operators = operators; + this.parameterSuggestionOracle = parameterSuggestionOracle; + } + + boolean applicable(final String query) { + final String operator = getApplicableOperator(query, operators); + return operator != null && query.length() > operator.length(); + } + + private String getApplicableOperator(final String lastWord, + final List<String> operators) { + for (final String operator : operators) { + if (lastWord.startsWith(operator)) { + return operator; + } + } + return null; + } + + void suggest(final String lastWord, final Request request, final Callback done) { + final String operator = getApplicableOperator(lastWord, operators); + parameterSuggestionOracle.requestSuggestions( + new Request(lastWord.substring(operator.length()), request.getLimit()), + new Callback() { + @Override + public void onSuggestionsReady(final Request req, + final Response response) { + final String query = request.getQuery(); + final List<SearchSuggestOracle.Suggestion> r = + new ArrayList<SuggestOracle.Suggestion>(response + .getSuggestions().size()); + for (final SearchSuggestOracle.Suggestion s : response + .getSuggestions()) { + r.add(new SearchSuggestion(s.getDisplayString(), + query.substring(0, query.length() - lastWord.length()) + + operator + quoteIfNeeded(s.getReplacementString()))); + } + done.onSuggestionsReady(request, new Response(r)); + } + + private String quoteIfNeeded(final String s) { + if (!s.matches("^\\S*$")) { + return "\"" + s + "\""; + } + return s; + } + }); + } + } } |