Query » Historie » Verze 1

Jakub Jirůtka, 2011-08-15 16:36
první návrh, nutno ještě doplnit

1 1 Jakub Jirůtka
h1. Vyhledávání
2 1 Jakub Jirůtka
3 1 Jakub Jirůtka
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(informačního systému) 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á.
4 1 Jakub Jirůtka
5 1 Jakub Jirůtka
6 1 Jakub Jirůtka
h2. Implicitní vyhledávání
7 1 Jakub Jirůtka
8 1 Jakub Jirůtka
KOSapi poskytuje sadu zdrojů, které v podstatě umožňují přirozené sestavení dotazu jen pomocí URL. Mezi ně patří například ... TODO
9 1 Jakub Jirůtka
10 1 Jakub Jirůtka
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.
11 1 Jakub Jirůtka
12 1 Jakub Jirůtka
13 1 Jakub Jirůtka
h2. Dotazovací jazyky pro webové služby
14 1 Jakub Jirůtka
15 1 Jakub Jirůtka
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":http://www.odata.org, 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é.
16 1 Jakub Jirůtka
17 1 Jakub Jirůtka
Druhým je návrh IETF(Internet Engineering Task Force) standardu "Feed Item Query Language":http://tools.ietf.org/html/draft-nottingham-atompub-fiql-00, 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":http://cxf.apache.org. Syntaxe FIQL(Feed Item Query Language) je výhodná svým prvoplánovým určením pro zápis v URI(Uniform Resource Identifier), 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).
18 1 Jakub Jirůtka
19 1 Jakub Jirůtka
20 1 Jakub Jirůtka
h2. RSQL
21 1 Jakub Jirůtka
22 1 Jakub Jirůtka
RSQL(RESTful Resource Query Language) umožňuje vyhledávat záznamy (Atom Entry) podle jejich strukturovaných elementů v Atom Content. Tím se také odlišuje od FIQL(Feed Item Query Language), 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(Extensible Markup Language)). RSQL(RESTful Resource Query Language) dotazy se v KOSapi překládají na SQL(Structured Query Language) dotazy do KOSu.
23 1 Jakub Jirůtka
24 1 Jakub Jirůtka
Jak již bylo napsáno, RSQL(RESTful Resource Query Language) umožňuje dva způsoby zápisu - „URI-friendly“ syntaxi FIQL(Feed Item Query Language) a alternativní syntaxi inspirovanou Javou. FIQL(Feed Item Query Language) lze v URL použít přímo, kdežto alternativní je nutné zakódovat podle "RFC 1738":http://www.ietf.org/rfc/rfc1738.txt (pozn. webové prohlížeče a zřejmě i většina knihoven dělá automaticky).
25 1 Jakub Jirůtka
26 1 Jakub Jirůtka
27 1 Jakub Jirůtka
h3. Struktura výrazu
28 1 Jakub Jirůtka
29 1 Jakub Jirůtka
Výraz se skládá z jednoho či více _porovnání_, které se spojují logickými (Booleovskými) operátory.
30 1 Jakub Jirůtka
31 1 Jakub Jirůtka
* _výraz_ = [ "(" ] ( _podmínka_ / _výraz_ ) [ _logický-operátor_ ( _podmínka_ / _výraz_ ) ] [ ")" ]
32 1 Jakub Jirůtka
* _podmínka_ = _selektor_ _operátor-porovnání_ _argument_
33 1 Jakub Jirůtka
* _logický-operátor_ = "@;@" / "@&@" / "@ and @" / "@,@" / "@|@" / "@ or @"
34 1 Jakub Jirůtka
* _operátor-porovnání_ = ( "@==@" / "@=@" / "@!=@" / "@=lt=@" / "@<@" / "@=le=@" / "@<=@" / "@=gt=@" / "@>@" / "@=ge=@" / "@>=@" )
35 1 Jakub Jirůtka
* _selektor_ = @[a-zA-Z_]([a-zA-Z_0-9\-])*@
36 1 Jakub Jirůtka
* _argument_ = ( "@'@" @[^']+@ "@'@" / "@"@" @[^"]+@ "@"@" )
37 1 Jakub Jirůtka
38 1 Jakub Jirůtka
39 1 Jakub Jirůtka
h3. Logické operátory
40 1 Jakub Jirůtka
41 1 Jakub Jirůtka
|_. Název	|_. FIQL		|_. Alternativní		|_. SQL-like		|
42 1 Jakub Jirůtka
| AND		| @;@		| @&@				| "@ and @"		|
43 1 Jakub Jirůtka
| OR		| @,@		| <code>|</code>	| "@ or @"		|
44 1 Jakub Jirůtka
45 1 Jakub Jirůtka
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ů.
46 1 Jakub Jirůtka
47 1 Jakub Jirůtka
48 1 Jakub Jirůtka
h3. Operátory porovnání
49 1 Jakub Jirůtka
50 1 Jakub Jirůtka
|_. Název			|_. FIQL		|_. Alternativní		|_. Platné datové typy							|
51 1 Jakub Jirůtka
| rovná se			| @==@		| @=@				| textový řetězec, číslo, datum, výčtový typ, XLink	|
52 1 Jakub Jirůtka
| nerovná se		        | @!=@		| @!=@				| textový řetězec, číslo, datum, výčtový typ, XLink	|
53 1 Jakub Jirůtka
| menší než			| @=lt=@	| @<@				| číslo, datum									|
54 1 Jakub Jirůtka
| menší nebo rovno	| @=le=@	| @<=@				| číslo, datum									|	
55 1 Jakub Jirůtka
| větší než			| @=gt=@	| @>@				| číslo, datum									|
56 1 Jakub Jirůtka
| větší nebo rovno	| @=ge=@	| @>=@				| číslo, datum									|
57 1 Jakub Jirůtka
58 1 Jakub Jirůtka
Porovnávání textových řetězců nezohledňuje velikost písmen (je _case insensitive_). Pokud je URL parametr [[URLParameters#multilang|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  [[URLParameters#lang|lang]]).
59 1 Jakub Jirůtka
60 1 Jakub Jirůtka
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).
61 1 Jakub Jirůtka
62 1 Jakub Jirůtka
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.
63 1 Jakub Jirůtka
64 1 Jakub Jirůtka
Argumentem pro XLink je identifikátor záznamu použitý v URI(Uniform Resource Identifier), což většinou bývá kód nebo ID.
65 1 Jakub Jirůtka
66 1 Jakub Jirůtka
67 1 Jakub Jirůtka
h3. Parametry
68 1 Jakub Jirůtka
69 1 Jakub Jirůtka
RSQL(RESTful Resource Query Language) výraz se zapisuje do URL parametru [[URLParameters#query|query]] a je možné ho efektivně kombinovat s parametry [[URLParameters#startIndex|startIndex]], [[URLParameters#maxResults|maxResults]] a [[URLParameters#orderBy|orderBy]].
70 1 Jakub Jirůtka
71 1 Jakub Jirůtka
72 1 Jakub Jirůtka
h3. Příklady
73 1 Jakub Jirůtka
74 1 Jakub Jirůtka
TODO
75 1 Jakub Jirůtka
76 1 Jakub Jirůtka
77 1 Jakub Jirůtka
h3. Pár slov k implementaci
78 1 Jakub Jirůtka
79 1 Jakub Jirůtka
TODO