@Override
  public QueueSet getSubscribers(
      String publisherQueuePath, String firstSubscriberQueuePath, int limit) {

    UUID publisherQueueId = getQueueId(publisherQueuePath);

    Keyspace ko = cass.getApplicationKeyspace(applicationId);

    if (firstSubscriberQueuePath != null) {
      limit += 1;
    }

    List<HColumn<String, UUID>> columns =
        createSliceQuery(ko, ue, se, ue)
            .setKey(publisherQueueId)
            .setColumnFamily(QUEUE_SUBSCRIBERS.getColumnFamily())
            .setRange(normalizeQueuePath(firstSubscriberQueuePath), null, false, limit + 1)
            .execute()
            .get()
            .getColumns();

    QueueSet queues = new QueueSet();

    int count = Math.min(limit, columns.size());
    if (columns != null) {
      for (int i = firstSubscriberQueuePath != null ? 1 : 0; i < count; i++) {
        HColumn<String, UUID> column = columns.get(i);
        queues.addQueue(column.getName(), column.getValue());
      }
    }
    if (columns.size() > limit) {
      queues.setMore(true);
    }
    return queues;
  }
  public void batchSubscribeToQueue(
      Mutator<ByteBuffer> batch,
      String publisherQueuePath,
      UUID publisherQueueId,
      String subscriberQueuePath,
      UUID subscriberQueueId,
      long timestamp) {

    batch.addInsertion(
        bytebuffer(publisherQueueId),
        QUEUE_SUBSCRIBERS.getColumnFamily(),
        createColumn(subscriberQueuePath, subscriberQueueId, timestamp, se, ue));

    batch.addInsertion(
        bytebuffer(subscriberQueueId),
        QUEUE_SUBSCRIPTIONS.getColumnFamily(),
        createColumn(publisherQueuePath, publisherQueueId, timestamp, se, ue));
  }
  public void batchUnsubscribeFromQueue(
      Mutator<ByteBuffer> batch,
      String publisherQueuePath,
      UUID publisherQueueId,
      String subscriberQueuePath,
      UUID subscriberQueueId,
      long timestamp) {

    batch.addDeletion(
        bytebuffer(publisherQueueId),
        QUEUE_SUBSCRIBERS.getColumnFamily(),
        subscriberQueuePath,
        se,
        timestamp);

    batch.addDeletion(
        bytebuffer(subscriberQueueId),
        QUEUE_SUBSCRIPTIONS.getColumnFamily(),
        publisherQueuePath,
        se,
        timestamp);
  }
  public Message batchPostToQueue(
      Mutator<ByteBuffer> batch,
      String queuePath,
      Message message,
      MessageIndexUpdate indexUpdate,
      long timestamp) {

    queuePath = normalizeQueuePath(queuePath);
    UUID queueId = getQueueId(queuePath);

    message.sync();

    addMessageToMutator(batch, message, timestamp);

    long shard_ts = roundLong(message.getTimestamp(), QUEUE_SHARD_INTERVAL);

    logger.debug("Adding message with id '{}' to queue '{}'", message.getUuid(), queueId);

    batch.addInsertion(
        getQueueShardRowKey(queueId, shard_ts),
        QUEUE_INBOX.getColumnFamily(),
        createColumn(message.getUuid(), ByteBuffer.allocate(0), timestamp, ue, be));

    long oldest_ts = Long.MAX_VALUE - getTimestampInMicros(message.getUuid());
    batch.addInsertion(
        bytebuffer(queueId),
        QUEUE_PROPERTIES.getColumnFamily(),
        createColumn(QUEUE_OLDEST, message.getUuid(), oldest_ts, se, ue));

    long newest_ts = getTimestampInMicros(message.getUuid());
    batch.addInsertion(
        bytebuffer(queueId),
        QUEUE_PROPERTIES.getColumnFamily(),
        createColumn(QUEUE_NEWEST, message.getUuid(), newest_ts, se, ue));

    batch.addInsertion(
        bytebuffer(getQueueId("/")),
        QUEUE_SUBSCRIBERS.getColumnFamily(),
        createColumn(queuePath, queueId, timestamp, se, ue));

    counterUtils.batchIncrementQueueCounter(
        batch, getQueueId("/"), queuePath, 1L, timestamp, applicationId);

    if (indexUpdate == null) {
      indexUpdate = new MessageIndexUpdate(message);
    }
    indexUpdate.addToMutation(batch, queueId, shard_ts, timestamp);

    counterUtils.addMessageCounterMutations(batch, applicationId, queueId, message, timestamp);

    batch.addInsertion(
        bytebuffer(queueId),
        QUEUE_PROPERTIES.getColumnFamily(),
        createColumn(QUEUE_CREATED, timestamp / 1000, Long.MAX_VALUE - timestamp, se, le));

    batch.addInsertion(
        bytebuffer(queueId),
        QUEUE_PROPERTIES.getColumnFamily(),
        createColumn(QUEUE_MODIFIED, timestamp / 1000, timestamp, se, le));

    return message;
  }