Hlavní navigace

Bandicoot a webové aplikácie

Július Chrobák

Bandicoot je nový programovací systém založený na relačnom modeli. Cieľom tohto článku je implementácia ukážkovej webovej aplikácie s použitím Bandicootu a JavaScriptu. Nasledujúce odstavce popisujú, ako vytvoriť jednoduchú aplikáciu. Na perzistenciu a kalkulácie s dátami je použitý Bandicoot.

Doba čtení: 5 minut

JavaScript je použitý na vytvorenie používateľského rozhrania, ktoré pomocou objektu XMLHttpRequest volá jednotlivé funkcie v Bandicoote. Program slúži ako príklad na popísanie funkcií systému Bandicoot a nadväzuje na ukážky z predchádzajúceho diela článku, ktorý sa venoval základný prvkom jazyka, t.j. relačným typom a premenným.

Aplikačné rozhranie

Bandicoot disponuje vlastným relačným programovacím jazykom a behovým prostredím. Jedným z prvkov jazyka sú funkcie, ktoré sú automaticky dostupné cez protokol HTTP 1.1 buď cez metódu GET alebo POST v závislosti na vstupných parametroch funkcie. Bandicoot vykonáva všetky funkcie v transakciách a poskytuje konzistentný pohľad na globálne premenné. Stručný popis, ako fungujú transakcie, je dostupný na blog stránke projektu. Nasledujúci diagram znázorňuje situáciu, keď dve klientské aplikácie spúšťajú funkcie X a Y súčasne:

Ako parametre do funkcií, tak aj ich návratové hodnoty sú relácie vo formáte CSV. Prvý riadok definuje atribúty a zvyšné riadky obsahujú jednotlivé záznamy v relácií, napríklad:

autor:string,cena:real,pocetStran:int,rok:int,titul:string
David A. Vise,375.9,363,2007,Google Story
Pavel Satrapa,248.5,253,1994,Začínáme v Pascalu 

Ako spustiť Bandicoot

Pre účely tohto článku sú dostupné balíky pre rôzne operačné systémy (Linux 64bit, MacOS 64bit, Windows 32bit) obsahujúce Bandicoot aj ukážkový program zároveň. Po stiahnutí a rozbalení je okamžite k dispozícii spustiteľný súbor bandicoot, zdrojový kód ukážkového programu knihy.b a HTML súbor knihy.html.

Po spustení príkazu ./bandicoot sa zobrazia požadované vstupné argumenty. Bandicoot podporuje dva rôzne režimy spustenia: standalone a distributed. Pre účely tohto článku je dostačujúca verzia standalone, ktorá pre spustenie vyžaduje príkaz start a štyri vstupné argumenty:

  • p – port pre HTTP server
  • c – program napísaný v jazyku Bandicoot
  • d – adresár pre perzistenciu globálnych premenných
  • s – súbor, kam sa ukladajú kontrolné informácie o posledných verziách globálnych premenných

Pre spustenie ukážkovej aplikácie sú potrebné len dva kroky: (1) vytvoriť adresár na ukladanie dát a (2) spustiť Bandicoot s požadovanými parametrami:

$ mkdir volume/
$ ./bandicoot start -p 12345 -d volume/ -s volume/.state -c knihy.b 

V tomto momente už beží Bandicoot s programom knihy.b a po otvorení súboru knihy.html v internetovom prehliadači je možné začať pracovať s aplikáciou.

knihy.b

Súbor knihy.b definuje dátové typy, premenné a funkcie, ktoré slúžia na manipuláciu či kalkulácie s dátami. Tento súbor je načítaný pri štarte systému, ktorý si vytvorí potrebné interné štruktúry a sprístupní funkcie cez server HTTP. V úvode ukážkového programu je definovaný dátový typ, globálna premenná a jednoduchá funkcia:

 1 rel Kniha {
 2     titul: string,
 3     autor: string,
 4     rok: int,
 5     pocetStran: int,
 6     pocetSlov: int,
 7 }
 8
 9 knihy: Kniha;
10
11 fn Knihy(): Kniha
12 {
13     return knihy;
14 } 

Globálne premenné sú automaticky uložené na disk do adresára určeného argumentom -d pri spustení Bandicootu. Vo funkciách je možné používať aj lokálne premenné a vstupný argument. Všetky premenné sú reláciami a v každom kroku je zaručené odstránenie akýchkoľvek duplicitných záznamov. Telo funkcie sa skladá z výrazov zložených z relačných operátorov a operácie priradenia.

23 fn Pridat(k: Kniha): Kniha
24 {
25     duplicitne := k * knihy project(titul);
26     knihy += k - duplicitne;
27
28     return duplicitne;
29 } 

Účelom tejto funkcie je pridať nové knihy. Vstupný parameter k reprezentuje množinu nových kníh. Funkcia zároveň definuje aj výstupný parameter. Ten obsahuje duplicitné knihy, ktoré už sú v systéme uložené. Záznamy sa v tomto prípade porovnávajú cez atribút titul pomocou operácie join (riadok 25).

Bandicoot umožňuje definovať aj funkcie, ktoré nepracujú s globálnymi premennými. Tie umožňujú používanie relačnej algebry pre dáta, ktoré nie sú ukladané na disk. Program s takýmito funkciami môže byť integrovaný do existujúcich systémov (napríklad ako jednoduchý program pre manipuláciu a kalkuláciu údajov z log súborov vo formáte CSV). V ukážkovom programe existuje funkcia na počítanie štatistík o knihách, ktoré sú poskytnuté ako vstupný argument. Je zrejmé, že v tomto prípade spĺňa funkcia ilustratívny charakter:

36 fn StatistikaKnih(k: Kniha): rel {pocetKnih: int, pocetStran: int}
37 {
38     return k summary(pocetKnih = cnt(),
39                      pocetStran = add(pocetStran, 0));
40 } 

knihy.html

Súbor knihy.html implementuje jednoduché používateľské rozhranie v jazyku JavaScript. Okrem štandardných operácií na vypísanie, pridávanie, zmenu, a vymazávanie kníh poskytuje aj sumárne informácie o vybraných knihách. Pre zjednodušenie komunikácie s Bandicootom sú implementované pomocné objekty Rel, Head a funkcia call, ktoré sú dostupné aj ako samostatný JavaScript súbor.

Komunikácia medzi prehliadačom a Bandicootom prebieha pomocou objektu XMLHttpRequest. Nasledujúca funkcia call má definované tri vstupné argumenty, narába s objektom XMLHttpRequest, a zároveň vracia dáta na výstupe ako objekt Rel:

89 /* funkcia na zavolanie funkcie implementovanej v Bandicoote */
90 function call(type, service, data) {
91     var req = new XMLHttpRequest();
92     req.open(type, "http://localhost:12345/" + service, false);
93     if (data !== undefined)
94         req.send(data);
95     else
96         req.send(null);
97
98     if (req.status != 200)
99         throw "status: " + req.status;
100
101     if (req.responseText != "")
102         return new Rel(req.responseText);
103     else
104         return null;
105 } 

Vstupné argumenty môžu nadobúdať nasledovné hodnoty:

  • type – „GET“ alebo „POST“
  • service – meno funkcie, ktorá sa má vykonať
  • data – dáta vo formáte CSV (len v prípade ak ide o požiadavok POST)

Nasledujúca funkcia add pridáva novú knihu do systému volaním funkcie Pridat, implementovanej v súbore knihy.b:

177 /* jednoduché pridanie jednej knihy */
178 function add() {
179     var csv =
180         "titul:string,autor:string,rok:int,pocetStran:int,cena:real\n" +
181         $("title").value + "," +
182         $("author").value + "," +
183         $("year").value + "," +
184         $("pages").value + "," +
185         $("price").value + "\n";
186
187     // zavolanie metódy Pridat
188     var res = call("POST", "Pridat", csv);
189     if (res.count() == 1)
190         alert("Kniha " + $("title").value + " už existuje");
191     else
192         display();
193 } 

Na riadku 188 sa volá funkcia call kde dochádza ku komunikácii s Bandicootom. Premenná csv obsahuje novú knihu a premenná res reprezentuje výsledok volania, ktorý v prípade ak ide o duplicitnú knihu, obsahu práve jeden záznam.

MIF18 tip v článku témata

Záver

Bandicoot je nový open source projekt, ktorého cieľom je poskytnúť relačný model netradičným spôsobom. Je ľahko použiteľný pre malé aplikácie, ktoré je jednoducho integrovať vďaka rozhraniu HTTP a otvorenému formátu CSV. Tento článok ukazuje ako používať Bandicoot priamo z JavaScriptu. Ak má niekto záujem vyskúšať Bandicoot s Javou, tak mu môže byť nápomocná knižnica bandicoot-lib.

Samotný jazyk Bandicootu zatiaľ implementuje len základy. Do budúcna je v pláne niekoľko rozšírení, ako napríklad pridanie dodatočných operácií, definovanie vlastných relačných operátorov, vytváranie modulov a možnosť definovať rozsiahle relačné ”constrainty”. To všetko však závisí od toho ako veľmi tento projekt zaujme a či sa mu podarí vytvoriť si pole pôsobnosti v silnej konkurencii tradičných relačných databáz.

Našli jste v článku chybu?