gpt4 book ai didi

java - 有没有办法解析jooq中的自定义函数?

转载 作者:行者123 更新时间:2023-11-30 05:25:23 30 4
gpt4 key购买 nike

我想用一种方言解析我的函数,然后将其渲染为另一种方言。

例如,我有一种方言中类似的字符串:

"(1 + my_function(myTable.id*2))/2"

我想解析它并将其呈现为另一种方言:

"(1 + my_other_dialect_function(myTable.id*2))/2"

我已经创建了 CustomField 继承器,它将使用 this example 正确呈现。 :

class MyFunctionCustomFiled extends CustomField<Integer>

但我无法找出将其插入表达式的正确方法。

我可以在解析步骤中执行此操作吗?或者在渲染步骤中使用 VisitListener 如下所示?

public class CustomFunctionsFisitListener2 extends DefaultVisitListener {
public void visitStart(VisitContext context){
if(context.queryPart().isTheFunctionINeed()){
Field<?> argument = context.queryPart().retrieveArgumentExpression();
context.queryPart(MyFunctionCustomFiled(argument));
}
}
}

最佳答案

从 jOOQ 版本 3.12(以及即将推出的 3.13)开始,您无法以 VisitListener 的方式访问 jOOQ 表达式树,以保证每次调用输入函数可以替换为对输出函数的调用。

There's a larger project on our roadmap重新设计当前的内部对象模型以使其成为公共(public) API,主要是为了您尝试使用 jOOQ 的精确目的:作为允许转换 SQL 表达式树的解析器。这是一项艰巨的工作,因为我们必须整合实际上同一事物的各种内部表示:例如用户定义的函数。正如您在评论中注意到的,这目前是一个 org.jooq.impl.Function,但现在,没有 保证 可以表示函数那种类型。

您今天已经可以做的一件事是使用模式来限定您的函数,并使用开箱即用的运行时模式映射功能:https://www.jooq.org/doc/latest/manual/sql-building/dsl-context/custom-settings/settings-render-mapping

现在针对您的具体问题最务实的解决方案可能是在将函数名称传递给解析器之前用正则表达式替换您的函数名称,因为我假设该名称在您的系统中应该足够唯一。

关于java - 有没有办法解析jooq中的自定义函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58768296/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com