summaryrefslogtreecommitdiffstats
path: root/gerrit-gwtui/src/main/java/com/google/gerrit/client/SearchSuggestOracle.java
diff options
context:
space:
mode:
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.java141
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;
+ }
+ });
+ }
+ }
}