Может ли jooq распознавать необязательные параметры для подпрограмм и соответственно создавать перегрузки? - PullRequest
3 голосов
/ 20 февраля 2020

мы используем jooq в среде Kotlin / Java для доступа к timescaledb. Теперь, часто, когда мы регенерируем объекты jooq, мы получаем ошибки, если произошла смена сигнатуры подпрограммы в БД, даже если она просто добавила необязательные параметры. Можно ли как-то заставить jooq генерировать перегрузки соответствующих методов, чтобы избежать необходимости вручную вводить значения по умолчанию для необязательных параметров?

Спасибо!

1 Ответ

2 голосов
/ 20 февраля 2020

Вы можете расширить класс org.jooq.meta.Database, который вы используете для генерации кода, чтобы генерировать дополнительные экземпляры RoutineDefinition из каждого прогона генерации кода. Вся необходимая для этого информация есть, вам просто нужно сделать что-то вроде этого (я не пробовал, могут быть ошибки, не стесняйтесь редактировать):

public class MyDatabase extends PostgresDatabase {
    @Override
    protected List<RoutineDefinition> getRoutines0() throws SQLException {
        List<RoutineDefinition> routines = super.getRoutines0();
        List<RoutineDefinition> result = new ArrayList<>(routines);

        routineLoop:
        for (RoutineDefinition routine : routines) {
            if (routine.isSQLUsable()) {
                List<ParameterDefinition> in = new ArrayList<>(routine.getInParameters());
                Iterator<ParameterDefinition> it = in.iterator();
                boolean hasDefaulted = false;

                while (it.hasNext())
                    if (it.next().isDefaulted()) {
                        hasDefaulted = true;
                        it.remove();
                    }

                    // This approach only works if the trailing params are defaulted
                    else if (hasDefaulted)
                        continue routineLoop;

                if (hasDefaulted)
                    result.add(new AbstractRoutineDefinition(
                        routine.getSchema(), null, routine.getName(), 
                        routine.getComment(), "OverloadIndex" // Replace this
                    ) {
                        @Override
                        protected void init0() {
                            addParameter(InOutDefinition.RETURN, routine.getReturnValue());

                            for (ParameterDefinition p : in)
                                addParameter(InOutDefinition.IN, p);
                        }
                    });
            }
        }

        return result;
    }
}
...