diff --git a/src/main/frontend/db/rtc/op_mem_layer.cljs b/src/main/frontend/db/rtc/op_mem_layer.cljs index 075b67d468..7bc0cd4b09 100644 --- a/src/main/frontend/db/rtc/op_mem_layer.cljs +++ b/src/main/frontend/db/rtc/op_mem_layer.cljs @@ -158,7 +158,7 @@ [asset-uuid->ops asset-uuid] (block-uuid->min-epoch asset-uuid->ops asset-uuid)) -(defn add-ops-to-block-uuid->ops +(defn add-ops-aux [ops block-uuid->ops epoch->block-uuid-sorted-map asset-uuid->ops epoch->asset-uuid-sorted-map] (loop [block-uuid->ops block-uuid->ops epoch->block-uuid-sorted-map epoch->block-uuid-sorted-map @@ -307,11 +307,11 @@ asset-uuid->ops epoch->asset-uuid-sorted-map]} :current-branch} (get @*ops-store repo) {:keys [block-uuid->ops epoch->block-uuid-sorted-map]} - (add-ops-to-block-uuid->ops ops block-uuid->ops epoch->block-uuid-sorted-map + (add-ops-aux ops block-uuid->ops epoch->block-uuid-sorted-map asset-uuid->ops epoch->asset-uuid-sorted-map) {old-branch-block-uuid->ops :block-uuid->ops old-epoch->block-uuid-sorted-map :epoch->block-uuid-sorted-map} (when old-branch - (add-ops-to-block-uuid->ops ops old-branch-block-uuid->ops old-epoch->block-uuid-sorted-map + (add-ops-aux ops old-branch-block-uuid->ops old-epoch->block-uuid-sorted-map old-branch-asset-uuid->ops old-epoch->asset-uuid-sorted-map))] (swap! *ops-store update repo (fn [{:keys [current-branch old-branch]}] @@ -325,6 +325,36 @@ :block-uuid->ops old-branch-block-uuid->ops :epoch->block-uuid-sorted-map old-epoch->block-uuid-sorted-map))))))) +(defn add-asset-ops! + [repo ops] + (assert (contains? (@*ops-store repo) :current-branch) (@*ops-store repo)) + (let [ops (ops-coercer ops) + {{old-branch-block-uuid->ops :block-uuid->ops + old-epoch->block-uuid-sorted-map :epoch->block-uuid-sorted-map + old-branch-asset-uuid->ops :asset-uuid->ops + old-epoch->asset-uuid-sorted-map :epoch->asset-uuid-sorted-map + :as old-branch} :old-branch + {:keys [block-uuid->ops epoch->block-uuid-sorted-map + asset-uuid->ops epoch->asset-uuid-sorted-map]} :current-branch} + (get @*ops-store repo) + {:keys [asset-uuid->ops epoch->asset-uuid-sorted-map]} + (add-ops-aux ops block-uuid->ops epoch->block-uuid-sorted-map + asset-uuid->ops epoch->asset-uuid-sorted-map) + {old-branch-asset-uuid->ops :asset-uuid->ops old-epoch->asset-uuid-sorted-map :epoch->asset-uuid-sorted-map} + (when old-branch + (add-ops-aux ops old-branch-block-uuid->ops old-epoch->block-uuid-sorted-map + old-branch-asset-uuid->ops old-epoch->asset-uuid-sorted-map))] + (swap! *ops-store update repo + (fn [{:keys [current-branch old-branch]}] + (cond-> {:current-branch + (assoc current-branch + :asset-uuid->ops asset-uuid->ops + :epoch->asset-uuid-sorted-map epoch->asset-uuid-sorted-map)} + old-branch + (assoc :old-branch + (assoc old-branch + :asset-uuid->ops old-branch-asset-uuid->ops + :epoch->asset-uuid-sorted-map old-epoch->asset-uuid-sorted-map))))))) (defn update-local-tx! [repo t] @@ -426,6 +456,17 @@ :block-uuid->ops (dissoc block-uuid->ops block-uuid) :epoch->block-uuid-sorted-map (dissoc epoch->block-uuid-sorted-map min-epoch))))) +(defn remove-asset-ops! + [repo asset-uuid] + {:pre [(uuid? asset-uuid)]} + (let [repo-ops-store (get @*ops-store repo) + {:keys [epoch->asset-uuid-sorted-map asset-uuid->ops]} (:current-branch repo-ops-store)] + (assert (contains? repo-ops-store :current-branch) repo) + (let [min-epoch (asset-uuid->min-epoch asset-uuid->ops asset-uuid)] + (swap! *ops-store update-in [repo :current-branch] assoc + :asset-uuid->ops (dissoc asset-uuid->ops asset-uuid) + :epoch->asset-uuid-sorted-map (dissoc epoch->asset-uuid-sorted-map min-epoch))))) + (defn ops epoch->block-uuid-sorted-map asset-uuid->ops epoch->asset-uuid-sorted-map]} - (add-ops-to-block-uuid->ops ops {} (sorted-map-by <) {} (sorted-map-by <)) + (add-ops-aux ops {} (sorted-map-by <) {} (sorted-map-by <)) r (cond-> {:block-uuid->ops block-uuid->ops :epoch->block-uuid-sorted-map epoch->block-uuid-sorted-map :asset-uuid->ops asset-uuid->ops diff --git a/src/test/frontend/db/rtc/op_mem_layer_test.cljs b/src/test/frontend/db/rtc/op_mem_layer_test.cljs index 76960ec419..f473a84587 100644 --- a/src/test/frontend/db/rtc/op_mem_layer_test.cljs +++ b/src/test/frontend/db/rtc/op_mem_layer_test.cljs @@ -17,7 +17,7 @@ (let [ops [["move" {:block-uuid "f4abd682-fb9e-4f1a-84bf-5fe11fe7844b" :epoch 1}] ["move" {:block-uuid "8e6d8355-ded7-4500-afaa-6f721f3b0dc6" :epoch 2}]] {:keys [block-uuid->ops epoch->block-uuid-sorted-map]} - (op-layer/add-ops-to-block-uuid->ops (op-layer/ops-coercer ops) {} (sorted-map-by <) {} (sorted-map-by <))] + (op-layer/add-ops-aux (op-layer/ops-coercer ops) {} (sorted-map-by <) {} (sorted-map-by <))] (is (= [{#uuid"f4abd682-fb9e-4f1a-84bf-5fe11fe7844b" {:move ["move" {:block-uuid #uuid"f4abd682-fb9e-4f1a-84bf-5fe11fe7844b", :epoch 1}]}, #uuid"8e6d8355-ded7-4500-afaa-6f721f3b0dc6" @@ -34,7 +34,7 @@ ["update" {:block-uuid "f639f13e-ef6f-4ba5-83b4-67527d27cd02" :epoch 3 :updated-attrs {:type {:add #{"type1"}}}}]] {:keys [block-uuid->ops epoch->block-uuid-sorted-map]} - (op-layer/add-ops-to-block-uuid->ops (op-layer/ops-coercer ops) {} (sorted-map-by <) {} (sorted-map-by <))] + (op-layer/add-ops-aux (op-layer/ops-coercer ops) {} (sorted-map-by <) {} (sorted-map-by <))] (is (= [{#uuid"f639f13e-ef6f-4ba5-83b4-67527d27cd02" {:move ["move" {:block-uuid #uuid"f639f13e-ef6f-4ba5-83b4-67527d27cd02", :epoch 1}], @@ -52,7 +52,7 @@ ["update" {:block-uuid "f639f13e-ef6f-4ba5-83b4-67527d27cd02" :epoch 4 :updated-attrs {:content nil :link nil}}]] {:keys [block-uuid->ops]} - (op-layer/add-ops-to-block-uuid->ops (op-layer/ops-coercer ops) {} (sorted-map-by <) {} (sorted-map-by <))] + (op-layer/add-ops-aux (op-layer/ops-coercer ops) {} (sorted-map-by <) {} (sorted-map-by <))] (is (= ["update" {:block-uuid #uuid "f639f13e-ef6f-4ba5-83b4-67527d27cd02" :updated-attrs {:content nil :link nil} @@ -62,15 +62,25 @@ (let [ops1 [["update-page" {:block-uuid #uuid "65564abe-1e79-4ae8-af60-215826cefea9" :epoch 1}]] ops2 [["remove-page" {:block-uuid #uuid "65564abe-1e79-4ae8-af60-215826cefea9" :epoch 2}]] {:keys [block-uuid->ops epoch->block-uuid-sorted-map asset-uuid->ops epoch->asset-uuid-sorted-map]} - (op-layer/add-ops-to-block-uuid->ops (op-layer/ops-coercer ops1) {} (sorted-map-by <) {} (sorted-map-by <)) + (op-layer/add-ops-aux (op-layer/ops-coercer ops1) {} (sorted-map-by <) {} (sorted-map-by <)) {block-uuid->ops2 :block-uuid->ops} - (op-layer/add-ops-to-block-uuid->ops (op-layer/ops-coercer ops2) + (op-layer/add-ops-aux (op-layer/ops-coercer ops2) block-uuid->ops epoch->block-uuid-sorted-map asset-uuid->ops epoch->asset-uuid-sorted-map)] (is (= {#uuid "65564abe-1e79-4ae8-af60-215826cefea9" {:remove-page ["remove-page" {:block-uuid #uuid "65564abe-1e79-4ae8-af60-215826cefea9", :epoch 2}]}} block-uuid->ops2))))) +(deftest add-ops-to-asset-uuid->ops-test + (let [[uuid1 uuid2] (repeatedly random-uuid) + ops1 [["update-asset" {:asset-uuid uuid1 :epoch 1}] + ["update-asset" {:asset-uuid uuid2 :epoch 2}]] + {:keys [asset-uuid->ops]} + (op-layer/add-ops-aux (op-layer/ops-coercer ops1) {} (sorted-map-by <) {} (sorted-map-by <))] + (is (= {uuid1 {:update-asset ["update-asset" {:asset-uuid uuid1 :epoch 1}]} + uuid2 {:update-asset ["update-asset" {:asset-uuid uuid2 :epoch 2}]}} + asset-uuid->ops)))) + (deftest process-test (let [repo (make-db-graph-repo-name "process-test")