@Override
  public Measure calculate(FormulaData data, FormulaContext context) {
    double sum = 0.0;
    double count = 0.0;
    boolean hasValue = false;

    for (FormulaData child : data.getChildren()) {
      Measure measure = child.getMeasure(context.getTargetMetric());
      Measure weightingMeasure = child.getMeasure(weightingMetric);
      if (MeasureUtils.haveValues(measure, weightingMeasure)) {
        sum += measure.getValue() * weightingMeasure.getValue();
        count += weightingMeasure.getValue();
        hasValue = true;
      }
    }

    if (!hasValue && !zeroIfNoValues) {
      return null;
    }

    double result = (Double.doubleToRawLongBits(count) == 0L) ? 0.0 : (sum / count);
    return new Measure(context.getTargetMetric(), result);
  }