SwiftDataで検索効率向上のためにインデックス使う方法を調べる
結論
現状SwiftDataではユニーク制約は使えそうだが、インデックス自体は使えそうにない。
理由
CoreDataの NSFetchIndexに関連するものがインデックスに関するもののようであるが、該当するものがSwiftDataに見当たらない。
調査メモ
Core Dataのドキュメント
Core Data Stackよりschemaを管理するのはNSManagedObjectModelあたりのように仮説をたてる
MSManagedObjectModel
NSEntityDescriptionというクラスがテーブル定義と対応を持ちそうであるという仮説をたてる
NSEntityDescription
Configuring indexes and constraintsという節があり、制約とindexsの情報をもっていそうである
NSFetchIndexDescriptionがIndexの設定ではないかという仮説をたてる
NSFetchIndexDescription
nameはおそらくindexの名前で、さらなる詳細がNSFetchIndexElementDescriptionで表現されそうという仮説を立てる
NSFetchIndexElementDescription
NSFetchIndexElementTypeでindexの種類を指定できそう
NSPropertyDescriptionはおそらく列を表現するクラスだろう
NSFetchIndexElementType
binary indexとR-Tree indexを指定できそうである
NSPropertyDescription
ここまでの結論
NSFetchIndex で始まるクラスがインデックスに関するものだと考えられる。
SwiftDataにポーティングされているか確認すればよさそう。
SwiftDataのドキュメント
fetchで検索すると以下の2点が見つかる
FetchDescriptor
FetchResultsCollection
FetchDescrptor
predicatorとsortbayをもつあたりから SQLのWHERE句とORDER BY 句に該当するものを表現するものに思われる
FetchResultsCollection
SQLの結果セットを返す構造体だと思われる
ここにindexという名前はでてくるが、これは何番目の要素かを示すものだと考えられる。
indexで検索してもクラスや構造体にindexを含むものは存在しない
つまり、該当するものがなさそうである。
別の調査
スキーマのメタデータを記録するような仕組みを探す
データの追記や編集のためのドキュメントがある
@Attribute(.unique) var name: String という記述がありunique 制約をかける設定のように見える
@Attribute マクロ
Schema.Attribute.Option が設定できる項目のようだ。
Schema.Attribute.Option
indexに該当しそうなものはない。
Scheme関連を確認していく
Scheme.Entityがテーブル定義に該当しそうである
Scheme.Proptertyが列に該当するものだと仮説を立てられそう
Scheme.Attributeがメタデータに該当するものだと仮説を立てらそう
uniquenessContstrainsとユニーク制約のためのものがある(しかし説明は一切ない)
SchemaProperty
ユニークかどうか確認ができる程度
Schema.Attribute
@Attributeマクロを使って作れる実態と仮説が建てられそう