@PooledConnection
  public void deleteColumn(
      String keyspace,
      String column_family,
      String key,
      String column,
      ConsistencyLevel consistency_level,
      boolean purgeIndex)
      throws InvalidRequestException, UnavailableException, TimedOutException, TException,
          HttpException, IOException {
    ColumnPath path = new ColumnPath(column_family);
    path.setColumn(ByteBufferUtil.bytes(column));
    getConnection(keyspace)
        .remove(
            ByteBufferUtil.bytes(key), path, System.currentTimeMillis() * 1000, consistency_level);

    // TODO: Revisit deleting a single field because it requires a fetch
    // first.
    // Evidently it is impossible to remove just a field from a document in
    // SOLR
    // http://stackoverflow.com/questions/4802620/can-you-delete-a-field-from-a-document-in-solr-index
    if (config.isIndexingEnabled() && purgeIndex) {
      indexer.delete(column_family, key);
      JSONObject json = this.getSlice(keyspace, column_family, key, consistency_level);
      json.remove(column);
      indexer.index(column_family, key, json);
    }
  }
  @PooledConnection
  public void setColumn(
      String keyspace,
      String column_family,
      String key,
      JSONObject json,
      ConsistencyLevel consistency_level,
      boolean index,
      long timestamp)
      throws InvalidRequestException, UnavailableException, TimedOutException, TException,
          HttpException, IOException {
    List<Mutation> slice = new ArrayList<Mutation>();
    for (Object field : json.keySet()) {
      String name = (String) field;
      String value = (String) json.get(name);
      Column c = new Column();
      c.setName(ByteBufferUtil.bytes(name));
      c.setValue(ByteBufferUtil.bytes(value));
      c.setTimestamp(timestamp);

      Mutation m = new Mutation();
      ColumnOrSuperColumn cc = new ColumnOrSuperColumn();
      cc.setColumn(c);
      m.setColumn_or_supercolumn(cc);
      slice.add(m);
    }
    Map<ByteBuffer, Map<String, List<Mutation>>> mutationMap =
        new HashMap<ByteBuffer, Map<String, List<Mutation>>>();
    Map<String, List<Mutation>> cfMutations = new HashMap<String, List<Mutation>>();
    cfMutations.put(column_family, slice);
    mutationMap.put(ByteBufferUtil.bytes(key), cfMutations);
    getConnection(keyspace).batch_mutate(mutationMap, consistency_level);

    if (config.isIndexingEnabled() && index) indexer.index(column_family, key, json);
  }
  @PooledConnection
  public long deleteRow(
      String keyspace,
      String column_family,
      String key,
      ConsistencyLevel consistency_level,
      boolean purgeIndex)
      throws InvalidRequestException, UnavailableException, TimedOutException, TException,
          HttpException, IOException {
    long deleteTime = System.currentTimeMillis() * 1000;
    ColumnPath path = new ColumnPath(column_family);
    getConnection(keyspace).remove(ByteBufferUtil.bytes(key), path, deleteTime, consistency_level);

    // Update Index
    if (config.isIndexingEnabled() && purgeIndex) {
      indexer.delete(column_family, key);
    }
    return deleteTime;
  }
  @SuppressWarnings("unchecked")
  @PooledConnection
  public void addColumn(
      String keyspace,
      String column_family,
      String rowkey,
      String column_name,
      String value,
      ConsistencyLevel consistency_level,
      boolean index)
      throws InvalidRequestException, UnavailableException, TimedOutException, TException,
          HttpException, IOException {
    JSONObject json = new JSONObject();
    json.put(column_name, value);
    this.setColumn(keyspace, column_family, rowkey, json, consistency_level, index);

    // TODO: Revisit adding a single field because it requires a fetch
    // first.
    if (this.config.isIndexingEnabled() && index) {
      JSONObject indexJson = this.getSlice(keyspace, column_family, rowkey, consistency_level);
      indexJson.put(column_name, value);
      indexer.index(column_family, rowkey, indexJson);
    }
  }