[isidorus-cvs] r198 - in branches/new-datamodel/src: model unit_tests

Author: lgiessmann Date: Sat Feb 20 09:49:30 2010 New Revision: 198 Log: new-datamodel: fixed some accessor/slot-names; restructured the file datamodel.lisp Modified: branches/new-datamodel/src/model/datamodel.lisp branches/new-datamodel/src/unit_tests/datamodel_test.lisp Modified: branches/new-datamodel/src/model/datamodel.lisp ============================================================================== --- branches/new-datamodel/src/model/datamodel.lisp (original) +++ branches/new-datamodel/src/model/datamodel.lisp Sat Feb 20 09:49:30 2010 @@ -78,9 +78,11 @@ :mark-as-deleted-p :in-topicmaps :delete-construct + :get-revision ;;globals - :*TM-REVISION*)) + :*TM-REVISION* + :*CURRENT-XTM*)) (in-package :datamodel) @@ -89,7 +91,7 @@ ;; after some data-operations are completed (should be passed as body) ;; and a merge should be done ;;TODO: use some exceptions --> more than one type, -;; identifier, not-mergable merges, ... +;; identifier, not-mergable merges, missing-init-args... ;;TODO: implement make-construct -> symbol ;; replace the latest make-construct-method ;;TODO: implement merge-construct -> ReifiableConstructC -> ... @@ -103,6 +105,447 @@ (defvar *TM-REVISION* 0) +(defparameter *CURRENT-XTM* nil "Represents the currently active TM.") + + +;;; classes ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; versioning +(defpclass VersionInfoC() + ((start-revision :initarg :start-revision + :accessor start-revision + :type integer + :initform 0 + :documentation "The start-revision of the version's + interval of a versioned object.") + (end-revision :initarg :end-revision + :accessor end-revision + :type integer + :initform 0 + :documentation "The end-revision of the version's interval + of a versioned object.") + (versioned-construct :initarg :versioned-construct + :accessor versioned-construct + :associate VersionedConstructC + :documentation "The reference of the versioned + object that is described by this + VersionInfoC-object.")) + (:documentation "A VersionInfoC-object describes the revision information + of a versioned object in intervals starting by the value + start-revision and ending by the value end-revision - 1. + end-revision=0 means always the latest version.")) + + +(defpclass VersionedConstructC() + ((versions :initarg :versions + :accessor versions + :inherit t + :associate (VersionInfoC versioned-construct) + :documentation "Version infos for former versions of this base + class."))) + + +;;; pointers ... +(defpclass SubjectLocatorC(IdentifierC) + () + (:index t) + (:documentation "A subject-locator that contains an uri-value and an + association to SubjectLocatorAssociationC's which are in + turn associated with TopicC's.")) + + +(defpclass PersistentIdC(IdentifierC) + () + (:index t) + (:documentation "A subject-identifier that contains an uri-value and an + association to PersistentIdAssociationC's which are in + turn associated with TopicC's.")) + + +(defpclass ItemIdentifierC(IdentifierC) + () + (:index t) + (:documentation "An item-identifier that contains an uri-value and an + association to ItemIdAssociationC's which are in turn + associated with RiefiableConstructC's.")) + + +(defpclass IdentifierC(PointerC) + () + (:documentation "An abstract base class for all TM-Identifiers.")) + + +(defpclass TopicIdentificationC(PointerC) + ((xtm-id :initarg :xtm-id + :accessor xtm-id + :type string + :initform (error "From TopicIdentificationC(): xtm-id must be seet for a topic-identifier") + :index t + :documentation "ID of the TM this identification came from.")) + (:index t) + (:documentation "Identify topic items through generalized topic-ids. + A topic may have many original topicids, the class + representing one of them.")) + + +(defpclass PointerC(TopicMapConstructC) + ((uri :initarg :uri + :accessor uri + :inherit t + :type string + :initform (error "From PointerC(): uri must be set for a pointer") + :index t + :documentation "The actual value of a pointer, i.e. uri or ID.") + (identified-construct :associate (PointerAssociationC identifier) + :inherit t + :documentation "Associates a association-object that + additionally stores some + version-infos.")) + (:documentation "An abstract base class for all pointers.")) + + +;;; reifiables ... +(defpclass AssociationC(ReifiableConstructC ScopableC TypableC) + ((roles :associate (RoleAssociationC association) + :documentation "Contains all association-objects of all roles this + association contains.") + (in-topicmaps :associate (TopicMapC associations) + :many-to-many t + :documentation "List of all topic maps this association is + part of")) + (:index t) + (:documentation "Association in a Topic Map")) + + +(defpclass RoleC(ReifiableConstructC TypableC) + ((parent :associate (RoleAssociationC role) + :documentation "Associates this object with a role-association.") + (player :associate (PlayerAssociationC parent-construct) + :documentation "Associates this object with a player-association."))) + + +(defpclass ReifiableConstructC(TopicMapConstructC) + ((item-identifiers :associate (ItemIdAssociationC parent-construct) + :inherit t + :documentation "A relation to all item-identifiers of + this construct.") + (reifier :associate (ReifierAssociationC reified-construct) + :inherit t + :documentation "A relation to a reifier-topic.")) + (:documentation "Reifiable constructs as per TMDM.")) + + +(elephant:defpclass TopicMapC (ReifiableConstructC) + ((topics :accessor topics + :associate (TopicC in-topicmaps) + :documentation "List of topics that explicitly belong to this TM.") + (associations :accessor associations + :associate (AssociationC in-topicmaps) + :documentation "List of associations that belong to this TM.")) + (:documentation "Represnets a topic map.")) + + +(defpclass TopicC (ReifiableConstructC) + ((topic-identifiers :associate (TopicIdAssociationC parent-construct) + :documentation "Contains all association objects that + relate a topic with its actual + topic-identifiers.") + (psis :associate (PersistentIdAssociationC parent-construct) + :documentation "Contains all association objects that relate a topic + with its actual psis.") + (locators :associate (PersistentIdAssociationC parent-construct) + :documentation "Contains all association objects that relate a + topic with its actual subject-lcoators.") + (names :associate (NameAssociationC parent-construct) + :documentation "Contains all association objects that relate a topic + with its actual names.") + (occurrences :associate (OccurrenceAssociationC parent-construct) + :documentation "Contains all association objects that relate a + topic with its actual occurrences.") + (player-in-roles :associate (PlayerAssociationC player-topic) + :documentation "Contains all association objects that relate + a topic that is a player with its role.") + (used-as-type :associate (TypeAssociationC type-topic) + :documentation "Contains all association objects that relate a + topic that is a type with its typable obejct.") + (used-as-theme :associate (ScopeAssociationC theme-topic) + :documentation "Contains all association objects that relate a + topic that is a theme with its scoppable + object.") + (reified-construct :associate (ReifiedAssociationC reifier-topic) + :documentation "Contains all association objects that + relate a topic that is a reifier with + its reified object.") + (in-topicmaps :associate (TopicMapC topics) + :many-to-many t + :documentation "List of all topic maps this topic is part of.")) + (:index t) + (:documentation "Represents a TM topic.")) + + + +;;; characteristics ... +(defpclass OccurrenceC(CharacteristicC DatatypableC) + () + (:documentation "Represents a TM occurrence.")) + + +(defpclass NameC(CharacteristicC) + ((variants :associate (VariantAssociationC parent-construct) + :documentation "Associates this obejct with varian-associations.")) + (:documentation "Scoped name of a topic.")) + + +(defpclass VariantC(CharacteristicC DatatypableC) + () + (:documentation "Represents a TM variant.")) + + +(defpclass CharacteristicC(ReifiableConstructC ScopableC TypableC) + ((parent :associate (CharacteriticAssociationC characteristic) + :inherit t + :documentation "Assocates the characterist obejct with the + parent-association.") + (charvalue :initarg :charvalue + :accessor charvalue + :type string + :inherit t + :initform "" + :index t + :documentation "Contains the actual data of this object.")) + (:documentation "Scoped characteristic of a topic (meant to be used + as an abstract class).")) + + +;;; versioned associations ... +(defpclass TypeAssociationC(VersionedAssociationC) + ((type-topic :initarg :type-topic + :accessor type-topic + :initform (error "From TypeAssociationC(): type-topic must be set") + :associate TopicC + :documentation "Associates this object with a topic that is used + as type.") + (typable-construct :initarg :typable-construct + :accessor typable-construct + :initform (error "From TypeAssociationC(): typable-construct must be set") + :associate TypableC + :documentation "Associates this object with the typable + construct that is typed by the + type-topic.")) + (:documentation "This class associates topics that are used as type for + typable constructcs. Additionally there are stored some + version-infos.")) + + +(defpclass ScopeAssociationC(VersionedAssociationC) + ((theme-topic :initarg :theme-topic + :accessor theme-topic + :initform (error "From ScopeAssociationC(): theme-topic must be set") + :associate TopicC + :documentation "Associates this opbject with a topic that is a + scopable construct.") + (scopable-construct :initarg :scopable-construct + :accessor scopable-construct + :initform (error "From ScopeAssociationC(): scopable-construct must be set") + :associate ScopableC + :documentation "Associates this object with the socpable + construct that is scoped by the + scope-topic.")) + (:documentation "This class associates topics that are used as scope with + scopable construtcs. Additionally there are stored some + version-infos")) + + +(defpclass ReifierAssociationC(VersionedAssociationC) + ((reifiable-construct :initarg :reifiable-construct + :accessor reifiable-construct + :initform (error "From ReifierAssociation(): reifiable-construct must be set") + :associate ReifiableConstructC + :documentation "The actual construct which is reified + by a topic.") + (reifier-topic :initarg :reifier-topic + :accessor reifier-topic + :initform (error "From ReifierAssociationC(): reifier-topic must be set") + :associate TopicC + :documentation "The reifier-topic that reifies the + reifiable-construct.")) + (:documentation "A versioned-association that relates a reifiable-construct + with a topic.")) + + +(defpclass VersionedAssociationC(VersionedConstructC) + () + (:documentation "An abstract base class for all versioned associations.")) + + + +;;; pointer associations ... +(defpclass SubjectLocatorAssociationC(PointerAssociationC) + ((parent-construct :initarg :parent-construct + :accessor parent-construct + :initform (error "From SubjectLocatorAssociationC(): parent-construct must be set") + :associate TopicC + :documentation "The actual topic which is associated + with the subject-locator.")) + (:documentation "A pointer that associates subject-locators, versions + and topics.")) + + +(defpclass PersistentIdAssociationC(PointerAssociationC) + ((parent-construct :initarg :parent-construct + :accessor parent-construct + :initform (error "From PersistentIdAssociationC(): parent-construct must be set") + :associate TopicC + :documentation "The actual topic which is associated + with the subject-identifier/psi.")) + (:documentation "A pointer that associates subject-identifiers, versions + and topics.")) + + +(defpclass TopicIdAssociationC(PointerAssociationC) + ((parent-construct :initarg :parent-construct + :accessor parent-construct + :initform (error "From TopicIdAssociationC(): parent-construct must be set") + :associate TopicC + :documentation "The actual topic which is associated + with the topic-identifier.")) + (:documentation "A pointer that associates topic-identifiers, versions + and topics.")) + + +(defpclass ItemIdAssociationC(PointerAssociationC) + ((parent-construct :initarg :parent-construct + :accessor parent-construct + :initform (error "From ItemIdAssociationC(): parent-construct must be set") + :associate ReifiableConstructC + :documentation "The actual parent which is associated + with the item-identifier.")) + (:documentation "A pointer that associates item-identifiers, versions + and reifiable-constructs.")) + + +(defpclass PointerAssociationC (VersionedAssociationC) + ((identifier :initarg :identifier + :accessor identifier + :inherit t + :initform (error "From PointerAssociationC(): identifier must be set") + :associate PointerC + :documentation "The actual data that is associated with + the pointer-association's parent.")) + (:documentation "An abstract base class for all versioned + pointer-associations.")) + + +;;; characteristic associations ... +(defpclass VariantAssociationC(CharateristicAssociationC) + ((parent-construct :initarg :parent-construct + :accessor parent-construct + :initform (error "From VariantAssociationC(): parent-construct must be set") + :associate NameC + :documentation "Associates this object with a name.")) + (:documentation "Associates variant objects with name obejcts. + Additionally version-infos are stored.")) + + +(defpclass NameAssociationC(CharacteristicAssociationC) + ((parent-construct :initarg :parent-construct + :accessor parent-construct + :initform (error "From NameAssociationC(): parent-construct must be set") + :associate TopicC + :documentation "Associates this object with a topic.")) + (:documentation "Associates name objects with their parent topics. + Additionally version-infos are stored.")) + + +(defpclass OccurrenceAssociationC(CharacteristicAssociationC) + ((parent-construct :initarg :parent-construct + :accessor parent-construct + :initform (error "From OccurrenceAssociationC(): parent-construct must be set") + :associate TopicC + :documentation "Associates this object with a topic.")) + (:documentation "Associates occurrence objects with their parent topics. + Additionally version-infos are stored.")) + + +(defpclass CharacteristicAssociationC(VersionedAssociationC) + ((characteristic :initarg :characteristic + :accessor characteristic + :inherit t + :initform (error "From CharacteristicCAssociation(): characteristic must be set") + :associate CharactersiticC + :documentation "Associates this object with the actual + characteristic object.")) + (:documentation "An abstract base class for all association-objects that + associates characteristics with topics.")) + + +;;; roles/association associations ... +(defpclass PlayerAssociationC(VersionedAssociationC) + ((player-topic :initarg :player-topic + :accessor player-topic + :associate TopicC + :initform (error "From PlayerAssociationC(): player-topic must be set") + :documentation "Associates this object with a topic that is + a player.") + (parent-construct :initarg :parent-construct + :accessor parent-construct + :associate RoleC + :initform (error "From PlayerAssociationC(): parent-construct must be set") + :documentation "Associates this object with the parent-association.")) + (:documentation "This class associates roles and their player in given + revisions.")) + + +(defpclass RoleAssociationC(VersionedAssociationC) + ((role :initarg :role + :accessor role + :associate RoleC + :initform (error "From RoleAssociationC(): role must be set") + :documentation "Associates this objetc with a role-object.") + (parent-construct :initarg :parent-construct + :accessor parent-construct + :associate AssociationC + :initform (error "From RoleAssociationC(): parent-construct must be set") + :documentation "Assocates thius object with an + association-object.")) + (:documentation "Associates roles with assoications and adds some + version-infos between these realtions.")) + + +;;; base classes ... +(defpclass TopicMapConstructC() + () + (:documentation "An abstract base class for all classes that describes + Topic Maps data.")) + + +(defpclass ScopableC() + ((themes :associate (ScopeAssociationC scopable-construct) + :inherit t + :documentation "Contains all association-objects that contain the + actual scope-topics.")) + (:documentation "An abstract base class for all constructs that are scoped.")) + + +(defpclass TypableC() + ((instance-of :associate (TypeAssociationC type-topic) + :inherit t + :documentation "Contains all association-objects that contain + the actual type-topic.")) + (:documentation "An abstract base class for all typed constructcs.")) + + +(defpclass DatatypableC() + ((datatype :accessor datatype + :initarg :datatype + :initform constants:*xml-string* + :type string + :documentation "The XML Schema datatype of the occurrencevalue + (optional, always IRI for resourceRef).")) + (:index t) + (:documentation "An abstract base class for characteristics that own + an xml-datatype.")) + + ;;; some helpers ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun slot-p (instance slot-symbol) "Returns t if the slot depending on slot-symbol is bound and not nil." @@ -154,46 +597,18 @@ properties)))))) -;;; VersionInfoC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defpclass VersionInfoC() - ((start-revision :initarg :start-revision - :accessor start-revision - :type integer - :initform 0 - :documentation "The start-revision of the version's - interval of a versioned object.") - (end-revision :initarg :end-revision - :accessor end-revision - :type integer - :initform 0 - :documentation "The end-revision of the version's interval - of a versioned object.") - (versioned-construct :initarg :versioned-construct - :accessor versioned-construct - :associate VersionedConstructC - :documentation "The reference of the versioned - object that is described by this - VersionInfoC-object.")) - (:documentation "A VersionInfoC-object describes the revision information - of a versioned object in intervals starting by the value - start-revision and ending by the value end-revision - 1. - end-revision=0 means always the latest version.")) +(defun get-revision () + "TODO: replace by something that does not suffer from a 1 second resolution." + (get-universal-time)) +;;; generic functions/accessors ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; VersionInfocC (defmethod delete-construct :before ((version-info VersionInfoC)) (delete-1-n-association version-info 'versioned-construct)) -;;; VersionedConstructC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defpclass VersionedConstructC() - ((versions :initarg :versions - :accessor versions - :inherit t - :associate (VersionInfoC versioned-construct) - :documentation "Version infos for former versions of this base - class."))) - - +;;; VersionedConstructC (defmethod delete-construct :before ((construct VersionedConstructC)) (dolist (version-info (versions construct)) (delete-construct version-info))) @@ -303,80 +718,7 @@ (setf (end-revision last-version) revision)))) -;;; TopicMapC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(elephant:defpclass TopicMapC (ReifiableConstructC) - ((topics :accessor topics - :associate (TopicC in-topicmaps) - :documentation "List of topics that explicitly belong to this TM.") - (associations :accessor associations - :associate (AssociationC in-topicmaps) - :documentation "List of associations that belong to this TM.")) - (:documentation "Represnets a topic map.")) - - -;;; Pointers ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; SubjectLocatorC -;;; PersistentIdC -;;; ItemIdentifierC -;;; IdentifierC -;;; TopicIdentificationC ;;; PointerC -(defpclass SubjectLocatorC(IdentifierC) - () - (:index t) - (:documentation "A subject-locator that contains an uri-value and an - association to SubjectLocatorAssociationC's which are in - turn associated with TopicC's.")) - - -(defpclass PersistentIdC(IdentifierC) - () - (:index t) - (:documentation "A subject-identifier that contains an uri-value and an - association to PersistentIdAssociationC's which are in - turn associated with TopicC's.")) - - -(defpclass ItemIdentifierC(IdentifierC) - () - (:index t) - (:documentation "An item-identifier that contains an uri-value and an - association to ItemIdAssociationC's which are in turn - associated with RiefiableConstructC's.")) - - -(defpclass IdentifierC(PointerC) - () - (:documentation "An abstract base class for all TM-Identifiers.")) - - -(defpclass TopicIdentificationC(PointerC) - ((xtm-id :initarg :xtm-id - :accessor xtm-id - :type string - :initform (error "From TopicIdentificationC(): xtm-id must be seet for a topic-identifier") - :index t - :documentation "ID of the TM this identification came from.")) - (:index t) - (:documentation "Identify topic items through generalized topic-ids. - A topic may have many original topicids, the class - representing one of them.")) - - -(defpclass PointerC(TopicMapConstructC) - ((uri :initarg :uri - :accessor uri - :inherit t - :type string - :initform (error "From PointerC(): uri must be set for a pointer") - :index t - :documentation "The actual value of a pointer, i.e. uri or ID.") - (identified-construct :initarg :identified-construct - :associate (PointerAssociationC identifier) - :inherit t)) - (:documentation "An abstract base class for all pointers.")) - - (defgeneric identified-construct (construct &key revision) (:documentation "Returns the identified-construct -> ReifiableConstructC or TopicC that corresponds with the passed revision.") @@ -389,77 +731,7 @@ (first assocs))))) -;;; TopicC + Characterics ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defpclass TopicC (ReifiableConstructC) - ((topic-identifiers :associate (TopicIdAssociationC parent-construct) - :documentation "Contains all association objects that - relate a topic with its actual - topic-identifiers.") - (psis :associate (PersistentIdAssociationC parent-construct) - :documentation "Contains all association objects that relate a topic - with its actual psis.") - (locators :associate (PersistentIdAssociationC parent-construct) - :documentation "Contains all association objects that relate a - topic with its actual subject-lcoators.") - (names :associate (NameAssociationC parent-construct) - :documentation "Contains all association objects that relate a topic - with its actual names.") - (occurrences :associate (OccurrenceAssociationC parent-construct) - :documentation "Contains all association objects that relate a - topic with its actual occurrences.") - (player-in-roles :associate (PlayerAssociationC player-topic) - :documentation "Contains all association objects that relate - a topic that is a player with its role.") - (used-as-type :associate (TypeAssociationC type-topic) - :documentation "Contains all association objects that relate a - topic that is a type with its typable obejct.") - (used-as-theme :associate (ScopeAssociationC theme-topic) - :documentation "Contains all association objects that relate a - topic that is a theme with its scoppable - object.") - (reified-construct :associate (ReifiedAssociationC reifier-topic) - :documentation "Contains all association objects that - relate a topic that is a reifier with - its reified object.") - (in-topicmaps :associate (TopicMapC topics) - :many-to-many t - :documentation "List of all topic maps this topic is part of.")) - (:index t) - (:documentation "Represents a TM topic.")) - - -(defpclass OccurrenceC(CharacteristicC DatatypableC) - () - (:documentation "Represents a TM occurrence.")) - - -(defpclass NameC(CharacteristicC) - ((variants :associate (VariantAssociationC parent-construct) - :documentation "Associates this obejct with varian-associations.")) - (:documentation "Scoped name of a topic.")) - - -(defpclass VariantC(CharacteristicC DatatypableC) - () - (:documentation "Represents a TM variant.")) - - -(defpclass CharacteristicC(ReifiableConstructC ScopableC TypableC) - ((parent :associate (CharacteriticAssociationC characteristic) - :inherit t - :documentation "Assocates the characterist obejct with the - parent-association.") - (charvalue :initarg :charvalue - :accessor charvalue - :type string - :inherit t - :initform "" - :index t - :documentation "Contains the actual data of this object.")) - (:documentation "Scoped characteristic of a topic (meant to be used - as an abstract class).")) - - +;;; TopicC (defmethod delete-construct :before ((construct TopicC)) "Deletes all association objects of the passed construct." (dolist (assoc (append (slot-p construct 'topic-identifiers) @@ -509,10 +781,10 @@ :revision revision) construct)) (t - (make-construct 'TopicIdAssociationC - :start-revision revision - :parent-construct construct - :identifier topic-identifier) + (make-instance 'TopicIdAssociationC + :start-revision revision + :parent-construct construct + :identifier topic-identifier) construct))))) @@ -560,10 +832,10 @@ :revision revision) construct)) (t - (make-construct 'PersistentIdAssociationC - :start-revision revision - :parent-construct construct - :identifier psi) + (make-instance 'PersistentIdAssociationC + :start-revision revision + :parent-construct construct + :identifier psi) construct))))) @@ -611,10 +883,10 @@ :revision revision) construct)) (t - (make-construct 'SubjectLocatorAssociationC - :start-revision revision - :parent-construct construct - :identifier locator) + (make-instance 'SubjectLocatorAssociationC + :start-revision revision + :parent-construct construct + :identifier locator) construct))))) @@ -660,10 +932,10 @@ when (eql (parent-construct name-assoc) name) return name-assoc))) (add-to-version-history name-assoc :start-revision revision)) - (make-construct 'NameAssociationC - :start-revision revision - :parent-construct construct - :characteristic name)) + (make-instance 'NameAssociationC + :start-revision revision + :parent-construct construct + :characteristic name)) construct))) @@ -709,10 +981,10 @@ when (eql (parent-construct occ-assoc) occurrence) return occ-assoc))) (add-to-version-history occ-assoc :start-revision revision)) - (make-construct 'OccurrenceAssociationC - :start-revision revision - :parent-construct construct - :characteristic occurrence)) + (make-instance 'OccurrenceAssociationC + :start-revision revision + :parent-construct construct + :characteristic occurrence)) construct))) @@ -773,6 +1045,8 @@ (filter-slot-value-by-revision topic 'in-topicmaps :start-revision revision)) + +;;; NameC (defgeneric variants (construct &key revision) (:documentation "Returns all variants that correspond with the given revision and that are associated with the passed construct.") @@ -786,7 +1060,7 @@ (defgeneric add-variant (construct variant &key revision) (:documentation "Adds the given theme-topic to the passed scopable-construct.") - (:method ((construct ScopableC) (variant VariantC) + (:method ((construct NameC) (variant VariantC) &key (revision *TM-REVISION*)) (when (not (eql (parent variant) construct)) (error "From add-variant(): ~a can't be owned by ~a since it is already owned by the name ~a" @@ -822,6 +1096,7 @@ construct))) +;;; CharacteristicC (defmethod delete-construct :before ((construct CharacteristicC)) "Deletes all association-obejcts." (dolist (parent-assoc (slot-p construct 'parent)) @@ -923,66 +1198,20 @@ (let ((assoc-to-delete (loop for parent-assoc in (slot-p construct 'parent) when (eql (characteristic parent-assoc) parent-construct) - return parent-assoc))) - (when assoc-to-delete - (mark-as-deleted assoc-to-delete :revision revision)) - construct)) - - -;;; Versioned-Associations ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; PlayerAssociationC -;;; RoleAssociationC -;;; VariantAssociationC -;;; NameAssociationC -;;; OccurrenceAssociationC -;;; CharacteristicAssociationC -;;; TypeAssociationC -;;; ScopeAssociationC -;;; ReifierAssociationC -;;; SubjectLocatorAssociationC -;;; PersistentIdAssociationC -;;; TopicIdAssociationC -;;; ItemIdAssociationC -;;; PointerAssociationC -;;; VersionedAssociationC -(defpclass PlayerAssociationC(VersionedAssociationC) - ((player-topic :initarg :player-topic - :accessor player-topic - :associate TopicC - :initform (error "From PlayerAssociationC(): player-topic must be set") - :documentation "Associates this object with a topic that is - a player.") - (parent-construct :initarg :parent-construct - :accessor parent-construct - :associate RoleC - :initform (error "From PlayerAssociationC(): parent-construct must be set") - :documentation "Associates this object with the parent-association.")) - (:documentation "This class associates roles and their player in given - revisions.")) + return parent-assoc))) + (when assoc-to-delete + (mark-as-deleted assoc-to-delete :revision revision)) + construct)) +;;; PlayerAssociationC (defmethod delete-construct :before ((construct PlayerAssociationC)) "Deletes all elephant-associations." (delete-1-n-association construct 'player-topic) (delete-1-n-association construct 'parent-construct)) -(defpclass RoleAssociationC(VersionedAssociationC) - ((role :initarg :role - :accessor role - :associate RoleC - :initform (error "From RoleAssociationC(): role must be set") - :documentation "Associates this objetc with a role-object.") - (parent-construct :initarg :parent-construct - :accessor parent-construct - :associate AssociationC - :initform (error "From RoleAssociationC(): parent-construct must be set") - :documentation "Assocates thius object with an - association-object.")) - (:documentation "Associates roles with assoications and adds some - version-infos between these realtions.")) - - +;;; RoleAssociationC (defmethod delete-construct :before ((construct RoleAssociationC)) "Deletes all elephant-associations and the entire role if it is not associated with another AssociationC object." @@ -993,60 +1222,22 @@ (delete-1-n-association construct 'parent-construct))) -(defpclass VariantAssociationC(CharateristicAssociationC) - ((parent-construct :initarg :parent-construct - :accessor parent-construct - :initform (error "From VariantAssociationC(): parent-construct must be set") - :associate NameC - :documentation "Associates this object with a name.")) - (:documentation "Associates variant objects with name obejcts. - Additionally version-infos are stored.")) - - +;;; VariantAssociationC (defmethod delete-construct :before ((construct VariantAssociationC)) (delete-1-n-association construct 'parent-construct)) -(defpclass NameAssociationC(CharacteristicAssociationC) - ((parent-construct :initarg :parent-construct - :accessor parent-construct - :initform (error "From NameAssociationC(): parent-construct must be set") - :associate TopicC - :documentation "Associates this object with a topic.")) - (:documentation "Associates name objects with their parent topics. - Additionally version-infos are stored.")) - - +;;; NameAssociationC (defmethod delete-construct :before ((construct NameAssociationC)) (delete-1-n-association construct 'parent-construct)) -(defpclass OccurrenceAssociationC(CharacteristicAssociationC) - ((parent-construct :initarg :parent-construct - :accessor parent-construct - :initform (error "From OccurrenceAssociationC(): parent-construct must be set") - :associate TopicC - :documentation "Associates this object with a topic.")) - (:documentation "Associates occurrence objects with their parent topics. - Additionally version-infos are stored.")) - - +;;; OccurrenceAssociationC (defmethod delete-construct :before ((construct OccurrenceAssociationC)) (delete-1-n-association construct 'parent-construct)) -(defpclass CharacteristicAssociationC(VersionedAssociationC) - ((characteristic :initarg :characteristic - :accessor characteristic - :inherit t - :initform (error "From CharacteristicCAssociation(): characteristic must be set") - :associate CharactersiticC - :documentation "Associates this object with the actual - characteristic object.")) - (:documentation "An abstract base class for all association-objects that - associates characteristics with topics.")) - - +;;; CharacteristicAssociationC (defmethod delete-construct :before ((construct CharacteristicAssociationC)) "Deletes all elephant-associations." (let ((characteristic (characteristic construct))) @@ -1056,73 +1247,21 @@ (delete-construct characteristic)))) -(defpclass TypeAssociationC(VersionedAssociationC) - ((type-topic :initarg :type-topic - :accessor type-topic - :initform (error "From TypeAssociationC(): type-topic must be set") - :associate TopicC - :documentation "Associates this object with a topic that is used - as type.") - (typable-construct :initarg :typable-construct - :accessor typable-construct - :initform (error "From TypeAssociationC(): typable-construct must be set") - :associate TypableC - :documentation "Associates this object with the typable - construct that is typed by the - type-topic.")) - (:documentation "This class associates topics that are used as type for - typable constructcs. Additionally there are stored some - version-infos.")) - - +;;; TypeAssociationC (defmethod delete-construct :before ((construct TypeAssociationC)) "Deletes all elephant-associations of the given construct." (delete-1-n-association construct 'type-topic) (delete-1-n-association construct 'typable-construct)) -(defpclass ScopeAssociationC(VersionedAssociationC) - ((theme-topic :initarg :theme-topic - :accessor theme-topic - :initform (error "From ScopeAssociationC(): theme-topic must be set") - :associate TopicC - :documentation "Associates this opbject with a topic that is a - scopable construct.") - (scopable-construct :initarg :scopable-construct - :accessor scopable-construct - :initform (error "From ScopeAssociationC(): scopable-construct must be set") - :associate ScopableC - :documentation "Associates this object with the socpable - construct that is scoped by the - scope-topic.")) - (:documentation "This class associates topics that are used as scope with - scopable construtcs. Additionally there are stored some - version-infos")) - - +;;; ScopeAssociationC (defmethod delete-construct :before ((construct ScopeAssociationC)) "Deletes all elephant-associations of this construct." (delete-1-n-association construct 'theme-topic) (delete-1-n-association construct 'scopable-topic)) -(defpclass ReifierAssociationC(VersionedAssociationC) - ((reifiable-construct :initarg :reifiable-construct - :accessor reifiable-construct - :initform (error "From ReifierAssociation(): reifiable-construct must be set") - :associate ReifiableConstructC - :documentation "The actual construct which is reified - by a topic.") - (reifier-topic :initarg :reifier-topic - :accessor reifier-topic - :initform (error "From ReifierAssociationC(): reifier-topic must be set") - :associate TopicC - :documentation "The reifier-topic that reifies the - reifiable-construct.")) - (:documentation "A versioned-association that relates a reifiable-construct - with a topic.")) - - +;;; ReifierAssociationC (defmethod delete-construct :before ((construct ReifierAssociationC)) "Deletes the association-construct and the reifier-topic when it is not used as a reifier of another construct." @@ -1133,78 +1272,27 @@ (delete-construct reifier-top)))) -(defpclass SubjectLocatorAssociationC(PointerAssociationC) - ((parent-construct :initarg :parent-construct - :accessor parent-construct - :initform (error "From SubjectLocatorAssociationC(): parent-construct must be set") - :associate TopicC - :documentation "The actual topic which is associated - with the subject-locator.")) - (:documentation "A pointer that associates subject-locators, versions - and topics.")) - - +;;; SubjectLocatorAssociationC (defmethod delete-construct :before ((construct SubjectLocatorAssociationC)) (delete-1-n-association construct 'parent-construct)) -(defpclass PersistentIdAssociationC(PointerAssociationC) - ((parent-construct :initarg :parent-construct - :accessor parent-construct - :initform (error "From PersistentIdAssociationC(): parent-construct must be set") - :associate TopicC - :documentation "The actual topic which is associated - with the subject-identifier/psi.")) - (:documentation "A pointer that associates subject-identifiers, versions - and topics.")) - - +;;; PersistentIdAssociationC (defmethod delete-construct :before ((construct PersistentIdAssociationC)) (delete-1-n-association construct 'parent-construct)) -(defpclass TopicIdAssociationC(PointerAssociationC) - ((parent-construct :initarg :parent-construct - :accessor parent-construct - :initform (error "From TopicIdAssociationC(): parent-construct must be set") - :associate TopicC - :documentation "The actual topic which is associated - with the topic-identifier.")) - (:documentation "A pointer that associates topic-identifiers, versions - and topics.")) - - +;;; TopicIdAssociationC (defmethod delete-construct :before ((construct TopicIdAssociationC)) (delete-1-n-association construct 'parent-construct)) -(defpclass ItemIdAssociationC(PointerAssociationC) - ((parent-construct :initarg :parent-construct - :accessor parent-construct - :initform (error "From ItemIDAssociationC(): parent-construct must be set") - :associate ReifiableConstructC - :documentation "The actual parent which is associated - with the item-identifier.")) - (:documentation "A pointer that associates item-identifiers, versions - and reifiable-constructs.")) - - +;;; ItemIdAssociationC (defmethod delete-construct :before ((construct ItemIdAssociationC)) (delete-1-n-association construct 'parent-construct)) -(defpclass PointerAssociationC (VersionedAssociationC) - ((identifier :initarg :identifier - :accessor identifier - :inherit t - :initform (error "From VersionedAssociationC(): identifier must be set") - :associate PointerC - :documentation "The actual data that is associated with - the pointer-association's parent.")) - (:documentation "An abstract base class for all versioned - pointer-associations.")) - - +;;; PointerAssociationC (defmethod delete-construct :before ((construct PointerAssociationC)) "Deletes the association-construct and the pointer if it is not used as an idengtiffier of any other object." @@ -1214,31 +1302,7 @@ (delete-construct id)))) -(defpclass VersionedAssociationC() - () - (:documentation "An abstract base class for all versioned associations.")) - - -;;; RoleC + AssociationC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defpclass AssociationC(ReifiableConstructC ScopableC TypableC) - ((roles :associate (RoleAssociationC association) - :documentation "Contains all association-objects of all roles this - association contains.") - (in-topicmaps :associate (TopicMapC associations) - :many-to-many t - :documentation "List of all topic maps this association is - part of")) - (:index t) - (:documentation "Association in a Topic Map")) - - -(defpclass RoleC(ReifiableConstructC TypableC) - ((parent :associate (RoleAssociationC role) - :documentation "Associates this object with a role-association.") - (player :associate (PlayerAssociationC parent-construct) - :documentation "Associates this object with a player-association."))) - - +;;; AssociationC (defmethod delete-construct :before ((construct AssociationC)) "Removes all elephant-associations and deleted all roles that are not associated by another associations." @@ -1295,6 +1359,7 @@ (filter-slot-value-by-revision association 'in-topicmaps :start-revision revision)) +;;; RoleC (defmethod delete-construct :before ((construct RoleC)) "Deletes all association-objects." (dolist (assoc (slot-p construct 'parent)) @@ -1341,7 +1406,7 @@ &key (revision (error "From delete-parent(): revision must be set"))) (let ((assoc-to-delete (loop for parent-assoc in (slot-p construct 'parent) - when (eql (association parent-assoc) parent-construct) + when (eql (parent-construct parent-assoc) parent-construct) return parent-assoc))) (when assoc-to-delete (mark-as-deleted assoc-to-delete :revision revision)) @@ -1399,18 +1464,7 @@ construct))) -;;; ReifiableConstructC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defpclass ReifiableConstructC(TopicMapConstructC) - ((item-identifiers :associate (ItemIdAssociationC identified-construct) - :inherit t - :documentation "A relation to all item-identifiers of - this construct.") - (reifier :associate (ReifierAssociationC reified-construct) - :inherit t - :documentation "A relation to a reifier-topic.")) - (:documentation "Reifiable constructs as per TMDM.")) - - +;;; ReifiableConstructC (defgeneric item-identifiers (construct &key revision) (:documentation "Returns the ItemIdentifierC-objects that correspond with the passed construct and the passed version.") @@ -1463,11 +1517,11 @@ :revision revision) construct)) (t - (make-construct 'ItemIdAssociationC - :start-revision revision - :parent-construct construct - :identifier item-identifier) - construct))))) + (make-instance 'ItemIdAssociationC + :start-revision revision + :parent-construct construct + :identifier item-identifier))) + construct))) (defgeneric delete-item-identifier (construct item-identifier &key revision) @@ -1509,10 +1563,10 @@ (all-constructs (merge-constructs (first all-constructs) construct)) (t - (make-construct 'ReifierAssociationC - :start-revision revision - :reifiable-construct construct - :reifier-topic merged-reifier-topic) + (make-instance 'ReifierAssociationC + :start-revision revision + :reifiable-construct construct + :reifier-topic merged-reifier-topic) construct)))))) @@ -1529,22 +1583,7 @@ construct))) -;;; TopicMapConstructC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defpclass TopicMapConstructC() - () - (:documentation "An abstract base class for all classes that describes - Topic Maps data.")) - - -;;; ScopableC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defpclass ScopableC() - ((themes :associate (ScopeAssociationC scopable-construct) - :inherit t - :documentation "Contains all association-objects that contain the - actual scope-topics.")) - (:documentation "An abstract base class for all constructs that are scoped.")) - - +;;; ScopableC (defmethod delete-construct :before ((construct ScopableC)) "Deletes all ScopeAssociationCs that are associated with the given object." (dolist (theme (slot-p construct 'themes)) @@ -1595,15 +1634,7 @@ construct))) -;;; TypableC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defpclass TypableC() - ((instance-of :associate (TypeAssociationC type-topic) - :inherit t - :documentation "Contains all association-objects that contain - the actual type-topic.")) - (:documentation "An abstract base class for all typed constructcs.")) - - +;;; TypableC (defmethod delete-construct :before ((construct TypableC)) "Deletes all TypeAssociationCs that are associated with this object." (dolist (type (slot-p construct 'instance-of)) @@ -1663,18 +1694,6 @@ construct))) -;;; DatatypableC -(defpclass DatatypableC() - ((datatype :accessor datatype - :initarg :datatype - :initform constants:*xml-string* - :documentation "The XML Schema datatype of the occurrencevalue - (optional, always IRI for resourceRef).")) - (:index t) - (:documentation "An abstract base class for characteristics that own - an xml-datatype.")) - - Modified: branches/new-datamodel/src/unit_tests/datamodel_test.lisp ============================================================================== --- branches/new-datamodel/src/unit_tests/datamodel_test.lisp (original) +++ branches/new-datamodel/src/unit_tests/datamodel_test.lisp Sat Feb 20 09:49:30 2010 @@ -16,7 +16,8 @@ :unittests-constants) (:export :run-datamodel-tests :test-VersionInfoC - :test-VersionedConstructC)) + :test-VersionedConstructC + :test-ItemIdentifierC)) (declaim (optimize (debug 3))) @@ -91,11 +92,28 @@ (is (= (length (elephant:get-instances-by-class 'd::VersionInfoC)) 0)) (is (= (length (elephant:get-instances-by-class 'd::VersionedConstructC)) 0))))) - - +(test test-ItemIdentifierC () + "Tests various functions of the VersionedCoinstructC class." + (with-fixture with-empty-db (*db-dir*) + (setf d:*TM-REVISION* 100) + (let ((ii-1 (make-instance 'd:ItemIdentifierC + :uri "ii-1")) + (ii-2 (make-instance 'd:ItemIdentifierC + :uri "ii-2")) + (topic (make-instance 'd:TopicC))) + (is-false (d:identified-construct ii-1)) + (signals error (make-instance 'd:ItemIdentifierC)) + (is-false (item-identifiers topic)) + (d:add-item-identifier topic ii-1) + (format t ">>> ~a~%" (d::parent-construct ii-1)) + (is (= (length (d:item-identifiers topic)) 1)) + ))) + + (defun run-datamodel-tests() (it.bese.fiveam:run! 'test-VersionInfoC) (it.bese.fiveam:run! 'test-VersionedConstructC) + (it.bese.fiveam:run! 'test-ItemIdentifierC) ) \ No newline at end of file
participants (1)
-
Lukas Giessmann