Merge "Support IsOperands in change queries from plugins"

This commit is contained in:
Martin Fick
2020-08-28 19:38:58 +00:00
committed by Gerrit Code Review
5 changed files with 123 additions and 2 deletions

View File

@@ -433,6 +433,7 @@ public class GerritGlobalModule extends FactoryModule {
DynamicMap.mapOf(binder(), DynamicOptions.DynamicBean.class);
DynamicMap.mapOf(binder(), ChangeQueryBuilder.ChangeOperatorFactory.class);
DynamicMap.mapOf(binder(), ChangeQueryBuilder.ChangeHasOperandFactory.class);
DynamicMap.mapOf(binder(), ChangeQueryBuilder.ChangeIsOperandFactory.class);
DynamicSet.setOf(binder(), ChangeAttributeFactory.class);
install(new GitwebConfig.LegacyModule(cfg));

View File

@@ -117,12 +117,14 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData, ChangeQueryBuil
* <p>bind(ChangeHasOperandFactory.class) .annotatedWith(Exports.named("your has operand"))
* .to(YourClass.class);
*/
private interface ChangeOperandFactory {
public interface ChangeOperandFactory {
Predicate<ChangeData> create(ChangeQueryBuilder builder) throws QueryParseException;
}
public interface ChangeHasOperandFactory extends ChangeOperandFactory {}
public interface ChangeIsOperandFactory extends ChangeOperandFactory {}
private static final Pattern PAT_LEGACY_ID = Pattern.compile("^[1-9][0-9]*$");
private static final Pattern PAT_CHANGE_ID = Pattern.compile(CHANGE_ID_PATTERN);
private static final Pattern DEF_CHANGE =
@@ -218,6 +220,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData, ChangeQueryBuil
final CommentsUtil commentsUtil;
final ConflictsCache conflictsCache;
final DynamicMap<ChangeHasOperandFactory> hasOperands;
final DynamicMap<ChangeIsOperandFactory> isOperands;
final DynamicMap<ChangeOperatorFactory> opFactories;
final GitRepositoryManager repoManager;
final GroupBackend groupBackend;
@@ -244,6 +247,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData, ChangeQueryBuil
ChangeIndexRewriter rewriter,
DynamicMap<ChangeOperatorFactory> opFactories,
DynamicMap<ChangeHasOperandFactory> hasOperands,
DynamicMap<ChangeIsOperandFactory> isOperands,
IdentifiedUser.GenericFactory userFactory,
Provider<CurrentUser> self,
PermissionBackend permissionBackend,
@@ -273,6 +277,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData, ChangeQueryBuil
rewriter,
opFactories,
hasOperands,
isOperands,
userFactory,
self,
permissionBackend,
@@ -304,6 +309,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData, ChangeQueryBuil
ChangeIndexRewriter rewriter,
DynamicMap<ChangeOperatorFactory> opFactories,
DynamicMap<ChangeHasOperandFactory> hasOperands,
DynamicMap<ChangeIsOperandFactory> isOperands,
IdentifiedUser.GenericFactory userFactory,
Provider<CurrentUser> self,
PermissionBackend permissionBackend,
@@ -351,6 +357,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData, ChangeQueryBuil
this.starredChangesUtil = starredChangesUtil;
this.accountCache = accountCache;
this.hasOperands = hasOperands;
this.isOperands = isOperands;
this.groupMembers = groupMembers;
this.changeIsVisbleToPredicateFactory = changeIsVisbleToPredicateFactory;
this.operatorAliasConfig = operatorAliasConfig;
@@ -364,6 +371,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData, ChangeQueryBuil
rewriter,
opFactories,
hasOperands,
isOperands,
userFactory,
Providers.of(otherUser),
permissionBackend,
@@ -643,6 +651,14 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData, ChangeQueryBuil
throw new QueryParseException("'is:wip' operator is not supported by change index version");
}
// for plugins the value will be operandName_pluginName
List<String> names = Lists.newArrayList(Splitter.on('_').split(value));
if (names.size() == 2) {
ChangeIsOperandFactory op = args.isOperands.get(names.get(1), names.get(0));
if (op != null) {
return op.create(this);
}
}
return status(value);
}