-
Notifications
You must be signed in to change notification settings - Fork 0
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
Fix inversePatches applying order #2
base: main
Are you sure you want to change the base?
Conversation
@shqld |
なるほど、逆patch + patchを実行したときに発見したバグですね 理解です 🙇 |
本家の unadlib#64 に起票しました。本家は別のロジックなのでこのPRのようにシンプルに解決しそうになかったのでPRは諦めました 🫠 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
array以外のinversePatchesは反転させなくて大丈夫ですかね?
僕がやったときは最後に全部をreverseさせました
83f36b3#diff-acef5581de9dc1f5af0e13953013e713d536553038309cb29fc3aa30cd6bb7ceR58
なるほど 👀 inversePatchesの適用時に配列の長さが最初に復元されてさえいれば、あとのオブジェクトの変更がどうであれ(存在しないpathへの変更の)問題は起きない想定だったのですが、どちらの方がより安全なのか判断に自信がない... 🤯 @skobaken7 ちなみに全体を反転させた理由はありますか? |
そもそも数学的?論理的?に考えて逆操作というのは逆順に適用するものなので、mutativeの元の実装が誤っているという考えです。 |
確かに最終的にその方針で行くのが良さそうです。 ただ、(我々の現行バージョンでは)配列の逆パッチ列に関しては順操作の逆元ではなく、順パッチ列と同じ順番で適用しても問題ないようにインデックスを調整しているので全体を反転させるには実装を変える必要がありそうです 😢 |
ちょっと試してみます。 |
おそらく本家は長さによって配列におけるpatches, inversePatchesを入れ替えているので逆パッチ列の全体反転をやりづらかったんだろうな... |
(本家でも再現するので近いうちにissueを送る予定)
以下のように、「オブジェクト内部に変更 → (手前の要素を削除するなどして)そのオブジェクトのインデックスを変更」した場合、
mutative/test/json-patch.test.ts
Lines 1707 to 1708 in 3af40b9
以下のようにinversePatchesが存在しない要素を参照(replace)してしまいapply時にエラーとなる。
この問題の修正のため、inversePatchesへの(配列に関する)パッチの追加をunshiftすることで対応する。