docs: public IndexRangeStats indexRangeStatsOfIndex(String index) {
          final FilterAggregationBuilder builder = AggregationBuilders.filter("agg", QueryBuilders.existsQuery(Message.FIELD_TIMESTAMP))
                  .subAggregation(AggregationBuilders.min("ts_min").field(Message.FIELD_TIMESTAMP))
                  .subAggregation(AggregationBuilders.max("ts_max").field(Message.FIELD_TIMESTAMP))
                  .subAggregation(AggregationBuilders.terms("streams").field(Message.FIELD_STREAMS));
          final String query = searchSource()
                  .aggregation(builder)
                  .size(0)
                  .toString();
  
          final Search request = new Search.Builder(query)
                  .addIndex(index)
                  .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                  .ignoreUnavailable(true)
                  .build();
  
          if (LOG.isDebugEnabled()) {
              String data = "{}";
              try {
                  data = request.getData(objectMapper.copy().enable(SerializationFeature.INDENT_OUTPUT));
              } catch (IOException e) {
                  LOG.debug("Couldn't pretty print request payload", e);
              }
              LOG.debug("Index range query: _search/{}: {}", index, data);
          }
  
          final SearchResult result = JestUtils.execute(jestClient, request, () -> "Couldn't build index range of index " + index);
  
          final FilterAggregation f = result.getAggregations().getFilterAggregation("agg");
          if (f == null) {
              throw new IndexNotFoundException("Couldn't build index range of index " + index + " because it doesn't exist.");
          } else if (f.getCount() == 0L) {
              LOG.debug("No documents with attribute \"timestamp\" found in index <{}>", index);
              return IndexRangeStats.EMPTY;
          }
  
          final MinAggregation minAgg = f.getMinAggregation("ts_min");
          final DateTime min = new DateTime(minAgg.getMin().longValue(), DateTimeZone.UTC);
          final MaxAggregation maxAgg = f.getMaxAggregation("ts_max");
          final DateTime max = new DateTime(maxAgg.getMax().longValue(), DateTimeZone.UTC);
          // make sure we return an empty list, so we can differentiate between old indices that don't have this information
          // and newer ones that simply have no streams.
          final TermsAggregation streams = f.getTermsAggregation("streams");
          final List<String> streamIds = streams.getBuckets().stream()
                  .map(TermsAggregation.Entry::getKeyAsString)
                  .collect(toList());
  
  
          return IndexRangeStats.create(min, max, streamIds);
      }