我已经标记类型实现为here。布尔运算在Slick on tagged布尔类型
与他们我标记所有我的模型的属性是或多或少通用(原语,String
等)。当我用油滑的映射模型到dabase我有他们通常是这样定义的:
val isDeleted = column[Boolean @@ CompanyDeleted]("deleted", O.Default(false.tag))
而类型映射器我定义为:
implicit def taggedBooleanColumnType[U]: BaseColumnType[Boolean @@ U] =
MappedColumnType.base[Boolean @@ U, Boolean](_.untag, _.tag[U])
它让我做模型的所有CRUD操作。然而,当我尝试例如为:
def fetchById(companyId: Long @@ CompanyId): SqlAction[Option[Company], NoStream, Read] =
companies.filter(c => c.companyId === companyId && !c.isDeleted).result.headOption
为Rep[Boolean @@ CompanyDeleted]
是nethier Rep[Boolean]
也不Rep[Option[Boolean]]
这会失败。当我创建implicits:
implicit def taggedBooleanExtensionMethods[P1, U](c: slick.lifted.Rep[P1]): TaggedBooleanExtensionMethods[P1, U] =
new TaggedBooleanExtensionMethods[P1, U](c)
implicit def taggedBooleanColumnCanBeQueryCondition[U]: CanBeQueryCondition[slick.lifted.Rep[Boolean @@ U]] =
new CanBeQueryCondition[slick.lifted.Rep[Boolean @@ U]] {
def apply(value: slick.lifted.Rep[Boolean @@ U]) = value
}
class TaggedBooleanExtensionMethods[P1, U](val c: Rep[P1])
extends AnyVal
with ExtensionMethods[Boolean @@ U, P1] {
protected[this] implicit def b1Type = implicitly[TypedType[Boolean @@ U]]
import slick.lifted.FunctionSymbolExtensionMethods._
def &&[P2, R](b: Rep[P2])(implicit om: o#arg[Boolean @@ U, P2]#to[Boolean @@ U, R]) =
om.column(Library.And, n, b.toNode)
def ||[P2, R](b: Rep[P2])(implicit om: o#arg[Boolean @@ U, P2]#to[Boolean @@ U, R]) =
om.column(Library.Or, n, b.toNode)
def unary_! = Library.Not.column[P1](n)
}
我可以!_unary
运营商,而不是&&
也不||
(作为类型的Rep
■不要匹配)。
我的问题是:我可以提供/修改implicits以便能够对这些列执行布尔操作吗?我对||
特别感兴趣,因为&&
可以使用链接filter
s完成。