动态订单与Squeryl

时间:2013-12-05 00:40:31

标签: scala squeryl

我无法弄清楚如何在运行时动态更改orderBy。我需要这样的东西:

def samplesSorted(fields: List[String]) = {
  from(Schema.samples)(s => select(s) orderBy(fields.map(getterByName))
}

或类似

def samplesSorted(fields: List[String]) = {
  val q = from(Schema.samples)(s => select(s))
  fields.forEach(field => q.addOrderBy(getterByName(field)))
  q
}

我正在尝试编写一个帮助函数来操纵AST。但这似乎不是正确的解决方案。

2 个答案:

答案 0 :(得分:2)

没有注意到有一个版本的orderBy接受ExpressionNodes列表。能够像这样解决它:

def samplesSorted(fields: List[String]) = {
  from(Schema.samples)(s => select(s) orderBy(fields.map(buildOrderBy(s)))
}
def buildOrderBy(row: Row)(field: String): ExpressionNode = {
  getterByName(row, field)
}
def getterByName(row: Row, field: String): String = field match {
  case "Name" => row.name
  case "Address" => row.address
}

尚未尝试使用不同类型的字段 - 在这种情况下,implicits可能无效。但我总是可以明确地称它们为。

UPD:

要按降序执行相同操作,可以使用类似这样的帮助程序:

def desc(node: ExpressionNode):ExpressionNode = new OrderByArg(node) {desc}

答案 1 :(得分:0)

这对我有用

def ord(dr: DataRow, name: String): ExpressionNode = if (orderAscending) {
  dr.getterByName(name) asc
} else {
  dr.getterByName(name) desc
}

case class DataRow(id: Long,
  @Column("resource_id") resourceId: String,

  def getterByName(name: String) = {
    name match {
      case "resource_id" => resourceId.~
      case _ => id.~
    }
  }
}

from(DataSchema.dataRows) { dr =>
    where(dr.id === id).select(dr).orderBy(ord(dr, filedName))
}.page(offset, limit)