• +49-(0)721-402485-12
Ihre Experten für XML, XQuery und XML-Datenbanken

Allgemeine Vergleiche

Allgemeine Vergleiche können im Wesentlichen als eine mengenwertige Erweiterung einfacher Wertevergleiche betrachtet werden. Ein Ausdruck mit einem allgemeinen Vergleich ist dann wahr, d. h., der effektive boolesche Wert wird zu true evaluiert, wenn mindestens ein Element der Sequenzen, die als Operanden dem Vergleichsoperator übergeben werden, den Vergleich erfüllt.

In obigem Beispiel existiert ein Ausdruck mit einem allgemeinen Vergleich bei dem Test bzgl. des Vornamens. Der Ausdruck würde zu true evaluiert, sobald einer der maximal zwei nach Schemavorgabe erlaubten Vornamen "Stefan" lautet. Hingegen könnte der Ausdruck mit einem einfachen Wertevergleich

...
and $a//Vorname eq "Stefan"

einen Laufzeitfehler verursachen, da nicht garantiert ist, dass alle Operanden grundsätzlich Sequenzen der Länge 1 sind. Die Auswertung eines allgemeinen Vergleichsausdrucks darf dabei abbrechen, sobald ein Paar von Elementen aus den beiden Operandensequenzen gefunden ist, welches die Vergleichsbedingung erfüllt. Die Suchstrategie ist implementierungsabhängig.

Die Phasen der Auswertung eines Vergleichsausdrucks umfassen zunächst die Überprüfung auf die korrekte Form der Operanden, Überprüfung bzw. Anpassung der Datentypen in den Operanden und schließlich die Durchführung des eigentlichen Vergleichs durch Ermittlung des booleschen Wertes. Die Anpassung der Datentypen erfolgt dadurch, dass ein Wert vom Typ xs:untypedAtomic des einen Operanden zum Datentyp xs:double konvertiert wird, falls der Wert aus dem anderen Operanden einen numerischen Datentyp aufweist; andernfalls wird zum Datentyp xs:string konvertiert.

Der Prozess der Konvertierung sei an folgenden FLWOR-Ausdrücken nach illustriert. Im ersten Ausdruck kann kein Wertepaar ermittelt werden, welches – auch nach der Anpassung der Datentypen – den geforderten Wertevergleich erfüllt, so dass die return-Klausel nicht aktiviert wird. Das liegt daran, dass $b und $c als Zeichenketten verglichen werden.

let $a := "1”, $b := "2”, $c := "2.0"
where ($a, $b) = ($c, 3.0)
return
<Text>Dieser Text wird nie erscheinen</Text>

Wird der konstante numerische Wert 3.0 durch 2.0 ersetzt, so erfolgt im nachfolgenden allgemeinen Vergleichsausdruck eine Konvertierung der Variablen $y zum Datentyp xs:double, wodurch der Wertevergleich mit dem konstanten Wert 2.0 zu true evaluiert wird:

let $x := "1", $y := "2", $z := "2.0"
where ($x, $y) = ($z, 2.0)
return
<Text>Dieser Text wird erscheinen</Text>

Des Weiteren sind erwartungsgemäß allgemeine Vergleichsoperatoren nicht auf den Test auf Gleichheit beschränkt. So wird für folgenden Vergleichsausdruck der boolesche Wert true ermittelt, da es eine "Kombination" von wertebasierten Vergleichsoperationen gibt ("any-Semantik"), welche die Ungleichheitsbedingung erfüllt (1.0 ne 2.0 bzw. 2.0 ne 1.0).

where (1.0, 2.0) != (1.0, 2.0)

In Analogie dazu würde ein Ersetzen des !=-Operators durch einen </<=- bzw. >/>=-Operator ebenfalls in einem true-Wert resultieren, da es mindestens ein Wertepaar gibt, welches den entsprechenden Operator erfüllen würde (zum Beispiel: 1.0 < 2.0 ).

Zum Schluss der Betrachtungen zu allgemeinen Vergleichsoperatoren bleibt anzumerken, dass bedingt durch die Dualität von Element und einelementiger Sequenz ein Wertevergleich inhaltlich identisch mit einem allgemeinen Vergleich zwischen zwei Sequenzen mit je einem Element ist. Wertevergleiche sind dann anzuwenden, wenn sichergestellt werden kann, dass exakt ein Wert vorhanden ist; andernfalls ist auf den (zur Laufzeit aufwändigeren) allgemeinen Vergleich über Sequenzen zurückzugreifen. Das Verhältnis sei darüber hinaus an den beiden folgenden Ausdrücken verdeutlicht:

( ) =  ( )
( ) eq ( )

Der erste Ausdruck wird zu false ausgewertet, da es kein Element in der Sequenz gibt, für welches der Wert true ermittelt werden kann. Der zweite Ausdruck hingegen liefert einen Laufzeitfehler, da – wie oben bereits erwähnt – ein Wertevergleich zwingend vorschreibt, dass alle Operanden aus einer Sequenz der Länge 1 bestehen.

 

Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)

<< zurückvor >>