Support IsOperands in change queries from plugins

Plugins currently can add search operators and "has" operands to change
queries. Now support "is" operands using a "is:<operand>_<plugin>"
syntax very similar to the "has" syntax.

Plugins can achieve this by implementing ChangeIsOperandFactory and
returning a Predicate<ChangeData>. A sample ChangeIsOpenrandFactory
class implementing, and registering, a new is:sample_pluginName
operand is shown below:

  public class SampleIsOperand implements ChangeIsOperandFactory {
    public static class Module extends AbstractModule {
      @Override
      protected void configure() {
        bind(ChangeIsOperandFactory.class)
            .annotatedWith(Exports.named("sample")
            .to(SampleIsOperand.class);
      }
    }

    @Override
    public Predicate<ChangeData> create(ChangeQueryBuilder builder){
      return new IsSamplePredicate();
    }
  }

Change-Id: Ic694673be806e23a294e0a30cb3bb1b7e59b46f8
This commit is contained in:
Martin Fick
2020-08-05 18:09:41 -05:00
committed by Adithya Chakilam
parent fdf18af2eb
commit 08534c9f0b
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);
}