theonedev/onedev · error · ExplicitException

Criteria ' ' is not supported here

Error message

Criteria '${criteriaText}' is not supported here

What it means

CommitQuery.parse walks the parsed criteria and rejects the 'Authored by me' criterion when the query is parsed without current-user context (withCurrentUserCriteria == false), throwing ExplicitException 'Criteria <text> is not supported here'. Some contexts (e.g. queries evaluated for other users or scheduled jobs) cannot resolve 'me', so the criterion is disallowed.

Solutions

  1. Replace 'Authored by me' with an explicit author name/value, e.g. author("login").
  2. Parse the query with withCurrentUserCriteria=true if the evaluation context does have a current user.
  3. Catch ExplicitException to return a clear message that the criterion is unsupported in this context.

Example fix

// before
CommitQuery.parse(project, "authored by me", false);
// after
CommitQuery.parse(project, "author(\"john\")", false);
Defensive patterns

Strategy: validation

Validate before calling

if (withCurrentUserCriteria == false && queryString.matches("(?i).*authored\\s+by\\s+me.*"))
    throw new IllegalArgumentException("'Authored by me' needs a current-user context");

Try / catch

try {
    return CommitQuery.parse(project, q, false);
} catch (ExplicitException e) {
    if (e.getMessage().contains("not supported here"))
        throw new UserFriendlyException("Replace 'me' criteria with explicit values in this context");
    throw e;
}

Prevention

When it happens

Trigger: Parsing a commit query containing 'Authored by me' (AuthoredByMe token) while CommitQuery.parse is called with withCurrentUserCriteria=false — e.g. in contexts with no security context / impersonation available.

Common situations: Using 'Authored by me' in a commit query evaluated server-side outside a user session (webhook, scheduled report); embedding the query in a setting where current user is undefined; copy-pasting a personal query into a shared context.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of theonedev/onedev@d44925c47c (2026-09-06). Data as JSON: /api/errors/e896a9dd087c6a42. Report an issue: GitHub.

Appendix: source

Thrown at server-core/src/main/java/io/onedev/server/search/commit/CommitQuery.java:76

				@Override
				public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line,
						int charPositionInLine, String msg, RecognitionException e) {
					throw new RuntimeException("Malformed query", e);
				}
				
			});
			CommonTokenStream tokens = new CommonTokenStream(lexer);
			CommitQueryParser parser = new CommitQueryParser(tokens);
			parser.removeErrorListeners();
			parser.setErrorHandler(new BailErrorStrategy());
			
			Map<Class<? extends CommitCriteria>, List<Object>> criteriaValues = new LinkedHashMap<>();
			
			for (CriteriaContext criteria: parser.query().criteria()) {
				if (criteria.authorCriteria() != null) {
					if (criteria.authorCriteria().AuthoredByMe() != null) {
						if (!withCurrentUserCriteria)
							throw new ExplicitException("Criteria '" + criteria.authorCriteria().AuthoredByMe().getText() + "' is not supported here");
							criteriaValues.computeIfAbsent(AuthorCriteria.class, k->new ArrayList<>()).add(null);
					} else {
						for (var value: criteria.authorCriteria().Value())
							criteriaValues.computeIfAbsent(AuthorCriteria.class, k->new ArrayList<>()).add(getValue(value));
					}
				} else if (criteria.committerCriteria() != null) {
					if (criteria.committerCriteria().CommittedByMe() != null) {
						if (!withCurrentUserCriteria)
							throw new ExplicitException("Criteria '" + criteria.committerCriteria().CommittedByMe().getText() + "' is not supported here");
						criteriaValues.computeIfAbsent(CommitterCriteria.class, k->new ArrayList<>()).add(null);
					} else {
						for (var value: criteria.committerCriteria().Value())
							criteriaValues.computeIfAbsent(CommitterCriteria.class, k->new ArrayList<>()).add(getValue(value));
					}
				} else if (criteria.messageCriteria() != null) {
					for (var value: criteria.messageCriteria().Value()) 
						criteriaValues.computeIfAbsent(MessageCriteria.class, k->new ArrayList<>()).add(getValue(value));
				} else if (criteria.fuzzyCriteria() != null) {

View on GitHub (pinned to d44925c47c)