Akta X: XQuery na vzestupu

7. 9. 2007
Doba čtení: 4 minuty

Sdílet

Jazyku XQuery 1.0 se podařilo naplnit očekávání a těší se široké podpoře uživatelů i výrobců softwaru. Jeho eklektická syntaxe mu dává velké vyjadřovací schopnosti, které se navíc chystá ještě posílit hned několik plánovaných rozšíření. K čemu je jazyk XQuery 1.0 a jak bude vypadat v blízké budoucnosti?

Jazyk XQuery 1.0 se stal doporučením W3C v lednu letošního roku, společně s příbuznými specifikacemi XPath 2.0 a XSLT 2.0. Zatímco XSLT 2.0 nerozhodně přešlapuje na místě, XQuery je jednoznačně úspěšným standardem. Bylo to zřejmé už dávno předtím, než bylo zveřejněno konečné doporučení. Implementátoři na nic nečekali a dali se do práce. Dnes existuje více než padesát implementací, z toho desítky pod open-source licencemi.

XQuery je v mnohých ohledech zajímavý jazyk. Původně se mělo jednat o dotazovací jazyk nad daty ve formátu XML. Jazyk XQuery měl být pro XML data tím, čím je pro relační databáze jazyk SQL. Toto srovnání je vcelku výstižné pokud se bavíme o využití XQuery v XML databázích, ale použití XQuery je mnohem širší. Sami autoři XQuery svůj výtvor definují takto: „XQuery je standardní jazyk pro kombinování dokumentů, databází, webových stránek a skoro všeho ostatního.“ Mluví o jazyku vhodném k vývoji webových aplikací, o náhradě kódu v Javě, C++ nebo PHP. To jsou jistě odvážná tvrzení, kterým je třeba rozumět v kontextu obvyklého nadšení autorů pro svůj výtvor a snahy uplatnit jej vždy a všude. Skutečností ale zůstává, že XQuery je mimořádně mocným prostředkem.

Syntaxe jazyka XQuery je nesourodá a eklektická. Zahrnuje tři velmi různé styly. Tím prvním jsou výrazy XPath 2.0. Jazyk XPath 2.0 je podmnožinou XQuery 1.0; každý platný výraz XPath 2.0 je také platným dotazem XQuery 1.0. Dotaz na všechny zaměstnance z určitého oddělení tedy může vypadat například takto:

//employee[@deptno='22']

To ovšem není nic nového. Hlavním prostředkem jazyka XQuery jsou takzvané výrazy FLWOR viditelně inspirované jazykem SQL. Zkratka FLWOR shrnuje hlavní klauzule této části jazyka: For, Let, Where, Order by a Return. Následující výraz spojuje hlavní dokument – seznam zaměstnanců – s číselníkem všech oddělení. Pro každé, které má deset a více zaměstnanců, vrátí číslo oddělení a průměrný plat zaměstnanců:

for $d in fn:doc("departments.xml")/departments/deptno
let $e := //employee[@deptno = $d]
where fn:count($e) >= 10
order by $d
return ($d, fn:avg($e/salary))

Posledním typem syntaxe jsou konstruktory XML. Mohou být buď literální, nebo vyhodnocované (počítané). Aby výsledkem předchozího dotazu byl soubor XML, stačí dotaz doplnit literálními konstruktory. Jeden „obalí“ celý dotaz, zbylé strukturují obsah klauzule return:

<big-depts>
  {
    for $d in fn:doc("departments.xml")/departments/deptno
    let $e := //employee[@deptno = $d]
    where fn:count($e) >= 10
    order by $d
    return
      <big-dept>

        <deptno>{$d}</deptno>
        <headcount>{fn:count($e)}</headcount>
        <avgsal>{fn:avg($e/salary)}</avgsal>
      </big-dept>

  }
</big-depts>

Syntaxe jazyka XQuery dovoluje mnohonásobné vnořování konstruktorů XML a výrazů FLWOR, takže lze napsat opravdu složité dotazy, obsahující dále například deklarace uživatelských funkcí. Zahrnutí výrazů XPath a konstruktorů XML nedovoluje jazyku XQuery definovat vyhrazená klíčová slova. Totožná jména elementů by v takovém případě bylo nutné nějak odlišit, čímž by vzala za své kompatibilita s XPathem a XML. Klauzule výrazů FLWOR je tedy nutné rozpoznávat v kontextu, což činí syntaxi dosti křehkou a parsování dotazů poměrně obtížným. Hlavní potíž ale představuje rozšiřování takto pojatého jazyka. A to není žádný akademický povzdech, ale reálný a velmi aktuální problém.

Rozšiřování jazyka XQuery je totiž skloňováno ve všech pádech. Rozšířením číslo jedna je specifikace XQuery 1.0 and XPath 2.0 Full-Text 1.0 doplňující XPath 2.0 a XQuery 1.0 o prostředky pro textové vyhledávání. Rozšířeny jsou výrazy XPath i FLWOR.

Druhou a mnohem podstatnější rozšiřující specifikací jeXQuery Update Facility 1.0. Máme-li zůstat u analogie s SQL, XQuery 1.0 zatím nabízí jen protějšek příkazu SELECT. S XQuery Update Facility 1.0 přibudou XMLizované verze příkazů INSERT, DELETE a UPDATE. Tady už nemůžeme mluvit o doplnění výrazů FLWOR, ale o zavedení nových paralelních výrazů insert, delete, replace, rename a transform. Právě toto zásadní rozšíření naráží na omezení syntaxe a nutí autory jazyka balancovat mezi vymýšlením dlouhých slovních konstrukcí a zaváděním nových speciálních znaků.

Dva výše zmíněné doplňky už jsou relativně daleko; pro oba už bylo zveřejněno několik pracovních verzí specifikace, přičemž ta aktuální už je označena jako Last Call. Pro třetí zamýšlené rozšíření – XQuery Scripting Extension – zatím existují jen požadavky. Skriptovací rozšíření má být procedurální programovací jazyk s plnohodnotnými proměnnými, který posílí XQuery v oblastech, jako je udržování interních stavů. I tady se nabízí analogie s SQL a procedurálními jazyky typu PL/SQL.

bitcoin_skoleni

A když mluvíme o rozšiřování XQuery 1.0, nesmíme vynechat ani úvahy o budoucí verzi 1.1, zatím také jen ve stádiu požadavků. Z nich je zřejmé, že se verze 1.1 bude snažit doplnit chybějící grupování, různé formátování výstupu, lepší zpracování chyb a další náměty od uživatelů.

XQuery se nehodlá spokojit se svým současným úspěšným tažením a bouřlivě se rozvíjí na všechny strany. Pokud se podaří dokončit všechna plánovaná rozšíření, má XQuery šanci stát se novou rozsáhlou platformou pro práci nejen s XML. Uživatelé ani implementátoři, kteří si vsadili na XQuery, se určitě nebudou nudit.

Seriál: Akta X

Autor článku