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