Триггер Cassandra 3.x: получение «ключа кластеризации и его ценности» - PullRequest
1 голос
/ 25 марта 2020

Мне нужно найти способ получить не только ключ разделения, но и ключ кластеризации через объект Разделения. Я знаю, как получить фактический ключ раздела и его значение из объекта, но не «ключи кластеризации»

Вот что я пробовал до сих пор: я пытался использовать «unfilteredIterator», но он возвращает только обычный столбцы (не ключ / значение кластеризации)

Моя таблица C* выглядит следующим образом

CREATE TABLE user.foo (
ac_id timeuuid,
mapping_id timeuuid,
country text,
state text,
PRIMARY KEY (ac_id, mapping_id) ) WITH CLUSTERING ORDER BY (mapping_id DESC) ...

Мой код:

public static String getKeyText(Partition update) {
    List<Map<String, String>> listOfMaps = new ArrayList<Map<String, String>>();
    CFMetaData cfm = update.metadata();
    Map<String, String> map = new HashMap<String, String>();
    try {
      UnfilteredRowIterator it = update.unfilteredIterator();
      while (it.hasNext()) {
          Unfiltered un = it.next();
          Clustering clt = (Clustering) un.clustering();
          Iterator<Cell> cells = update.getRow(clt).cells().iterator();
          Iterator<ColumnDefinition> columnss = update.getRow(clt).columns().iterator();
          while(columnss.hasNext()){
              ColumnDefinition columnDef = columnss.next();
              Cell cell = cells.next();
          }
      }
  } catch (Exception e) {

  }
}

Цель - получить имена и значения столбцов ac_id и mapping_id

Любая помощь приветствуется

1 Ответ

1 голос
/ 25 марта 2020

Я решил это следующим образом:

      public static String getKeyText(Partition update) {
    List<Map<String, String>> listOfMaps = new ArrayList<Map<String, String>>();
    CFMetaData cfm = update.metadata();
    Map<String, String> map = new HashMap<String, String>();

    String localKey = getKey(update.partitionKey().getKey(), cfm);
    // go over all columns and only add those that are clustering and partition keys
    List<ColumnDefinition> partitionKeyColumns = cfm.partitionKeyColumns();
    for (ColumnDefinition partitionColumn : partitionKeyColumns) {
      map.put(partitionColumn.name.toString(), localKey);
    }
    //Now work on clustering keys ONLY
    try {
      List<ColumnDefinition> clusteringKeyColumns = cfm.clusteringColumns();
      UnfilteredRowIterator it = update.unfilteredIterator();
      while (it.hasNext()) {
        Unfiltered un = it.next();
        Clustering clt = (Clustering) un.clustering();
        ByteBuffer[] clusteringKeyValues = clt.getRawValues();
        int i = 0;
        for (ColumnDefinition column : clusteringKeyColumns) {
          map.put(column.name.toString(), cfm.getKeyValidator().getString(clusteringKeyValues[i]));
          i++;
        }
      }
    } catch (Exception e) {
      logger.error(e.getMessage(), e);
    }
    listOfMaps.add(map);
    // Now process Clustering keys
    return gson.toJson(listOfMaps);
  }

Однако я не уверен, является ли это оптимальным способом решить эту проблему

...