Vyhledávání

Komplexní podpora dotazování tvoří jednu ze základních funkcionalit databází. Oproti tomu většina běžných RESTových služeb nenabízí moc silné prostředky pro dotazování a omezuje se pouze na tzv. implicitní, příp. fulltextové vyhledávání. Ovšem mají-li webové služby IS sloužit aplikacím jako {{fn(přímý, To znamená, že aplikace si nebudou uchovávat lokální kopii celé ani části databáze IS (cache se tím nevylučuje), ale budou je přímo získávat z webové služby.)}} zdroj dat, tak je komplexnější podpora alespoň vyhledávání prakticky nezbytná.

Implicitní vyhledávání

KOSapi poskytuje sadu zdrojů, které v podstatě umožňují přirozené sestavení dotazu jen pomocí URL. Mezi ně patří například ... TODO

Jejich limity jsou zjevné - pouze omezená sada předdefinovaných zdrojů a nemožnost vyhledávat podle rozličných parametrů, natožpak jejich kombinace.

Dotazovací jazyky pro webové služby

Existují dva standardy (alespoň co jsem našel), které definují jazyk pro dotazování nad RESTovými webovými službami. Prvním je obsáhlý Open Data Protocol, který mimo jiné zahrnuje komplexní podporu pro dotazování. Využití OData pro KOSapi jsem z několika důvodů zavrhl a vzhledem k tomu, že podpora vyhledávání je přímo jeho součástí, tak mi její samostatné využití nepřišlo přínosné.

Druhým je návrh IETF standardu Feed Item Query Language, který definuje „URI-friendly“ syntaxi pro dotazování (správně spíš vyhledávání) nad Atom Feeds. Umožňuje vyhledávat záznamy Atom Entry podle jejich metadat. Jedná se pouze o návrh („draft“) z roku 2007, kterýžto nakonec nebyl standardizován, nicméně už jej implementuje např. framework Apache CXF. Syntaxe FIQL je výhodná svým prvoplánovým určením pro zápis v URI, díky čemuž ji není potřeba zakódovávat. To ovšem můžeš být zároveň nevýhodou, neb kvůli tomu není příliš intuitivní. Jelikož jsem si stejně musel napsat vlastní parser, rozhodl jsem se tuto syntaxi využít a rozšířit ji ještě o alternativní zápis ala Java. Tím vznikl RESTful Resource Query Language (RSQL).

RSQL

RSQL umožňuje vyhledávat záznamy (Atom Entry) podle jejich strukturovaných elementů v Atom Content. Tím se také odlišuje od FIQL, který je naopak určený pouze pro vyhledávání záznamů podle jejich metadat v Atom Entry. Všechny zdroje KOSapi jsou koncipované tak, že Atom elementy využívají pouze pro metadata a vlastní data z KOSu jsou obsažená v Atom Content ve strukturované podobě (závisí na Content-Type, výchozí je XML). RSQL dotazy se v KOSapi překládají na SQL dotazy do KOSu.

Jak již bylo napsáno, RSQL umožňuje dva způsoby zápisu - „URI-friendly“ syntaxi FIQL a alternativní syntaxi inspirovanou Javou. FIQL lze v URL použít přímo, kdežto alternativní je nutné zakódovat podle RFC 1738 (pozn. webové prohlížeče a zřejmě i většina knihoven dělá automaticky).

Struktura výrazu

Výraz se skládá z jednoho či více porovnání, které se spojují logickými (Booleovskými) operátory.

Logické operátory

Název FIQL Alternativní SQL-like
AND ; & and
OR , | or

Operátor AND má standardně přednost, tj. všechny operátory OR se vyhodnocují až po něm. Toto chování samozřejmě lze změnit pomocí uzávorkování výrazů.

Operátory porovnání

Název FIQL Alternativní Platné datové typy
rovná se == = textový řetězec, číslo, datum, výčtový typ, XLink
nerovná se != != textový řetězec, číslo, datum, výčtový typ, XLink
menší než =lt= < číslo, datum
menší nebo rovno =le= <= číslo, datum
větší než =gt= > číslo, datum
větší nebo rovno =ge= >= číslo, datum

Porovnávání textových řetězců nezohledňuje velikost písmen (je case insensitive). Pokud je URL parametr multilang nastaven na true, tak zohledňuje texty v obou jazycích. V opačném případě vyhledává pouze ve zvoleném jazyce (podle Accept-Language, nebo lang).

Při porovnávání řetězců lze využít i divoké karty a hledat pomocí nich i jen podle části řetězce. Způsob zápisu je stejný jako v SQL LIKE, pouze s tím rozdílem, že místo % se zde používá *. Například podmínce name='prog*' vyhoví všechny předměty, jejichž název začíná na „prog“ (opět bez ohledu na velikost písmen).

V případě elementů, které reprezentují výčtový typ, je nutné jako argument uvádět výčtový název (enum), nikoli jeho lokalizovaný popis.

Argumentem pro XLink je identifikátor záznamu použitý v URI, což většinou bývá kód nebo ID.

Parametry

RSQL výraz se zapisuje do URL parametru query a je možné ho efektivně kombinovat s parametry startIndex, maxResults a orderBy.

Příklady

TODO

Pár slov k implementaci

TODO