Add 'parentproject' operator that includes changes of child projects
With the 'parentproject' operator one can find all changes of a project and its child projects. This is e.g. useful to watch a project tree. Change-Id: Id45e6fc391137a1830a1782fea0b1326c661afa9 Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
This commit is contained in:
		| @@ -110,6 +110,12 @@ matches project names by regular expression.  The | |||||||
| link:http://www.brics.dk/automaton/[dk.brics.automaton | link:http://www.brics.dk/automaton/[dk.brics.automaton | ||||||
| library] is used for evaluation of such patterns. | 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:'BRANCH':: | branch:'BRANCH':: | ||||||
| + | + | ||||||
|   | |||||||
| @@ -22,13 +22,13 @@ import com.google.gwtexpui.safehtml.client.HighlightSuggestOracle; | |||||||
|  |  | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.Arrays; | import java.util.Arrays; | ||||||
| import java.util.Collections; |  | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.TreeSet; | import java.util.TreeSet; | ||||||
|  |  | ||||||
| public class SearchSuggestOracle extends HighlightSuggestOracle { | public class SearchSuggestOracle extends HighlightSuggestOracle { | ||||||
|   private static final List<ParamSuggester> paramSuggester = Arrays.asList( |   private static final List<ParamSuggester> paramSuggester = Arrays.asList( | ||||||
|       new ParamSuggester("project:", new ProjectNameSuggestOracle()), |       new ParamSuggester(Arrays.asList("project:", "parentproject:"), | ||||||
|  |           new ProjectNameSuggestOracle()), | ||||||
|       new ParamSuggester(Arrays.asList("owner:", "reviewer:"), |       new ParamSuggester(Arrays.asList("owner:", "reviewer:"), | ||||||
|           new AccountSuggestOracle() { |           new AccountSuggestOracle() { | ||||||
|             @Override |             @Override | ||||||
| @@ -81,6 +81,7 @@ public class SearchSuggestOracle extends HighlightSuggestOracle { | |||||||
|     suggestions.add("commit:"); |     suggestions.add("commit:"); | ||||||
|     suggestions.add("comment:"); |     suggestions.add("comment:"); | ||||||
|     suggestions.add("project:"); |     suggestions.add("project:"); | ||||||
|  |     suggestions.add("parentproject:"); | ||||||
|     suggestions.add("branch:"); |     suggestions.add("branch:"); | ||||||
|     suggestions.add("topic:"); |     suggestions.add("topic:"); | ||||||
|     suggestions.add("ref:"); |     suggestions.add("ref:"); | ||||||
| @@ -207,11 +208,6 @@ public class SearchSuggestOracle extends HighlightSuggestOracle { | |||||||
|     private final List<String> operators; |     private final List<String> operators; | ||||||
|     private final SuggestOracle parameterSuggestionOracle; |     private final SuggestOracle parameterSuggestionOracle; | ||||||
|  |  | ||||||
|     ParamSuggester(final String operator, |  | ||||||
|         final SuggestOracle parameterSuggestionOracle) { |  | ||||||
|       this(Collections.singletonList(operator), parameterSuggestionOracle); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     ParamSuggester(final List<String> operators, |     ParamSuggester(final List<String> operators, | ||||||
|         final SuggestOracle parameterSuggestionOracle) { |         final SuggestOracle parameterSuggestionOracle) { | ||||||
|       this.operators = operators; |       this.operators = operators; | ||||||
|   | |||||||
| @@ -47,6 +47,10 @@ public class ListChildProjects implements RestReadView<ProjectResource> { | |||||||
|     this.projectNodeFactory = projectNodeFactory; |     this.projectNodeFactory = projectNodeFactory; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   public void setRecursive(boolean recursive) { | ||||||
|  |     this.recursive = recursive; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   @Override |   @Override | ||||||
|   public List<ProjectInfo> apply(ProjectResource rsrc) { |   public List<ProjectInfo> apply(ProjectResource rsrc) { | ||||||
|     if (recursive) { |     if (recursive) { | ||||||
|   | |||||||
| @@ -33,8 +33,8 @@ public abstract class BasicChangeRewrites extends QueryRewriter<ChangeData> { | |||||||
|       new ChangeQueryBuilder.Arguments( // |       new ChangeQueryBuilder.Arguments( // | ||||||
|           new InvalidProvider<ReviewDb>(), // |           new InvalidProvider<ReviewDb>(), // | ||||||
|           new InvalidProvider<ChangeQueryRewriter>(), // |           new InvalidProvider<ChangeQueryRewriter>(), // | ||||||
|           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<ChangeData> schema(@Nullable IndexCollection indexes) { |   static Schema<ChangeData> schema(@Nullable IndexCollection indexes) { | ||||||
|     ChangeIndex index = indexes != null ? indexes.getSearchIndex() : null; |     ChangeIndex index = indexes != null ? indexes.getSearchIndex() : null; | ||||||
|   | |||||||
| @@ -37,6 +37,7 @@ import com.google.gerrit.server.index.IndexCollection; | |||||||
| import com.google.gerrit.server.index.Schema; | import com.google.gerrit.server.index.Schema; | ||||||
| import com.google.gerrit.server.patch.PatchListCache; | import com.google.gerrit.server.patch.PatchListCache; | ||||||
| import com.google.gerrit.server.project.ChangeControl; | 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.project.ProjectCache; | ||||||
| import com.google.gerrit.server.query.IntPredicate; | import com.google.gerrit.server.query.IntPredicate; | ||||||
| import com.google.gerrit.server.query.Predicate; | import com.google.gerrit.server.query.Predicate; | ||||||
| @@ -93,6 +94,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> { | |||||||
|   public static final String FIELD_MESSAGE = "message"; |   public static final String FIELD_MESSAGE = "message"; | ||||||
|   public static final String FIELD_OWNER = "owner"; |   public static final String FIELD_OWNER = "owner"; | ||||||
|   public static final String FIELD_OWNERIN = "ownerin"; |   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_PROJECT = "project"; | ||||||
|   public static final String FIELD_REF = "ref"; |   public static final String FIELD_REF = "ref"; | ||||||
|   public static final String FIELD_REVIEWER = "reviewer"; |   public static final String FIELD_REVIEWER = "reviewer"; | ||||||
| @@ -139,6 +141,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> { | |||||||
|     final Provider<ReviewDb> dbProvider; |     final Provider<ReviewDb> dbProvider; | ||||||
|     final Provider<ChangeQueryRewriter> rewriter; |     final Provider<ChangeQueryRewriter> rewriter; | ||||||
|     final IdentifiedUser.GenericFactory userFactory; |     final IdentifiedUser.GenericFactory userFactory; | ||||||
|  |     final Provider<CurrentUser> self; | ||||||
|     final CapabilityControl.Factory capabilityControlFactory; |     final CapabilityControl.Factory capabilityControlFactory; | ||||||
|     final ChangeControl.GenericFactory changeControlGenericFactory; |     final ChangeControl.GenericFactory changeControlGenericFactory; | ||||||
|     final AccountResolver accountResolver; |     final AccountResolver accountResolver; | ||||||
| @@ -147,6 +150,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> { | |||||||
|     final PatchListCache patchListCache; |     final PatchListCache patchListCache; | ||||||
|     final GitRepositoryManager repoManager; |     final GitRepositoryManager repoManager; | ||||||
|     final ProjectCache projectCache; |     final ProjectCache projectCache; | ||||||
|  |     final Provider<ListChildProjects> listChildProjects; | ||||||
|     final IndexCollection indexes; |     final IndexCollection indexes; | ||||||
|  |  | ||||||
|     @Inject |     @Inject | ||||||
| @@ -154,6 +158,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> { | |||||||
|     public Arguments(Provider<ReviewDb> dbProvider, |     public Arguments(Provider<ReviewDb> dbProvider, | ||||||
|         Provider<ChangeQueryRewriter> rewriter, |         Provider<ChangeQueryRewriter> rewriter, | ||||||
|         IdentifiedUser.GenericFactory userFactory, |         IdentifiedUser.GenericFactory userFactory, | ||||||
|  |         Provider<CurrentUser> self, | ||||||
|         CapabilityControl.Factory capabilityControlFactory, |         CapabilityControl.Factory capabilityControlFactory, | ||||||
|         ChangeControl.GenericFactory changeControlGenericFactory, |         ChangeControl.GenericFactory changeControlGenericFactory, | ||||||
|         AccountResolver accountResolver, |         AccountResolver accountResolver, | ||||||
| @@ -162,10 +167,12 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> { | |||||||
|         PatchListCache patchListCache, |         PatchListCache patchListCache, | ||||||
|         GitRepositoryManager repoManager, |         GitRepositoryManager repoManager, | ||||||
|         ProjectCache projectCache, |         ProjectCache projectCache, | ||||||
|  |         Provider<ListChildProjects> listChildProjects, | ||||||
|         IndexCollection indexes) { |         IndexCollection indexes) { | ||||||
|       this.dbProvider = dbProvider; |       this.dbProvider = dbProvider; | ||||||
|       this.rewriter = rewriter; |       this.rewriter = rewriter; | ||||||
|       this.userFactory = userFactory; |       this.userFactory = userFactory; | ||||||
|  |       this.self = self; | ||||||
|       this.capabilityControlFactory = capabilityControlFactory; |       this.capabilityControlFactory = capabilityControlFactory; | ||||||
|       this.changeControlGenericFactory = changeControlGenericFactory; |       this.changeControlGenericFactory = changeControlGenericFactory; | ||||||
|       this.accountResolver = accountResolver; |       this.accountResolver = accountResolver; | ||||||
| @@ -174,6 +181,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> { | |||||||
|       this.patchListCache = patchListCache; |       this.patchListCache = patchListCache; | ||||||
|       this.repoManager = repoManager; |       this.repoManager = repoManager; | ||||||
|       this.projectCache = projectCache; |       this.projectCache = projectCache; | ||||||
|  |       this.listChildProjects = listChildProjects; | ||||||
|       this.indexes = indexes; |       this.indexes = indexes; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @@ -314,6 +322,12 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> { | |||||||
|     return new ProjectPredicate(args.dbProvider, name); |     return new ProjectPredicate(args.dbProvider, name); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   @Operator | ||||||
|  |   public Predicate<ChangeData> parentproject(String name) { | ||||||
|  |     return new ParentProjectPredicate(args.dbProvider, args.projectCache, | ||||||
|  |         args.listChildProjects, args.self, name); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   @Operator |   @Operator | ||||||
|   public Predicate<ChangeData> branch(String name) { |   public Predicate<ChangeData> branch(String name) { | ||||||
|     if (name.startsWith("^")) |     if (name.startsWith("^")) | ||||||
|   | |||||||
| @@ -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<ChangeData> { | ||||||
|  |   private final String value; | ||||||
|  |  | ||||||
|  |   ParentProjectPredicate(Provider<ReviewDb> dbProvider, | ||||||
|  |       ProjectCache projectCache, Provider<ListChildProjects> listChildProjects, | ||||||
|  |       Provider<CurrentUser> self, String value) { | ||||||
|  |     super(predicates(dbProvider, projectCache, listChildProjects, self, value)); | ||||||
|  |     this.value = value; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private static List<Predicate<ChangeData>> predicates( | ||||||
|  |       Provider<ReviewDb> dbProvider, ProjectCache projectCache, | ||||||
|  |       Provider<ListChildProjects> listChildProjects, | ||||||
|  |       Provider<CurrentUser> self, String value) { | ||||||
|  |     ProjectState projectState = projectCache.get(new Project.NameKey(value)); | ||||||
|  |     if (projectState == null) { | ||||||
|  |       return Collections.emptyList(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     List<Predicate<ChangeData>> 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; | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -26,7 +26,7 @@ public class FakeQueryBuilder extends ChangeQueryBuilder { | |||||||
|         new FakeQueryBuilder.Definition<ChangeData, FakeQueryBuilder>( |         new FakeQueryBuilder.Definition<ChangeData, FakeQueryBuilder>( | ||||||
|           FakeQueryBuilder.class), |           FakeQueryBuilder.class), | ||||||
|         new ChangeQueryBuilder.Arguments(null, null, null, null, null, null, |         new ChangeQueryBuilder.Arguments(null, null, null, null, null, null, | ||||||
|           null, null, null, null, null, indexes), |           null, null, null, null, null, null, null, indexes), | ||||||
|         null); |         null); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Edwin Kempin
					Edwin Kempin