{"record":{"id":"dbab8ffa7e54a97e","repo":"flowable/flowable-engine","slug":"the-query-is-already-in-an-or-statement-dbab8f","errorCode":null,"errorMessage":"The query is already in an or statement","messagePattern":"The query is already in an or statement","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/history/HistoricPlanItemInstanceQueryImpl.java","lineNumber":812,"sourceCode":"    @Override\n    public HistoricPlanItemInstanceQuery orderByTerminatedTime() {\n        return orderBy(HistoricPlanItemInstanceQueryProperty.TERMINATED_TIME);\n    }\n\n    @Override\n    public HistoricPlanItemInstanceQuery orderByExitTime() {\n        return orderBy(HistoricPlanItemInstanceQueryProperty.EXIT_TIME);\n    }\n\n    @Override\n    public HistoricPlanItemInstanceQuery orderByName() {\n        return orderBy(HistoricPlanItemInstanceQueryProperty.NAME);\n    }\n\n    @Override\n    public HistoricPlanItemInstanceQuery or() {\n        if (inOrStatement) {\n            throw new FlowableIllegalArgumentException(\"The query is already in an or statement\");\n        }\n\n        inOrStatement = true;\n        if (commandContext != null) {\n            currentOrQueryObject = new HistoricPlanItemInstanceQueryImpl(commandContext);\n        } else {\n            currentOrQueryObject = new HistoricPlanItemInstanceQueryImpl(commandExecutor);\n        }\n        orQueryObjects.add(currentOrQueryObject);\n        return this;\n    }\n\n    @Override\n    public HistoricPlanItemInstanceQuery endOr() {\n        if (!inOrStatement) {\n            throw new FlowableIllegalArgumentException(\"endOr() can only be called after calling or()\");\n        }\n","sourceCodeStart":794,"sourceCodeEnd":830,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/history/HistoricPlanItemInstanceQueryImpl.java#L794-L830","documentation":"HistoricPlanItemInstanceQueryImpl.or() throws FlowableIllegalArgumentException if the query is already inside an or block (inOrStatement is true). The or()/endOr() API only supports a single level of OR grouping, so nested or() calls are rejected. This prevents accidentally building an OR-of-OR query the engine cannot express.","triggerScenarios":"Calling or() twice without an intervening endOr(), e.g. chaining or() ... or() while building the query, or re-entering or() due to a loop over filter conditions that each call or().","commonSituations":"Building dynamic queries in loops where each condition calls or() but endOr() is only called once; copy-pasting query-builder code from examples that already used or().","solutions":["Call endOr() before calling or() again","Restructure the query so all OR conditions are within a single or()...endOr() block","If multiple independent OR groups are needed, run separate queries and merge results","Use a flag or loop restructure so or() is invoked exactly once per query"],"exampleFix":"// before\nquery.or().planItemInstanceName(\"a\").or().planItemInstanceName(\"b\"); // throws\n// after\nquery.or().planItemInstanceName(\"a\").planItemInstanceName(\"b\").endOr();","handlingStrategy":"validation","validationCode":"boolean canStartOrBlock(HistoricPlanItemInstanceQuery query) {\n    // track your own flag; the query does not expose inOrStatement\n    return !orBlockOpen;\n}","typeGuard":null,"tryCatchPattern":"try {\n    query.or();\n} catch (FlowableIllegalArgumentException e) {\n    // already inside an or() block — close it with endOr() first or skip this or() call\n}","preventionTips":["Track or-block state with a boolean when building queries dynamically","Always pair or()/endOr() in the same builder method or use try/finally semantics","Do not call or() inside loops that add OR conditions — call it once before the loop"],"tags":["flowable","cmmn","query","or-statement","api-misuse"],"backgroundTag":"invalid-state-transition","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}