2017-05-31 6 views
0

Est-il possible de passer un caractère générique _ dans une requête paramétrée? Quelque chose comme ceci:Est-il possible de transmettre le caractère générique datalog `_` dans une requête paramétrée?

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

Lorsque j'ai essayé cela comme écrit ci-dessus il a jeté une erreur. Y a-t-il un moyen de faire cela?

Je sais que je peux tout avec une requête qui ressemble à ceci:

(d/q [: trouver e : où [e: type]] db)

Mais mon L'objectif est d'éviter de devoir créer des requêtes séparées lorsque je ne souhaite pas filtrer les résultats par :type. Le cas d'utilisation est, par exemple, et le point de terminaison API qui peut ou non filtrer les résultats.

+0

Pouvez-vous ajouter un exemple de ce que vous essayez de faire? –

Répondre

1

Si je comprends bien, vous devriez être en mesure de taper:

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

En Datomic, toutes les valeurs non spécifiées sont considérées comme des jokers. La requête ci-dessus retournera une liste de toutes les entités qui ont l'attribut :type, indépendamment de la valeur.

Mise à jour

requête de Datomic est conçu pour accepter une valeur simple comme 5 ou :awesome à être substitué dans la variable ?type. Un symbole comme _ (ou la version citée '_) ne correspond pas au modèle attendu par Datomic. Juste pour le plaisir, j'ai essayé plusieurs variantes et je n'ai pas pu obtenir que Datomic accepte le symbole '_ pour la variable ?type comme vous l'avez proposé. Je pense que vous devrez écrire une requête séparée pour le cas générique. Fondamentalement, le caractère générique _ est un symbole spécial (également appelé "mot réservé") dans la syntaxe de requête Datomic, tout comme $. Datomic impose également que les variables de requête commencent par ? comme ?e ou ?type. Ces exigences font partie de la liste DSL de Datomic que vous ne pouvez pas modifier. La seule solution de contournement, outre l'écriture manuscrite de requêtes distinctes, consisterait à composer dynamiquement le vecteur de requête à partir d'une partie de base et de parties ajoutées. Que cela soit plus facile ou plus difficile que d'écrire à la main les différentes requêtes dépend de votre situation spécifique.

+0

J'aurais dû fournir plus de contexte. C'est pour un point d'extrémité API qui récupère les résultats avec ou sans filtre appliqué. Ce que j'essaie d'éviter, c'est de construire une structure de requête différente quand il n'y a pas de filtre par type: car la construction de requêtes séparées crée un désordre de code, alors que fournir un caractère générique serait plus concis. – fraxture