Java 使用Odata4j为查询参数表达式创建抽象语法树

Java 使用Odata4j为查询参数表达式创建抽象语法树,java,odata,odata4j,Java,Odata,Odata4j,我通过使用Sprint MVC 4.0框架公开REST服务,并尝试按照Odata规范对$filter、$search和$orderBy等查询参数进行查询。其中每一个都包含我需要解析、构建抽象语法树和验证的表达式。它们都作为字符串检索 我不需要ODatagrammer()中定义的所有构造,我只选择与我的用例相关的构造(实际上很少) 我想了解一些关于如何以一种简单的方式解析和构建抽象树的技巧,以及Odata4j是否可以用作实用程序库来为我完成这项工作?我希望避免将大量新的依赖项拖到odata4j上,

我通过使用Sprint MVC 4.0框架公开REST服务,并尝试按照Odata规范对$filter、$search和$orderBy等查询参数进行查询。其中每一个都包含我需要解析、构建抽象语法树和验证的表达式。它们都作为字符串检索

我不需要ODatagrammer()中定义的所有构造,我只选择与我的用例相关的构造(实际上很少)


我想了解一些关于如何以一种简单的方式解析和构建抽象树的技巧,以及Odata4j是否可以用作实用程序库来为我完成这项工作?我希望避免将大量新的依赖项拖到odata4j上,因为我将只使用一小部分代码。

您当然可以使用odata4j为查询参数构建AST。我这样做正是为了你所说的目的。我分离查询参数,然后在“&”上再次分离以获取参数。对于每一个参数,我检查参数名($select、$filter等),然后在此基础上对该值使用相应的OptionsQueryParser静态方法,返回特定于该查询参数的数字、列表或AST。对于expression AST,请查看PrintExpressionVisitor,并将其作为一种模式,用于编写您自己的访问者来浏览AST。

Tom,这听起来也像是我在寻找的东西。你有什么可以分享的代码吗?我相信你可以在这里看到模式并自己完成。字符串queryString=uri.substring(uri.indexOf('?')+1);对于(字符串段:queryString.split(&)){String[]paramPair=segment.split(=”;String name=paramPair[0]。trim();String value=paramPair[1]。trim();if(name.equals(OPTION_SELECT)){SELECT=options queryparser.parseSelect(value);}else if(name.equals(OPTION_FILTER)){filter=options queryparser.parseFilter(value);}else if(name.equals)(…谢谢,Tom。是的,这是最简单的部分。现在我尝试完成答案的最后一部分:遍历过滤器AST以构建我的查询。