我需要在java中实现一个cassandra触发器,它将对INSERT vs UPDATE操作采取不同的操作。
我已经看到了如何在问题 Cassandra 示例触发器中识别 DELETE 操作以获取已删除的行和列值,但我在 ColumnFamily 对象中看不到任何允许代码区分插入与更新的方法,有没有办法实现这一点?
INSERT 和 UPDATE 之间在概念上没有任何区别。事实上,插入和更新只是突变。Cassandra给了他们不同的名字,以便来自关系数据库的人有熟悉的概念。
正如@doanduyhai提到的,根据Casssandra的消息来源,只有INSERT操作更新行时间戳(LivenessInfo(。对于其他操作,此时间戳不会更新,等于 Long.MIN_VALUE。
检查插入操作的自定义触发器
public class CustomTrigger implements ITrigger {
@Override
public Collection<Mutation> augment(Partition partition) {
checkQueryType(partition));
return Collections.emptyList();
}
private void checkQueryType(Partition partition) {
UnfilteredRowIterator it = partition.unfilteredIterator();
while (it.hasNext()) {
Unfiltered unfiltered = it.next();
Row row = (Row) unfiltered;
if (isInsert(row)) {
// Implement insert related logic
}
}
}
private boolean isInsert(Row row) {
return row.primaryKeyLivenessInfo().timestamp() != Long.MIN_VALUE;
}
}