domaframework / doma

DAO oriented database mapping framework for Java
https://doma.readthedocs.io/
Apache License 2.0
447 stars 70 forks source link

for文内で配列を使いたい #275

Closed kakusuke closed 5 years ago

kakusuke commented 5 years ago

for文内でIterableだけしか使えないのが時々不便に感じることがあります。 例えば、enumの値すべてを直接回したい場合、配列が使えないのでリストを返すvalueListメソッドを定義し、それを呼び出すなど手間が必要になります。 拡張for文と同様、配列も回せるようにしたいです。

nakamura-to commented 5 years ago

Listよりも配列が便利なケースが思い浮かびませんでした。 お手数ですがサンプルコードを見せもらえないでしょうか?

kakusuke commented 5 years ago

ごくたまにあるのですが、直近では、Enumのnameの値をDBに登録するポリシーのシステムで、enumの順番に並び替えをしようとしたときにありました。 基本的にはListでいいのですが、配列も受け付けていただけるとありがたいです。

public enum Grade {
  幼児,
  小1,
  小2,
  小3,
  小4,
  小5,
  小6,
  中1,
  中2,
  中3,
  高1,
  高2,
  高3,
  高卒,
  ;
}
SELECT /*%expand*/* FROM student
ORDER BY
  /*%for grade : @example.enums.Grade@values()*/
    grade <> /*grade*/'小1',
  /*%end*/
  id
nakamura-to commented 5 years ago

なるほど。Enumのvalues()は配列を返すのでしたね。 対応する方向で考えますが、 対応を終えるまでにはいただいた #276 へまだ2つの修正が必要です。

  1. コードをフォーマットする( ./gradlew spotlessApply を実行してpushしてもらうだけ )
  2. Annotation Processing時にも配列を認める処理を入れる(この辺り

フォーマットをしないとCIのビルドが成功しない設定にしています。 また、2番の対応をしないとコンパイルエラーとなります。

質問なんですが、いただいたPRに関して最後まで対応されるか、私の方で引き取って欲しいかどちらが良いか希望はありますか?私はどちらでも大丈夫です。

kakusuke commented 5 years ago

ありがとうございます。 せっかくなので、僕が最後まで対応したいです。 よろしくおねがいします。

nakamura-to commented 5 years ago

了解です 😄 わからない点などあればなんでも聞いてください。(ここでもgitterでも構いません)

kakusuke commented 5 years ago

ありがとうございます。 2点ほど。

https://github.com/domaframework/doma/pull/276/files#diff-54d032887af1bb9ce5ebec9c7207463eR69 こちらのテストを書いたのですが、何故かElements#getTypeElementStreamを渡すタイミングでNPEが起こっていました。 JavaCompilerのcloseが先に発生しているようでしたが、それ以上追っかけられていません。 ただ、デバッグ中に何故かctx.getTypes().getTypeMirror(Collection.class)を行うと取得できることを発見しまして、ひとまず入れています。 原因になにか心当たりはありますでしょうか。

テスト上はメソッドの引数に配列を渡しても大丈夫のはずですが、実際に使ってみたところパラメータ名の取得に失敗するようです。(DOMA4067) https://github.com/kakusuke/simple-boilerplate/blob/master/src/test/java/boilerplate/dao/EmployeeDaoTest.java#L36 Listにしたときは動くので、まだ修正しなければならない箇所があるのだと思いますが、どのへんになりますでしょうか。

nakamura-to commented 5 years ago

原因になにか心当たりはありますでしょうか

あります! Annotation Processing の中核に ProcessingEnvironment というクラスがありますが、Domaがコンパイル後に得られた ProcessingEnvironment のインスタンスを使ってテストをしているのが原因のようです。 コンパイル最中のインスタンスを使ってテストをすれば問題ないことがわかりました。 近日中に私の方でテストの仕方を変更しますので、その変更を取り込んでもらえないでしょうか?

まだ修正しなければならない箇所があるのだと思いますが

バインド変数に紐づけられることを教えてあげる必要があります。このクラスで visitArrayCtType して true を返してください。 https://github.com/domaframework/doma/blob/2.22.0/src/main/java/org/seasar/doma/internal/apt/meta/query/QueryParameterMeta.java#L112

nakamura-to commented 5 years ago

近日中に私の方でテストの仕方を変更しますので、その変更を取り込んでもらえないでしょうか?

283 で対応しました。このコミットを取り込んで試してもらえませんか?Annotation Processingに依存したテストコードの書き方を少し変えていますので、それらに合わせてみてください。

kakusuke commented 5 years ago

ありがとうございます! 試してみます

kakusuke commented 5 years ago

遅くなりました おそらく対応できたかと思います よろしくおねがいします

nakamura-to commented 5 years ago

Merged #276