private JRFillVariable addVariable(
      JRVariable parentVariable, List variableList, JRFillObjectFactory factory) {
    JRFillVariable variable = factory.getVariable(parentVariable);

    byte calculation = variable.getCalculation();
    switch (calculation) {
      case JRVariable.CALCULATION_AVERAGE:
      case JRVariable.CALCULATION_VARIANCE:
        {
          JRVariable countVar =
              createHelperVariable(parentVariable, "_COUNT", JRVariable.CALCULATION_COUNT);
          JRFillVariable fillCountVar = addVariable(countVar, variableList, factory);
          variable.setHelperVariable(fillCountVar, JRCalculable.HELPER_COUNT);

          JRVariable sumVar =
              createHelperVariable(parentVariable, "_SUM", JRVariable.CALCULATION_SUM);
          JRFillVariable fillSumVar = addVariable(sumVar, variableList, factory);
          variable.setHelperVariable(fillSumVar, JRCalculable.HELPER_SUM);

          break;
        }
      case JRVariable.CALCULATION_STANDARD_DEVIATION:
        {
          JRVariable varianceVar =
              createHelperVariable(parentVariable, "_VARIANCE", JRVariable.CALCULATION_VARIANCE);
          JRFillVariable fillVarianceVar = addVariable(varianceVar, variableList, factory);
          variable.setHelperVariable(fillVarianceVar, JRCalculable.HELPER_VARIANCE);

          break;
        }
      case JRVariable.CALCULATION_DISTINCT_COUNT:
        {
          JRVariable countVar = createDistinctCountHelperVariable(parentVariable);
          JRFillVariable fillCountVar = addVariable(countVar, variableList, factory);
          variable.setHelperVariable(fillCountVar, JRCalculable.HELPER_COUNT);

          break;
        }
    }

    variableList.add(variable);
    return variable;
  }
  private void checkVariableCalculationReq(
      JRFillVariable variable, List variableList, JRFillObjectFactory factory) {
    if (hasVariableCalculationReq(variable, JRVariable.CALCULATION_AVERAGE)
        || hasVariableCalculationReq(variable, JRVariable.CALCULATION_VARIANCE)) {
      if (variable.getHelperVariable(JRCalculable.HELPER_COUNT) == null) {
        JRVariable countVar =
            createHelperVariable(variable, "_COUNT", JRVariable.CALCULATION_COUNT);
        JRFillVariable fillCountVar = factory.getVariable(countVar);
        checkVariableCalculationReq(fillCountVar, variableList, factory);
        variable.setHelperVariable(fillCountVar, JRCalculable.HELPER_COUNT);
      }

      if (variable.getHelperVariable(JRCalculable.HELPER_SUM) == null) {
        JRVariable sumVar = createHelperVariable(variable, "_SUM", JRVariable.CALCULATION_SUM);
        JRFillVariable fillSumVar = factory.getVariable(sumVar);
        checkVariableCalculationReq(fillSumVar, variableList, factory);
        variable.setHelperVariable(fillSumVar, JRCalculable.HELPER_SUM);
      }
    }

    if (hasVariableCalculationReq(variable, JRVariable.CALCULATION_STANDARD_DEVIATION)) {
      if (variable.getHelperVariable(JRCalculable.HELPER_VARIANCE) == null) {
        JRVariable varianceVar =
            createHelperVariable(variable, "_VARIANCE", JRVariable.CALCULATION_VARIANCE);
        JRFillVariable fillVarianceVar = factory.getVariable(varianceVar);
        checkVariableCalculationReq(fillVarianceVar, variableList, factory);
        variable.setHelperVariable(fillVarianceVar, JRCalculable.HELPER_VARIANCE);
      }
    }

    if (hasVariableCalculationReq(variable, JRVariable.CALCULATION_DISTINCT_COUNT)) {
      if (variable.getHelperVariable(JRCalculable.HELPER_COUNT) == null) {
        JRVariable countVar = createDistinctCountHelperVariable(variable);
        JRFillVariable fillCountVar = factory.getVariable(countVar);
        checkVariableCalculationReq(fillCountVar, variableList, factory);
        variable.setHelperVariable(fillCountVar, JRCalculable.HELPER_COUNT);
      }
    }

    variableList.add(variable);
  }