JOOQ: как добавить несколько интерфейсов к сгенерированным классам записей с помощью стратегии сопоставления - PullRequest
1 голос
/ 06 августа 2020

Основываясь на предоставленном здесь ответе , я пытаюсь заставить свои сгенерированные записи реализовывать несколько интерфейсов. В зависимости от того, какое регулярное выражение соответствует (REGEX_A, REGEX_B или оба), сгенерированная запись должна реализовывать один или оба IFoo и IBar.

У меня есть файл конфигурации gradle-jooq-plugin, но семантически он должен быть равен следующему:

<generator>
  <strategy>
    <matchers>
      <tables>
        <table>
          <expression>REGEX_A</expression>
          <recordImplements>com.test.IFoo</recordImplements>
        </table>
        <table>
          <expression>REGEX_B</expression>
          <recordImplements>com.test.IBar</recordImplements>
        </table>
      </tables>
    </matchers>
  </strategy>
</generator>

В результате я получаю то, что запись, соответствующая обоим сопоставителям, будет реализовывать только IFoo. Это ожидаемый результат? И есть ли способ достичь того, чего я хочу, только с конфигурацией сопоставления?

1 Ответ

1 голос
/ 06 августа 2020

Применяется только первая соответствующая <table> спецификация.

Как работают эти стратегии сопоставления, только первая <table> спецификация, <expression> которой совпадают, применяется к сгенерированному артефакту. Последующие совпадения игнорируются. Это означает, что вы не можете объединить различные спецификации <recordImplements/>. Вместо этого вам придется добавить еще одну спецификацию, которая соответствует обоим вашим регулярным выражениям в начале, например:

<generator>
  <strategy>
    <matchers>
      <tables>
        <table>
          <expression>REGEX_A.*REGEX_B|REGEX_B.*REGEX_A</expression>
          <recordImplements>com.test.IFoo, com.test.IBar</recordImplements>
        </table>
        <table>
          <expression>REGEX_A</expression>
          <recordImplements>com.test.IFoo</recordImplements>
        </table>
        <table>
          <expression>REGEX_B</expression>
          <recordImplements>com.test.IBar</recordImplements>
        </table>
      </tables>
    </matchers>
  </strategy>
</generator>

Почему бы не объединить различные спецификации <table>?

Для <recordImplements/>, кажется полезным иметь возможность объединить две соответствующие <table> спецификации сопоставителя и позволить результирующим записям соответствовать всем спецификациям реализации интерфейса.

Однако это неверно для всех других возможных элементов внутри <table>, например <tableClass>, <tableIdentifier>, et c., Поэтому к любой таблице применяется только выражение соответствия первое . Чтобы не усложнять эту функцию без необходимости, применяется только первое выражение соответствия.

...