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")