Základy XQuery a věci z toho pro nás plynoucí


Základním stavebním kamenem XQuery je Expression, které mohou být konstruovány z klíčových slov, symbolů a operandů. Každý operand je opět Expression. XQuery je funkcionální jazyk se silnou typovou kontrolou.

Hodnota Expression v XQuery je vždy Sequence což je setříděná kolekce 0 nebo více Items. Každá Item je buď Atomic value nebo Node. Každý Node má jednoznačnou identitu ( z toho pro nás plyne to, že každému uzlu XML databáze musíme přiřadit nějakým způsobem id, přičemž uzlem může být element, atribut, poznámka nebo text ).

XQuery procesor (XQP)


XQuery procesor vyhodnocuje jednotlivé Expressions v dotazu. Tím dostává Sequences Itemů. Nechť E je nějaký Expression, který vyhodnocuje v rámci daného dotazu. Potřebuje vyhodnotit všechny Expessiony, které se vyskytují v E jako operandy. Tím dostává Sequences Itemů jako podvýsledky. Tyto Sequences poté zpracuje podle daných klíčových slov a symbolů v E a vytvoří nový Sequence S jako výsledek. Při tomto zpracování potřebuje přistupovat k obsahu Itemů ze Sequences z podvýsledků. Jediné co má jsou id těchto Itemů. Potřebuje-li tedy procesor získat nějakou Item J z Itemu I, musí mít možnost získat I z dokumentu, nad kterým je dotaz prováděn.
Pro vyhodnocení Experession musí mít vrstvu XML Document Index Structures (XDIS Layer). Pomocí indexů v XDIS získá Sequence id Itemů ležících na dané cestě. Pokud potřebuje přistoupit k nějakým datům Itemu I, potřebuje k tomu vrstvu XML Document Data Model (XDDM Layer). Zavolá metodu Item getItem(id_t id), která vrací Item identifikované id z argumentu metody. Nechť I je výsledek tohoto volání. I je možné přetypovat na nějaký konkrétní subtyp typu Node, buď ho explicitně známe, nebo můžeme jeho typ zjistit z runtime vlastností. Objekt I daného typu potom poskytuje metody pro přístup k potomkům, atributům, jménu, ... .

Příklad vyhodnocení dotazu

<bib>
 {
  for $b in document("http://www.bn.com/bib.xml")/bib/book
  where $b/publisher = "Addison-Wesley" and $b/@year > 1991
  return
    <book year="{ $b/@year }">
     { $b/title }
    </book>
 }
</bib> 

Příklad vyhodnocení dotazu

<results>
  {
    for $a in distinct-values(document("http://www.bn.com/bib.xml")//author)
    return
        <result>
            { $a }
            {
                for $b in document("http://www.bn.com/bib.xml")/bib/book
                where some $ba in $b/author satisfies deep-equal($ba,$a)
                return $b/title
            }
        </result>
  }
</results>

XML Document Data Model (XDDM Layer)


Jde o indexy, které mapují čísla id do jejich Nodes. Metoda XDDM.getItem(id) toto umožňuje a vrací objekt N(instanci třídy Node), který je možno přetypovat podle skutečného typu uzlu příslušejícího tomuto id. Objekt N nabízí metody pro přístup různým vlastnostem příslušného Node z XML dokumentu. Je třeba řešit, jak bude skutečně ten Node uložený. Vrstvám komunikujícím s touto vrstvou ze zhora (XQP) je to jedno, těm je nabízeno interface reprezentované objektem vráceným metodou XDDM.getItem(id). Možná by to šlo takhle:
Vyřešit: Jak budeme namapovávat Nody, které nejsou v paměti a jak budou uložený. Pro každý Node potřebuju uložit idčka všech Nodů, které jsou obsažený v tomto Nodu (pro element např. idčka atributů, elementů, commentů, textnodů, ...) a jeho atomické hodnoty (pro textnode např. jeho obsah, pro element např jeho jméno, pro atribut jeho jméno a hodnotu, ...). Jak budu žádat o namapování nějakýho Nodu? (přes jeho id, nějaká index struktura, která mi řekne, kde se Node fyzicky nachází podle jeho id?).