リストプロパティのINフィルタを別プロパティでソートするにはカスタムインデックスが必要

リストプロパティpersonKeysへのINフィルタを、プロパティlatestFavDateによるソートで並べ替えようとしたら頭がこんがらがったのでメモしておきます。

		List<Boke> favBokes = Datastore.query(meta).filter(meta.personKeys.in(keys)).sort(meta.latestFavDate.desc).asList();

最初はこれでいいかと思ったけど、上記のケースはカスタムインデックスが必要でした。
リストプロパティでカスタムインデックスを作ってしまうと、値のぶんだけインデックスが作られてしまうので、インデックス爆発の危険が大きい(はず)。
このへん、どういうインデックスが必要なのかスプレッドシートなどで実際に書いてみないと、自分の手には負えませんでした。頭の中だけで組み立てようとしたら、インデックスより先に自分の頭が爆発しそうになりました。

slim3のインメモリ機能でカスタムインデックスの使用を避ける

それで、sortInMemoryを使ってカスタムインデックスの使用を避けました。

		List<Boke> favBokes = Datastore.query(meta).filter(meta.personKeys.in(keys)).sortInMemory(meta.latestFavDate.desc).asList();

不要になったインデックスを削除するには?

xmlからindexを削除するだけでは消えない。調べてみると、Javaではインデックスを削除する機能は提供されておらず、Python環境を用意する必要があるらしい。(まだ試してない。手間がかかりそうなので、不要なインデックスの削除はいったん保留にしました)