我使用 gocql 与我的 scylla 数据库交互并使用页面状态实现分页。但是,在使用 ALLOW FILTERING 时,如果过滤的数据不在定义的页面大小范围内,它会返回空记录。
这是我正在使用的示例架构
CREATE TABLE table (
partitonKeyOne TEXT,
partitonKeyTwo TEXT,
clusteringKeyOne TEXT,
filterColumnOne TEXT,
PRIMARY KEY ((partitonKeyOne, partitonKeyTwo), clusteringKeyOne)
) WITH CLUSTERING ORDER BY (clusteringKeyOne DESC);
这就是我使用页面状态实现分页的方式
getQuery := "SELECT * FROM table WHERE partitonKeyOne = 'abc' AND partitonKeyTwo = 'def' AND filterColumnOne = 'xyz' ALLOW FILTERING;"
queryResponse := db.GetSession().Query(
getQuery,
).Consistency(gocql.One)
queryResponse.PageSize(limit)
queryResponse.PageState(pageState)
iterator := queryResponse.Iter()
nextPageState := hex.EncodeToString(iterator.PageState())
现在,如果表总共有 100 条记录,并且我将每个页面大小限制为 20(即总共 5 页),那么如果 60 条记录与 WHERE 子句匹配,那么我希望通过更新 pageState 从这 60 条记录中获取 20 条记录。
但是,如果在定义的页面大小内没有与 WHERE 子句匹配的单个记录,则返回 null
这看起来像一个错误。由于几年前 Python CQL 驱动程序中就存在这样的错误(请参阅 https://github.com/scylladb/scylladb/issues/8203,请在 https://github.com/datastax/python-driver 中修复) /commit/1d9077d3f4c937929acc14f45c7693e76dde39a9),以及 Cassandra Java 驱动程序(https://github.com/apache/cassandra-java-driver/pull/1544) - 我怀疑 gocql 驱动程序也有相同的错误。
我在 Scylla 的 gocql 驱动程序分支中打开了一个新问题(我希望您正在使用它):https://github.com/scylladb/gocql/issues/180,我希望他们能修复它。
Scylla 的测试套件有一个测试,
test_filtering_contiguous_nonmatching_partition_range
,以验证 Scylla 本身没有这个 bug - 您可以通过过滤长分区进行扫描,除了最后一行之外的所有行都被过滤掉,并且迭代不会停止第一个空页 - 它会继续下去,直到最后产生匹配项。由于这个测试,我强烈怀疑该错误是在 gocql 中,而不是在 Scylla 中。