Вот еще одна идея (несколько нетрадиционная). Вы можете создать определенную пользователем функцию для реализации фильтра второго диапазона (в 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
Теперь давайте получить TASK_ID-х, которые начинаются> = 2 и конец < = 15:
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 и вы должны игнор e нулевые строки (я не выяснил способ сброса строк с помощью UDF). Вы заметите, что фильтр start> = 2 упал на одну строку, прежде чем передать его в UDF.
В любом случае, это не идеальный метод, но это может быть то, с чем вы можете работать. :)
Спасибо Джим. Но в моей ситуации даже после запроса диапазона на start_on приведет к большому количеству записей, которые мне придется фильтровать на стороне клиента, что я пытаюсь уменьшить. Единственным решением, которое я вижу до сих пор, является наличие другой таблицы с дублирующимися данными, но имеющая end_on в качестве столбца кластеризации, а затем объединение результатов в приложении. –
Я думаю, что этот подход будет медленнее, чем я предложил, поскольку вы читали бы больше строк (каждый раз читал бы каждую желаемую строку, плюс отклонения). Другой подход заключается в использовании искры, которая может выполнять запрос диапазона для нескольких полей, поскольку поддерживает более полную реализацию SQL. –