@Override
  protected void doCollect(int doc) throws IOException {
    if (!latFieldData.hasValue(doc) || !lonFieldData.hasValue(doc)) {
      return;
    }

    double value = ((Number) valueFunction.execute(doc, params)).doubleValue();

    if (latFieldData.multiValued()) {
      double[] lats = latFieldData.doubleValues(doc);
      double[] lons = latFieldData.doubleValues(doc);
      for (int i = 0; i < lats.length; i++) {
        double distance = geoDistance.calculate(lat, lon, lats[i], lons[i], unit);
        for (GeoDistanceFacet.Entry entry : entries) {
          if (distance >= entry.getFrom() && distance < entry.getTo()) {
            entry.count++;
            entry.total += value;
          }
        }
      }
    } else {
      double distance =
          geoDistance.calculate(
              lat, lon, latFieldData.doubleValue(doc), lonFieldData.doubleValue(doc), unit);
      for (GeoDistanceFacet.Entry entry : entries) {
        if (distance >= entry.getFrom() && distance < entry.getTo()) {
          entry.count++;
          entry.total += value;
        }
      }
    }
  }
 @Override
 protected void doSetNextReader(IndexReader reader, int docBase) throws IOException {
   super.doSetNextReader(reader, docBase);
   valueFunction.setNextReader(reader);
 }