Бинарный протокол cql и именованные связанные переменные в подготовленных запросах

представьте, что у меня есть простая таблица 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`.

Из этого описания я получаю следующее:

  1. «Значения» в QUERY не позволяют указать значение для определенного столбца. Это просто упорядоченный список значений. Я предполагаю, что [short] должен соответствовать точному количеству связанных переменных в подготовленном запросе?
  2. Все значения, независимо от их типов, представлены как [байты]. Если это правда, любая интерпретация значения [bytes] остается на сервере (преобразование в int, short, text,...)?

Предполагая, что я все понял правильно, мне интересно, можно ли использовать значение «null» [bytes], чтобы просто «пропустить» связанную переменную и не присваивать ей значение.

Я попробовал это и исправил драйвер cpp (это то, что меня интересует). Запросы выполняются, но когда я выполняю SELECT из clqsh, я не вижу строкового представления «null» для пустых полей, поэтому мне интересно, является ли это хаком, который по некоторым причинам не просто дает сбой, или предполагаемый способ сделать это .

Извините, но я действительно не думаю, что могу просто загрузить драйвер Java и посмотреть, как реализованы именованные связанные переменные! :(

---------- РЕДАКТИРОВАТЬ - РЕШЕНО ----------

Мои предположения были верны, и теперь в драйвер cpp добавлена ​​поддержка пропуска поля в подготовленном запросе (см. здесь ), используя нулевое [значение байтов].


person benelgiac    schedule 17.04.2014    source источник


Ответы (2)


Мне интересно, как правильно с точки зрения двоичного протокола предоставлять значения только для подмножества связанных переменных в подготовленном запросе?

Вам нужно подготовить запрос, который вставляет/обновляет только интересующее вас подмножество столбцов.

«Значения» в QUERY не предлагают способов предоставить значение для определенного столбца. Это просто упорядоченный список значений. Я предполагаю, что [short] должен соответствовать точному количеству связанных переменных в подготовленном запросе?

Это правильно. Порядок определяется метаданными столбца, которые Cassandra возвращает при подготовке запроса.

Все значения, независимо от их типов, представлены как [байты]. Если это правда, любая интерпретация значения [bytes] остается на сервере (преобразование в int, short, text,...)?

Это тоже правильно. Драйвер будет использовать возвращенные метаданные столбца, чтобы определить, как преобразовать собственные значения (строки, UUIDS, целые числа и т. д.) в двоичный (байтовый) формат. Cassandra выполняет обратную операцию на стороне сервера.

Предполагая, что я все понял правильно, мне интересно, можно ли использовать значение «null» [bytes], чтобы просто «пропустить» связанную переменную и не присваивать ей значение.

Вставка нулевого столбца интерпретируется как удаление.

person Tyler Hobbs    schedule 18.04.2014

Реализация того, чего я пытался достичь, была выполнена (см. здесь) на основе описанный мною принцип.

person benelgiac    schedule 28.04.2014