70 likes | 172 Views
OQL-Anfragen (1). Alle Punkte, die auf der Null-Ebene liegen: select struct (ex : x, ey : y) from alle Punkte where z = 0 Rückgabetyp: bag<struct<ex:float, ey:float>> Alle Kanten, die zu Flächen mit mindestens vier Kanten gehören:
E N D
OQL-Anfragen (1) • Alle Punkte, die auf der Null-Ebene liegen: select struct (ex : x, ey : y) from allePunktewherez = 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)fromfin alleFlächen, k inf.kanten wherecount (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: (selectstruct (kp1 : p1, kp2 : p2) fromf.kanten))from f in alleFlächen, k in f.kanten wherecount (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änge from f in alleFlächen, k in f.kanten where f.fläche > 100.0 • Vielflächner mit großen Flächen:select vName from alleVielflächner where 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 alleQuader group byofläche : oberflächehavingoberflä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 alleQuader order by oberflächedesc, 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( selectfrom 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 Syntax selectcount ()from alleKanten wherep1.x = 0.0 andp1.y = 0.0 andp1.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ängefrom k in f.kanten) • Ergebnistyp: bag<Fläche>