представьте, что у меня есть простая таблица CQL
CREATE TABLE test (
k int PRIMARY KEY,
v1 text,
v2 int,
v3 float
)
Есть много случаев, когда можно было бы использовать бессхемную сущность Cassandra, установить только некоторые значения и выполнить, например,
INSERT into test (k, v1) VALUES (1, 'something');
При написании приложения для записи в такую CQL-таблицу в кластере Cassandra сразу возникает необходимость сделать это с помощью подготовленных операторов, по соображениям производительности.
В разных драйверах это решается по-разному. Драйвер Java, например, представил (с помощью модификации двоичного протокола CQL) возможность использования именованных связанных переменных. Очень практично: CASSANDRA-6033
Мне интересно, как правильно с точки зрения двоичного протокола предоставлять значения только для подмножества связанных переменных в подготовленном запросе?
Фактически значения предоставляются подготовленному запросу путем построения списка значений, как описано в
4.1.4. QUERY
[...]
Values. In that case, a [short] <n> followed by <n> [bytes]
values are provided. Those value are used for bound variables in
the query.
Обратите внимание на определение [bytes]
[bytes] A [int] n, followed by n bytes if n >= 0. If n < 0,
no byte should follow and the value represented is `null`.
Из этого описания я получаю следующее:
- «Значения» в QUERY не позволяют указать значение для определенного столбца. Это просто упорядоченный список значений. Я предполагаю, что [short] должен соответствовать точному количеству связанных переменных в подготовленном запросе?
- Все значения, независимо от их типов, представлены как [байты]. Если это правда, любая интерпретация значения [bytes] остается на сервере (преобразование в int, short, text,...)?
Предполагая, что я все понял правильно, мне интересно, можно ли использовать значение «null» [bytes], чтобы просто «пропустить» связанную переменную и не присваивать ей значение.
Я попробовал это и исправил драйвер cpp (это то, что меня интересует). Запросы выполняются, но когда я выполняю SELECT из clqsh, я не вижу строкового представления «null» для пустых полей, поэтому мне интересно, является ли это хаком, который по некоторым причинам не просто дает сбой, или предполагаемый способ сделать это .
Извините, но я действительно не думаю, что могу просто загрузить драйвер Java и посмотреть, как реализованы именованные связанные переменные! :(
---------- РЕДАКТИРОВАТЬ - РЕШЕНО ----------
Мои предположения были верны, и теперь в драйвер cpp добавлена поддержка пропуска поля в подготовленном запросе (см. здесь ), используя нулевое [значение байтов].