这是另一个想法(有点不合常规)。您可以创建一个用户定义的函数来实现第二个范围过滤器(在 Cassandra 2.2 和更高版本中)。
假设您像这样定义您的表(显示为整数而不是时间戳以保持示例简单):
CREATE TABLE tasks (
p int,
task_id timeuuid,
start int,
end int,
end_range int static,
PRIMARY KEY(p, start));
现在我们创建一个用户定义的函数来根据结束时间检查返回的行,并返回匹配行的task_id,如下所示:
CREATE FUNCTION my_end_range(task_id timeuuid, end int, end_range int)
CALLED ON NULL INPUT RETURNS timeuuid LANGUAGE java AS
'if (end <= end_range) return task_id; else return null;';
现在我在第三个参数中使用了一个技巧。在明显的(主要?)疏忽中,您似乎无法将常量传递给用户定义的函数。所以为了解决这个问题,我们传递一个静态列 (end_range) 作为我们的常量。
所以首先我们必须设置我们想要的 end_range:
UPDATE tasks SET end_range=15 where p=1;
假设我们有这些数据:
SELECT * FROM tasks;
p | start | end_range | end | task_id
---+-------+-----------+-----+--------------------------------------
1 | 1 | 15 | 5 | 2c6e9340-4a88-11e5-a180-433e07a8bafb
1 | 2 | 15 | 7 | 3233a040-4a88-11e5-a180-433e07a8bafb
1 | 4 | 15 | 22 | f98fd9b0-4a88-11e5-a180-433e07a8bafb
1 | 8 | 15 | 15 | 37ec7840-4a88-11e5-a180-433e07a8bafb
现在让我们获取 start >= 2 和 end
SELECT start, end, my_end_range(task_id, end, end_range) FROM tasks
WHERE p=1 AND start >= 2;
start | end | test.my_end_range(task_id, end, end_range)
-------+-----+--------------------------------------------
2 | 7 | 3233a040-4a88-11e5-a180-433e07a8bafb
4 | 22 | null
8 | 15 | 37ec7840-4a88-11e5-a180-433e07a8bafb
这样就可以为您提供匹配的 task_id 并且您必须忽略空行(我还没有找到使用 UDF 删除行的方法)。您会注意到 start >= 2 的过滤器在将其传递给 UDF 之前删除了一行。
显然,无论如何这不是一个完美的方法,但它可能是你可以使用的东西。 :)