class RedisClusterOnlineRetriever implements OnlineRetriever {

  @Override
  public List<Optional<FeatureRow>> getOnlineFeatures(
      List<EntityRow> entityRows, FeatureSetRequest featureSetRequest) {

    // get features for this features/featureset in featureset request
    FeatureSetSpec featureSetSpec = featureSetRequest.getSpec();
    List<RedisKey> redisKeys = buildRedisKeys(entityRows, featureSetSpec);
    FeatureRowDecoder decoder =
        new FeatureRowDecoder(generateFeatureSetStringRef(featureSetSpec), featureSetSpec);
    List<Optional<FeatureRow>> featureRows = new ArrayList<>();
    try {
      featureRows = getFeaturesFromRedis(redisKeys, decoder);
    } catch (InvalidProtocolBufferException | ExecutionException e) {
      throw Status.INTERNAL
          .withDescription("Unable to parse protobuf while retrieving feature")
          .withCause(e)
          .asRuntimeException();
    }
    return featureRows;
  }

  private  RedisClusterOnlineRetriever(Builder builder);

}