protected void addVariables(
      ExecutionQuery processInstanceQuery, List<QueryVariable> variables, boolean process) {
    for (QueryVariable variable : variables) {
      if (variable.getVariableOperation() == null) {
        throw new ActivitiIllegalArgumentException(
            "Variable operation is missing for variable: " + variable.getName());
      }
      if (variable.getValue() == null) {
        throw new ActivitiIllegalArgumentException(
            "Variable value is missing for variable: " + variable.getName());
      }

      boolean nameLess = variable.getName() == null;

      Object actualValue = new RestResponseFactory().getVariableValue(variable);

      // A value-only query is only possible using equals-operator
      if (nameLess
          && variable.getVariableOperation() != QueryVariable.QueryVariableOperation.EQUALS) {
        throw new ActivitiIllegalArgumentException(
            "Value-only query (without a variable-name) is only supported when using 'equals' operation.");
      }

      switch (variable.getVariableOperation()) {
        case EQUALS:
          if (nameLess) {
            if (process) {
              processInstanceQuery.processVariableValueEquals(actualValue);
            } else {
              processInstanceQuery.variableValueEquals(actualValue);
            }
          } else {
            if (process) {
              processInstanceQuery.processVariableValueEquals(variable.getName(), actualValue);
            } else {
              processInstanceQuery.variableValueEquals(variable.getName(), actualValue);
            }
          }
          break;

        case EQUALS_IGNORE_CASE:
          if (actualValue instanceof String) {
            if (process) {
              processInstanceQuery.processVariableValueEqualsIgnoreCase(
                  variable.getName(), (String) actualValue);
            } else {
              processInstanceQuery.variableValueEqualsIgnoreCase(
                  variable.getName(), (String) actualValue);
            }
          } else {
            throw new ActivitiIllegalArgumentException(
                "Only string variable values are supported when ignoring casing, but was: "
                    + actualValue.getClass().getName());
          }
          break;

        case NOT_EQUALS:
          if (process) {
            processInstanceQuery.processVariableValueNotEquals(variable.getName(), actualValue);
          } else {
            processInstanceQuery.variableValueNotEquals(variable.getName(), actualValue);
          }
          break;

        case NOT_EQUALS_IGNORE_CASE:
          if (actualValue instanceof String) {
            if (process) {
              processInstanceQuery.processVariableValueNotEqualsIgnoreCase(
                  variable.getName(), (String) actualValue);
            } else {
              processInstanceQuery.variableValueNotEqualsIgnoreCase(
                  variable.getName(), (String) actualValue);
            }
          } else {
            throw new ActivitiIllegalArgumentException(
                "Only string variable values are supported when ignoring casing, but was: "
                    + actualValue.getClass().getName());
          }
          break;
        default:
          throw new ActivitiIllegalArgumentException(
              "Unsupported variable query operation: " + variable.getVariableOperation());
      }
    }
  }