我有一些理解循環。這裏使用的對象被自動從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