Логические значения в динамических запросах Squeryl - PullRequest
1 голос
/ 30 сентября 2011

Я пытаюсь использовать Squeryl (0.9.4 для scala 2.8.1) динамические запросы (.? и inhibitWhen(...)). Они работают нормально, пока я использую поля String / Int / что угодно, но, похоже, они мешают синтаксическому сахару squeryl для логических условий.

Предполагая, что где-то определено is_trusted: Option[Boolean], следующий код

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

не компилируется, выдав следующую ошибку:

... 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]                                   ^

даже этот не работает, при первом условии:

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

Единственная рабочая версия использует двойной not в качестве подсказки для компилятора:

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

Есть ли более разумный способ выполнять динамические запросы с логическими значениями?

1 Ответ

1 голос
/ 04 октября 2011

Хм ... Я думаю, что это, вероятно, еще одна ошибка, вызванная неявным преобразованием из Boolean -> LogicalBoolean.Эта функция устарела в 0.9.5 из-за подобных проблем.Что за .?нужно сделать, это вызвать неявное преобразование из Boolean -> BooleanExpression, но поскольку LogicalBoolean имеет.?Метод также существует конфликт, и последний, кажется, имеет приоритет.Я знаю, что это не очень красиво, но попробуйте это:

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

. ~ Должен форсировать преобразование в BooleanExpression [Option [Boolean]] раньше.?вызывается.

...