Чтение блога DataStax , Я тестировал запрос среза, даже если блог был написан с помощью Cassandra 2, а мы находимся на 3.
Итак, я определяю тестовую таблицу, как показано ниже.
CREATE TABLE foo(
part_key TEXT,
start_ts INT,
end_ts INT,
PRIMARY KEY(part_key, start_ts, end_ts)
) WITH CLUSTERING ORDER BY (start_ts ASC, end_ts ASC);
Некоторые приспособления вставлены в эту таблицу.
INSERT INTO foo(part_key, start_ts, end_ts) VALUES ('A', 1, 5);
INSERT INTO foo(part_key, start_ts, end_ts) VALUES ('A', 2, 3);
INSERT INTO foo(part_key, start_ts, end_ts) VALUES ('B', 4, 7);
INSERT INTO foo(part_key, start_ts, end_ts) VALUES ('B', 9, 13);
INSERT INTO foo(part_key, start_ts, end_ts) VALUES ('B', 1, 2);
INSERT INTO foo(part_key, start_ts, end_ts)
VALUES ('B', 9, 9999); -- 9999 = symbolic value for no end
Сначала проверяю раздел B
:
> SELECT * FROM foo WHERE part_key='B';
part_key | start_ts | end_ts
----------+----------+--------
B | 1 | 2
B | 4 | 7
B | 9 | 13
B | 9 | 9999
(4 rows)
Мы не можем выполнить "естественный" запрос SELECT * FROM foo WHERE part_key='B' AND start_ts <= 7 AND end_ts >= 7
, так как это вызовет следующую ошибку.
InvalidRequest: Error from server: code=2200 [Invalid query] message="Clustering column "end_ts" cannot be restricted (preceding column "start_ts" is restricted by a non-EQ relation)"
В блоге DataStax есть запрос, как показано ниже.
SELECT * FROM numberOfRequests
WHERE cluster = ‘cluster1’
AND date = ‘2015-06-05’
AND datacenter = 'US_WEST_COAST'
AND (hour, minute) >= (12, 30) AND (hour) < (14)
Поэтому мы пробуем этот обходной путь с помощью следующего запроса среза, используя start_ts >= -9999
как всегда true и позволяя вместе указать условие неравенства для end_ts
.
SELECT * FROM foo WHERE part_key='B'
AND (start_ts, end_ts) >= (-9999, 7) AND start_ts <= 7; -- -9999 = min_value
Он выполняется без предупреждения и дает результаты, указанные ниже.
part_key | start_ts | end_ts
----------+----------+--------
B | 1 | 2
B | 4 | 7
(2 rows)
На этом этапе строка №1 (с start_ts = 1
) не должна быть для меня, поскольку end_ts >= 7
не соответствует действительности для этой строки. Поскольку start_ts >= -9999
всегда верно, кажется, что первое условие (start_ts, end_ts) >= (-9999, 7)
просто игнорируется: результаты совпадают с результатами запроса SELECT * FROM foo WHERE part_key='B' AND start_ts <= 7
.
Читая пример блога, я подумал, что (по крайней мере, с C2.2), (start_ts, end_ts) >= (-9999, 7) AND start_ts <= 7
будет означать start_ts >= -9999 AND end_ts >= 7 AND start_ts <= 7
, аналогично (start_ts, end_ts) = (4, 7)
, что означает start_ts = 4 AND end_ts = 7
, как показано ниже.
SELECT * FROM foo WHERE part_key='B' AND (start_ts, end_ts) = (4, 7);
part_key | start_ts | end_ts
----------+----------+--------
B | 4 | 7
(1 rows)
Как на самом деле интерпретируется такое кортежное неравенство? Есть ли способ обновить его, чтобы он "работал"?