{"record":{"id":"29a83a8f27bb53a2","repo":"theonedev/onedev","slug":"unexpected-operator-operator-29a83a","errorCode":null,"errorMessage":"Unexpected operator: ${operator}","messagePattern":"Unexpected operator: (.+?)","errorType":"exception","errorClass":"ExplicitException","httpStatus":null,"severity":"error","filePath":"server-core/src/main/java/io/onedev/server/search/entity/project/ProjectQuery.java","lineNumber":137,"sourceCode":"\t\t\t\t\t\tswitch (ctx.operator.getType()) {\n\t\t\t\t\t\t\tcase Roots:\n\t\t\t\t\t\t\t\treturn new RootsCriteria();\n\t\t\t\t\t\t\tcase Leafs:\n\t\t\t\t\t\t\t\treturn new LeafsCriteria();\n\t\t\t\t\t\t\tcase ForkRoots:\n\t\t\t\t\t\t\t\treturn new ForkRootsCriteria();\n\t\t\t\t\t\t\tcase OwnedByMe:\n\t\t\t\t\t\t\t\treturn new OwnedByMeCriteria();\n\t\t\t\t\t\t\tcase OwnedByNone:\n\t\t\t\t\t\t\t\treturn new NoOwnerCriteria();\n\t\t\t\t\t\t\tcase WithoutEnoughReplicas:\n\t\t\t\t\t\t\t\treturn new WithoutEnoughReplicasCriteria();\n\t\t\t\t\t\t\tcase HasOutdatedReplicas:\n\t\t\t\t\t\t\t\treturn new HasOutdatedReplicasCriteria();\n\t\t\t\t\t\t\tcase MissingStorage:\n\t\t\t\t\t\t\t\treturn new MissingStorageCriteria();\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tthrow new ExplicitException(\"Unexpected operator: \" + ctx.operator.getText());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tpublic Criteria<Project> visitOperatorValueCriteria(OperatorValueCriteriaContext ctx) {\n\t\t\t\t\t\tvar criterias = new ArrayList<Criteria<Project>>();\n\t\t\t\t\t\tfor (var quoted: ctx.criteriaValue.Quoted()) {\n\t\t\t\t\t\t\tString value = getValue(quoted.getText());\n\t\t\t\t\t\t\tif (ctx.operator.getType() == ChildrenOf)\n\t\t\t\t\t\t\t\tcriterias.add(new ChildrenOfCriteria(value));\n\t\t\t\t\t\t\telse if (ctx.operator.getType() == ForksOf)\n\t\t\t\t\t\t\t\tcriterias.add(new ForksOfCriteria(value));\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tcriterias.add(new OwnedByUserCriteria(getUser(value)));\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn Criteria.orCriterias(criterias);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t@Override","sourceCodeStart":119,"sourceCodeEnd":155,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-core/src/main/java/io/onedev/server/search/entity/project/ProjectQuery.java#L119-L155","documentation":"When parsing a bare operator criterion (an operator with no value, e.g. 'owned by me'-style tokens) the visitor switches on the operator token and throws ExplicitException('Unexpected operator: X') for any operator not supported as a standalone criterion in project queries.","triggerScenarios":"A project query uses a bare operator token that exists in the grammar but is not handled in visitOperatorCriteria's switch (e.g. an operator valid for issues but not projects), hitting the default branch.","commonSituations":"Reusing issue/pull-request query syntax in project queries; typos in operator names; queries copied from documentation for a different entity type.","solutions":["Use only operators supported for project queries without values (e.g. OwnedByMe, SubmittedByMe equivalents, ToBeDeleted).","Move value-based operators into 'operator(value)' form handled by visitOperatorValueCriteria.","Catch ExplicitException and display the message, guiding the user to valid operators.","Check the switch in ProjectQuery.visitOperatorCriteria for the exact supported set."],"exampleFix":"// before\nProjectQuery.parse(\"has builds\"); // 'has' not a bare operator for projects\n// after\nProjectQuery.parse(\"to be deleted\"); // supported bare operator","handlingStrategy":"validation","validationCode":"// only these bare operators are valid for projects: check before parsing\nSet<String> allowed = Set.of(\"owned by me\", \"to be deleted\");","typeGuard":"null","tryCatchPattern":"try { q = ProjectQuery.parse(text); } catch (ExplicitException e) { show(e.getMessage()); }","preventionTips":["Use only project-supported bare operators","Do not copy bare operators from issue/pull-request queries","Offer operator autocompletion in query editors","Catch ExplicitException for user-facing validation"],"tags":["parsing","query","validation"],"backgroundTag":"invalid-enum-value","analyzedSha":"d44925c47c37992c828ea673a5f9620539bc3ff2","analyzedAt":"2026-09-06T07:18:27.995Z","contentChangedAt":"2026-09-06T07:18:27.995Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}