Cassandra将Token转换为long

问题描述

我想在表上运行这样的查询

SELECT count(*) FROM mytable WHERE token(_id) >= -9220405531215751472 AND token(_id) < -9215701564955960000 AND state=true ALLOW FILTERING;

我先按Metadata.getTokenMap(),然后按tokenMap.getTokenRanges()读取令牌范围。但这给了我开始令牌和结束令牌作为令牌对象(例如 Murmur3Token(9187337865070158013) )!如何将其转换为 long String 以在查询中使用:

CqlSession session = builder.build();

Metadata Metadata = session.getMetadata();
if (Metadata.getTokenMap().isPresent()) {

   TokenMap tokenMap = Metadata.getTokenMap().get();

   for(TokenRange range : tokenMap.getTokenRanges()) {

          System.out.println(range.getStart()); // output Murmur3Token(9187337865070158013)
   }
}

解决方法

我发现了如何转换它!必须将其显式转换为Murmur3Token并调用getValue方法。

long start,end;
String sql;

for(TokenRange range : tokenMap.getTokenRanges()) {
    start = ((Murmur3Token) range.getStart()).getValue();
    end = ((Murmur3Token) range.getEnd()).getValue();
    sql = "SELECT count(*) FROM mytable WHERE token(_id) >= "+start+" AND token(_id) < "+end+" AND state=true ALLOW FILTERING;";
    System.out.println(i +":" + sql);
}