Есть ли способ разобрать пользовательскую функцию в Jooq? - PullRequest
1 голос
/ 08 ноября 2019

Я хочу проанализировать свою функцию на одном диалекте и затем преобразовать ее на другой диалект.

Например, у меня есть такая строка на одном диалекте:

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

И я хочупроанализировать и отобразить его на другом диалекте, например:

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

Я создал CustomField наследник, который будет правильно отображаться с использованием этого примера :

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 Ответ

1 голос
/ 11 ноября 2019

Начиная с версии 3.12 jOOQ (и следующей версии 3.13), вы не можете получить доступ к дереву выражений jOOQ таким образом, чтобы ваши VisitListener до гарантировали , что каждый вызов функции ввода может быть заменен навызов функции вывода.

В нашей дорожной карте есть более крупный проект , чтобы изменить дизайн текущей внутренней объектной модели, чтобы сделать ее общедоступным API, главным образом для той конкретной цели, которую вы пытаетесь использовать. используйте jOOQ для: в качестве парсера, который позволяет преобразовывать деревья выражений SQL. Это большая работа, так как нам придется консолидировать различные внутренние представления одного и того же: например, пользовательскую функцию. Как вы заметили в своих комментариях, в настоящее время это org.jooq.impl.Function, но сейчас гарантия для функции, представляемой этим типом, не гарантируется.

Одна вещь, которую выможно было бы уже сегодня использовать схемы для оценки ваших функций и использовать готовую функцию отображения схем во время выполнения: https://www.jooq.org/doc/latest/manual/sql-building/dsl-context/custom-settings/settings-render-mapping

Самое прагматичное решение вашей конкретной проблемы на данный момент может заключаться в замене регулярных выражений вашимимя функции до ее передачи парсеру, так как я предполагаю, что имя должно быть достаточно уникальным в вашей системе.

...