enhancement
major
minor
defect
critical
major
minor
major
#30115
delete-module / delete-class räumen hasWrapperAttValue-Daten nicht auf
Beim Löschen von Modulen (delete-module) oder Klassen (delete-class) in einer Migration werden die Metadaten-Zeilen in META_ATTRIBUTE korrekt entfernt, aber die zugehörigen Datenzeilen in HAS_WRAPPER_ATT_VALUE (und ggf. weiteren Assoziationstabellen) verbleiben als verwaiste Einträge in der Datenbank.
Ursache
- DeleteTLModuleProcessor sammelt Typen, TypeParts, Generalizations und Specializations ein und löscht sie per deleteModelParts() direkt aus den Metadaten-Tabellen, ohne auf DeleteTLReferenceProcessor zurückzufallen.
- DeleteTLClassProcessor ruft Util.deleteTLType() auf, das die Metadaten und synthetischen Assoziationstypen löscht, aber ebenfalls kein DELETE FROM HAS_WRAPPER_ATT_VALUE ausführt.
- Nur der explizite DeleteTLReferenceProcessor (<delete-reference>) löscht die Datenzeilen aus der Assoziationstabelle (default: hasWrapperAttValue).
Auswirkung
Nach einer Migration, die Module oder Klassen mit gespeicherten Referenz-Attributen löscht, verbleiben verwaiste Zeilen in HAS_WRAPPER_ATT_VALUE, deren META_ATTRIBUTE_ID auf nicht mehr existierende META_ATTRIBUTE-Einträge verweist. Funktional hat das keinen direkten Effekt, da die Zeilen zur Laufzeit nicht mehr adressiert werden, aber es belastet die Datenbank mit totem Ballast.
Erwartetes Verhalten
delete-module und delete-class sollten für jede gelöschte Reference auch die zugehörigen Datenzeilen in der Assoziationstabelle entfernen — idealerweise durch Wiederverwendung der Logik aus DeleteTLReferenceProcessor.
Ergänzung: Daten gelöschter Instanzen
Ist bei delete-class die Option type-table gesetzt, löscht DeleteTLClassProcessor die Instanzen der Klasse aus der Objekttabelle (DELETE FROM <type-table> WHERE BRANCH = ? AND TYPE_ID = ?). Die Daten, die an diesen Instanzen hängen, bleiben jedoch stehen:
- Flex-Attribute: Die Zeilen in FLEX_DATA (Schlüssel TYPE = Tabellenname, IDENTIFIER, BRANCH) der gelöschten Instanzen werden nicht entfernt.
- Referenzwerte: Zeilen in hasWrapperAttValue (bzw. den weiteren Assoziationstabellen), deren SOURCE eine gelöschte Instanz ist, werden nicht entfernt — auch nicht für Referenzen anderer, nicht gelöschter Klassen.
delete-module bietet keine Entsprechung zu type-table; die Instanzen der Klassen eines gelöschten Moduls bleiben dort vollständig stehen.
Erwartet: Werden Instanzen aus der Objekttabelle gelöscht, werden auch ihre Flex-Attribute in FLEX_DATA und die von ihnen ausgehenden Zeilen in den Assoziationstabellen gelöscht. delete-module sollte analog die Instanzen seiner Klassen samt dieser Daten löschen können.
Vorbilder im Code:
- DeleteTLPropertyProcessor löscht beim Entfernen eines Attributs bereits die zugehörigen FLEX_DATA-Zeilen.
- DeletedObjectPurge räumt zur Laufzeit Flex-Daten und Link-Zeilen gelöschter Objekte auf; es arbeitet aber auf einer laufenden KnowledgeBase und ist daher nur als Vorlage für die Logik nutzbar, nicht direkt in der Migration.
Hinweis zur Assoziationstabelle
Referenzen können außer in hasWrapperAttValue auch in anderen Tabellen gespeichert sein, die auf hasWrapperAttValueBaseAssociation basieren (Unversioned-, Bag-, Historic-Varianten oder anwendungsspezifische Tabellen). delete-class und delete-module kennen die Speicherung der einzelnen Referenz nicht. Vorschlag: über MigrationContext#getPersistentRepository() alle Tabellen dieser Hierarchie ermitteln und in jeder per IN-Set auf META_ATTRIBUTE_ID bzw. SOURCE löschen.
Betroffene Klassen
- com.top_logic.element.model.migration.model.DeleteTLModuleProcessor
- com.top_logic.element.model.migration.model.DeleteTLClassProcessor
- com.top_logic.model.migration.Util#deleteTLType