Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
Moriya-Taichi opened this issue Nov 15, 2020 · 1 comment
Closed

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

Moriya-Taichi opened this issue Nov 15, 2020 · 1 comment

Comments

@Moriya-Taichi
Copy link
Owner

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
Copy link
Owner Author

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant