hereとして実装されたタグ付き型があります。タグ付きブール型のSlickでのブール演算
私はすべてのモデルの属性に多かれ少なかれ一般的なもの(プリミティブ、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]]
であるとして、これは失敗します。私は暗黙を作成する場合:
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
Sの型が一致しないとして)。
私の質問は:これらの列に対してブール演算を実行できるようにimplicitsを提供/変更できますか?私は特に||
に興味があり、を使用して&&
を行うことができます。