XQuery-Suche
Mittels XQuery kann man beliebig komplizierte Suchanfragen an die eigene Ausleihenhistorie stellen.
In der Desktopversion kann man diese Suchanfragen über den Dialog vom Menü "Extras\XQuery Suche..." eingeben, in der Androidversion kann man die Anfrage direkt im Suchfeld unterhalb der Ausleihenliste eingeben.
Wie der Titel sagt, werden diese Abfragen in XQuery formuliert, was zu viele Möglichkeiten bietet, um sie hier alle zu beschreiben, deshalb werden im Folgenden nur einige mögliche Beispielabfragen aufgelistet. Wer die weiteren Möglichkeiten von XQuery kennenlernen will, kann sich in der Bibliothek ein Lehrbuch über XQuery ausleihen. Zusätzlich zu XQuery sollte man wissen, dass VideLibri eine Variable $books
bereitstellt, die alle Bücher enthält. Die für jedes Buch jeweils vorhandenen Eigenschaften sind auf der Hilfeseite zum Auslesen von Bücher-enthaltenen Webseiten beschrieben.
Suche alle jemals ausgeliehenen Bücher eines bestimmten Autors (z.B.: von Meyer):
for $book in $books where $book.author = "Meyer" return $book
Suche alle Bücher über ein bestimmtes Thema (z.B.: über Schatten), sortiert nach Autor:
for $book in $books where contains($book.title, "schatten") order by $book.author return $book
Suche alle jemals ausgeliehenen Bücher von mehreren bestimmten Autoren (z.B.: von Meyer und Pratchett):
for $book in $books where $book.author = ("Meyer", "Pratchett") return $book
Suche alle jemals ausgeliehenen Bücher von mehreren bestimmten Autoren (z.B.: von Meyer und Pratchett) (Kurzversion, ohne Sortiermöglichkeit und beliebige Vornamen):
$books[matches(author, "Meyer|Pratchett")]
Sortiere alle Bücher nach der Länge des Titels:
for $book in $books order by string-length($book.title) return $book
Ermittel die Zahl aller jemals ausgeliehenen Bücher:
count($books)
Finde alle Autoren, von denen mehr als ein Buch ausgeliehen worden ist:
for $book in $books group by $author := $book.author where count($book) > 1 return $author
Finde alle Bücher, die mehrmals ausgeliehen worden sind:
for $book in $books group by $temp := $book.author || ":" || $book.title where count($book) > 1 return $book
Finde alle Bücher, die mehrmals ausgeliehen worden sind, aber zeige jedes Buch nur einmal an:
for $book in $books group by $author := $book.author || ":" || $book.title where count($book) > 1 return $book[1]
Ermittle für jeden Autor, wie viele Bücher von ihm ausgeliehen worden sind:
for $book in $books group by $author := $book.author order by count($book) return {"author": $author, "title": count($book)}
Finde alle Bücher, deren Titel aus mindestens 5 Wörtern besteht:
for $book in $books where matches($book.title, "(\w+(\W+|$)){5}") return $book
Finde alle Bücher, bei denen der Autorname mindestens 3 Vokale und der Titel mindestens 17 Konsonenten enthält:
for $book in $books where matches($book.author, "([aeiou].*){3}", "i") and matches(replace($book.title,"[^a-z]","","i"), "([^aeiou].*){17}", "i") return $book
Berechne die Summe aller Zahlen von 1 bis 100: (in der Androidversion muss xquery version "3.0"; vorangestellt werden, wenn $books nicht im Ausdruck vorkommt)
sum(1 to 100)
Suche alle Primzahlen unter 100:
for $i in 2 to 100 where empty((2 to $i - 1)[$i mod . = 0]) return $i
Finde alle Bücher, deren Titellänge eine Primzahl ist:
let $primes := (for $i in 2 to 200 where empty((2 to $i - 1)[$i mod . = 0]) return $i) return $books[string-length(title) = $primes]
Finde alle Bücher, deren Titellänge eine Primzahl ist, wobei nur Buchstaben (oder Zahlen, etc.) gezählt werden und Sonderzeichen (z.B.: !) ignoriert werden:
let $primes := (for $i in 2 to 200 where empty((2 to $i - 1)[$i mod . = 0]) return $i) return $books[string-length(replace(title, "\W", "")) = $primes]
Ermittle das aktuelle Datum und Uhrzeit:
current-date(), current-time()
Finde alle Bücher, deren Titel den aktuellen Monatsnamen enthält:
let $month := format-date(current-date(), "[Mn]", "de", (), ()) return $books[contains(title, $month)]
Finde alle Bücher, deren Titel irgendeinen Monatsnamen enthält:
let $months := (1 to 12) ! format-date(xs:date("2010-"||format-integer(.,"00")||"-01"), "[Mn]", "de", (), ()) return $books[some $month in $months satisfies contains(title, $month)](Übung für den Leser: was muss man daraus löschen, um nur eine Liste der Monate auszugeben?)
Verschlüssele einen Text mittels Cäsarchiffre:
let $a := x:cps("a") return string-join( x:cps(x:cps("dertext") ! ((. - $a + 3) mod 26 + $a) ) )
Entschlüssele einen Text mittels Cäsarchiffre:
let $a := x:cps("a") return string-join( x:cps(x:cps("ghuwhaw") ! ((. - $a + 23) mod 26 + $a) ) )
Erstelle 100 virtuelle Bücher, 1 vom Verfasser 1, 4 von 2, 9 von 3, ..:
(1 to 100) ! {"author": ., "title": . * .}
Erstelle 1000 zufällige Bücher, indem vorhandenen Autornamen und Titelwörter zufällig zusammengemixt werden:
let $names := $books!tokenize(author, "\W+")[.] let $titles := $books!tokenize(title, "\W+")[.] return (random-seed(), (1 to 1000) ! { "author": let $temp := random(count($names))+1 return $names[$temp], "title": join((1 to (random(7)+1))!(let $temp := random(count($titles))+1 return $titles[$temp]))})
Berechne die Fakultäten von 1 bis 100: "eins", "zwei", "sechs" bis "dreiundneunzig Sesvigintillionen..."
(1 to 100) ! (x:product(1 to .)) ! format-integer(., "w", "de")