Moriya-Taichi / ORMComparison-iOS

1 stars 0 forks source link

リストの差分をちゃんとやる #8

Closed Moriya-Taichi closed 3 years ago

Moriya-Taichi commented 3 years ago

What

重複を防ぐ為にSELECT FROM hoge WHERE id IN <ids>でidのリストを渡して 保存されているものは値を更新 保存されていないものは新しく作成 という形で操作しなければならない ループ内でfilter{ hoge.contains() }を使う方法もあるが計算量的にはO(n^2)なので微妙に思える 言語は違うがJSでは一定数までは上記の二重ループでも早いので毛嫌いするほどではないと思われるが

let newObjects = hoge
let storedObjects = SELECT INで取ってきたやつ

if storedObjects.count == newObjects.count { 更新 }//取得できたものと新しくきたものの数が同じなら全て保存されている
else {
let differences//差分
//新しいやつは作成
//あるものは更新
}

リレーションがの場合はさらにそこから更新対象のリレーションの差分を見て更新する

let storedObjects = SELECT INで取ってきたやつ
let storedRelationObjects = 更新対象のリレーション

let difference = 差分
前段の差分で新しかったものは追加し
ここで新しかったものは追加
消えてるものはrelationから削除
Moriya-Taichi commented 3 years ago

また速度的なことを考えるとデイスクとやりとりをする fetchはループの中で行うべきではないと考えるので SELECT INで一気に持ってくるのを考える 

自分のアルゴリズム力はガバガバなので レーベンシュタイン距離をどうしようか悩んだが 差分更新に関してはこちらの記事でSwiftにメソッドが存在しているとのこと https://qiita.com/shiz/items/0e363219a0151d790d03

Swift5.1からはArray.difference(from: Array)で2つのリスト間の差分が行える この結果はinsertremoveの形で返ってくる。 どちらも(offset, element, associatedWith)を持つ つまりは新しく増えたのと消されたのが分かる。 今欲しいのは消されたもの 増えたもの 変わってないものの3つなので 元の配列からinsertもdeleteもされていないインデックスを変わってないものとして増やした扱いやすい 差分の算出メソッドを作る