[isidorus-cvs] r267 - branches/new-datamodel/src/model
Lukas Giessmann
lgiessmann at common-lisp.net
Tue Apr 6 20:09:58 UTC 2010
Author: lgiessmann
Date: Tue Apr 6 16:09:58 2010
New Revision: 267
Log:
new-datamodel: added "merge-constructs" --> "RoleC"
Modified:
branches/new-datamodel/src/model/datamodel.lisp
Modified: branches/new-datamodel/src/model/datamodel.lisp
==============================================================================
--- branches/new-datamodel/src/model/datamodel.lisp (original)
+++ branches/new-datamodel/src/model/datamodel.lisp Tue Apr 6 16:09:58 2010
@@ -155,6 +155,10 @@
(in-package :datamodel)
+;;TODO: call delete-construct for all child-constructs that are:
+;; *exist-in-revision-history => nil
+;; *are not referenced by other constructs
+;; --> iis, psis, sls, tids, names, occs, variants, roles
;;TODO: mark-as-deleted should call mark-as-deleted for every owned
;; versioned-construct of the called construct
;;TODO: add: add-to-version-history (parent) to all
@@ -3636,20 +3640,40 @@
(delete-construct newer-assoc))
older-assoc))))
-;TODO: merge-constructs: RoleC (merge parents), AssociationC
-
-
-
-
-
-;;; start hacks ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defmethod merge-constructs ((construct-1 TopicMapConstructC) (construct-2 TopicMapconstructC)
+(defmethod merge-constructs ((construct-1 RoleC) (construct-2 RoleC)
&key (revision *TM-REVISION*))
- (or revision)
- (if construct-1 construct-1 construct-2))
-
-
-
-
-;;; end hacks ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ (declare (integer *TM-REVISION*))
+ (if (eql construct-1 construct-2)
+ construct-1
+ (let ((older-role (find-oldest-construct construct-1 construct-2)))
+ (let ((newer-role (if (eql older-role construct-1)
+ construct-2
+ construct-1)))
+ (unless (strictly-equivalent-constructs construct-1 construct-2
+ :revision revision)
+ (error "From merge-constructs(): ~a and ~a are not mergable"
+ construct-1 construct-2))
+ (let ((parent-1 (parent older-role :revision revision))
+ (parent-2 (parent newer-role :revision revision)))
+ (cond ((and parent-1 (eql parent-1 parent-2))
+ (move-referenced-constructs newer-role older-role
+ :revision revision)
+ (delete-role newer-role parent-2 :revision revision)
+ (add-role older-role parent-1 :revision revision))
+ ((and parent-1 parent-2)
+ (let ((active-assoc (merge-constructs parent-1 parent-2
+ :revision revision)))
+ (if (find older-role (roles active-assoc
+ :revision revision))
+ older-role
+ newer-role)))
+ ((or parent-1 parent-2)
+ (let ((dst (if parent-1 older-role newer-role))
+ (src (if parent-1 newer-role older-role)))
+ (move-referenced-constructs src dst :revision revision)
+ dst))
+ (t
+ (move-referenced-constructs newer-role older-role
+ :revision revision)
+ older-role)))))))
\ No newline at end of file
More information about the Isidorus-cvs
mailing list