我在Scala中创建了一个OData查询语言。它进展得很顺利,但我得到了一个我无法解释的错误。
首先让我向您展示我创建的Query类(为简洁起见省略了一些代码):
case class Query(val name: String, val args: Seq[(String, String)] = Seq())
(val parent: Option[Query] = None)
(val options: Seq[QueryOption] = Seq()) {
def /(newChild: Query): Query = new Query(newChild.name, newChild.args)(Some(this))(options)
def $(newOptions: QueryOption*): Query = new Query(name, args)(parent)(options ++ newOptions)
def |(newArgs: (String, String)*): Query = new Query(name, args ++ newArgs)(parent)(options)
}
object Query {
private def emptyQueryWithName(name: String): Query = Query(name, Seq())(None)(Seq())
def /(name: String): Query = emptyQueryWithName(name)
implicit def createQuery(name: String): Query = emptyQueryWithName(name)
}
package object queries {
implicit class QueryOps(name: String) {
def ===(attr: Any): (String, String) = (name, attr.toString)
}
}
我已经为这个DSL编写了一些测试,但它们主要起作用。例如这段代码:
Query / "Pages" / "Component" | ("ItemId" === 123, "PublicationId" === 1) $ ("Title" ==| "Test Title")
给我预期的查询:/ Pages / Component(ItemId = 123,PublicationId = 1)?$ filter = Title eq' Test Title'
但是这个:
Query / "Pages" | ("ItemId" === 123) / "Title" $ jsonFormat $ ("Url" ==| "Bla")
抱怨' /"标题"'部分。好像编译器不知道正在进行的代码导致Query实例。它无法找到' /'方法。对我而言,这似乎很奇怪,因为' $'找到方法,具有相同的范围;查询类。
我可能遇到了一些我无法理解的限制,但我想了解一下。谢谢你的帮助!
答案 0 :(得分:2)
|
的优先级低于/
,$
的优先级最高,因此您的表达式被解释为:
(Query / "Pages") | (("ItemId" === 123) / (("Title" $ jsonFormat) $ ("Url" ==| "Bla")))
此外,提供确切的错误消息通常很有用。