Changeset 274
- Timestamp:
- 04/12/10 15:06:19 (15 years ago)
- Location:
- branches/new-datamodel/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified branches/new-datamodel/src/model/datamodel.lisp ¶
r271 r274 158 158 159 159 160 ;;TODO: modify 2x add-parent --> use add-characteristic and add-role161 ;;TODO: call merge-if-equivalent in 2x add-parent162 160 ;;TODO: mark-as-deleted should call mark-as-deleted for every owned ??? 163 161 ;; versioned-construct of the called construct, same for add-xy ??? 164 162 ;; and associations of player 165 ;;TODO: check for duplicate identifiers after topic-creation/merge166 163 ;;TODO: check merge-constructs in add-topic-identifier, 167 164 ;; add-item-identifier/add-reifier (can merge the parent constructs … … 843 840 844 841 ;;; generic definitions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 842 (defgeneric find-self-or-equal (construct parent-construct &key revision) 843 (:documentation "Returns the construct 'construct' if is owned by the 844 parent-construct or an equal construct or nil if there 845 is no equal one.")) 846 847 845 848 (defgeneric merge-if-equivalent (new-characteristic parent-construct 846 849 &key revision) … … 1693 1696 (map 'list #'characteristic (slot-p construct 'names)))) 1694 1697 (if (find name all-names) 1695 (let ((name-assoc (loop for name-assoc in (slot-p construct 'names) 1696 when (eql (parent-construct name-assoc) 1697 construct) 1698 return name-assoc))) 1698 (let ((name-assoc 1699 (loop for name-assoc in (slot-p construct 'names) 1700 when (eql (parent-construct name-assoc) 1701 construct) 1702 return name-assoc))) 1699 1703 (add-to-version-history name-assoc :start-revision revision)) 1700 1704 (make-construct 'NameAssociationC … … 1753 1757 (map 'list #'characteristic (slot-p construct 'occurrences)))) 1754 1758 (if (find occurrence all-occurrences) 1755 (let ((occ-assoc (loop for occ-assoc in (slot-p construct 'occurrences) 1756 when (eql (parent-construct occ-assoc) construct) 1757 return occ-assoc))) 1759 (let ((occ-assoc 1760 (loop for occ-assoc in (slot-p construct 'occurrences) 1761 when (eql (parent-construct occ-assoc) construct) 1762 return occ-assoc))) 1758 1763 (add-to-version-history occ-assoc :start-revision revision)) 1759 1764 (make-construct 'OccurrenceAssociationC … … 2018 2023 2019 2024 ;;; CharacteristicC 2025 (defmethod find-self-or-equal ((construct CharacteristicC) 2026 (parent-construct TopicC) 2027 &key (revision *TM-REVISION*)) 2028 (declare (integer revision) (type (or OccurrenceC NameC) construct)) 2029 (let ((chars (if (typep construct 'OccurrenceC) 2030 (occurrences parent-construct :revision revision) 2031 (names parent-construct :revision revision)))) 2032 (let ((self (find construct chars))) 2033 (if self 2034 self 2035 (let ((equal-char 2036 (remove-if #'null 2037 (map 'list 2038 #'(lambda(char) 2039 (strictly-equivalent-constructs 2040 char construct :revision revision)) 2041 chars)))) 2042 (when equal-char 2043 (first equal-char))))))) 2044 2045 2020 2046 (defmethod delete-if-not-referenced ((construct CharacteristicC)) 2021 2047 (let ((references (slot-p construct 'parent))) … … 2131 2157 (parent-construct ReifiableConstructC) 2132 2158 &key (revision *TM-REVISION*)) 2159 (declare (integer revision)) 2133 2160 (let ((already-set-parent (parent construct :revision revision)) 2134 2161 (same-parent-assoc ;should contain an object that was marked as deleted … … 2144 2171 :existing-reference (parent construct :revision revision) 2145 2172 :new-reference parent-construct))) 2146 (cond (already-set-parent 2147 (let ((parent-assoc 2148 (loop for parent-assoc in (slot-p construct 'parent) 2149 when (eql parent-construct 2150 (parent-construct parent-assoc)) 2151 return parent-assoc))) 2152 (add-to-version-history parent-assoc :start-revision revision))) 2153 (same-parent-assoc 2154 (add-to-version-history same-parent-assoc :start-revision revision)) 2155 (t 2156 (let ((association-type (cond ((typep construct 'OccurrenceC) 2157 'OccurrenceAssociationC) 2158 ((typep construct 'NameC) 2159 'NameAssociationC) 2160 (t 2161 'VariantAssociationC)))) 2162 (make-construct association-type 2163 :characteristic construct 2164 :parent-construct parent-construct 2165 :start-revision revision))))) 2166 (when (typep parent-construct 'VersionedConstructC) 2167 (add-to-version-history parent-construct :start-revision revision)) 2168 construct) 2173 (let ((merged-char 2174 (merge-if-equivalent construct parent-construct :revision revision))) 2175 (if merged-char 2176 merged-char 2177 (progn 2178 (cond (already-set-parent 2179 (let ((parent-assoc 2180 (loop for parent-assoc in (slot-p construct 'parent) 2181 when (eql parent-construct 2182 (parent-construct parent-assoc)) 2183 return parent-assoc))) 2184 (add-to-version-history parent-assoc 2185 :start-revision revision))) 2186 (same-parent-assoc 2187 (add-to-version-history same-parent-assoc 2188 :start-revision revision)) 2189 (t 2190 (let ((association-type (cond ((typep construct 'OccurrenceC) 2191 'OccurrenceAssociationC) 2192 ((typep construct 'NameC) 2193 'NameAssociationC) 2194 (t 2195 'VariantAssociationC)))) 2196 (make-construct association-type 2197 :characteristic construct 2198 :parent-construct parent-construct 2199 :start-revision revision)))) 2200 (when (typep parent-construct 'VersionedConstructC) 2201 (add-to-version-history parent-construct :start-revision revision)) 2202 construct))))) 2169 2203 2170 2204 … … 2216 2250 2217 2251 ;;; VariantC 2252 (defmethod find-self-or-equal ((construct VariantC) (parent-construct NameC) 2253 &key (revision *TM-REVISION*)) 2254 (declare (integer revision)) 2255 (let ((vars (variants parent-construct :revision revision))) 2256 (let ((self (find construct vars))) 2257 (if self 2258 self 2259 (let ((equal-var 2260 (remove-if #'null 2261 (map 'list 2262 #'(lambda(var) 2263 (strictly-equivalent-constructs 2264 var construct :revision revision)) 2265 vars)))) 2266 (when equal-var 2267 (first equal-var))))))) 2268 2269 2218 2270 (defmethod equivalent-constructs ((construct-1 VariantC) (construct-2 VariantC) 2219 2271 &key (revision *TM-REVISION*)) … … 2476 2528 2477 2529 ;;; RoleC 2530 (defmethod find-self-or-equal ((construct RoleC) (parent-construct AssociationC) 2531 &key (revision *TM-REVISION*)) 2532 (declare (integer revision)) 2533 (let ((p-roles (roles parent-construct :revision revision))) 2534 (let ((self (find construct p-roles))) 2535 (if self 2536 self 2537 (let ((equal-role 2538 (remove-if #'null 2539 (map 'list 2540 #'(lambda(role) 2541 (strictly-equivalent-constructs 2542 role construct :revision revision)) 2543 p-roles)))) 2544 (when equal-role 2545 (first equal-role))))))) 2546 2547 2478 2548 (defmethod delete-if-not-referenced ((construct RoleC)) 2479 2549 (let ((references (slot-p construct 'parent))) … … 2587 2657 (defmethod add-parent ((construct RoleC) (parent-construct AssociationC) 2588 2658 &key (revision *TM-REVISION*)) 2659 (declare (integer revision)) 2589 2660 (let ((already-set-parent (parent construct :revision revision)) 2590 2661 (same-parent-assoc (loop for parent-assoc in (slot-p construct 'parent) … … 2599 2670 :existing-reference (parent construct :revision revision) 2600 2671 :new-reference parent-construct))) 2601 (cond (already-set-parent 2602 (let ((parent-assoc 2603 (loop for parent-assoc in (slot-p construct 'parent) 2604 when (eql parent-construct 2605 (parent-construct parent-assoc)) 2606 return parent-assoc))) 2607 (add-to-version-history parent-assoc :start-revision revision))) 2608 (same-parent-assoc 2609 (add-to-version-history same-parent-assoc :start-revision revision)) 2610 (t 2611 (make-construct 'RoleAssociationC 2612 :role construct 2613 :parent-construct parent-construct 2614 :start-revision revision)))) 2615 (add-to-version-history parent-construct :start-revision revision) 2616 construct) 2672 (let ((merged-role 2673 (merge-if-equivalent construct parent-construct :revision revision))) 2674 (if merged-role 2675 merged-role 2676 (progn 2677 (cond (already-set-parent 2678 (let ((parent-assoc 2679 (loop for parent-assoc in (slot-p construct 'parent) 2680 when (eql parent-construct 2681 (parent-construct parent-assoc)) 2682 return parent-assoc))) 2683 (add-to-version-history parent-assoc 2684 :start-revision revision))) 2685 (same-parent-assoc 2686 (add-to-version-history same-parent-assoc 2687 :start-revision revision)) 2688 (t 2689 (make-construct 'RoleAssociationC 2690 :role construct 2691 :parent-construct parent-construct 2692 :start-revision revision))) 2693 (add-to-version-history parent-construct :start-revision revision) 2694 construct))))) 2617 2695 2618 2696 … … 3288 3366 existing-role)) 3289 3367 (map 'list #'role (slot-p parent 'roles))))))) 3290 (cond ((> (length existing-roles) 1) 3291 (merge-all-constructs existing-roles)) 3292 (existing-roles 3293 (first existing-roles)) 3294 (t 3295 (make-instance 'RoleC)))))) 3368 (if (and existing-roles 3369 (or (eql parent (parent (first existing-roles) 3370 :revision start-revision)) 3371 (not (parent (first existing-roles) 3372 :revision start-revision)))) 3373 (progn 3374 (add-role parent (first existing-roles) 3375 :revision start-revision) 3376 (first existing-roles)) 3377 (make-instance 'RoleC))))) 3296 3378 (when player 3297 3379 (add-player role player :revision start-revision)) … … 3413 3495 :function-symbol 'make-characgteristic))) 3414 3496 (let ((characteristic 3415 (let ((existing-characteristic 3497 (let ((existing-characteristics 3416 3498 (when parent 3417 3499 (remove-if … … 3426 3508 existing-characteristic)) 3427 3509 (get-all-characteristics parent class-symbol)))))) 3428 (if existing-characteristic 3429 (first existing-characteristic) 3510 (if (and existing-characteristics 3511 (or (eql parent (parent (first existing-characteristics) 3512 :revision start-revision)) 3513 (not (parent (first existing-characteristics) 3514 :revision start-revision)))) 3515 (progn 3516 (add-characteristic parent (first existing-characteristics) 3517 :revision start-revision) 3518 (first existing-characteristics)) 3430 3519 (make-instance class-symbol :charvalue charvalue 3431 3520 :datatype datatype))))) -
TabularUnified branches/new-datamodel/src/unit_tests/datamodel_test.lisp ¶
r271 r274 81 81 :test-find-oldest-construct 82 82 :test-move-referenced-constructs-ReifiableConstructC 83 :test-move-referenced-constructs-NameC)) 83 :test-move-referenced-constructs-NameC 84 :test-move-referenced-constructs-TopicC)) 84 85 85 86 … … 2932 2933 2933 2934 2935 (test test-move-referenced-constructs-TopicC () 2936 "Tests the generic move-referenced-constructs corresponding to TopicC." 2937 (with-fixture with-empty-db (*db-dir*) 2938 (let ((rev-1 100) 2939 (rev-2 200)) 2940 (let ((ii-1 (make-construct 'ItemIdentifierC :uri "ii-1")) 2941 (ii-2 (make-construct 'ItemIdentifierC :uri "ii-2")) 2942 (sl-1 (make-construct 'SubjectLocatorC :uri "sl-1")) 2943 (sl-2 (make-construct 'SubjectLocatorC :uri "sl-2")) 2944 (psi-1 (make-construct 'PersistentIdC :uri "psi-1")) 2945 (psi-2 (make-construct 'PersistentIdC :uri "psi-2")) 2946 (tid-1 (make-construct 'TopicIdentificationC :uri "tid-1" 2947 :xtm-id "xtm-1")) 2948 (tid-2 (make-construct 'TopicIdentificationC :uri "tid-2" 2949 :xtm-id "xtm-2")) 2950 (type-1 (make-construct 'TopicC :start-revision rev-1)) 2951 (type-2 (make-construct 'TopicC :start-revision rev-1)) 2952 (theme-1 (make-construct 'TopicC :start-revision rev-1)) 2953 (theme-2 (make-construct 'TopicC :start-revision rev-1))) 2954 (let ((variant-1 (make-construct 'VariantC 2955 :start-revision rev-1 2956 :charvalue "var-1" 2957 :themes (list theme-1))) 2958 (variant-2 (make-construct 'VariantC 2959 :start-revision rev-1 2960 :charvalue "var-2" 2961 :themes (list theme-2))) 2962 (variant-3 (make-construct 'VariantC 2963 :start-revision rev-1 2964 :charvalue "var-1" 2965 :themes (list theme-1))) 2966 (occ-1 (make-construct 'OccurrenceC 2967 :start-revision rev-1 2968 :charvalue "occ-1" 2969 :instance-of type-1 2970 :themes (list theme-1))) 2971 (occ-2 (make-construct 'OccurrenceC 2972 :start-revision rev-1 2973 :charvalue "occ-2" 2974 :instance-of type-2)) 2975 (occ-3 (make-construct 'OccurrenceC 2976 :start-revision rev-1 2977 :charvalue "occ-1" 2978 :instance-of type-1 2979 :themes (list theme-1)))) 2980 (let ((name-1 (make-construct 'NameC 2981 :start-revision rev-1 2982 :charvalue "name-1" 2983 :instance-of type-1)) 2984 ) 2985 )))))) 2934 2986 2935 2987 … … 2992 3044 (it.bese.fiveam:run! 'test-move-referenced-constructs-ReifiableConstructC) 2993 3045 (it.bese.fiveam:run! 'test-move-referenced-constructs-NameC) 3046 (it.bese.fiveam:run! 'test-move-referenced-constructs-TopicC) 2994 3047 )
Note: See TracChangeset
for help on using the changeset viewer.