我有一些理解循环。这里使用的对象被自动从DB产生具有slick.codegen.SourceCodeGenerator:TableQuery到案例类
for {
boxer <- Boxers.filter { b => b.address === someAddress }
fullBoxer <- buildFullBoxer(boxer)
} yield {
fullBoxer
}
的buildFullBoxer函数接受的情况下类BoxersRow作为参数,因此该循环不编译并生成错误:
type mismatch; found : models.Tables.Boxers required: models.Tables.BoxersRow
生成的模式代码:
case class BoxersRow(id: Long, firstName: String, lastName: String, nick: Option[String] = None, boxingTypeId: Int = 0, birthDate: Option[java.sql.Date] = None, address: Option[String] = None, lastUpdated: java.sql.Timestamp)
implicit def GetResultBoxersRow(implicit e0: GR[Long], e1: GR[String], e2: GR[Option[String]], e3: GR[Int], e4: GR[Option[java.sql.Date]], e5: GR[java.sql.Timestamp]): GR[BoxersRow] = GR{
prs => import prs._
BoxersRow.tupled((<<[Long], <<[String], <<[String], <<?[String], <<[Int], <<?[java.sql.Date], <<?[String], <<[java.sql.Timestamp]))
}
class Boxers(_tableTag: Tag) extends Table[BoxersRow](_tableTag, "boxers") {
def * = (id, firstName, lastName, nick, boxingTypeId, birthDate, address, lastUpdated) <> (BoxersRow.tupled, BoxersRow.unapply)
def ? = (Rep.Some(id), Rep.Some(firstName), Rep.Some(lastName), nick, Rep.Some(boxingTypeId), birthDate, address, Rep.Some(lastUpdated)).shaped.<>({r=>import r._; _1.map(_=> BoxersRow.tupled((_1.get, _2.get, _3.get, _4, _5.get, _6, _7, _8.get)))}, (_:Any) => throw new Exception("Inserting into ? projection not supported."))
val id: Rep[Long] = column[Long]("id", O.AutoInc, O.PrimaryKey)
....
}
lazy val Boxers = new TableQuery(tag => new Boxers(tag))
我当然不希望自动改变GE神经架构对象。 buildFullBoxer函数从数据库读取附加数据并构建一个包含所有必要数据的常见FullBoxer对象。
private def buildFullBoxer(boxersRow: BoxersRow): DBIO[FullBoxer] = {
val query = for {
((((boxer, fight), division), b1), b2) <-
Boxers.filter(_.id === boxersRow.id)
.joinLeft(Fights).on((b, f) => (b.id === f.firstBoxerId) || (b.id === f.secondBoxerId))
.joinLeft(Divisions).on((bf, d) => bf._2.map { _.divisionId === d.id })
.joinLeft(Boxers).on((bfd, b1) => bfd._1._2.map { _.firstBoxerId === b1.id })
.joinLeft(Boxers).on((bfdb1, b2) => bfdb1._1._1._2.map { _.secondBoxerId === b2.id })
} yield (boxer, fight, division, b1, b2)
val action = query.result.map {case sequence => sequence.groupBy(x => x._1) }.
map { _.map { case (box, tup) => (box, tup.map { case (b, f, d, b1, b2) => f.map { fight => (fight, d.getOrElse(throw NoDivisionException("No such a division: " + fight.divisionId)), b1.getOrElse(throw NoBoxerException("No boxer with id " + fight.firstBoxerId, Seq.empty, None)), b2.getOrElse(throw NoBoxerException("No boxer with id " + fight.secondBoxerId, Seq.empty, None)), Seq.empty) } } map (_.map(FullFight.tupled)) flatten) } toSeq }.
map {_.map(FullBoxer.tupled).head }
action
}
我怎么能通过案例类BoxersRow buildFullBoxer函数在这理解循环?
问候!
感谢您的及时回复:)它的作品! – Gandalf