Changeset 274


Ignore:
Timestamp:
04/12/10 15:06:19 (15 years ago)
Author:
lgiessmann
Message:

new-datamodel: added merging of characteristics when added with "add-<type>"

Location:
branches/new-datamodel/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified branches/new-datamodel/src/model/datamodel.lisp

    r271 r274  
    158158
    159159
    160 ;;TODO: modify 2x add-parent --> use add-characteristic and add-role
    161 ;;TODO: call merge-if-equivalent in 2x add-parent
    162160;;TODO: mark-as-deleted should call mark-as-deleted for every owned ???
    163161;;      versioned-construct of the called construct, same for add-xy ???
    164162;;      and associations of player
    165 ;;TODO: check for duplicate identifiers after topic-creation/merge
    166163;;TODO: check merge-constructs in add-topic-identifier,
    167164;;      add-item-identifier/add-reifier (can merge the parent constructs
     
    843840
    844841;;; 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
    845848(defgeneric merge-if-equivalent (new-characteristic parent-construct
    846849                                                    &key revision)
     
    16931696               (map 'list #'characteristic (slot-p construct 'names))))
    16941697          (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)))
    16991703                (add-to-version-history name-assoc :start-revision revision))
    17001704              (make-construct 'NameAssociationC
     
    17531757               (map 'list #'characteristic (slot-p construct 'occurrences))))
    17541758          (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)))
    17581763                (add-to-version-history occ-assoc :start-revision revision))
    17591764              (make-construct 'OccurrenceAssociationC
     
    20182023
    20192024;;; 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
    20202046(defmethod delete-if-not-referenced ((construct CharacteristicC))
    20212047  (let ((references (slot-p construct 'parent)))
     
    21312157                       (parent-construct ReifiableConstructC)
    21322158                       &key (revision *TM-REVISION*))
     2159  (declare (integer revision))
    21332160  (let ((already-set-parent (parent construct :revision revision))
    21342161        (same-parent-assoc ;should contain an object that was marked as deleted
     
    21442171                             :existing-reference (parent construct :revision revision)
    21452172                             :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)))))
    21692203
    21702204
     
    22162250
    22172251;;; 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
    22182270(defmethod equivalent-constructs ((construct-1 VariantC) (construct-2 VariantC)
    22192271                                  &key (revision *TM-REVISION*))
     
    24762528
    24772529;;; 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
    24782548(defmethod delete-if-not-referenced ((construct RoleC))
    24792549  (let ((references (slot-p construct 'parent)))
     
    25872657(defmethod add-parent ((construct RoleC) (parent-construct AssociationC)
    25882658                            &key (revision *TM-REVISION*))
     2659  (declare (integer revision))
    25892660  (let ((already-set-parent (parent construct :revision revision))
    25902661        (same-parent-assoc (loop for parent-assoc in (slot-p construct 'parent)
     
    25992670                             :existing-reference (parent construct :revision revision)
    26002671                             :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)))))
    26172695
    26182696
     
    32883366                                      existing-role))
    32893367                          (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)))))
    32963378      (when player
    32973379        (add-player role player :revision start-revision))
     
    34133495                             :function-symbol 'make-characgteristic)))
    34143496    (let ((characteristic
    3415            (let ((existing-characteristic
     3497           (let ((existing-characteristics
    34163498                  (when parent
    34173499                    (remove-if
     
    34263508                                      existing-characteristic))
    34273509                          (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))
    34303519                 (make-instance class-symbol :charvalue charvalue
    34313520                                :datatype datatype)))))
  • TabularUnified branches/new-datamodel/src/unit_tests/datamodel_test.lisp

    r271 r274  
    8181           :test-find-oldest-construct
    8282           :test-move-referenced-constructs-ReifiableConstructC
    83            :test-move-referenced-constructs-NameC))
     83           :test-move-referenced-constructs-NameC
     84           :test-move-referenced-constructs-TopicC))
    8485
    8586
     
    29322933
    29332934
     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            ))))))
    29342986
    29352987
     
    29923044  (it.bese.fiveam:run! 'test-move-referenced-constructs-ReifiableConstructC)
    29933045  (it.bese.fiveam:run! 'test-move-referenced-constructs-NameC)
     3046  (it.bese.fiveam:run! 'test-move-referenced-constructs-TopicC)
    29943047  )
Note: See TracChangeset for help on using the changeset viewer.