2017-08-11 7 views
0

ignite C++ APIを使用して、特定のフィールドを選択するためにSqlFieldsQueryを実行する方法を見つけようとしていますが、これは一連のキーに対して行います。これを行うにはSqlFieldsQuery固有のキーを照会

一つの方法は、このようなSqlFieldsQueryを行うことです

keys_stringは、カンマで区切られた文字列としてキーのリストがある
SqlFieldsQuery("select field from Table where _key in (" + keys_string + ")") 

残念ながら、これは、キーのセットに対してcache.GetAll(keys)keysを実行するのに比べて、非常に長い時間がかかります。

igniteキャッシュのキーセットの特定のフィールドを取得する代替方法がありますか?

EDIT:

答えを読んだ後、私はにクエリを変更してみました:私は、このようなキーの私のセットから引数を追加

auto query = SqlFieldsQuery("select field from Table t join table(_key bigint = ?) i on t._key = i._key") 

for(const auto& key: keys) query.AddArgument(key); 

しかし、クエリを実行すると、エラーが表示されます。

Failed to bind parameter [idx=2, obj=159957, stmt=prep0: select field from Table t join table(_key bigint = ?) i on t._key = i._key {1: 159956}]

「?」が1つのみであるため、明らかにこれは機能しません。

私はvector<int64_t>の鍵を渡そうとしましたが、基本的にはstd::vector<int64_t>が点火を特化していないというエラーが出ましたBinaryType。だから私は定義した通りにこれをしたhere。例:

writer.WriteInt64Array("data", data.data(), data.size()) 

私はフィールドに任意の名前「データ」を与えました。そして、これはエラーになり:

Failed to run map query remotely.

は残念ながら、C++ APIは、どちらも十分に文書化なく、また完全であるので、私は何かが足りないか、APIを渡すために許可していないということだ場合、私は思ったんだけど配列をSqlFieldsQueryの引数として指定します。

+0

あなたはまだC++でのパラメータとして配列を渡すことはできません。'GetAll()'を使うことができるのであれば、なぜあなたはクエリを使いたいのですか? – isapego

+0

私は、帯域幅の制限のために、特定のフィールドの照会がオブジェクト全体を取得するよりも速いかもしれないと言われました。 – Grieverheart

答えて

1

演算子を使用したクエリ "IN"は常にインデックスを使用するとは限りません。

select field from Table t join table(id bigint = ?) i on t.id = i.id 

をして、それが好き呼び出す:この問題を回避するには、次のようにクエリを書き直すことができ

new SqlFieldsQuery(
     "select field from Table t join table(id bigint = ?) i on t.id = i.id") 
     .setArgs(new Object[]{ new Integer[] {2, 3, 4} })) 
関連する問題