class CassandraMessageFastViewProjection implements MessageFastViewProjection {

    @Override
    public Mono<MessageFastViewPrecomputedProperties> retrieve(MessageId messageId) {
        checkMessage(messageId);

        return cassandraAsyncExecutor.executeSingleRow(retrieveStatement.bind()
                .setUUID(MESSAGE_ID, ((CassandraMessageId) messageId).get())
                .setConsistencyLevel(ConsistencyLevel.ONE))
            .map(this::fromRow)
            .doOnNext(preview -> metricRetrieveHitCount.increment())
            .switchIfEmpty(Mono.fromRunnable(metricRetrieveMissCount::increment))
            .onErrorResume(e -> {
                LOGGER.error("Error while retrieving MessageFastView projection item for {}", messageId, e);
                return Mono.empty();
            });
    }

    @Inject  CassandraMessageFastViewProjection(MetricFactory metricFactory, Session session);

}