在Slick中按通用参数分组

时间:2018-10-01 10:38:33

标签: scala generics slick

我正在尝试使用Slick 3.2.3实现通用分组。通用分组是指将同一查询按不同的参数或参数集进行分组。

假设我有一张桌子:

class MyTable(tag: Tag) extends Table[MyEntry](tag, "my_table") {
  def text1 = column[String]("text1")
  def text2 = column[Option[String]]("text2")
  def list = column[List[String]]("list")   //  I am using postgres+slick_pg
  ...
}

然后我有一个包含多个联接的复杂查询,我希望能够按 text1 ,( text1 text2 ), list 等。一种方法是定义一个通用函数,该函数使用 extractor 参数执行分组:

private def getData[T](extractor: MyTable => T) = {
  //    supposing MyTable comes second in the list
  //    of joined tables in my complex query
  val groupedQuery = myComplexQuery.groupedBy(x => extractor(x._2))
  ...
  //    here goes aggregation functions, mapping etc.
}

其中提取器实现之一可以定义为

val extractor: MyTable => (Rep[String], Rep[Option[String]]) = me => me.text1 -> me.text2

但是,由于 extractor 是通用的,因此 groupBy 找不到与T类型匹配的Shape,这意味着我也必须提供它。我的问题是如何精确定义此类形状? slick.lifted软件包的文档中没有示例,并且对于Query#groupBy定义(或FlatShapeLevel)中的通用类型K,T,G和P的含义也不是很清楚。如果有人至少为原始类型(String)和tuple2(例如(String,Option [String]))提供了此类提取器函数的示例,我将不胜感激。还是有一种更好的方法可以达到我所忽略的相同结果?谢谢。

0 个答案:

没有答案