2011-09-30 2 views
1

J'essaie d'utiliser les requêtes dynamiques Squeryl (0.9.4 pour scala 2.8.1) (.? et inhibitWhen(...)). Ils fonctionnent bien lorsque j'utilise des champs String/Int/whatever, mais semblent interférer avec la syntaxe de squeryl pour les conditions booléennes.Booléens dans les requêtes dynamiques Squeryl

En supposant que nous avons quelque part défini is_trusted: Option[Boolean], le code suivant

where (obj => 
    obj.is_trusted === is_trusted.? 
) 

ne compile pas, jeter l'erreur suivante:

... type mismatch; 
[error] found : org.squeryl.dsl.ast.LogicalBoolean 
[error] required: org.squeryl.dsl.NonNumericalExpression[org.squeryl.PrimitiveTypeMode.BooleanType] 
[error]  obj.is_trusted === is_trusted.? 
[error]         ^

même celui-ci ne fonctionne pas, à défaut de la première condition :

where (obj => 
    obj.is_trusted.inhibitWhen(is_trusted == Some(true)) and 
    not(obj.is_trusted).inhibitWhen(is_trusted == Some(false)) 
) 

La seule version de travail utilise le not comme un indice pour le compilateur:

not(not(obj.is_trusted)).inhibitWhen(is_trusted != Some(true)) and 
not(obj.is_trusted).inhibitWhen(is_trusted != Some(false)) 

est-il un moyen plus sain d'esprit pour faire des requêtes dynamiques avec booléens?

Répondre

1

Hmm ... Je pense que c'est probablement un autre bogue causé par une conversion implicite de Boolean -> LogicalBoolean. Cette fonctionnalité a été abandonnée dans la version 0.9.5 en raison de problèmes similaires. Qu'est-ce que le.? devrait faire est de déclencher une conversion implicite de Boolean -> BooleanExpression mais puisque LogicalBoolean a. méthode aussi il y a un conflit et le dernier semble avoir la préséance. Je sais que ce n'est pas très jolie, mais essayez ceci:

where (obj => 
    obj.is_trusted === is_trusted.~.? 
) 

Le ~ devrait forcer la conversion en expression booléenne [Option [Boolean]] avant..? est invoqué.

+0

Cela semble fonctionner, merci! – Digal

+1

Heureux de vous aider. Si vous avez des problèmes à l'avenir, vous pouvez les publier sur https://groups.google.com/forum/#!forum/squeryl. Max, le créateur de Squeryl, a tendance à réagir assez rapidement. –