Почему генерация кода Jooq не работает с PostGIS? - PullRequest
1 голос
/ 01 мая 2019

Контекст - Я пробую расширение географической информационной системы Postgres PostGis , которое разрешает широту и долготу историй как Точка и операции с ней.

Если я правильно понимаю , тогда мне нужно добавить пользовательский конвертер, который может конвертировать point между JOOQ и PostGis и добавить его в файл Gradle.

Проблема - Когда я генерирую jooq-код, несколько файлов генерируются неправильно и имеют поля, определенные дважды, что не позволяет компиляции.Это:

<configured-generation-dir>/tables/StValuecount.java
<configured-generation-dir>/tables/records/StValuecountRecord.java
<configured-generation-dir>/tables/records/StValuepercentRecord.java
<configured-generation-dir>/tables/_StValuecount.java
<configured-generation-dir>/tables/records/_StValuecountRecord.java
<configured-generation-dir>/tables/_StHistogram.java
<configured-generation-dir>/tables/records/_StHistogramRecord.java
<configured-generation-dir>/tables/_StQuantile.java

Конфигурация Gradle =>

jooq{
    myAwesomeApp(sourceSets.main){
        logging = 'WARN'
        jdbc {
            driver = 'org.postgresql.Driver'
            url = db_url
            user = db_user
            password = db_password
        }
        generator {
            name = 'org.jooq.codegen.DefaultGenerator'
            strategy {
                name = 'org.jooq.codegen.DefaultGeneratorStrategy'
            }
            database {
                name = 'org.jooq.meta.postgres.PostgresDatabase'
                inputSchema = 'public'
                forcedTypes {
                    forcedType {
                        userType = 'org.postgis.Point'
                        converter = 'com.example.JooqBreaksWithPostGis.jooq.converters.PostgresPointJooqConverter'
                        expression = '.*\\.point'
                        types = '.*'
                    }
                }
            }
            generate {
                routines = false
                relations = true
                deprecated = false
                records = true
                immutablePojos = false
                fluentSetters = true
            }
            target {
                packageName = 'jooq.fancy.app'
                directory = 'src/main/java/generated'
            }
        }
    }
}

Что я делаю не так?


Я также создалминимальный проект , в котором я воспроизвел проблему на случай, если кто-то захочет быстро ее попробовать.

Шаги для воспроизведения

  • Checkout project
git clone git@github.com:raj-saxena/JooqBreaksWithPostGis.git
  • Перейдите в каталог проекта и запустите контейнер postgis docker с помощью
docker-compose up
  • Аналогично, для удаления контейнера postgis docker запустите
docker-compose down 
  • Запуск миграций, которые добавляют простую таблицу City, содержащую тип Point, с
./gradlew flywayMigrate
  • Я добавил несколько строк в секундумиграция для проверки работоспособности структуры БД.Подробности подключения к экземпляру Postgres в файле build.gradle.

  • Создание файлов jooq с

./gradlew generateMyAwesomeAppJooqSchemaSource
  • Убедитесь, что файлы созданы в настроенном каталоге src/main/java/generated.

  • Убедитесь, что файлы, упомянутые выше, не могут быть скомпилированы.


Принимая совет Лукаса , я добавил конфигурацию исключения в конфигурацию jooq, как показано ниже:

            database {
                name = 'org.jooq.meta.postgres.PostgresDatabase'
                ...
                excludes = '.*ST_ValueCount' +
                        '|.*St_Valuepercent' +
                        '|.*St_Histogram' +
                        '|.*St_Quantile' +
                        '|.*St_Approxhistogram' +
                        '|.*St_PixelOfValue' +
                        '|.*St_Approxquantile' +
                        '|.*ST_Tile'
            }

Это позволилокод для компиляции.

1 Ответ

0 голосов
/ 01 мая 2019

Это звучит очень похоже на https://github.com/jOOQ/jOOQ/issues/4055. jOOQ 3.11 в настоящее время не может обрабатывать перегруженные табличные функции ни в одной СУБД, поддерживающей табличные функции.Ваш лучший вариант здесь - исключить все задействованные функции из генерации кода, используя <excludes>:

https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-includes-excludes/

...