From 5392b484517216abb6d26f9fb17f326b135d0f24 Mon Sep 17 00:00:00 2001 From: Tony Kay Date: Tue, 20 Aug 2024 10:25:59 -0700 Subject: [PATCH] Fixed a bug in remove-entity. It was not removing nested idents that were not part of the top-level normalized graph. --- .../fulcro/algorithms/normalized_state.cljc | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/main/com/fulcrologic/fulcro/algorithms/normalized_state.cljc b/src/main/com/fulcrologic/fulcro/algorithms/normalized_state.cljc index 29e76b4b..afd12332 100644 --- a/src/main/com/fulcrologic/fulcro/algorithms/normalized_state.cljc +++ b/src/main/com/fulcrologic/fulcro/algorithms/normalized_state.cljc @@ -4,13 +4,15 @@ #?(:cljs (:require-macros com.fulcrologic.fulcro.algorithms.normalized-state)) (:require [clojure.set :as set] + [clojure.walk :as walk] [com.fulcrologic.fulcro.components :as comp] [edn-query-language.core :as eql] [clojure.spec.alpha :as s] [com.fulcrologic.guardrails.core :refer [>defn =>]] [com.fulcrologic.fulcro.algorithms.data-targeting :as targeting] [com.fulcrologic.fulcro.algorithms.denormalize :as fdn] - [com.fulcrologic.fulcro.algorithms.merge :as merge])) + [com.fulcrologic.fulcro.algorithms.merge :as merge] + [taoensso.encore :as enc])) (def integrate-ident "[state ident & named-parameters] @@ -165,6 +167,15 @@ state (ident-specific-paths state ident))) + remove-leftovers (fn [state] + (walk/postwalk + (fn [ele] + (cond + (map? ele) (enc/remove-vals #(= ident %) ele) + (vector? ele) (filterv #(not= ident %) ele) + :else ele)) + state)) + state-without-entity (-> ;; remove pointers to the entity (remove-ident-from-tables state-map ident) @@ -183,13 +194,14 @@ cascade (set (keys target-entity))))) - final-state (reduce - (fn [state edge] - (if (every? eql/ident? edge) - (reduce (fn [new-state ident] (remove-entity new-state ident cascade)) state edge) - (remove-entity state edge cascade))) - state-without-entity - cascaded-idents)] + final-state (remove-leftovers + (reduce + (fn [state edge] + (if (every? eql/ident? edge) + (reduce (fn [new-state ident] (remove-entity new-state ident cascade)) state edge) + (remove-entity state edge cascade))) + state-without-entity + cascaded-idents))] final-state)))