Gocql 允许过滤返回具有页面大小的空记录

问题描述 投票:0回答:1

我使用 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

cassandra cql scylla gocql
1个回答
0
投票

这看起来像一个错误。由于几年前 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 中。

© www.soinside.com 2019 - 2024. All rights reserved.