具有忽略大小写操作的 Slick AST 库
Slick AST Library with ignore case operations
这个问题我已经在slickgoogle群里问过了。如果向不检查该组的人寻求帮助,请将其张贴在这里。
我正在尝试实现类似于 scala-kendo 的过滤器。我们已经使用普通查询开发了这个过滤器功能。现在,我正在尝试将其转换为 slick 表达式,类似于 slick-kendo 所做的。
我需要实施不区分大小写的过滤。但是,我不知道该怎么做。 scala.slick.ast.Library 中的成员仅提供区分大小写的搜索方法。
编辑:
添加代码:
private def predicate(e: E, f: Filter) = {
val (c, v) = (colNode(e, f.field), LiteralNode(f.value))
val L = Library
def \(fs: FunctionSymbol, nodes: Node*) = fs.typed[Boolean](nodes: _*)
Column.forNode[Boolean](f.operator match {
case "EqualTo" => \(L.==, c, v)
case "NotEqualTo" => \(L.Not, \(L.==, c, v))
case "GreaterThen" => \(L.>, c, v)
case "GreaterThenOrEqualTo" => \(L.>=, c, v)
case "LessThen" => \(L.<, c, v)
case "LessThenOrEqualTo" => \(L.<=, c, v)
case "StartsWith" => \(L.StartsWith, c, v)
case "StartsWithIgnore" => \(L.StartsWith, c, v)
case "EndsWith" => \(L.EndsWith, c, v)
case "Contains" => \(L.Like, c, LiteralNode(s"%${f.value}%"))
case "DoesNotContain" => \(L.Not, \(L.Like, c, LiteralNode(s"%${f.value}%")))
})
}
如你所见,Library
中有StartsWith
、EndsWith
等方法,但我需要StartsWithIgnoreCase
、EndsWithIgnoreCase
等方法等等
有人可以提供任何建议来实现我需要的这个功能。
如果我对你的理解是正确的,你想要像这里这样的东西:http://slick.typesafe.com/doc/3.0.0-RC3/queries.html#sorting-and-filtering - 请参阅 4. 示例 "val q4 = coffees.filter ..."。这部分文档也适用于 slick 2.x。
终于找到解决办法了。粘贴在这里是为了其他人的利益。浏览了光滑的代码库,发现了如何将节点转换为列并在列上应用小写字母。
case "EqualToIgnoreCase" => \(L.==, (Column.forNode[String](c).toLowerCase).toNode, LiteralNode(f.value.toLowerCase()))
这个问题我已经在slickgoogle群里问过了。如果向不检查该组的人寻求帮助,请将其张贴在这里。
我正在尝试实现类似于 scala-kendo 的过滤器。我们已经使用普通查询开发了这个过滤器功能。现在,我正在尝试将其转换为 slick 表达式,类似于 slick-kendo 所做的。 我需要实施不区分大小写的过滤。但是,我不知道该怎么做。 scala.slick.ast.Library 中的成员仅提供区分大小写的搜索方法。
编辑:
添加代码:
private def predicate(e: E, f: Filter) = {
val (c, v) = (colNode(e, f.field), LiteralNode(f.value))
val L = Library
def \(fs: FunctionSymbol, nodes: Node*) = fs.typed[Boolean](nodes: _*)
Column.forNode[Boolean](f.operator match {
case "EqualTo" => \(L.==, c, v)
case "NotEqualTo" => \(L.Not, \(L.==, c, v))
case "GreaterThen" => \(L.>, c, v)
case "GreaterThenOrEqualTo" => \(L.>=, c, v)
case "LessThen" => \(L.<, c, v)
case "LessThenOrEqualTo" => \(L.<=, c, v)
case "StartsWith" => \(L.StartsWith, c, v)
case "StartsWithIgnore" => \(L.StartsWith, c, v)
case "EndsWith" => \(L.EndsWith, c, v)
case "Contains" => \(L.Like, c, LiteralNode(s"%${f.value}%"))
case "DoesNotContain" => \(L.Not, \(L.Like, c, LiteralNode(s"%${f.value}%")))
})
}
如你所见,Library
中有StartsWith
、EndsWith
等方法,但我需要StartsWithIgnoreCase
、EndsWithIgnoreCase
等方法等等
有人可以提供任何建议来实现我需要的这个功能。
如果我对你的理解是正确的,你想要像这里这样的东西:http://slick.typesafe.com/doc/3.0.0-RC3/queries.html#sorting-and-filtering - 请参阅 4. 示例 "val q4 = coffees.filter ..."。这部分文档也适用于 slick 2.x。
终于找到解决办法了。粘贴在这里是为了其他人的利益。浏览了光滑的代码库,发现了如何将节点转换为列并在列上应用小写字母。
case "EqualToIgnoreCase" => \(L.==, (Column.forNode[String](c).toLowerCase).toNode, LiteralNode(f.value.toLowerCase()))