110 KAPITEL 6: VERBESSERUNGSMÖGLICHKEITEN{var : (v 1234 : {v 1234 : (v 123 : T 1 p 1 T 2 p 3 T 3 p 4 , x 4 : T 4 )|p 6 (x 3 , x 4 )}, x 5 : T 5 ) |p 5 (x 1 , x 2 , x 3 ) ∧ p 7 (x 1 , x 3 , x 5 ) }– p 5 (x 1 , x 2 , x 3 ) : Hier tritt der Fall ein, wo alle Argumente des Prädikats bereits in einemElementtyp zusammengefasst sind, <strong>und</strong> zwar im Elementtyp, dessen Variable var 123 heißt.Deshalb wird p 5 zum Restriktionsterm von var 123 mit einem logischen AND hinzugefügt:{var : (v 1234 : {v 1234 : (v 123 : {v 123 : (v 12 : T 1 p 1 T 2 p 3 , x 3 : T 3 )|p 4 (x 2 , x 3 ) ∧ p 5 (x 1 , x 2 , x 3 )},x 4 : T 4 )|p 6 (x 3 , x 4 )}, x 5 : T 5 ) | p 7 (x 1 , x 3 , x 5 ) }– p 7 (x 1 , x 3 , x 5 ) : Für diesen Term kann keine Optimierung mehr vorgenommen werden, dadie Gruppierung von x 1 , x 3 <strong>und</strong> x 5 zu einem Elementtyp die Zusammenfassung der verbliebenenTypelemente var 1234 <strong>und</strong> x 5 nach sich ziehen würde – das Ergebnis wäre der Typ(var 1234 : T 1 p 1 T 2 p 3 T 3 p 4 p 5 T 4 p 6 , x 5 : T 5 ), der schon jetzt der Basistyp des äußeren eingeschränktenTyps ist.Nachdem wir den Ablauf der Optimierung dargestellt haben, wollen wir die optimierte Formulierungdes als Beispiel verwendeten eingeschränkten Typs angeben:{var : (v 1234 : {v 1234 : (v 123 : {v 123 : (v 12 : {v 12 : (x 1 : {x 1 : T 1 |p 1 (x 1 )}, x 2 : T 2 )|p 3 (x 1 , x 2 )}, x 3 : T 3 )|p 4 (x 2 , x 3 ) ∧ p 5 (x 1 , x 2 , x 3 )}, x 4 : T 4 )|p 6 (x 3 , x 4 )}, x 5 : T 5 ) | p 7 (x 1 , x 3 , x 5 )}Diese Formulierung bringt unter Umständen erhebliche Zeitgewinne bei der Auswertung gegenüberder äquivalenten nicht-optimierten Formulierung{var : (x 1 : T 1 , x 2 : T 2 , x 3 : T 3 , x 4 : T 4 , x 5 : T 5 ) | p 1 (x 1 ) ∧ p 2 (x 4 ) ∧ p 3 (x 1 , x 2 ) ∧ p 4 (x 2 , x 3 )∧p 5 (x 1 , x 2 , x 3 ) ∧ p 6 (x 3 , x 4 ) ∧ p 7 (x 1 , x 3 , x 5 )}ist jedoch gleichzeitig viel unübersichtlicher. Genau das ist auch der Gr<strong>und</strong> dafür, dass die Integrationdieser Optimierung in das <strong>ODL</strong>-Auswertungssystem von großem Vorteil wäre, denn es ist einemBenutzer kaum zuzumuten, <strong>ODL</strong>-Abfragen selbst so weitgehend zu optimieren, dass sie wie die obigeoptimierte Typdeklaration aussehen.Bei der Implementierung ist folgender Aspekt zu beachten: die <strong>ODL</strong>-Notation schreibt, im Unterschiedzu der im Algorithmus verwendeten vereinfachten Notation, die Verwendung von Selektorenzum Zugriff auf Elemente des Basistyps eines eingeschränkten Typs vor: die korrekte Schreibweisefür den Zugriff auf die Basistyp-Elemente in unserem Beispieltyp wäre also{ var:(x1:T1,x2:T2,x3:T3,x4:T4,x5:T5) |p1(var.x1) and p2(var.x4) and p3(var.x1,var.x2) andp4(var.x2,var.x3) and p5(var.x1,var.x2,var.x3) andp6(var.x3,var.x4) and p7(var.x1,var.x3,var.x5) }In der optimierten Formulierung müsste beispielsweise das Prädikat p 7 im Restriktionsterm sogarkompliziertere Selektorausdrücke verwenden:p7(var.v1234.v123.v12.x1, var.v1234.v123.x3, var.x5)Wie sich damit zeigt, entsteht bei der Umformulierung eines eingeschränkten Typs das Problem, dassdie Namen der Basistyp-Elemente verändert werden, sodass für den Zugriff sowohl im Restriktionstermals auch in Termen außerhalb des eingeschränkten Typs (das sind Terme, welche die Variablebenutzen, deren Typ optimiert wurde) angepasste Selektoren benutzt werden müssten. Ferner fieleauch die Darstellung der erfüllenden Belegungen für die Variable, deren Typ optimiert wurde, andersaus, als der Benutzer sie gemäß der ursprünglichen Typdeklaration erwarten würde.Eine Möglichkeit, diesen Problemen aus dem Weg zu gehen, besteht darin, dass die Umformulierungeines eingeschränkten Type innerhalb der <strong>ODL</strong>-Auswertungsklasse MetaRestricted-Type gekapselt wird, die den eingeschränkten Typ darstellt (s. auch Abschnitt 5.1.2). Der optimierteeingeschränkte Typ verhielte sich nach außen wie seine nicht-optimierte Version – insbesonderekönnte auf die Basistyp-Elemente mit denselben Selektoren wie bei der Ausgangsformulierungdes Typs zugegriffen werden – für die Iteration über die Typinstanzen würde aber intern die optimierteFormulierung verwendet. Weiter könnte die gekapselte optimierte Formulierung zur Überprü-
6.2 OPTIMIERUNG DER ABFRAGEAUSWERTUNG 111fung eingesetzt werden, ob ein Tupel, bei dem einige der Elementwerte nicht festgelegt sind, dieRestriktionsbedingung verletzt: die optimierte Version des obigen Beispieltyps könnte für ein Tupel(x1=Wert1,x2=Wert2,x3=Wert3) feststellen, ob es die Restriktionsbedingung verletzt, da jedesTupel, das die gesamte Restriktionsbedingung erfüllt, auch die Restriktionsbedingung von v 123erfüllten müsste – diese Funktionalität wäre für Eingabedialoge für eingeschränkte Typen nützlich, dader Benutzer auf diese Weise früher informiert werden könnte, wenn die von ihm eingegebenen Wertedie Restriktionsbedingung nicht erfüllen.Zum Schluss wollen wir noch einige Weiterentwicklungsmöglichkeiten für die beschriebene Optimierungnennen:• Anwendung eines Kostenmodells bei der Optimierung:Wie bei der Beschreibung des Algorithmus im Schritt 5b auf der Seite 107 erwähnt, kann fürSituationen, in denen es mehrere Möglichkeiten gibt, Elemente des Basistyps des zu optimierendeneingeschränkten Typs mit Prädikaten aus dem Restriktionsterm zu gruppieren, eine Berechnungder Kosten für die Auswertung jeder Gruppierungsmöglichkeit vorgenommen werden<strong>und</strong> dann diejenige Optimierung durchgeführt werden, die zu den geringsten Auswertungskostenführt.• Optimierung von Quantortermen:Die vorgestellte Optimierung kann auf von Quantoren geb<strong>und</strong>ene Terme ausgedehnt werden,indem der Typ der vom Quantor geb<strong>und</strong>enen Variablen zu einem eingeschränkten Typ umgewandeltwird, der als Restriktionsterm den Quantorenterm oder einige Teilterme aus ihmenthält. Anschließend kann der Optimierungsalgorithmus auf den Restriktionsterm angewandtwerden.Betrachten wir die Beispielabfrageexists ports:( p1:Port, p2:Port ).(ports.p1.Name = ”Slot1” and ports.p2.Name = ”Slot” andexists ch:Channel.(ch.SourcePort = ports.p1 andch.DestinationPort = ports.p2 ) )Da der Quantorterm eine Konjunktion mehrerer Teilterme darstellt, können wir einige Teiltermein den Typ der Quantorvariablen verlagern, der dafür zu einem eingeschränkten Typ umgewandeltwerden muss:exists ports:{ p:( p1:Port, p2:Port ) |p.p1.Name = ”Slot1” and p.p2.Name = ”Slot” }.exists ch:Channel.(ch.SourcePort = ports.p1 andch.DestinationPort = ports.p2 )Bereits diese Umformung bringt Zeitgewinne bei der Auswertung. Nach der Anwendung desOptimierungsalgorithmus auf den eingeschränkten Typ erhalten wir eine Formulierung der Abfrage,bei der die Auswertungszeit noch einmal sinkt:exists ports:(p1:{ p1:Port | p1.Name = ”Slot1” },p2:{ p2:Port | p2.Name = ”Slot” } ).exists ch:Channel.(ch.SourcePort = ports.p1 andch.DestinationPort = ports.p2 )