OQL-Anfragen (1)
description
Transcript of OQL-Anfragen (1)
OQL-Anfragen (1)• Alle Punkte, die auf der Null-Ebene liegen:select struct (ex : x, ey : y) from allePunkte where z = 0
Rückgabetyp: bag<struct<ex:float, ey:float>>
• Alle Kanten, die zu Flächen mit mindestens vier Kanten gehören:
select struct (kp1 : k.p1, kp2 : k.p2)from f in alleFlächen, k in f.kanten where count (f.kanten) >= 4
Rückgabetyp: bag<struct<kp1:Punkt, kp2:Punkt>>(Impliziter Join!)
OQL-Anfragen (2)
• Dieselbe Anfrage, aber gruppiert nach Flächen:select struct (fläche: f.fName, punkte:
(select struct (kp1 : p1, kp2 : p2) from f.kanten))
from f in alleFlächen, k in f.kanten where count (f.kanten) >= 4
Rückgabetyp:bag<bag<struct< fläche:string, punkte:bag<struct<kp1:Punkt,kp2:Punkt>>>
• Beachte: Gruppierung ohne group by
OQL-Anfragen (3)
• Ergebnis kann Resultat von Operatoraufrufen enthalten z.B.:
select volumen()from alleQuader
• Länge aller Kanten von großen Flächen:select k.längefrom f in alleFlächen, k in f.kanten where f.fläche > 100.0
• Vielflächner mit großen Flächen:select vNamefrom alleVielflächnerwhere for all f in flächen : f.fläche() > 100.0
OQL-Anfragen (4)
• Aggregierung nach Gruppen, z.B. zuerst Gruppierung der Quader nach Oberfläche, dann Berechnung des mittleren Volumens über alle Quader mit dieser Oberfläche, dies aber nur für Oberflächen über 20:
select struct (ofläche, dvolumen: avg( volumen() )
from alleQuadergroup by ofläche : oberflächehaving oberfläche >= 20.0
Rückgabetyp:bag<struct<ofläche:float, dvolumen:float>>
OQL-Anfragen (5)
• Auch die Sortierungsklausel existiert in OQL, z.B.:
select from alleQuaderorder by oberfläche desc, volumen() asc
• Es kann nach mehreren Attributen bzw. Methodenresultaten sortiert werden– Aufsteigend: asc (Voreinstellung) – Absteigend: desc
OQL-Anfragen (6)
• Gesamtzahl aller Kanten, die aus dem Nullpunkt entspringen :count( select from alleKantenwhere p1.x = 0.0and p1.y = 0.0 and p1.z = 0.0)
• Ergebnistyp:unsigned long
• Bemerkung: OQL erlaubt (als Tribut an SQL) auch Syntaxselect count ()from alleKanten where p1.x = 0.0 and p1.y = 0.0 and p1.z = 0.0)
OQL-Anfragen (7)
• Liste aller Flächen mit Umfang über 1000:select ffrom f in alleFlächenwhere 1000 < sum(select k.länge
from k in f.kanten)
• Ergebnistyp:bag<Fläche>