Lade...
 

Link

Link

Link(zugriffsAusdruck), Link(STACK), Link(zugriffsAusdruck, backRef), Link(STACK, STACK)

Parameter: ein Zugriffsausdruck, Name der Rückreferenz.

Link eines Objekts

Stack
Stack Position Beschreibung
Stack(In) Top Zielobjekt
  Top-1 einzufügendes Objekt
Stack(Out) Top -

Der vom Zielobjekt ausgehend über den Zugriffsausdruck erreichte Pointer p soll nach dieser Operation auf das Objekt auf Stack-Top-1 zeigen, 

oder das Objekt aus Stack-Top-1 wird in die - ausgehend vom Zielobjekt - über den Zugriffsausdruck erreichte Collection c eingefügt.

Beide Objekte müssen entweder transient oder persistent sein. Wenn der im Zielobjekt ausgewählte Pointer im DDI als 1-1- oder 1-m-Referenz  oder die im Zielobjekt ausgewählte Collection im DDI als m-1- oder m-n-Referenz deklariert wurde, ist der Name einer Rückreferenz als zweiter Operand anzugeben. Die Rückreferenz (Pointer oder Collection) wird nach Überprüfung des im DDI angegeben Typs gesetzt.

Link wird von Einträgen im DDI gesteuert und bricht mit einem Fehler ab, wenn versucht wird, eine der im DDI getroffenen Festlegungen zu verletzen. Dies ist der Fall, wenn:

  • der Datentyp des zu referenzierenden Objekts nicht zu dem im DDI eingetragenen Referenz-Datentyp passt  (d.h. das zu referenzierende Objekt ist keine Instanz der im DDI eingetragenen oder einer davon abgeleiteten Klasse)
  • das Pointer p enthaltende Objekt o nicht zu dem im DDI eingetragenen BackReferenz-Datentyp paßt (d.h. Objekt o ist keine Instanz der im DDI als Backreference-Typ eingetragenen oder einer davon abgeleiteten Klasse)
  • das Collection c enthaltende Objekt o nicht zu dem im DDI eingetragenen BackReferenz-Datentyp passt (d.h. Objekt o ist keine Instanz der im DDI als Backreference-Typ eingetragenen oder einer davon abgeleiteten Klasse)
  • die zum Beginn der Operation vorgefundene Referenz hinsichtlich Hin- oder Rückreferenz einen Typwiderspruch zum DDI enthält
  • bei einer 1-1-Relation die Rückreferenz nicht auf Objekt o zeigt
  • bei einer m-1-Relation die Rückreferenz nicht auf Objekt o zeigt
  • bei einer 1-m-Relation Objekt o kein Element der Backreference-Collection ist.
  • bei einer m-n-Relation Objekt o kein Element der Backreference-Collection ist.

Wenn eines oder beide Objekte Wrapper sind, gelten folgende Regeln (B A Link(..., ...)):

  • A -> B: Relation ist immer auf den Wrapper gerichtet und geht immer vom Wrapper aus.
    • Ausnahme: Die Relation ist eine M1 oder MN Relation und der Core hat diesen Slot bereits oder es ist ein DDI-Member der Klasse. Dann geht die Relation vom Core  von A aus.
  • B -> A: Relation geht immer vom Core aus und ist immer auf den Wrapper gerichtet.

Beispiel: wB wA Link(rel1m, relm1)   wobei wB = gewrapptes B und wA = gewrapptes A
=> wA.rel1m zeigt auf wB und B.relm1 zeigt auf wA

Üblich sind so genannte "Dreier":
'alloc' sei ein CX_SINGLE_ALLOCATION,
'sup' ein CX_SUPPLIER und
'wsup' der CX_SUPPLIER gewrappt
Aus 'wsup alloc Link(object, allocations)' wird ein Dreier gebildet:

 

Dieser Mechanismus, dass die Rückrelation auf den Core geht hat den Hintergrund, dass häufig irgendein Objekt mit dem Hauptobjekt verlinkt werden soll und unklar ist, ob es sich dabei um einen Wrapper handelt oder nicht. Die Rückrelation sollte aber nicht in den Wrapper gesetzt werden, denn man will eher vom gewrappten Zielobjekt aus die Relationen untersuchen. Um beim Linken dem Entwickler das Link(rel, core.rel) zu ersparen, gibt es diesen Mechanismus.

Durch diesen Mechanismus ist es jedoch nicht möglich direkt zwei Wrapper miteinander in Relation zu setzen, ohne die gewrappten Objekte zu verändern. Um dies zu bewerkstelligen, muss UnsafeLink verwendet werden. Bsp:

wA wB UnsafeLink(rel11) // ref
wB wA UnsafeLink(rel11) // back ref

Eine auf diese Weise aufgebaute Relation kann regulär über Unlink wieder aufgelöst werden.

 

Ein persistentes Objekt darf nie ein transientes Objekt referenzieren, dies betrifft Hin- und Rückreferenz. Folgende Referenzen sind erlaubt:

  transient persistent
transient erlaubt mit Einschränkungen erlaubt
persistent verboten erlaubt

Ein transientes Objekt darf ein persistentes referenzieren, wenn

  • der Pointer ein dynamisches Datenfeld und
  • vom Typ POINTER ist (REL_11 bzw. REL_1M würden eine Rückreferenz vom persistenten zum transienten Objekt erzwingen, und dies ist verboten).

Hinweis:  Wenn ein persistentes Objekt an der Operation teilnimmt, beginnt eine Transaktion.

Link einer Collection/eines Vektors

Ist das obere Element auf dem Stack ein Vektor oder eine Collection, so werden alle Elemente dessen einzeln verlinkt.

So ist

[ source1 source2 ] # target Link(collection)

äquivalent zu

source2 target Link(collection) source1 target Link(collection)
Verwandte Themen