• Keine Ergebnisse gefunden

Komplexe Anfragen

Im Dokument I Einführung und Überblick 1 (Seite 183-187)

Eine Anfragesprache für das GUPRO–Repository

10.3 Überblick 177 Eine solche FWR–Ausdruck genannte Anfrage besteht grundsätzlich aus den Teilen

10.3.3 Komplexe Anfragen

Die bisher vorgestellten Beispiele waren relativ einfach strukturiert, um die grundsätzlichen Ei-genschaften vonGReQLdarzustellen.

In diesem Abschnitt werden nun Eigenschaften der Sprache vorgestellt, die es ermöglichen, An-fragen zu formulieren, die komplexer strukturiert sind.

Schachtelung von Anfragen

ImWITH–Teil einer Anfrage bzw. einer Anweisung und imREPORT–Teil einer Anfrage dürfen beliebige GReQL–Ausdrücke verwendet werden. Da FWR–Ausdrücke selbst Ausdrücke sind, ist es so möglich, sie zu schachteln.

Dies ermöglicht

Informationen zu berechnen, die mit „flachen“ Anfragen nicht zu ermitteln sind.

das Ergebnis einer Anfrage zu strukturieren.

180 GReQL–Sprachbeschreibung Mit der Anfrage in Beispiel 5 werden die Namen aller Datenbanktabellen ermittelt, die minde-stens eine Spalte enthalten, die den TypDATEhat.

Beispiel 5

FROM tab: V{DbTable}

WITH cnt( FROM col: V{DbColumn}

WITH tab <--{isColumnOf} col AND col.type = ’DATE’

REPORT col END ) > 0 REPORT tab.name END

Die im äußeren FWR–Ausdruck deklarierte Variabletabwird im inneren FWR–Ausdruck ver-wendet. Dies ist möglich, da es inGReQLein entsprechendes Sichtbarkeitskonzept für Variablen gibt (s. Abschnitt 10.5.4).

Im inneren Ausdruck werden so diejenigen DbColumn–Objekte gezählt (durch die Aggrega-tionsfunktioncnt), die mit der aktuellen Belegung der Variablentabüber eine Beziehung des TypsisColumnOfverbunden sind und derentype–Wert entsprechend ist. Ergibt diese Zählung einen Wert größer als null, so ist das Prädikat für die aktuelle Belegung vontaberfüllt und der Wert desname–Attributs wird Teil des Ergebnisses.

In der nächsten Anfrage werden COBOL–Programme und die von ihnen inkludierten Copy–

Strecken betrachtet. Ermittelt werden die Namen aller COBOL–Programme und zu jedem Pro-gramm die Namen der entsprechenden Copy–Strecken.

Beispiel 6

FROM prog: V{CobolProgram}

REPORT prog.name, FROM cp: V{CobolCopy}

WITH prog -->{copies} cp REPORT cp.name END

END

In dieser Anfrage besteht das Ergebnis wie in Beispiel 2 aus Wertepaaren (2–Tupel). Im Gegen-satz dazu ist jetzt das zweite Element eines jeden Ergebnistupels selbst wiederum ein Bag (ge-nauer: eine Tabelle), so daß letztendlich zu jedemCobolProgram–Objekt sein Namensattribut und die Namen der mit ihm über eine copies–Beziehung verbundenen CobolCopy–Objekte ausgegeben werden.

Angenommen, das Repository weist die in Abbildung 10.2 dargestellte Struktur auf, so erhält man als Ergebnis den Bag

’ProgX’A ’CopA’A ’CopB’LA ’ProgY’A ’CopB’LA ’ProgZ’A

Pfadbeschreibungen

Ein besonderes und vielleicht das wichtigste Sprachkonstrukt inGReQLsind die Pfadbeschrei-bungen. Sie bieten eine ausdrucksstarke Möglichkeit, um

10.3 Überblick 181

CobolProgram p1

name = ’ProgX’

CobolProgram p2

name = ’ProgY’

CobolCopy c1

name = ’CopA’

CobolCopy c2

name = ’CopB’

copies

b1 b2 b3

copies copies

CobolProgram p3

name = ’ProgZ’

Abbildung 10.2: Repository–Inhalt (Beispiel) Zusammenhangsbeziehungen zwischen Objekten zu beschreiben.

von einem Objekt ausgehend die Menge der über einen Pfad einer bestimmten Form er-reichbaren Objekte zu berechnen.

In den bisherigen Beispielen wurde bereits von einfachen Pfadbeschreibungen in Prädikaten wie col -->{isColumnOf} tab

Gebrauch gemacht. Die eigentliche Pfadbeschreibung ist hierbei nur der Teil -->{isColumnOf}

Durch eine Pfadbeschreibung werden geordnete Paare von Objekten beschrieben, die über einen Pfad der angegebenen Form miteinander verbunden sind. Die obige Pfadbeschreibung liefert also alle Paare von Objekten zwischen denen eineisColumnOf–Beziehung existiert, wobei die Richtung des Pfeilsymbols festlegt, daß das erste Objekt jedes Paares das Anfangsobjekt der Beziehung ist.

Syntaktisch hat eine einfache Pfadbeschreibung eine der drei Formen (vgl. Anhang 10.A.5):

-->{TypeId},<--{TypeId}oder<->{TypeId}

Die Richtung des Pfeilsymbols bestimmt die Beziehungsrichtung. Ein Pfeil an beiden En-den (<->) bedeutet, daß beide Richtungen erlaubt sind.

Über die (optionale) Angabe eines Beziehungstypbezeichners (TypeId) wird festgelegt, Beziehungen welcher Klasse betrachtet werden.

Es ist möglich, jede Pfadbeschreibung mit einer sog. Goalrestriction (‘&{’TypeId‘}’) zu ver-sehen. Diese beschreibt eine zusätzliche Bedingung, die das zweite Objekt jedes Paares zu erfül-len hat, nämlich die, einer bestimmten Klasse anzugehören.

Eine konkrete Pfadbeschreibung mit Goalrestriction ist z.B.

<--{copies}&{CobolProgram}

Hier werden Paare von Objekten ermittelt, die über einecopies–Kante miteinander verbunden sind und bei denen das Startobjekt der Beziehung der KlasseCobolProgramm(und damit nicht CobolCopy) angehört.

Ihre Ausdrucksstärke erhalten Pfadbeschreibungen durch die Möglichkeit sie nach Art regulärer Ausdrücke (durch Iteration, Sequenz- und Alternativenbildung sowie durch Angabe einer Option) aufzubauen (vgl. Anhang 10.A.5).

182 GReQL–Sprachbeschreibung Eine Sequenz wird durch einfaches Hintereinanderschreiben gebildet. Durch

<--{copies}<--{writes}

werden Paare ermittelt, bei denen das zweite Objekt über eine in das erste Objekt eingehen-decopies–Kante und dann weiter über eine eingehendewrites–Kante erreicht werden kann.

Soll der Pfad über ein Objekt einer bestimmten Klasse führen (Goalrestriction s.o.), wird diese Einschränkung einfach eingefügt:

<--{copies}&{CobolProgram}<--{writes}

Alternativen werden durch einen senkrechten Strich (|) getrennt. In der Pfadbeschreibung

<--{writes} | <--{designs}

wird ein Zusammenhang über einewrites– oder einedesigns–Beziehung beschrieben.

Eine Option wird ausgedrückt, indem die Pfadbeschreibung in eckige Klammern ([ ]) gesetzt wird. Der so geklammerte (Teil–)pfad kann, muß aber nicht, durchlaufen werden.

Um eine Iteration auszudrücken wird der zu iterierende (Teil–)Pfad mit der Häufigkeit der gewünschten Durchläufe annotiert. Es ist möglich

– eine beliebig häufiges aber mindestens einmaliges Durchlaufen durch Angabe des

+

–Symbols (Bildung der transitiven Hülle)

– ein beliebig häufiges (einschließlich nullmaliges) Durchlaufen durch Angabe des

*

– Symbols (Bildung der transitiven reflexiven Hülle)

zu fordern. Durch -->{calls}+

werden Paare gebildet, die übercalls–Beziehungen direkt oder indirekt miteinander ver-bunden sind.

Die folgende Anfrage ist eine Erweiterung des Beispiels 6. Im Unterschied zu diesem werden hier nicht nur die unmittelbar von einem COBOL–Programm inkludierten Copy–Strecken ermit-telt, sondern auch die indirekt (über COPY–Befehle in Copy–Strecken) inkludierten. Dies wird einfach durch das Hinzufügen des

+

–Symbols zur Pfadbeschreibung erreicht.

Beispiel 7

FROM prog: V{CobolProgram}

REPORT prog.name, FROM cp: V{CobolCopy}

WITH prog -->{copies}+ cp REPORT cp.name END

END

10.3 Überblick 183

Im Dokument I Einführung und Überblick 1 (Seite 183-187)