2017-05-31 10 views
0

パラメータ化されたクエリにワイルドカード_を渡すことはできますか?このようなもの:データログのワイルドカード `_`をパラメータ化されたクエリに渡すことはできますか?

(d/q [:find ?e 
     :in $ ?type 
     :where [?e :type ?type]] db _) 

上記のように試してみると、エラーが発生しました。これを行う方法はありますか?

私はこのようになります、クエリですべてのものを得ることができることを知っている:

(D/Qの[:??[E:]タイプE 見つける]デシベル)

をしかし、私を:typeで結果をフィルタリングしたくないときに別のクエリを作成する必要がないようにすることです。ユースケースは、例えば、結果をフィルタリングしてもしなくてもよいAPIエンドポイントである。

+0

あなたは何をしようとしているのかの例を追加できますか? –

答えて

1

私が正しくあなたを理解していれば、次のように入力することができるはず:Datomicで

(d/q [:find ?e 
     :in $ 
     :where [?e :type]] db) 

を、任意の不特定の値がワイルドカードであると考えられています。上記のクエリは、値にかかわらず、:type属性を持つすべてのエンティティのリストを返します。

更新

はDatomicのクエリが?type変数に代入する5または:awesomeのようなプレーンな値を受け入れるように設計されています。 _(または引用されたバージョン'_)のようなシンボルは、Datomicが期待するパターンに適合しません。

私はいくつかのバリエーションを試してみましたが、提案した方法で変数?typeのシンボル_を受け入れることができませんでした。私はあなたがワイルドカードケースのための別のクエリを書かなければならないと思う。

本質的に、ワイルドカード_は、$のようなDatomicクエリ構文の特別なシンボル(別名「予約語」)です。 Datomicはまた、?eまたは?typeのような?で始まるクエリ変数を強制します。これらの要件は、変更できないDatomic DSLの一部です。

手書きの別のクエリ以外の唯一の回避策は、ベース部分とアドオン部分からクエリベクトルを動的に構成することです。さまざまなクエリを手書きするよりも簡単かどうかは、それぞれの状況によって異なります。

+0

私はより多くの文脈を提供していたはずです。これは、フィルターが適用されているかどうかにかかわらず結果をフェッチするAPIエンドポイント用です。私が避けようとしているのは、別のクエリーを構築するとコードの混乱を招くため、ワイルドカードを提供することがより簡潔になるため、特定の ':type'でフィルターがないときには、別のクエリー構造を構築する必要があります。 – fraxture