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

时间:2019-11-08 14:18:37

标签: java sql parsing jooq

我想在一种方言上解析我的函数,然后将其呈现给另一种方言。

例如,我在一种方言中有这样的字符串:

"(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));
    }
  }
}

1 个答案:

答案 0 :(得分:1)

从jOOQ版本3.12(和即将发布的3.13开始)开始,您无法以VisitListener来保证给{em>保证的方式访问jOOQ表达式树,即对输入函数的每次调用都可以替换为对输出函数的调用。

There's a larger project on our roadmap重新设计当前内部的对象模型以使其成为公共API,主要是出于您正试图将jOOQ用于以下目的的精确目的:作为允许转换SQL表达式树的解析器。这是很多工作,因为我们必须合并真正相同的事物的各种内部表示形式:用户定义的功能。正如您在注释中注意到的那样,当前是org.jooq.impl.Function,但目前尚无保证可以用该类型表示函数。

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

目前针对您的特定问题最实用的解决方案可能是在将函数名称传递给解析器之前,先对其进行正则表达式替换,因为我认为该名称在您的系统中应该足够唯一。