Cassandra 3.x触发列值

时间:2016-07-26 07:24:09

标签: java triggers cassandra

我使用3.4 Cassandra触发器API,它引入了修改过的ITrigger接口,例如:https://github.com/apache/cassandra/blob/trunk/examples/triggers/src/org/apache/cassandra/triggers/AuditTrigger.java

我的问题是从插入/更新语句的分区对象中提取列值的方法是什么?如果是这样我怎么能这样做?

public interface ITrigger
{
    public Collection<Mutation> augment(Partition update);
}

某些代码段会很有用。

2 个答案:

答案 0 :(得分:2)

试试这个!!!

public Collection<Mutation> augment(Partition update) {
    try {
        UnfilteredRowIterator it = update.unfilteredIterator();
        while (it.hasNext()) {
            Unfiltered un = it.next();
            Clustering clt = (Clustering) un.clustering();  
            Iterator<Cell> cls = update.getRow(clt).cells().iterator();
            while(cls.hasNext()){
                Cell cell = cls.next();
                 String data = new String(cell.value().array()); // If cell type is text
            }
        }
    } catch (Exception e) {
      ...
    }
    return null;
}

答案 1 :(得分:1)

public class HelloWorld implements ITrigger
{
    private static final Logger logger = LoggerFactory.getLogger(HelloWorld.class);

    public Collection<Mutation> augment(Partition partition)
    {
        String tableName = partition.metadata().cfName;
        logger.info("Table: " + tableName);

        JSONObject obj = new JSONObject();
        obj.put("message_id", partition.metadata().getKeyValidator().getString(partition.partitionKey().getKey()));

        try {
            UnfilteredRowIterator it = partition.unfilteredIterator();
            while (it.hasNext()) {
                Unfiltered un = it.next();
                Clustering clt = (Clustering) un.clustering();  
                Iterator<Cell> cells = partition.getRow(clt).cells().iterator();
                Iterator<ColumnDefinition> columns = partition.getRow(clt).columns().iterator();

                while(columns.hasNext()){
                    ColumnDefinition columnDef = columns.next();
                    Cell cell = cells.next();
                    String data = new String(cell.value().array()); // If cell type is text
                    obj.put(columnDef.toString(), data);
                }
            }
        } catch (Exception e) {

        }
        logger.debug(obj.toString());

        return Collections.emptyList();
    }        
}