cm:name – Die erzwungene Eigenschaft

Im letzten Post habe ich ein Performanceproblem beschrieben, welches auf die Nutzung von cm:name (bzw. cm:cmobject als Vatertyp) bei der Modellierung / Instanziierung von 500.000+ Datensätzen im Standard ContentStore zurückgeführt werden konnte. Entsprechend eines der aufgeführten Ansätze wollte ich diese Tage eine kleine Migration umsetzen, bei welcher die redundante Eigenschaft cm:name durch Wechsel auf den Vatertyp sys:base und anschließender Löschung der persistenten Werte von den 500.000+ Datensätzen eliminiert werden sollte. Dabei wurde mir bewusst, dass cm:name unabhängig von der Definition meiner Inhaltstypen im Data Dictionary durch das System immer gespeichert und indiziert wird – lediglich die Prüfung auf Pflicht und Constraint basiert auf der tatsächlichen Typdefinition.

Damit wird natürlich der Ansatz zur Bekämpfung des Performanceproblems wertlos – wenn es unmöglich ist, ein Node ohne cm:name in Datenbank und Index anzulegen, dann lassen sich Seiteneffekte auf die Standardnavigation von Share durch große Datensätze nicht vermeiden.

Wie äußert sich dieses Verhalten?

  • Wird ein Node ohne cm:name angelegt, so wird kein Wert gespeichert, aber beim Auslesen die UUID der NodeRef als vorgetäuschte cm:name zurück gegeben (z.B. DBNodeServiceImpl.getProperty(NodeRef, QName) oder ReferenceablePropertiesEntity.addReferenceableProperties(Node, Map<QName,Serializable>)).
  • Nur die lt. Typ definierten Eigenschaften werden bei der Anlage / einer Aktualisierung validiert. Da cm:name nur für cm:cmobject und davon abgeleitete Typen definiert ist, wird der Constraint nur für diese Typen geprüft. Die Prüfung auf Pflicht ist zwecklos, da Alfresco die Eigenschaft transparent auf die UUID setzt, wenn sie nicht explizit angegeben wurde.
  • Beim Indizieren gilt nichtmehr die Typdefinition, sondern die vorhandenen Eigenschaften und deren Definition. D.h. für Knoten, die nicht von cm:cmobject ableiten wird cm:name trotzdem indiziert, weil es a) automatisch den Wert der UUID hat, wenn es nicht gesetzt wurde und b) eine Definition der Eigenschaft gibt, welche die Indizierung vorgibt (nämlich an cm:cmobject).

Lt. SVN ist dieses Verhalten soweit von mir geprüft seit 3.2 so anzufinden und auch in der aktuellen 4.0 unverändert. Für welche Funktionalität muss diese Eigenschaft erzwungen werden, auch wenn ich sie nicht in meinem Datenmodell (bzw. den definierenden Typ) verwendet habe? Bei der in solchen Fällen üblichen Frage “Bug oder Feature” stimme ich aktuell für “Bug”. Als Partner im Auftrag eines Enterprise Kunden habe ich diesen Punkt entsprechend dem Alfresco Support übermittelt. Wenn das Verhalten bewusst so sein soll, dann wäre es zumindest sauberer, cm:name – ähnlich wie die Eigenschaften von sys:referencable – an sys:base zu hängen.

Kommentar schreiben

0 Kommentare.

Kommentar schreiben


Hinweis - Du kannst dies benutzenHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>