Hlavní navigace

Bandicoot a webové aplikácie

Július Chrobák 30. 6. 2011

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.

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.

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?

30. 6. 2011 23:53

BostX (neregistrovaný)

Napisat clanok kde sa s kodom copy-pastuju aj cisla riadkov, to si zasluzi polamat klavesnicu o hlavu.

Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed

Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

Lupa.cz: Slevové šílenství je tu. Kde nakoupit na Black Friday?

Slevové šílenství je tu. Kde nakoupit na Black Friday?

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

120na80.cz: Bojíte se encefalitidy?

Bojíte se encefalitidy?

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

120na80.cz: Jak oddálit Alzheimera?

Jak oddálit Alzheimera?

Lupa.cz: UX přestává pro firmy být magie

UX přestává pro firmy být magie

DigiZone.cz: NG natáčí v Praze seriál o Einsteinovi

NG natáčí v Praze seriál o Einsteinovi

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Podnikatel.cz: Na poslední chvíli šokuje vyjímkami v EET

Na poslední chvíli šokuje vyjímkami v EET

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

DigiZone.cz: ČT má dalšího zástupce v EBU

ČT má dalšího zástupce v EBU

Lupa.cz: Babiš: E-shopů se EET možná nebude týkat

Babiš: E-shopů se EET možná nebude týkat

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí