diff --git a/Documentation/user-search.txt b/Documentation/user-search.txt index 7c4ca52f46..37040eae2c 100644 --- a/Documentation/user-search.txt +++ b/Documentation/user-search.txt @@ -110,6 +110,12 @@ matches project names by regular expression. The link:http://www.brics.dk/automaton/[dk.brics.automaton library] is used for evaluation of such patterns. +[[parentproject]] +parentproject:'PROJECT':: ++ +Changes occurring in 'PROJECT' or in one of the child projects of +'PROJECT'. + [[branch]] branch:'BRANCH':: + 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 da9f1c6389..aae506deac 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 @@ -22,13 +22,13 @@ 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 = Arrays.asList( - new ParamSuggester("project:", new ProjectNameSuggestOracle()), + new ParamSuggester(Arrays.asList("project:", "parentproject:"), + new ProjectNameSuggestOracle()), new ParamSuggester(Arrays.asList("owner:", "reviewer:"), new AccountSuggestOracle() { @Override @@ -81,6 +81,7 @@ public class SearchSuggestOracle extends HighlightSuggestOracle { suggestions.add("commit:"); suggestions.add("comment:"); suggestions.add("project:"); + suggestions.add("parentproject:"); suggestions.add("branch:"); suggestions.add("topic:"); suggestions.add("ref:"); @@ -207,11 +208,6 @@ public class SearchSuggestOracle extends HighlightSuggestOracle { private final List operators; private final SuggestOracle parameterSuggestionOracle; - ParamSuggester(final String operator, - final SuggestOracle parameterSuggestionOracle) { - this(Collections.singletonList(operator), parameterSuggestionOracle); - } - ParamSuggester(final List operators, final SuggestOracle parameterSuggestionOracle) { this.operators = operators; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListChildProjects.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListChildProjects.java index d4b84dd087..58abe40082 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListChildProjects.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListChildProjects.java @@ -47,6 +47,10 @@ public class ListChildProjects implements RestReadView { this.projectNodeFactory = projectNodeFactory; } + public void setRecursive(boolean recursive) { + this.recursive = recursive; + } + @Override public List apply(ProjectResource rsrc) { if (recursive) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/BasicChangeRewrites.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/BasicChangeRewrites.java index f81b0ca82f..dd96d50004 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/BasicChangeRewrites.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/BasicChangeRewrites.java @@ -33,8 +33,8 @@ public abstract class BasicChangeRewrites extends QueryRewriter { new ChangeQueryBuilder.Arguments( // new InvalidProvider(), // new InvalidProvider(), // - null, null, null, null, null, // - null, null, null, null, null), null); + null, null, null, null, null, null, // + null, null, null, null, null, null), null); static Schema schema(@Nullable IndexCollection indexes) { ChangeIndex index = indexes != null ? indexes.getSearchIndex() : null; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java index 9fc3dbf030..0efdc88cb4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java @@ -37,6 +37,7 @@ import com.google.gerrit.server.index.IndexCollection; import com.google.gerrit.server.index.Schema; import com.google.gerrit.server.patch.PatchListCache; import com.google.gerrit.server.project.ChangeControl; +import com.google.gerrit.server.project.ListChildProjects; import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.query.IntPredicate; import com.google.gerrit.server.query.Predicate; @@ -93,6 +94,7 @@ public class ChangeQueryBuilder extends QueryBuilder { public static final String FIELD_MESSAGE = "message"; public static final String FIELD_OWNER = "owner"; public static final String FIELD_OWNERIN = "ownerin"; + public static final String FIELD_PARENTPROJECT = "parentproject"; public static final String FIELD_PROJECT = "project"; public static final String FIELD_REF = "ref"; public static final String FIELD_REVIEWER = "reviewer"; @@ -139,6 +141,7 @@ public class ChangeQueryBuilder extends QueryBuilder { final Provider dbProvider; final Provider rewriter; final IdentifiedUser.GenericFactory userFactory; + final Provider self; final CapabilityControl.Factory capabilityControlFactory; final ChangeControl.GenericFactory changeControlGenericFactory; final AccountResolver accountResolver; @@ -147,6 +150,7 @@ public class ChangeQueryBuilder extends QueryBuilder { final PatchListCache patchListCache; final GitRepositoryManager repoManager; final ProjectCache projectCache; + final Provider listChildProjects; final IndexCollection indexes; @Inject @@ -154,6 +158,7 @@ public class ChangeQueryBuilder extends QueryBuilder { public Arguments(Provider dbProvider, Provider rewriter, IdentifiedUser.GenericFactory userFactory, + Provider self, CapabilityControl.Factory capabilityControlFactory, ChangeControl.GenericFactory changeControlGenericFactory, AccountResolver accountResolver, @@ -162,10 +167,12 @@ public class ChangeQueryBuilder extends QueryBuilder { PatchListCache patchListCache, GitRepositoryManager repoManager, ProjectCache projectCache, + Provider listChildProjects, IndexCollection indexes) { this.dbProvider = dbProvider; this.rewriter = rewriter; this.userFactory = userFactory; + this.self = self; this.capabilityControlFactory = capabilityControlFactory; this.changeControlGenericFactory = changeControlGenericFactory; this.accountResolver = accountResolver; @@ -174,6 +181,7 @@ public class ChangeQueryBuilder extends QueryBuilder { this.patchListCache = patchListCache; this.repoManager = repoManager; this.projectCache = projectCache; + this.listChildProjects = listChildProjects; this.indexes = indexes; } } @@ -314,6 +322,12 @@ public class ChangeQueryBuilder extends QueryBuilder { return new ProjectPredicate(args.dbProvider, name); } + @Operator + public Predicate parentproject(String name) { + return new ParentProjectPredicate(args.dbProvider, args.projectCache, + args.listChildProjects, args.self, name); + } + @Operator public Predicate branch(String name) { if (name.startsWith("^")) diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ParentProjectPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ParentProjectPredicate.java new file mode 100644 index 0000000000..2f63f5ee2d --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ParentProjectPredicate.java @@ -0,0 +1,67 @@ +// Copyright (C) 2013 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.server.query.change; + +import com.google.common.collect.Lists; +import com.google.gerrit.reviewdb.client.Project; +import com.google.gerrit.reviewdb.server.ReviewDb; +import com.google.gerrit.server.CurrentUser; +import com.google.gerrit.server.project.ListChildProjects; +import com.google.gerrit.server.project.ProjectCache; +import com.google.gerrit.server.project.ProjectJson.ProjectInfo; +import com.google.gerrit.server.project.ProjectResource; +import com.google.gerrit.server.project.ProjectState; +import com.google.gerrit.server.query.OrPredicate; +import com.google.gerrit.server.query.Predicate; +import com.google.inject.Provider; + +import java.util.Collections; +import java.util.List; + +class ParentProjectPredicate extends OrPredicate { + private final String value; + + ParentProjectPredicate(Provider dbProvider, + ProjectCache projectCache, Provider listChildProjects, + Provider self, String value) { + super(predicates(dbProvider, projectCache, listChildProjects, self, value)); + this.value = value; + } + + private static List> predicates( + Provider dbProvider, ProjectCache projectCache, + Provider listChildProjects, + Provider self, String value) { + ProjectState projectState = projectCache.get(new Project.NameKey(value)); + if (projectState == null) { + return Collections.emptyList(); + } + + List> r = Lists.newArrayList(); + r.add(new ProjectPredicate(dbProvider, projectState.getProject().getName())); + ListChildProjects children = listChildProjects.get(); + children.setRecursive(true); + for (ProjectInfo p : children.apply(new ProjectResource( + projectState.controlFor(self.get())))) { + r.add(new ProjectPredicate(dbProvider, p.name)); + } + return r; + } + + @Override + public String toString() { + return ChangeQueryBuilder.FIELD_PARENTPROJECT + ":" + value; + } +} diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/FakeQueryBuilder.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/FakeQueryBuilder.java index 63e62a02a2..77633c8061 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/index/FakeQueryBuilder.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/index/FakeQueryBuilder.java @@ -26,7 +26,7 @@ public class FakeQueryBuilder extends ChangeQueryBuilder { new FakeQueryBuilder.Definition( FakeQueryBuilder.class), new ChangeQueryBuilder.Arguments(null, null, null, null, null, null, - null, null, null, null, null, indexes), + null, null, null, null, null, null, null, indexes), null); }