リストプロパティの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();