単純な CQL テーブルがあるとします。
CREATE TABLE test (
k int PRIMARY KEY,
v1 text,
v2 int,
v3 float
)
Cassandra のスキーマのないエッセンスを利用して、値の一部のみを設定し、たとえば、
INSERT into test (k, v1) VALUES (1, 'something');
Cassandra クラスター内のこのような CQL テーブルに書き込むアプリケーションを作成する場合、パフォーマンス上の理由から、準備済みステートメントを使用してこれを行う必要がすぐに生じます。
これは、さまざまなドライバーによってさまざまな方法で処理されます。たとえば、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] として表されます。その場合、[bytes] 値の解釈はサーバーに委ねられます (int、short、text などへの変換)?
これで問題ないと仮定すると、「null」[bytes] 値を使用して、バインドされた変数を単に「スキップ」し、それに値を割り当てないようにすることができるかどうか疑問に思います。
私はこれを試し、cpp ドライバーにパッチを当てました (これは私が興味を持っていることです)。クエリは実行されますが、clqsh から SELECT を実行すると、空のフィールドの「null」文字列表現が表示されないため、これは何らかの理由で単にクラッシュするだけではないハックなのか、それとも意図した方法なのか疑問に思います。 .
申し訳ありませんが、Java ドライバーをダウンロードして、名前付きバインド変数がどのように実装されているかを確認することはできないと思います。:(
---------- 編集 - 解決済み ----------
私の仮定は正しかったので、null [バイト値] を使用して、準備されたクエリでフィールドをスキップするサポートが cpp ドライバーに追加されました (こちらを参照)。