{"record":{"id":"6c045bd38bdcf845","repo":"flowable/flowable-engine","slug":"the-variable-value-does-not-contain-an-operator-va-6c045b","errorCode":null,"errorMessage":"The variable value does not contain an operator value","messagePattern":"The variable value does not contain an operator value","errorType":"exception","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine/src/main/java/org/flowable/engine/impl/delete/BatchDeleteProcessConfig.java","lineNumber":346,"sourceCode":"\n    protected static void populateOrQueryObjects(JsonNode orQueryObjectsNode, HistoricProcessInstanceQuery query,\n            ProcessEngineConfigurationImpl engineConfiguration) {\n        if (orQueryObjectsNode.isArray()) {\n            for (JsonNode orQueryObjectNode : orQueryObjectsNode) {\n                HistoricProcessInstanceQuery orQuery = query.or();\n                populateQuery(orQueryObjectNode, orQuery, engineConfiguration);\n                query.endOr();\n            }\n        }\n    }\n\n    protected static void populateQueryVariableValues(JsonNode variableValuesNode, HistoricProcessInstanceQuery query,\n            ProcessEngineConfigurationImpl engineConfiguration) {\n        if (variableValuesNode.isArray()) {\n            for (JsonNode variableValue : variableValuesNode) {\n                String operatorString = variableValue.path(\"operator\").stringValue(null);\n                if (operatorString == null) {\n                    throw new FlowableIllegalArgumentException(\"The variable value does not contain an operator value\");\n                }\n\n                QueryOperator operator = QueryOperator.valueOf(operatorString);\n                String variableName = variableValue.path(\"name\").stringValue(null);\n                switch (operator) {\n                    case EQUALS:\n                        if (variableName != null) {\n                            query.variableValueEquals(variableName, extractVariableValue(variableValue, engineConfiguration));\n                        } else {\n                            query.variableValueEquals(extractVariableValue(variableValue, engineConfiguration));\n                        }\n                        break;\n                    case NOT_EQUALS:\n                        query.variableValueNotEquals(variableName, extractVariableValue(variableValue, engineConfiguration));\n                        break;\n                    case GREATER_THAN:\n                        query.variableValueGreaterThan(variableName, extractVariableValue(variableValue, engineConfiguration));\n                        break;","sourceCodeStart":328,"sourceCodeEnd":364,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/delete/BatchDeleteProcessConfig.java#L328-L364","documentation":"Each entry in the 'variableValues' array of the serialized query must declare an 'operator' field that maps to a QueryOperator. When the operator field is absent or null, populateQueryVariableValues throws this FlowableIllegalArgumentException because the comparison semantics of the variable filter are undefined.","triggerScenarios":"Batch delete configuration JSON where a variableValue object in the array lacks the 'operator' key, e.g. { \"name\": \"status\", \"value\": \"DONE\" }.","commonSituations":"Hand-crafted batch configurations; tooling that omits the operator assuming a default; schema drift after copying query JSON from another format.","solutions":["Add the required 'operator' field to each variable value object (e.g. \"operator\": \"EQUALS\")","Validate the batch configuration JSON before creating the batch part","Consult QueryOperator for the exact allowed operator names"],"exampleFix":"// before\n{ \"name\": \"status\", \"value\": \"DONE\" }\n// after\n{ \"name\": \"status\", \"operator\": \"EQUALS\", \"value\": \"DONE\" }","handlingStrategy":"validation","validationCode":"for (JsonNode var : variableValuesJson) {\n    if (var.path(\"operator\").stringValue(null) == null) {\n        throw new IllegalArgumentException(\"variableValue missing operator: \" + var);\n    }\n}","typeGuard":null,"tryCatchPattern":"try {\n    config = BatchDeleteProcessConfig.create(partId, engineConfiguration);\n} catch (FlowableIllegalArgumentException e) {\n    logger.error(\"Invalid variable filter: \" + e.getMessage());\n}","preventionTips":["Always include operator in every variableValues entry","Validate batch JSON against a schema before submission","Build configurations with the SDK/tooling rather than by hand"],"tags":["batch","query","configuration","variables"],"backgroundTag":"missing-required-argument","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"}