i
ii
eské vysoké u£ení technické v Praze Fakulta elektrotechnická Katedra po£íta£·
Bakalá°ská práce
Implementace nativních funkcí jazyka XQuery
Ji°í Houºvi£ka
Vedoucí práce:
Ing. Adam enk
Studijní program: Softwarové technologie a management, Bakalá°ský
Obor: Softwarové inºenýrství
22. kv¥tna 2013
iv
v
Pod¥kování Na tomto míst¥ bych rád pod¥koval za poskytnuté rady a podporu b¥hem mé práce svému vedoucímu práce Ing. Adamu enkovi.
vi
vii
Prohlá²ení Prohla²uji, ºe jsem práci vypracoval samostatn¥ a pouºil jsem pouze podklady uvedené v p°iloºeném seznamu. Nemám závaºný d·vod proti uºití tohoto ²kolního díla ve smyslu 60 Zákona £. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o zm¥n¥ n¥kterých zákon· (autorský zákon).
V Praze dne 23. 5. 2013
.............................................................
viii
Abstract This work deals with the problem of languages XML and XQuery in environment of native XML database CellStore. It implements a subset of the built-in functions of the XQuery language. It also implements XQTS tests on the implemented funkcionality.
Abstrakt Práce se zabývá problematikou jazyka XML a XQuery. Implementuje podmnoºinu vestav¥ných funkcí jazyka XQuery v prost°edí nativní XML databáze CellStore. Zárove¬ implementuje XQTS testy na implementovanou funkcionalitu.
ix
x
Obsah 1 Úvod
1
2 Popis problému, specikace cíle
3
2.1
CellStore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
2.1.1
Historie projektu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
2.1.2
Cíl projektu CellStore
3
2.1.3
Architektura databáze CellStore
2.1.4
Low Level Storage
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.1.5
Cache Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.1.6
Log Manager
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.1.7
Recovery Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.1.8
Transaction Manager, Lock Manager . . . . . . . . . . . . . . . . . . .
4
2.1.9
Document Provider, Document Adaptor . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
5
2.2
Jazyk XML
2.3
Jazyk XPath
. . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.4
Jazyk XQuery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.2.1
2.3.1
2.5
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
Syntaxe XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
P°íklady XPath výraz·
2.4.1
Struktura dotazu v XQuery . . . . . . . . . . . . . . . . . . . . . . . .
2.4.2
Skupiny funkcí XQuery
. . . . . . . . . . . . . . . . . . . . . . . . . .
Implementace XQuery v CellStore
. . . . . . . . . . . . . . . . . . . . . . . .
2.5.1
Vnit°ní reprezentace XQuery výrazu
2.5.2
Implementace AST stromu
2.5.3
Tabulka funkcí fn:
. . . . . . . . . . . . . . . . . . .
6
9 12 13 13
. . . . . . . . . . . . . . . . . . . . . . . .
14
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
3 Analýza a návrh °e²ení
17
3.1
Poºadavky na vývojové prost°edí
3.2
Návrh implementace
. . . . . . . . . . . . . . . . . . . . . . . . .
17
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
3.2.1
Úkol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
3.2.2
Zp·sob implementace
18
. . . . . . . . . . . . . . . . . . . . . . . . . . .
4 Realizace
19
4.1
Volba skupiny XQuery funkcí
. . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2
Funkce fn:upper case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
4.3
Funkce fn:lower case
19
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
xi
19
xii
OBSAH
4.4
Funkce fn:substring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
4.5
Funkce fn:substring after . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
4.6
Funkce fn:substring before . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
4.7
Funkce fn:starts with . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
4.8
Funkce fn:ends with
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
4.9
Funkce fn:string length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
4.10 Funkce fn:translate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
5 Testování 5.1
5.2
5.3
25
Unit testy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
5.1.1
Smysl unit test·
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
5.1.2
Zp·sob provedení unit test· . . . . . . . . . . . . . . . . . . . . . . . .
25
5.1.3
Pr·b¥h a implementace unit test·
. . . . . . . . . . . . . . . . . . . .
26
XQTS testy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
5.2.1
Co jsou XQTS testy
26
5.2.2
Zp·sob provedení XQTS test·
5.2.3
Pr·b¥h a implementace XQTS test·
5.2.4
Struktura balíku XQTS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27 27
. . . . . . . . . . . . . . . . . . . . . . . . . .
28
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
5.3.1
Unit testy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
5.3.2
XQTS testy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
Výsledky testování
6 Záv¥r
31
A Seznam pouºitých zkratek
35
B Instala£ní a uºivatelská p°íru£ka
37
C Obsah p°iloºeného CD
39
Seznam obrázk· 2.1
XPath osy [3] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2
P°íklad AST stromu
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
C.1
Obsah p°iloºeného CD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
xiii
8
xiv
SEZNAM OBRÁZK
Kapitola 1
Úvod V osmdesátých letech za£aly s pot°ebou zpracování velkého mnoºství dat vznikat k tomuto ú£elu tzv. zna£kovací jazyky. Jejich hlavním úkolem bylo ozna£it význam jednotlivých £ástí dokumentu, nikoli jejich vzhled. Firma IBM vyvinula zna£kovací jazyk (Generalized Markup Language). Tento jazyk p°evzala standardiza£ní organizace ANSI a na jeho základ¥ vyvinula jazyk umoº¬ující denování vlastních sad zna£ek vhodných k °e²ení daného problému. Sdruºení GCA (Graphics Communications Association) jiº d°íve vytvo°ilo standardní formátovací jazyk GenCode. Mnohé cíle obou projekt· byly podobné, a proto se ob¥ aktivity spojily. Výsledkem byl jazyk SGML (Standard Generalized Markup Language), který je denován v ISO norm¥ z roku 1986. Jazyk SGML je v²ak velmi obecný a díky tomu také velmi sloºitý. Za deset let jeho existence se ukázalo, ºe se vyuºívá jen malá podmnoºina jeho moºností. Tato d·leºitá podmnoºina byla vybrána a vznikla z ní denice nového obecného zna£kovacího jazyka pro t°etí tisíciletí, který je zaloºen na p°ísných denicích, jejichº spole£nou vlastností je jednoduchost. Díky tomu je aplikace tohoto jazyka pro konkrétní ú£el rychlej²í a levn¥j²í. Tento jazyk dostal název XML (eXtensible Markup Language). Doménou pouºití jazyka XML je uchování a zpracování textových dokument·. Zna£ky v²ak nabízejí moºnost uchovat informace o struktu°e a významu, díky tomu je moºné do dokumentu uloºit nap°. obsah tabulky z rela£ní databáze. Dal²í dobrou vlastností je £len¥ní dat v dokumentu do hierarchických struktur, díky kterým lze snadno vyjad°ovat vztahy mezi daty a efektivním zp·sobem s nimi pracovat, nap°. v nich vyhledávat. Jazyk XML tedy nabízí v²e, co dne²ní doba zaloºená na vým¥n¥ informací pot°ebuje. Není vhodné posílat informace nap°. ve wordovém formátu DOC, protoºe n¥kdo s linuxovým po£íta£em si jej t¥ºko m·ºe korektn¥ p°e£íst. Denice jazyka je zdarma k dispozici, kaºdý si jej m·ºe ve svých aplikacích naimplementovat, coº je velký rozdíl oproti remním formát·m, k nimº není k dispozici ºádná dokumentace a bývají velice sloºité. Aby bylo moºné s XML dokumenty pracovat, vznikla celá °ada jazyk· pro dotazování nad XML databázemi a transformaci XML dokument· pro jejich lep²í £ítelnost. Základním stavebním kamenem pro dotazování je jazyk XPath, který slouºí k výb¥ru £ásti XML dokumentu. Roz²í°ením jazyka XPath je jazyk XPointer, který tento výb¥r umoº¬uje v rámci celého internetu. Dal²ím jazykem je jazyk XLink umoº¬ující vytvá°et vazby mezi více XML dokumenty. Pro modikaci dat v XML dokumentu existuje standard XQuery Update Facilities. Transformaci XML dokument· zaji²´uje jazyk XSLT.
1
2
KAPITOLA 1.
ÚVOD
Na jazyk XPath pak navazuje dotazovací jazyk XQuery, který je dopl¬uje o mnoºství funkcí nap°. pro práci s °et¥zci apod. Jazyk XQuery je analogií jazyka SQL ze sv¥ta rela£ních databází. Implementace mnoºiny funkcí a jejich test· je p°edm¥tem této bakalá°ské práce. V²echny specikace jazyka XML a v²echny jazyky spojené s XML zast°e²uje nadnárodní konsorcium W3C, na jehoº stránkách jsou v²echny specikace voln¥ ke staºení. Toto konsorcium vydává rovn¥º testy, kterým mají jednotlivé implementace daných jazyk· vyhov¥t. P°ípadn¥ voln¥ jsou k dispozici validátory XML dokument·.
Kapitola 2
Popis problému, specikace cíle 2.1
CellStore
2.1.1
Historie projektu
Projekt CellStore za£al v roce 2004 jako studentský projekt v rámci p°edm¥tu Realizace softwarových projekt·. Výsledkem tohoto projektu byla implementace binárního úloºi²t¥ XML soubor·. V této dob¥ bylo také rozhodnuto o implementa£ní platform¥ Smalltalk/X. Dal²í rozvoj projektu je pod vedením Ing. Michala Valenty, Ph.D. a Ing. Jana Vraného (jednoho z prvních autor·) zaji²´ován zpracováním bakalá°ských a diplomových prací. Karel P°íhoda roz²í°il ve své bakalá°ské práci cache manaºer a log manaºer, které pak za£lenil do tzv. recovery modulu, slouºícího k zotavení databáze do konzistentního stavu po p°ípadné havárii. Jan ák poté ve své diplomové práci [5] implementoval exekutor jazyka XQuery. Následn¥ Pavel Strnad implementoval transak£ní manaºer. Paraleln¥ s touto prací implementuje Karel Beyr Indexovací modul jako svoji diplomovou práci. Prototypovou implementaci standardu XQuery Update Facilities pro manipulaci s daty vypracoval ve své diplomové práci Luká² Wróblewski [13], Jan Kur² implementoval datový model s podporou XQuery datových typ· [7].
2.1.2
Cíl projektu CellStore
Cílem projektu CellStore je implementace XML-nativního databázového stroje zejména pro ú£ely výuky a výzkumu v oblasti databázových systém· [1]. Neklade se d·raz na rychlost vykonávání operací, ale na modularitu a objektové provedení.
2.1.3
Architektura databáze CellStore
Databáze CellStore je tvo°ena n¥kolika spolupracujícími moduly na r·zných vrstvách, které si vzájemn¥ poskytují sluºby.
3
4
KAPITOLA 2.
POPIS PROBLÉMU, SPECIFIKACE CÍLE
Struktura vrstev:
•
Low Level Storage
•
Storage Manager
CellStore/XML
•
Cache Manager
Document Adaptor Transaction Manager
XQuery Executor
2.1.4
Low Level Storage
Nejniº²í vrstvou databáze je Low Level Storage, která je zodpov¥dná za p°ítup k datovým soubor·m na disku a jejich správu. Na disku jsou data ukládána do dvou typ· soubor· cell le a text le. Cell File obsahuje strukturu XML stromu, text le uchovává obsah a jména element· a atribut·.
2.1.5
Cache Manager
Cache Manager zvy²uje výkon databáze. Prost°ednictvím optimální správy vyrovnávácí pam¥ti databáze poskytuje moºnost rychlého na£tení poloºky z databáze, p°ípadn¥ uloºení zm¥n¥né poloºky bez nutnosti okamºitých a zbyte£n¥ zdrºujících diskových operací, které tak mohou být vhodn¥ rozloºeny v £ase.
2.1.6
Log Manager
Log Manager udrºuje ºurnál (log), coº je sekven£ní soubor, ve kterém jsou uloºena redundantní data vztahující se k probíhajícím transakcím. Zm¥ny provád¥né v rámci transakce jsou uloºeny v ºurnálu a p·vodní hodnota tak není ohroºena p°ípadnou havárií.
2.1.7
Recovery Module
Recovery Module °e²í zotavení databáze ze selhání, a to jak selhání jednotlivé transakce, tak selhání celého databázového systému v£etn¥ moºnosti selhání pam¥´ového média. T¥ºi²t¥ jeho práce spo£ívá ve vhodné komunikaci mezi cache managerem, log managerem a databází tak, jak je uloºena ve stálé pam¥ti.
2.1.8
Transaction Manager, Lock Manager
Tato £ást systému zodpovídá za °ízení práce s transakcemi nastavování zámk· a komunikaci s cache managerem.
2.2.
JAZYK XML
2.1.9
5
Document Provider, Document Adaptor
Sou£ásti databáze, které jsou zodpov¥dné za vyhodnocování dotaz·, pot°ebují mít zaji²t¥ný p°ístup k mnoha XML dokument·m uloºených v databázi. V rámci databáze CellStore je uºivatel·m umoºn¥no dotazovat se nejen na dokumenty uloºené p°ímo v databázi, ale také na dokumenty na souborovém systému a dokonce i na dokumenty dostupné na internetu prost°enictvním protokol· HTTP a FTP. Komunikaci s jednotlivými datovými zdroji zaji²´ují r·zné document adaptory specické pro kaºdý druh datového zdroje (nap°. dokument v databázi, dokument v souborovém systému, dokument na webu apod.). Document adaptory poskytuje ostatním sou£ástem na vyºádání document provider.
2.2
Jazyk XML
P°i návrhu jazyka XML [9] byly cíleny p°edev²ím tyto vlastnosti:
•
Snadná £itelnost pro £lov¥ka,
•
snadná tvorba dokumentu za pomoci b¥ºn¥ dostupných nástroj·,
•
p°esná a jednoduchá pravidla pro tvorbu dokument·,
Na základ¥ t¥chto cíl· vznikla jednoduchá syntaxe jazyka XML.
2.2.1
Syntaxe XML
Kaºdý XML dokument se skládá z element·, které se do sebe mohou navzájem vno°ovat. Elementy se v textu vyzna£ují pomocí zna£ek. Rozli²ujeme zn£ku po£áte£ní a zna£ku ukon£ovací. Zna£ky jsou v textu dokumentu ozna£eny znaky < a >. Ukon£ovací zna£ka se od po£áte£ního li²í znakem / uvedeným p°ed názvem elementu. Ukázka nejjednodu²²ího XML dokumentu, který lze vytvo°it:
<para> Toto je obsah elementu para V XML existuje také pojem prázdný element, který nemá ºádný obsah. Tento element se potom ozna£uje takovouto zna£kou:
<para/>
6
KAPITOLA 2.
POPIS PROBLÉMU, SPECIFIKACE CÍLE
Ukázka vno°ení element·:
Po£íta£ové komponenty <dodavatel> Spole£nost1 Ke Kapli£ce <m¥sto>Praha 4 140 00 Element ceník je v tomto p°ípad¥ tzv. ko°enový element. Z ukázky je patrné, ºe elementy v XML dokumentu tvo°í stromovou strukturu, coº platí pro kaºdý XML dokument. V elementu m·ºe být voliteln¥ uveden jeden nebo více atribut·. V ukázce jsou tyto atributy pouºity v elementu platnost, který má dva atributy. Prvním atributem je poloºka od s hodnotou 1.1.2013 a druhým atributem je poloºka do s hodnotou 31.3.2013. Hodnota atributu se vºdy uzavírá do uvozovek nebo do apostrof·. Zaji²t¥ní stromové struktury v kaºdém XML dokumentu je dosaºeno pravidly tohoto jazyka:
•
kaºdý XML dokument je celý obsaºen v jednom ko°enovém elementu,
•
kaºdý element má po£ate£ní a koncovou zna£ku, výjimku tvo°í prázdný element,
•
elementy se nesmí k°íºit.
Tyto vlastnosti je snadné na kaºdém XML dokumentu zkontrolovat. Existuje na to validátor nap°. od W3C, kam je moºné obsah XML dokumentu vloºit. Validátor potom upozorní na p°ípadné chyby nebo vypí²e, ºe dokument je Well Formed.
2.3
Jazyk XPath
Jazyk XPath [6] [10] slouºí k výb¥ru £ásti XML dokumentu. Opírá se p°itom o skute£nost, ºe XML dokument má vºdy stromovou strukturu. Výsledkem p°íkazu jazyka XPath je skupina uzl· z daného XML dokumentu, která danému p°íkazu vyhovuje. Zp·sob popisu cesty k element·m je podobný zp·sobu, jakým popisujeme cesty k soubor·m. Na XPath jsou zaloºeny dal²í jazyky XSLT, XPointer a XQuery. Strom XML dokumentu vyr·stá vºdy z ko°enového elementu, ze kterého pak vychází dal²í reprezentace XML dokumentu. Kaºdý prvek dokumentu je reprezentován uzlem stromu, r·zné prvky jsou reprezentovány r·znými typy uzl·.
2.3.
JAZYK XPATH
7
Existuje sedm typ· uzl·:
•
ko°enový uzel,
•
uzly element·,
•
textové uzly,
•
atributové uzly,
•
uzly pro komentá°e,
•
uzly instrukcí pro zpracování,
•
uzly jmenných prostor·.
Základním stavebním kamenem výraz· jazyka XPath je tzv. krok. Jedná se o krok v reprezentaci XML dokumentu. Výraz v jazyce XPath je tvo°en posloupností krok·, které jsou odd¥leny znakem /. Interpretace výrazu spo£ívá v postupné interpretaci jednotlivých krok·. Kaºdý krok je interpretován vzhledem k aktuálnímu kontextu, který odpovídá aktuální poloze v dokumentu spolu se stavem globálních objekt·. Interpretací kroku se kontext zm¥ní, následující krok se interpretuje v novém kontextu. Kontext, do kterého vstoupíme posledním krokem je výstupem vyhodnocení výrazu vzhledem ke vstupnímu kontextu. Význam výrazu je pak sada objekt· nacházejících se v daném kontextu v aktuální poloze. Chceme-li u£init krok, musíme se rozhodnout, jakým sm¥rem p·jdeme. Tyto sm¥ry se nazývají osy (axis). M·ºeme krá£et nap°. po elementech XML stromu nebo se zam¥°it na atributy uzlu £i ke jmennému prostoru. Krok ur£itým sm¥rem se zapisuje:
osa::test-na-uzel Osa ur£uje sm¥r, test na uzel specikuje poºadované vlastnosti uzlu. Seznam os:
•
child:: - p°ímí potomci aktuálního uzlu,
•
descendant:: - v²ichni potomci aktuálního uzlu,
•
descendant-or-self:: - aktuální uzel a v²ichni potomci,
•
self:: - aktuální uzel,
•
ancestor-or-self:: - aktuální uzel a v²ichni jeho p°edci,
•
ancestor:: - v²ichni p°edci aktuálního uzlu,
•
parent:: - rodi£ aktuálního uzlu,
•
following:: - V²echny uzly nacházející se za aktuálním uzlem,
•
preceding:: - V²echny uzly nacházející se p°ed aktuálním uzlem,
•
following-sibling:: - v²ichni následující sourozenci aktuálního uzlu,
•
preceding-sibling:: - v²ichni p°edcházející sourozenci aktuálního uzlu,
•
attribute:: - ,
•
namespace:: - ,
8
KAPITOLA 2.
POPIS PROBLÉMU, SPECIFIKACE CÍLE
Obrázek 2.1: XPath osy [3]
2.3.1
P°íklady XPath výraz·
Výb¥r v²ech element· para, které jsou potomky aktuálního uzlu:
para Výb¥r v²ech element·, které jsou potomky aktuálního uzlu:
* Výb¥r v²ech element· moznost, které jsou p°ímými potomky element· moznosti, obsaºených v aktuálním elementu:
moznosti/moznost Výb¥r v²ech element· moznost a´ jsou v libovolném kontextu:
//moznost Výb¥r v²ech element· moznost, které jsou p°ímými nebo nep°ímými potomky elementu anketa:
/anketa//moznost
2.4.
JAZYK XQUERY
9
Výb¥r v²ech element· moznost, jejichº atribut hlasu má hodnotu 5:
//moznost[@hlasu="5"] Výb¥r v²ech textových uzl·, které jsou potomky aktuálního uzlu:
text() Výb¥r v²ech uzl· s atributem typu ID nastaveným na hodnotu kap1, které jsou potomky aktuálního uzlu:
id(kap1) 2.4
Jazyk XQuery
XQuery [6] [12] je funkcionální jazyk vybudovaný na základ¥ jazyka XPath. Výrazy jazyka XPath pouºíváme v XQuery pro dotazy nad XML dokumenty. Výsledkem dotazu je sada uzl·, ze kterých zkonstruujeme výstup dotazu. Proto obsahuje jazyk XQuery konstrukty, které dovolují vytvá°ení element· v souvislosti s daty získanými dotazem. Mezi tyto konstrukty pat°í prom¥nné. Ty se ozna£ují prexem $. Nap°. avg($book/price) vypo£te pr·m¥rnou cenu knihy, protoºe v prom¥nné $book se budou postupn¥ b¥hem zpracování výrazu nad daným XML dokumentem vyskytovat v²echny knihy nalezené v dokumentu vyhovující výrazu.
2.4.1
Struktura dotazu v XQuery
Dotaz v jazyce XQuery má dv¥ £ásti - prolog a t¥lo dotazu. Prolog slouºí k zavedení jmenných prostor·, pro import modul·, denici schématu a funkcí, deklaraci globálních prom¥nných. T¥lo dotazu je výraz, jehoº hodnota v prost°edí denovaném prologem p°edstavuje výstup výrazu. Chceme-li nap°. nalézt ve vstupním dokumentu knihu (element book) a vytvo°it výstupní element ozna£ený result, název knihy si ozna£íme jako prom¥nnou $b, autora jako prom¥nnou $a, m·ºe výstup vypadat t°eba takto:
$b $a
10
KAPITOLA 2.
POPIS PROBLÉMU, SPECIFIKACE CÍLE
Do tohoto výstupu musíme ale dosadit nalezené tituly a autory. Na to slouºí v jazyce XQuery konstrukce nazývaná FLWOR. Je to zkratka slov For, Let, Where, Order-By, Return a jedná se o obdobu p°íkazu SELECT dotazovacího jazyka SQL. V XQuery se tento p°íkaz zapisuje takto:
for $b in //book let $a = $b/author return
$b $a Výraz //book ozna£uje libovolný element book v daném XML dokumentu. Klazule for a let se pouºívají k deklaraci prom¥nných, které platí v celém zbytku výrazu od místa deklarace aº k p°i°azování hodnot t¥mto porm¥nným. Klauzule for iteruje nad jednotlivými prvky p°i°azované sekvence. V kaºdém kroku p°i°adí do prom¥nné aktuální prvek a p°edá prom¥nnou do dal²ího zpracování.
for $s in (<modra/>,
,
) return
{$s} ..... dává tento výstup .....
<modra/> Klauzule let slouºí také pro deklaraci prom¥nných a k p°i°azování hodnot t¥mto prom¥nným, ale narozdíl od klauzule for neprovádí nad p°i°azovanými sekvencemi iteraci. V jediném kroku p°i°azuje celou sekvenci jako hodnotu prom¥nné.
let $s := (<modra/>,
,
) return
{$s} .... dává tento výstup .....
<modra/>
2.4.
JAZYK XQUERY
11
P°íklad s vno°enými klauzulemi for:
for $i in (1,2,3) for $i in (3,4,5) return ($i,$j) .... dává výstup .... (1,3,1,4,1,5,2,3,2,4,2,5,3,3,3,4,3,5 ) Stejného výstupu by bylo dosaºeno tímto zápisem:
for $i in (1,2,3),$j in (3,4,5) Klauzule where není povinná. Je ur£ena pro podmín¥né za°azení výstupu generovaného p°edcházejícími klauzulemi for a let. Výraz, který je za klí£ovým slovem where uveden, je vyhodnocen pro kaºdý krok iterace. Je-li jeho výsledkem hodnota true, potom je výstup dané iterace za°azen do zpracování klauzele return. Pokud je podmínka za klauzulí where vyhodnocena jako false, potom je z dal²ího zpracování klazulí return výledek iterace vy°azen. Dal²í nepovinnou £ástí FLWOR výrazu je klauzule order by. Je-li klauzule order by vynechána, pak je po°adí dáno výskytem v klauzulích for a let. Pokud je klauzule order by uvedena, °ídí se po°adí specikací °azení uvedeném v této klauzuli. Pomocí klí£ových slov ascending a descending lze ur£it vzestupný nebo sestupný smysl °azení. Klauzule return uzavírá celý FLWOR výraz. Je v ní denováno, co má být obsaºeno v kaºdém výstupním elementu. Sloºit¥j²í p°íklad pouºití klausule FLWOR:
let $children as xs:string* := ("Merlyn", "Kai", "Eden") return element children { for $child as xs:string at $position in $children let $older-sibling as xs:string? := $children[($position - 1)] where fn:contains($child,"e") order by $position descending return element child { ( attribute name {$child}, if ($older-sibling) then attribute older-sibling {$older-sibling} else () ) } }
12
KAPITOLA 2.
POPIS PROBLÉMU, SPECIFIKACE CÍLE
..... dává tento výstup .....
P°íklad obsahuje také v denici podmínky klausule where volání funkce fn:contains ze skupiny zabudovaných funkcí pro práci s °et¥zci.
2.4.2
Skupiny funkcí XQuery
Jazyk XQuery obsahuje velké mnoºství zabudovaných funkcí [8], zde je seznam jejich skupin:
•
Accesor
•
Error and Trace
•
Numeric
•
String
•
AnyURI
•
Boolean
•
Duration/Date/Time
•
QName
•
Node
•
Sequence
•
Context
Prex pro jmenný prostor t¥chto funkcí je fn:. Jejich volání se tedy provádí zápisem nap°. fn:contains(....), fn:substring(.....) apod. Díky t¥mto zabudovaným funkcím není problém provád¥t v jazyku XQuery sloºité
nu-
merické výpo£ty, vyhledávat výskyt pod°et¥zc· v dokumentech, spojovat °et¥zce, transformovat °et¥zce, provád¥t agrega£ní funkce jako nap°. count, min, max avg a velké mnoºství dal²ích operací r·zných druh·.
2.5.
IMPLEMENTACE XQUERY V CELLSTORE
2.5
13
Implementace XQuery v CellStore
Implementace jazyka XQuery v rámci projektu CellStore probíhá od roku 2006. Za£n¥me popisem postupu zpracování vstupního XQuery výrazu. Prvním krokem je p°edání vstupního výrazu v p·vodní textové form¥ do XQuery parseru, který provádí jeho parsování. Parsováním vznikne interní forma vstupního XQuery výrazu, kterou je objektová struktura v podob¥ stromu abstraktní syntaxe (Abstract Syntax Tree - AST). Jednotlivé uzly AST stromu jsou pak postupn¥ p°edávány do XQuery Interpreteru, který provádí volání jednotlivých povel· - dotaz· obsaºených v daném AST uzlu. Po vykonání této operace si uloºí vrácený výsledek v datovém kontextu aktuálního AST uzlu a pokra£uje na dal²í AST uzel, dokud strom neprojde celý.
Obrázek 2.2: P°íklad AST stromu
2.5.1
Vnit°ní reprezentace XQuery výrazu
Jak bylo popsáno, vnit°ní reprezentace XQuery výrazu je uspo°ádána v AST stromu. Tento AST strom obsahuje uzly, kaºdý uzel °e²í jednu operaci z daného vstupního XQuery výrazu. Pro p°íslu²nou XQuery operaci - resp. funkci - je do uzlu umíst¥n objekt odpovídající t°ídy. Tato t°ída obsahuje metody, které danou operaci umí nad vstupními daty vykonat. M¥jme následující XQuery výraz:
14
KAPITOLA 2.
POPIS PROBLÉMU, SPECIFIKACE CÍLE
let $a := 1 return $a + 1 AST strom bude potom pro tento XQuery výraz vypadat podle obrázku 2.2
2.5.2
Implementace AST stromu
Pro implementaci AST stromu je pouºit návrhový vzor Visitor. Visitorem je zde Interpreter, který má metodu visitxxx pro kaºdou t°ídu, se kterou se m·ºe potkat v uzlech AST stromu. Pro kaºdou t°ídu, kterou visitor nav²t¥vuje, má metodu, jejíº název za£íná na visit a na konci je dopln¥n o postx charakterizující danou t°ídu. P°es tyto metody visitor vlastn¥ vstoupí do objektu dané t°ídy, která má specické vlastnosti a získá tak údaj o typu t°ídy a odkaz na nav²tívený objekt. Na základ¥ t¥chto informací má p°ístup k dat·m daného objektu a také prost°edky pro zacházení s nimi. Pro up°esn¥ní uvádím n¥kolik p°íklad· názv· metod, pomocí kterých Interpreter nav²t¥vuje jiné t°ídy:
•
visitXPathAxisChild
•
visitXPathAxisParent
•
visitAstBooleanLiteral
•
visitAstFLWORExpr
•
visitAstForClause
•
visitAstAtomicType:
•
visitAstFunctionCall
Z uvedených názv· metod je patrná souvislost s p°edcházejícími odstavci popisujícími jazyk XPath a XQuery. Poslední jmenovaný p°íklad, visitAstFunctionCall, se úzce týká tématu této bakalá°ské práce. Tudy prochází XQuery dotazy obsahující funkce za£ínající na fn:, tedy práv¥ vestav¥né funkce jazyka XQuery, nap°. fn:abs(1) apod. Zpracování t¥chto funkcí je implementováno ve t°íd¥ XQuery::FnLibrary kde je obsaºena také tabulka funkcí. V¥t²ina z mnoºiny funkcí denovaných specikacemi jazyka XQuery [8] není v projektu doposud obsaºena, doimplementování podmnoºiny t¥chto funkcí je jedním z úkol· této práce. Mezi funkce, které jsou jiº implementovány v rámci prací student· z p°edchozích let, pat°í nap°. agrega£ní funkce count, avg, max, min, sum, nebo boolovské funkce boolean, not, true, false, z °et¥zcových funkcí nap°. funkce contains, concat a mnoho dal²ích funkcí z ostatních skupin.
2.5.
IMPLEMENTACE XQUERY V CELLSTORE
2.5.3
15
Tabulka funkcí fn:
Tabulka funkcí obsahuje seznam názv· vestav¥ných funkcí jazyka XQuery, které jsou metodami t°ídy FnLibrary. Jedná se o pole °et¥zc·, které obsahují názvy implementovaných XQuery funkcí. Je snaha pojmenovat metodu implementující danou funkci shodn¥ s názvem, který je p°edepsán specikacemi XQuery. Protoºe se ale v názvech XQuery funkcí £asto objevuje znak -, který jazyk Smalltalk v názvu metody nep°ipou²tí, mají v tomto p°ípad¥ metody název pozm¥n¥ný. Znak - je vynechán a první písmeno následující v názvu XQuery funkce za ním je vºdy velké. Nap°. XQuery funkce upper-case má název metody upperCase. Pro up°esn¥ní: ve skute£nosti je název metody upperCaseInContext.
16
KAPITOLA 2.
POPIS PROBLÉMU, SPECIFIKACE CÍLE
Uvádím také £ást tabulky implementovaných funkcí:
functionLocalNames ^#( abs avg boolean #'base-uri' ceiling count collection concat contains #'current-time' data #'distinct-values' doc .. .. ) Po vstupu do visitAstFunctionCall je tedy postup zpracování názvu funkce následující:
•
provede se p°eklad názvu na název metody pomocí metody Smalltalkize,
•
zkontroluje se, zda je funkce v tabulce obsaºena (je-li implementována),
•
v metod¥ perform se zavolá metoda s daným názvem.
Kapitola 3
Analýza a návrh °e²ení 3.1
Poºadavky na vývojové prost°edí
Vývojové prost°edí pro celý projekt bylo zvoleno jiº na samém po£átku vzniku projektu CellStore, a to prost°edí objektového jazyka SmallTalk/X. K volb¥ tohoto prost°edí vedly následující poºadavky:
•
snadná zm¥na vnit°ní logiky jednotlivých £ástí - modularita,
•
£ist¥ objektový p°ístup k návrhu a implementaci,
•
podpora testy °ízeného vývoje,
•
snadné zapracování trasovací a logovací podpory jednotlivých £ástí systému pro ú£ely lad¥ní a výuky,
•
prost°edí by m¥lo být spí²e interpreta£ní neº kompila£ní pro snadnou a okamºitou propagaci zm¥n. Tato volba má ale i negativní d·sledky:
•
²patn¥ se shání dal²í ú£astníci projektu, protoºe Smalltalk není p°íli² roz²í°ený jazyk, studenti nemají motivaci se jej u£it, t¥ºko jeho znalost mohou v budoucnu zhodnotit,
•
Smalltalk/X nemá podpo°enu tvorbu WWW aplikací, coº pon¥kud komplikuje moºnosti roz²í°ení a tím i testování projektu CellStore.
3.2 3.2.1
Návrh implementace Úkol
Úkolem je implementovat podmnoºinu vestav¥ných funkcí jazyka XQuery do projektu Cellstore. Tyto funkce je t°eba otestovat nejprve pomocí unit test· a poté prov¥°it pomocí testovacího balíku XQTS. Je proto t°eba navrhnout zp·sob, jakým prob¥hne implementace vlastních funkcí v jazyku Smalltalk do jiº existujících t°íd projektu CellStore.
17
18
KAPITOLA 3.
3.2.2
ANALÝZA A NÁVRH EENÍ
Zp·sob implementace
Vzhledem ke skute£nosti, ºe mnoho vestav¥ných funkcí jazyka XQuery bylo jiº do projektu implementováno, je provedení implementace dal²ích funkcí dáno d°íve navrºeným °e²ením popsaným v 2.5. P°ed implementací nové funkce je t°eba doplnit do tabulky funkcí (functionLocalNames) název nové funkce, aby interpreter provedl zavolání této funkce, pokud se vyskytne ve vstupním XQuery dotazu. Potom je nutné do t°ídy FnLibrary doplnit správn¥ sestavený název metody, která má zamý²lenou funkci vykonávat. Konstrukce názvu je následující:
ffffInContext Kde p°edstavuje libovolný po£et znak· odpovídající názvu implementované vestav¥né funkce XQuery. Je t°eba zde vynechat znak -, který je v XQuery vyuºíván ve víceslovných názvech funkcí. Na následujícím míst¥ pak musí následovat velké písmeno. Nap°. p°i implementaci XQuery funkce upper-case musí celý název metody dopln¥né do t°ídy FnLibrary vypadat takto:
upperCaseInContext Aby mohly být od interpreteru p°evzaty v²echny informace, musí mít v²echny metody daný vý£et parametr·. Jsou to celkem t°i parametry: daný kontext, kolekce parametr· ze vstupního XQuery výrazu, informace o objektu interpreteru. Kolekce s parametry XQuery výrazu je objektová struktura OrderedCollection. OrderedCollection je název t°ídy z knihovny jazyka Smalltalk, která uchovává objekty v kolekci objekt· v po°adí, ve kterém do ní byly vloºeny. Z této kolekce potom funkce vyzvedávají jednotlivé parametry jako vstup pro operaci, která nad nimi má být ve funkci provedena. Úplná hlavi£ka metody pak bude vypadat nap°. takto:
upperCaseInContext: context withParameters: parameters forInterpreter: interpreter Do t¥la metody je pak t°eba naprogramovat funkcionalitu v jazyku Smalltalk tak, aby p°íslu²ná funkce vracela vzhledem ke vstupu správné výsledky podle specikací jazyka XQuery. Vracený výsledek musí kaºdá funkce transformovat na t°ídu XQuerySequence, Pro p°edávání parametr· funkcím a vracení výsledku v °et¥zcové podob¥ je pouºita t°ída XQuerySequence, která má metody nap°. pro transformaci Smalltalk °et¥zce nebo celo£íselného objektu na °et¥zec, ve kterém jsou dopln¥ny informace o XQuery typech (nap°. xs:string nebo xs:integer). Naopak pro transformaci vstupních parametr· má t°ída XQuerySequence metody na p°evod °et¥zce obsahujících informace o XQuery typech na b¥ºné Smalltalk °et¥zce. Po napsání t¥la metody je vhodné ihned napsat unit testy na danou metodu a odladit p°ípadné chyby.
Kapitola 4
Realizace 4.1
Volba skupiny XQuery funkcí
Pro implementaci byly vybrány XQuery funkce ze skupiny funkcí pro práci s °et¥zci. Z této skupiny byly doposud implementovány pouze dv¥ funkce: concat a contains.
4.2
Funkce fn:upper case
fn:upper-case($arg as xs:string?) as xs:string Vstupním parametrem funkce fn:upper-case je °et¥zec typu xs:string. Funkce transformuje v²echny znaky vstupního °et¥zce na malé a vzniklý °et¥zec vrátí jako výsledek, který je rovn¥º typu xs:string. P°íklad:
fn:upper-case($arg as xs:string?) as xs:string
4.3
Funkce fn:lower case
fn:lower-case($arg as xs:string?) as xs:string Funkce fn:lower-case má jeden vstupní parametr, kterým je °et¥zec typu xs:string. Funkce transformuje v²echny znaky vstupního °et¥zce na malé a vzniklý °et¥zec vrátí jako výsledek, který je rovn¥º typu xs:string. P°íklad:
fn:lower-case("ABc!D") vrací "abc!d".
19
20
4.4
KAPITOLA 4.
REALIZACE
Funkce fn:substring
fn:substring($sourceString as xs:string?, $startingLoc as xs:double) as xs:string fn:substring($sourceString as xs:string?, $startingLoc as xs:double, $length as xs:double) as xs:string Pokud je funkce volána se dv¥ma parametry, vrací £ást vstupního °et¥zce sourceString za£ínající od pozice dané hodnotou parametru startingLoc do konce °et¥zce. Pokud má funkce t°i parametry, pak vrací £ást vstupního °et¥zce o délce length od pozice dané hodnotou vstupního parametru startingLoc. P°íklady:
fn:substring("metadata", 4, 3) vrací "ada". fn:substring("motor car", 6) vrací " car". 4.5
Funkce fn:substring after
fn:substring-after($arg1 as xs:string?, $arg2 as xs:string?) as xs:string Funkce vrací £ást °et¥zce arg1 od pozice následující za výskytem °et¥zce arg2 do konce °et¥zce. P°íklad:
fn:substring-after("tattoo", "tat") vrací "too" 4.6
Funkce fn:substring before
fn:substring-before($arg1 as xs:string?, $arg2 as xs:string?) as xs:string Funkce vrací £ást °et¥zce arg1 od za£átku do pozice p°ed výskytem °et¥zce arg2.
4.7
Funkce fn:starts with
fn:starts-with($arg1 as xs:string?, $arg2 as xs:string?) as xs:boolean Funkce vrací výsledek typu xs:boolean. Hodnota true je vrácena v p°ípad¥, ºe arg1 za£íná °et¥zcem v arg2, jinak je vrácena hodnota false. P°íklad:
fn:starts-with ( "tattoo", "att") vrací false abcd
4.8.
FUNKCE FN:ENDS WITH
4.8
21
Funkce fn:ends with
fn:ends-with($arg1 as xs:string?, $arg2 as xs:string?) as xs:boolean Funkce vrací výsledek typu xs:boolean. Hodnota true je vrácena v p°ípad¥, ºe arg1 kon£í °et¥zcem v arg2, jinak je vrácena hodnota false. P°íklad:
fn:ends-with ( "tattoo", "too") vrací true
4.9
Funkce fn:string length
fn:string-length($arg as xs:string?) as xs:integer Funkce vrací délku °et¥zce arg. P°íklad:
string-length("abcdef") vrací 5
4.10
Funkce fn:translate
fn:translate( $arg as xs:string?, $mapString as xs:string, $transString as xs:string) as xs:string Funkce vrací °et¥zec v arg modikovaný tak, ºe kaºdý znak v arg, který se vyskytuje na stejné pozici N v °et¥zci mapString, je nahrazen znakem, který se vyskytuje na pozici N v °et¥zci transString. P°íklad:
fn:translate("bar","abc","ABC") vrací "BAr" fn:translate("abcdabc", "abc", "AB") vrací "ABdAB"
P°íklad implementace funkce Pro p°íklad implementace metody v jazyku Smalltalk zvolím funkci translate. Metoda pro vykonání XQuery funkce translate je deklarována ve t°íd¥ FnLibrary, má název translateInContext, jedná se o instan£ní metodu. Tento název je uveden také v tabulace funkcí functionLocalNames umíst¥né ve stejné t°íd¥.
22
KAPITOLA 4.
REALIZACE
Výpis kódu metody translateInContext: translateInContext:context withParameters:parameters forInterpreter:interpreter | string1 string2 string3 pos pos1 | parameters size ~= 3 ifTrue: [^XQuerySequence new:0]. parameters first size ~= 0 ifTrue: [ string1 := parameters first first. (string1 isSubtypeOf: 'xs:string') ifFalse: [^XQuerySequence new:0]. string1 := string1 stringValue. ] ifFalse: [string1 := '']. parameters second size ~= 0 ifTrue: [ string2 := parameters second first. (string2 isSubtypeOf: 'xs:string') ifFalse: [^XQuerySequence new:0]. string2 := string2 stringValue. ] ifFalse: [string2 := '']. parameters third size ~= 0 ifTrue: [ string3 := parameters third first. (string3 isSubtypeOf: 'xs:string') ifFalse: [^XQuerySequence new:0]. string3 := string3 stringValue. ] ifFalse: [string3 := '']. pos := 1. [ pos <= string3 size ifTrue: [ string1 replaceAll: (string2 at:pos) with: (string3 at:pos). ] ifFalse: [ pos1 := 1. [ pos1 := string1 findString: (string2 copyFrom:pos to:pos) startingAt:pos1. pos1 > 0 ifTrue: [ pos1 > 1 ifTrue: [string1 := (string1 copyFrom: 1 to: pos1-1), (string1 copyFrom: (pos1+1) to: string1 size).] ifFalse: [string1 := string1 copyFrom: (pos1+1) to: string1 size.]. ]. (pos1 > 0) ] whileTrue. ]. pos := pos + 1. pos <= string2 size ] whileTrue. ^XQuerySequence withString:string1.
4.10.
FUNKCE FN:TRANSLATE
23
Nejprve se zkotroluje, zda byla XQuery funkce translate zavolána se správným po£tem parametr·, tj. se t°emi parametry. Pokud tomu tak není, metoda vrátí prázdný °et¥zec. Parametry jsou metod¥ z XQuery interpreteru p°edány jako OrderedCollection, coº je t°ída z knihovny jazyka Smalltalk. Parametry se na£tou do lokálních prom¥nných string1, string2, string3 a prov¥°í se, zda mají v²echny t°i z hlediska jazyka XQuery správný typ, tj. zdali se jedná o typ xs:string. Pokud tomu tak není, metoda vrátí prázdný °et¥zec a ukon£í se. Pokud parametry jsou správného typu, p°etransformují se do °et¥zce ve smyslu jazyka Smalltalk, tzn. na °et¥zec typu xs:string se zavolá metoda stringValue, která vrací typ String. Nyní lze °íci, ºe pokud se metoda neukon£ila, pak dostala od interpreteru parametry s korektním obsahem, se kterým umí dále pracovat. Následn¥ se provede p°eklad vstupního °et¥zce podle zadaných vzor·. Tato operace se provádí v iteraci, jejímº °ídicím parametrem je pozice znaku v mapString. Pokud je tato pozice men²í neº délka °et¥zce transString, potom je moºné pro zám¥nu znak· efektivn¥ vyuºít metodu replaceAll z knihovny jazyka Smalltalk. Pokud je pozice v¥t²í neº délka °et¥zce transString, potom je t°eba výsledný °et¥zec zkracovat, protoºe znaky p°ebývající v mapString je podle specikace nutné vypustit. K tomuto ú£elu se spustí je²t¥ jedna vnit°ní iterace, která vyhledává výskyty od za£átku a vytvá°í nový °et¥zec s vypu²t¥ným daným znakem. Vnit°ní iterace se ukon£í, pokud daný znak z mapString jiº není ve zpracovávaném °et¥zci nalezen. Vn¥j²í iterace se ukon£í, pokud se pro²ly v²echny znaky z parametru mapString. Potom se metoda ukon£í a vrátí transformovaný °et¥zec.
24
KAPITOLA 4.
REALIZACE
Kapitola 5
Testování Co je poºadováno Poºadováno je testování dvojího druhu. Zaprvé to jsou unit testy, které jsou psané autorem práce a zadruhé to jsou testy XQTS, které jsou k dispozici ke staºení na serveru W3C. Unit testy poslouºí pro odlad¥ní základní funk£nosti jednotlivých XQuery funkcí, testy XQTS poskytnou p°edstavu, v jaké mí°e se poda°ilo naplnit W3C specikace implementovaných vestav¥ných funkcí jazyka XQuery.
5.1 5.1.1
Unit testy Smysl unit test·
Smyslem jednotkového testování (unit testing) je prov¥°ení malých funk£ních celk· d°íve, neº jsou pouºity ke sloºit¥j²ímu ú£elu. Testovat je vhodné takovou jednotku, která má jasn¥ daný vstup a k n¥mu o£ekávaný výstup, jinak °e£eno je testovatelná. Nejmen²í testovatelnou jednotkou je v na²em p°ípad¥ zdrojový kód metody napsané v jazyce Smalltalk vykonávající funkcionalitu dané vestav¥né XQuery funkce. Pro kaºdý vstup této funkce, kterým je XQuery výraz, je podle specikací W3C jasn¥ daný výstup.
5.1.2
Zp·sob provedení unit test·
Pro implementaci unit test· je v projektu p°ipravena t°ída XQueryInterpreterTests. Do této t°ídy lze p°idávat metody s jednotlivými testovacími p°ípady, kterými se prov¥°í základní funk£nost dané XQuery funkce. Názvy metod s testovacími p°ípady budou tvo°eny takto:
test_function_fn_xxxx_nn Znaky xxxx zastupují název XQuery funkce a nn dvoumístné po°adové £íslo testu. Pro pohodlné spu²t¥ní testu lze vyuºít vlastnost prost°edí Smalltalk/X, kde je moºné spou²t¥t testovací metody kliknutím na tla£ítko. Výsledek testu se potom vypí²e ve stavovém °ádku dole v okn¥ Smalltalk-browseru.
25
26
KAPITOLA 5.
5.1.3
TESTOVÁNÍ
Pr·b¥h a implementace unit test·
Unit testy byly psány b¥hem implementace jednotlivých XQuery funkcí, které tak pomocí unit test· byly odlad¥ny. Jednotlivé testovací metody jsou umíst¥ny ve t°íd¥ XQueryInterpreterTests. Zde je uveden p°íklad implementace jedné z nich:
test_function_fn_endsWith_01 | result | result := interpreter evaluate:' fn:ends-with("Query","ry") '. "sem je vloºen testovaný XQuery dotaz" self assert: (result first "first item in result as document fragment" childNodes first "the only one child of document fragment" nodeValue) = 'true' "zde je komparace na o£ekávaný výsledek" Implementace testovací metody spo£ívá ve vloºení testovaného XQuery výrazu, na který je zavolána metoda interpreter evaluate, která provede vyhodnocení poºadovaného XQuery výrazu pomocí implementovaných (testovaných) funkcí a vrátí výsledek. Tento výsledek porovná s výsledkem, který má být podle specikací jazyka XQuery dosaºen. Tento výsledek je t°eba do metody také vepsat. Vytvo°enou testovací metodu je pak moºné spou²t¥t jedním kliknutím p°ímo v prost°edí Smalltalk/X, kde je zobrazeno, zda test prob¥hl bez chyb £i nikoli.
5.2 5.2.1
XQTS testy Co jsou XQTS testy
XML Query test Suite (XQTS) poskytuje sadu metrik pro ur£ení, na kolik procent daná implementace jazyka XQuery plní specikace jazyka XQuery p°edepsaná konsorciem W3C. XQTS také pomáhá realizátor·m identikovat p°ípadné problémy ve svých iplementacích XQuery procesor·. Aktuáln¥ je na webu W3C ke staºení balík XQTS test· ve verzi 1.0.3, viz [11]. Tento balík obsahuje více neº 19 000 testovacích p°ípad·, které jsou zapsány ve form¥ textových soubor· s jednoduchými i sloºitými XQuery výrazy. Ke kaºdému souboru s XQuery výrazem je v balíku obsaºen také textový soubor se správným výsledkem. Pomocí t¥chto soubor· mohou jednotliví implementáto°i prov¥°ovat svoje implementace jazyka XQuery. Výrobci potom uvád¥jí ke svým XQuery procesor·m, na kolik procent vyhovují XQTS test·m. Jedná se vlastn¥ o benchmark test.
5.2.
XQTS TESTY
5.2.2
27
Zp·sob provedení XQTS test·
Pro implementaci XQTS test· je v projektu p°ipraven balí£ek, do kterého jsou vkládány jednotlivé skupiny XQTS test·. Balí£ek má název XQuery-Tests-XQTS. Sem budou do p°íslu²ných t°íd vkládány v²echny testovací p°ípady obsaºené v balíku XQTS test· pro konkrétní implementované XQuery funkce. Názvy jednotlivých testovacích metod budou p°evzaty z balíku XQTS. Kostra t¥la testovací metody bude p°evzata z jiº hotových XQTS test·, kde je jiº implementována £ást provád¥jící komparaci p°edpokládaného °et¥zce výstupu a °et¥zce, který vygenerovala nov¥ implementovaná XQuery funkce. Bude se tedy jednat o parametrizování testovacích metod.
5.2.3
Pr·b¥h a implementace XQTS test·
XQTS testy byly provád¥ny po odlad¥ní v²ech implementovaných funkcí a po provedení v²ech unit test·. Balík XQTS test· byl staºen z [11] jako zip archiv a rozbalen na lokální souborový systém po£íta£e. V prost°edí Smalltalk/X je potom nutné nastavit cestu k takto rozbalenému archivu. Tuto cestu potom testovací prost°edí pouºívá k vyhledání p°íslu²ných soubor·. P°íklad implementace XQTS testovací metody pro realizaci testu s ozna£ením fn-lowercase-1:
test_fn_lower_case_1 | query result | query := ' (: Name: fn-lower-case-1 :) (: Description: Evaluation of lower-case function as per example 1 :) (: from the F&O specs. :) fn:lower-case("ABc!D") '. self xqtsBind: 'input-context' toContentsOf: 'emptydoc'. result := interpreter evaluate: query. self assert: (self xqtsResultTextFromResult: result) = (self xqtsResultTextFromFile: 'Functions/AllStringFunc/GeneralStringFunc/LowerCaseFunc/ fn-lower-case-1.txt' ) Do prom¥nné query je zkopírován ze souboru fn-lower-case-1.xq jeho textový obsah. Jedná se o XQuery výraz s komentá°em. Na konci metody se provádí porovnání výsledku, který je
28
KAPITOLA 5.
TESTOVÁNÍ
vrácen implementovanou XQuery funkcí s výsledkem, který je poºadován balíkem XQTS obsaºeným v p°íslu²ném soboru s fn-lower-case-1.txt. Takto implementovaná metoda se spustí v prost°edí Smalltalk/X jedním kliknutím. V²echny implementované testovací XQTS metody jsou obsaºeny ve t°íd¥ XQTSAllString. Je jich celkem 318 a jsou to v²echny testy, které balík XQTS v kategorii AllString k implementovaným XQuery funkcím obsahuje.
5.2.4
Struktura balíku XQTS
Balík XQTS má pom¥rn¥ sloºitou adresá°ovou strukturu a obsahuje velké mnoºství soubor·. Pro jednoduchost zde budou popsány pouze ty adresá°e a typy soubor·, které souvisí s touto prací. Pro ú£ely této práce jsou z balíku zapot°ebí dva druhy soubor·. Za prvé to jsou soubory s testovacími XQuery výrazy a za druhé soubory s °et¥zci p°edpokládaných výsledk·. V²echny implementované XQuery funkce pat°í do skupiny °et¥zcových funkcí, odpovídající cesta v balíku XQTS je tedy
queries/XQuery/Functions/AllStringFunc. Na této cest¥ je pak t°eba je²t¥ vybrat podsloºku pro konkrétní funkci, nap°.
GeneralStringFunc/StringLengthFunc. P°íklad názvu souboru s testovacím XQuery výrazem je fn-substring-1.xq. Obsah tohoto souboru je následující:
(: Name: fn-substring-1 :) (: Description: Evaluation of substring function as per example 1 :) (: from the F&O specs. :) fn:substring("motor car", 6) Cesta k p°edpokládaným výsledk·m je potom
ExpectedResults/Functions/AllStringFunc, pro konkrétní funkci je t°eba op¥t vybrat podsloºku, nap°.
GeneralStringFunc/StringLengthFunc. P°íklad názvu souboru s o£ekávaným výsledkem je fn-substring-1.txt. Obsah tohoto souboru je pouze °et¥zec car.
5.3.
VÝSLEDKY TESTOVÁNÍ
5.3 5.3.1
29
Výsledky testování Unit testy
Pomocí unit test· bylo provedeno odlad¥ní implementovaných XQuery funkcí. V²echny testovací p°ípady unit test· tedy vy²ly bez chyb. V p°ípad¥ unit testu £. 02 funkce substringbefore, se zpo£átku neda°ilo dosáhnout pozitivního vyhodnocení testu. Debuggerem bylo ov¥°eno, ºe metoda substringInContext, která byla p°edm¥tem testu, p°itom dodávala správný výsledek, tj. prázdný °et¥zec. Pomocí debuggeru bylo odhaleno, ºe ²patn¥ funguje vyhodnocování výsledku v testovací metod¥, protoºe v objektu result chyb¥l odkaz na objekt s výsledkem. Výsledkem m¥l být práv¥ prázdný °et¥zec. Pokud byl výsledkem neprázdný °et¥zec, v²e fungovalo správn¥. Za pomoci vedoucího práce vznikla oprava, která je zachycena v následujícím vloºeném kódu: P°ed opravou:
visitAtomic: item | data | data := item stringValue. (data allSatisfy:[:c|c isXMLWhiteSpace]) ifFalse: [contentHandler characters: data] ] Po oprav¥:
visitAtomic: item | data | data := item stringValue. (data allSatisfy:[:c|c isXMLWhiteSpace]) ifFalse: [contentHandler characters: data] ifTrue:[ data isEmpty ifTrue:[contentHandler characters: data] ] Opravená metoda visitAtomic je umíst¥na ve t°íd¥ XDMXMLReader. Po této oprav¥ jiº problematický unit test pro²el bez problém· s pozitivním výsledkem.
30
KAPITOLA 5.
5.3.2
TESTOVÁNÍ
XQTS testy
XQTS test· je v rámci této práce naimplementováno celkem 318. Pozitivního výsledku bylo dosaºeno u 198 testovacích p°ípad·. Testovací p°ípady s negativním výsledkem v¥t²inou vyºadují komplexní implementaci ²ir²í funkcionality, která v projektu CellStore doposud není dostupná. Zkoumání p°í£in n¥kterých dal²ích chyb by si vyºádalo mnoho dal²ího úsilí, které jiº p°esahuje rámec této bakalá°ské práce. Naiplementovány jsou v²echny testy balíku XQTS ze skupiny AllString pro následující XQuery funkce:
•
upper-case
•
lower-case
•
substring
•
substring-after
•
substring-before
•
ends-with
•
starts-with
•
translate
•
string-length
•
matches (tato XQuery funkce je naimplementována pouze z £ásti)
Funkce matches byla naimplementována z £asových d·vod· pouze ve zjednodu²ené podob¥. Protoºe jsem v²ak naimplementoval pro tuto funkci v²echny XQTS testy, rozhodl jsem se ji i v této rozd¥lané podob¥ odevzdat. V¥t²ina test· pro ni proto nevychází. P°íklad testovacího p°ípadu s negativním výsledkem:
fn:string-length(fn:string("AbcDH")) V tomto p°ípad¥ je k prov¥°ení funkce string-length pouºito je²t¥ vno°ené volání funkce string, která není naimplementována.
Kapitola 6
Záv¥r Tvorba této práce mi p°inesla mnoho poznání a zajímavých zku²eností. Zapojil jsem se jako student kombinované formy studia do projektu, na kterém doposud participovali studenti denní formy studia. Z jejich diplomových prací je znát velké nad²ení pro v¥c, hluboká znalost problematiky a zárove¬ velké mnoºství £asu, které svým pracím v¥novali. Spln¥ní konkrétních cíl· zadání této práce pro mne p°edstavovalo nejprve zvládnout °adu nových technologií, se kterými jsem se v dosavadním ºivot¥ nesetkal v·bec nebo pouze okrajov¥. Jednalo se nejprve o studium projektu CellStore jako celku, se kterým souviselo také prostudování diplomových prací student·, kte°í se na projektu CellStore podíleli p°ede mnou. Nainstaloval jsem si prost°edí Smalltalk/X na sv·j po£íta£ a provedl nastavení SVN, aby bylo moºné natáhnout pot°ebné balí£ky zdrojových kód·. Potom jsem se seznamoval s hierarchií doposud implementovaných t°íd, zejména t°íd souvisejících s jazykem XQuery. Sehnal jsem si na internetu dokumentaci k jazyku Smalltalk a konfrontoval zdrojový kód jiº hotových t°íd XQuery interpreteru s domumentací k jazyku Smalltalk. Tím jsem porozum¥l jazyku Smalltalk a zárove¬ získal p°edstavu o tom, co je v projektu CellStore v souvislosti s jazykem XQuery jiº hotového. Hlavn¥ jsem získal p°edstavu, kde má moje práce na dílo mých p°edch·dc· navázat a jakým zp·sobem má být provedena. Po vlastním projektu CellStore jsem se je²t¥ zam¥°il na studium jazyk· XML, XPath a XQuery, kterých se zadání mé práce úzce týká. Novinkou pro mne byly rovn¥º XQTS testy, kde bylo d·leºité pochopit jejich pom¥rn¥ sloºitou strukturu a dokázat z ní vybrat to podstatné pro pot°eby spln¥ní úkolu této práce. Po nabytí t¥chto znalostí jsem si vytipoval skupinu vestav¥ných XQuery funkcí, kterou jsem potom postupn¥ implementoval. Z £asových d·vod· se mi bohuºel nepoda°ilo tuto skupinu naimplementovat celou. Zde budou moci navázat dal²í studenti svými pracemi. Do projektu CellStore jsem v rámci své práce naimplementoval podmnoºinu vestav¥ných funkcí jazyka XQuery, doplnil k nim vlastní unit testy. Také jsem do projektu doplnil v²echny testovací p°ípady z balíku XQTS související s mnou implentovanými XQuery funkcemi. Toto povaºuji za spln¥ní zadání mé bakalá°ské práce. Nad rámec práce se poda°ilo b¥hem testování jedné z funkcí odhalit chybu v £ásti, která se zadáním práce p°ímo nesouvisela. Za pomoci vedoucího práce byla tato chyba odstran¥na.
31
32
KAPITOLA 6.
ZÁV
R
Z mého osobního hlediska jsem tvorbou této práce získal znalost základ· objektového jazyka Smalltalk, osvojil jsem si práci s jazyky XML, XPath a XQuery. Získal jsem zajímavou zku²enost, jak se tvo°í programovací jazyk, a p°edstavu, jaké úsilí je t°eba v¥novat lad¥ní funkcí tak, aby vyhov¥ly co nejv¥t²ímu po£tu pravidel, která konsorcium W3C striktn¥ p°edepisuje. Tato pravidla jsou ale dob°e vydenovaná a testovací p°ípady jsou nastaveny tak, aby odchytily typické implementa£ní chyby. Navíc podpo°ení testování XQuery funkcí nástroji integrovanými p°ímo do vývojového prost°edí Smalltalk/X velmi unsad¬uje a urychluje práci.
Literatura [1] Faculty of Information Technology.
CellStore [online]. 2013. [cit. 15. 5. 2013]. Dostupné
z:
. [2] FIT - Software Engineering Group.
Setting up Subversion in Smalltalk/X [online]. 2011.
[cit. 15. 5. 2013]. Dostupné z:
wiki/SVNSetup>.
XPathAxis [online]. 2007. [cit. 15. 5. 2013]. Dostupné z: .
[3] George Hemandez.
[4] Jan Vraný (FIT).
Jenkins - Software Engineering Group [online]. 2013. [cit. 15. 5. 2013].
Dostupné z: . [5] Jan ák.
Implementace £ásti jazyka XQuery v rámci projektu CellStore.
: Diplomová
práce, 2007. [6] Karel Richta.
Jazyky XQuery a XPath [online]. 2006. [cit. 15. 5. 2013]. Dostupné z:
<www.ksi.mff.cuni.cz/~richta/publications/RichtaMD2006.pdf>. [7] Kur², J.
Introducing XML Schema Data Types into CellStore XQuery Interpreter.
:
Diplomová práce, 2010. [8] W3C.
XPath, XQuery, and XSLT Functions [online]. 2013. [cit. 15. 5. 2013]. Dostupné
z: . [9] W3C.
Extensible Markup Language (XML) [online]. 2006. [cit. 15. 5. 2013]. Dostupné z:
. [10] W3C.
XQuery and XPath Full Text 1.0 [online]. 2011. [cit. 15. 5. 2013]. Dostupné z:
. [11] W3C.
XML Query Test Suite 1.0 (XQTS) [online]. 2013. [cit. 15. 5. 2013]. Dostupné z:
. [12] W3C.
XML Query [online]. 2006. [cit. 15. 5. 2013]. Dostupné z:
XML/Query/>.
[13] Wróblewski, L.
Jazyk pro manipulaci s daty v projektu CellStore.
2008.
33
: Diplomová práce,
34
LITERATURA
P°íloha A
Seznam pouºitých zkratek ANSI AST
American National Standards Institute
Abstract Syntax Tree
FLWOR GML
Generalized Markup Language
SGML SQL
For, Let, Where, Order and Return
Standard Generalized Markup Language
Structured Query Language
W3C
World Wide Web Consortium
XML
eXtensible Markup Language
XQTS XSLT
XML Query Test Suite eXtensible Stylesheet Language Transformations
35
36
PÍLOHA A.
SEZNAM POUITÝCH ZKRATEK
P°íloha B
Instala£ní a uºivatelská p°íru£ka Pro pouºívání implementovaných XQuery funkcí v rámci databáze CellStore je t°eba nainstalovat vývojové a b¥hové prost°edí Smalltalk/X, které je ke staºení zde [4]. Na CD je uloºen image, který obsahuje stav v²ech pot°ebných zdrojových text· v dob¥, kdy byla dokon£ena tato práce. Tento image je moºné natáhnout do prost°edí Smalltalk/X. To se provede tímto p°íkazem
stx -i st_houzvjir.img Celé prost°edí je tak nastaveno do stejného stavu, v jakém bylo p°i dokon£ení této práce. Kompletní zdrojové texty projektu CellStore v£etn¥ zdrojových text· této práce je moºné také získat online p°es Subversion. Postup pro nastavení Subversion je k dispozici zde: [2]. Zadávání XQuery výraz· je po instalaci moºné p°es spu²t¥ní volby XQuery Workspace v menu Tools okna ST/X Launcher. Otev°e se okno XQuery Workspace, kde je moºné zadat nap°. XQuery výraz lower-case('AbCd'). Tento °et¥zec je nutné ozna£it celý nap°. my²í a potom v menu Editace zvolit poloºku Do it. P°íkaz se vykoná a je vypsán výsledek abcd. Dal²í moºností je spou²t¥t XQTS testy. To se provede z okna ST/X Launcher z menu Classes-System Browser. Otev°e okno browseru, kde je t°eba v levé £ásti najít balí£ek t°íd s názvem XQuery-Tests-XQTS. Potom je t°eba ozna£it t°ídu XQuery::XQTSAllString a dvakrát na ni poklikat. Otev°e se okno SUnit Test Runner Tool, kde je moºné vybrat op¥t t°ídu XQuery::XQTSAllString. Zmá£knutím tla£ítka Run Selected se spustí v²echny XQTS testy, které byly napsány v rámci této práce, po dob¥hnutí se zobrazí výsledek.
37
38
PÍLOHA B.
INSTALANÍ A UIVATELSKÁ PÍRUKA
P°íloha C
Obsah p°iloºeného CD
Obrázek C.1: Obsah p°iloºeného CD
39