[isidorus-cvs] r718 - in trunk/src: model rest_interface

lgiessmann at common-lisp.net lgiessmann at common-lisp.net
Wed Aug 10 14:55:53 UTC 2011


Author: lgiessmann
Date: Wed Aug 10 07:55:51 2011
New Revision: 718

Log:
trunk: rest-interface: fixed a bug when updating the serializatiuon cache of fragments after another topic was deleted that was bound to an association which referenced other topics/fragments

Modified:
   trunk/src/model/datamodel.lisp
   trunk/src/rest_interface/set-up-json-interface.lisp

Modified: trunk/src/model/datamodel.lisp
==============================================================================
--- trunk/src/model/datamodel.lisp	Wed Aug 10 03:37:39 2011	(r717)
+++ trunk/src/model/datamodel.lisp	Wed Aug 10 07:55:51 2011	(r718)
@@ -1577,7 +1577,7 @@
   (when (or (and (not source-locator) sl-provided-p)
 	    (and sl-provided-p
 		 (some (lambda (psi) (string-starts-with (uri psi) source-locator))
-		       (psis top :revision 0))))
+		       (psis top :revision revision))))
     (mapc (lambda(psi)(mark-as-deleted psi :revision revision
 				       :source-locator source-locator))
 	  (psis top :revision revision))

Modified: trunk/src/rest_interface/set-up-json-interface.lisp
==============================================================================
--- trunk/src/rest_interface/set-up-json-interface.lisp	Wed Aug 10 03:37:39 2011	(r717)
+++ trunk/src/rest_interface/set-up-json-interface.lisp	Wed Aug 10 07:55:51 2011	(r718)
@@ -609,7 +609,8 @@
 					    (when (eql (d:topic fragment) result)
 					      (elephant:drop-instance fragment)))
 				      (elephant:get-instances-by-value
-				       'd:FragmentC 'd:topic result)))
+				       'd:FragmentC 'd:topic result))
+				 (update-fragments result rev))
 				((typep result 'd:AssociationC)
 				 (let ((players
 					(delete-if
@@ -654,6 +655,49 @@
 	(setf (hunchentoot:return-code*) hunchentoot:+http-bad-request+))))
 
 
+
+(defun update-fragments(deleted-topic delete-revision)
+  "Updates all fragments of topics that directly and indireclty
+   related to the delete-topic."
+  (declare (TopicC deleted-topic)
+	   (Integer delete-revision))
+  (let* ((rev (1- delete-revision))
+	 (all-tops
+	  (append
+	   (let ((assocs
+		  (map 'list (lambda(role)
+			       (d:parent role :revision rev))
+		       (d:player-in-roles deleted-topic :revision rev))))
+	     (loop for assoc in assocs
+		append (loop for role in (roles assoc :revision rev)
+			  collect (d:player role :revision rev))))
+	   (let ((items
+		  (append (used-as-theme deleted-topic :revision rev)
+			  (used-as-type deleted-topic :revision rev))))
+	     (loop for item in items
+		when (or (typep item 'NameC) (typep item 'OccurrenceC))
+		collect (parent item :revision rev)
+		when (or (typep item 'RoleC) (typep item 'AssociationC))
+		append (let ((inst (if (typep item 'AssociationC)
+				       item
+				       (d:parent item :revision rev))))
+			 (loop for role in (roles inst :revision rev)
+			    collect (d:player role :revision rev)))))))
+	 (fragments
+	  (delete-if #'null
+		     (map 'list (lambda(top)
+				  (elephant:get-instance-by-value
+				   'd:FragmentC 'd::topic top))
+			  (delete-duplicates
+			   (delete deleted-topic
+				   (delete-if #'null all-tops)))))))
+    (map nil (lambda(frg)
+	       (setf (slot-value frg 'd::serializer-cache) nil)
+	       (d:serialize-fragment frg (fragment-serializer)))
+	 fragments)))
+			       
+
+
 (defun return-latest-revision ()
   "Returns an integer that represents the latest revision that
    is used in the storage."




More information about the Isidorus-cvs mailing list