Slick 3.0阵列聚合替代方案

时间:2015-06-29 02:34:45

标签: scala slick slick-3.0

这里有一个关于阵列聚合的话题:

Support of PostgreSQL specific array_agg function in scala frameworks?

然而,由于它目前尚未得到支持,我发现很难用浮油做一些事情。这是一个简单的例子。

比如说,我经营一个商业主办方。 每个聚会都有嘉宾,主持人:

Party(id: Option[Int], name: String)
Guest(id: Option[Int], name: String)
Host(id: Option[Int], name: String)

PartyGuests(partyId, guestId: Int)
PartyHosts(partyId, hostId: Int)

我想要一张所有派对的表格,显示所有的客人和主持人:

PartyId     |Guests                 |Hosts
------------|-----------------------|------
1           |Adam, Julie, Jack      |Tom, Jamie, John
2           |Joe, Jim, Jake         |Tom, Tony, James
3           |Amy, Sally             |Jenny

我的解决方案是:

// The map is: partyId -> (guestNamesList, hostNamesList)
val partyTable: Map[Int, (List[String], List[String])] = (for {
  party <- db.run(parties.result.list)
  guest <- db.run(partyGuests
    .filter(_.partyId === party.id)
    .flatMap(_.guest)
    .result.list)
  host <- db.run(partyHosts
    .filter(_.partyId === party.id)
    .flatMap(_.host)
    .result.list)
} yield (party, guest, host))
  .groupBy { case (party, guest, host) =>
    party.id
  }
  .mapValues { values =>
    val myGuests = values.map(_._2).distinct.map(_.name)
    val myHosts = values.map(_._3).distinct.map(_.name)
    (myGuests, myHosts)
  }

然而,这种解决方案在大型数据集上非常耗费空间。有谁知道更好的解决方案?

0 个答案:

没有答案