docs: @Override
      protected DataPoint[] getAllInRange(long timestampStartMs, long timestampEndMs) {
          SortedSet<DataPoint> result = new TreeSet<DataPoint>(new Comparator<DataPoint>() {
              @Override
              public int compare(DataPoint block1, DataPoint block2) {
                  return Longs.compare(block1.timestamp(), block2.timestamp());
              }
          });
          long keyStart = toTimeSeriesPoint(timestampStartMs);
          long keyEnd = toTimeSeriesPoint(timestampEndMs);
          if (keyEnd == timestampStartMs) {
              keyEnd = toTimeSeriesPoint(timestampEndMs - 1);
          }
  
          // build list of Redis map & field names
          List<Long> keys = new ArrayList<Long>();
          List<String> mapNames = new ArrayList<String>();
          List<String> fieldNames = new ArrayList<String>();
          String _name = getName();
          for (long timestamp = keyStart, _end = keyEnd; timestamp <= _end; timestamp += RESOLUTION_MS) {
              long bucketOffset = toTimeSeriesPoint(timestamp);
              long delta = bucketOffset % (RESOLUTION_MS * BUCKET_SIZE);
              long bucketId = bucketOffset - delta;
              long[] bucket = { bucketId, bucketOffset };
              keys.add(bucketOffset);
              String redisKey = _name + ":" + bucket[0];
              String redisField = String.valueOf(bucket[1]);
              mapNames.add(redisKey);
              fieldNames.add(redisField);
          }
  
          // use pipeline to get all data points at once
          try (ShardedJedis jedis = getJedis()) {
              ShardedJedisPipeline p = jedis.pipelined();
              for (int i = 0, n = mapNames.size(); i < n; i++) {
                  String mapName = mapNames.get(i);
                  String fieldName = fieldNames.get(i);
                  p.hget(mapName, fieldName);
              }
              List<?> _pointValues = p.syncAndReturnAll();
              for (int i = 0, n = keys.size(); i < n; i++) {
                  Long _key = keys.get(i);
                  Long _value = null;
                  try {
                      _value = Long.parseLong(_pointValues.get(i).toString());
                  } catch (Exception e) {
                      _value = null;
                  }
                  DataPoint dp = _value != null
                          ? new DataPoint(Type.SUM, _key.longValue(), _value.longValue(),
                                  RESOLUTION_MS)
                          : new DataPoint(Type.NONE, _key.longValue(), 0, RESOLUTION_MS);
                  result.add(dp);
              }
          }
  
          return result.toArray(DataPoint.EMPTY_ARR);
      }