A Tutorial Advances in query languages for similarity-based databases George J. Klir Petr Krajča State University of New York (SUNY) Binghamton, New York 13902, USA gklir@binghamton.edu Palacky University, Olomouc, Czech Republic prepared for International Centre for Information and Uncertainty, Palacky University, Olomouc!!!! Krajča P. (DAMOL) RESIQL 8. 11. 2012 1 / 16
RESIQL 1 RESIQL: relační databázový systém implementace relačního databázového modelu navrženého RB a VV platforma pro další výzkum (algoritmy, závislosti,... ) ověřování vlasností databázového modelu implementace v Javě... 2 RESIQL: jazyk dotazovací jazyk pro relační databázový systém RESIQL částečně kompatibilní s SQL (výrazná inspirace Tutorial D) některé části SQL zavrženy (např. SELECT) Krajča P. (DAMOL) RESIQL 8. 11. 2012 2 / 16
Životní cyklus dotazu I. RESIQL: klient uživatelské rozhraní na první pohled,,hloupá Swing-ová aplikace, která ale umí: 1 zpracovat vstup od uživatele a vypsat výsledek (vše lze volitelně zformátovat jako text nebo LaTex) 2 syntax-highlighting 3 nápověda kódu 4 práce s historíı ala BASH (historie příkazů uložena přímo v RESIQL) 5 umí poradit s opravou některých chyb 6... (řada dalších nedokumentovaných vlasností) Krajča P. (DAMOL) RESIQL 8. 11. 2012 3 / 16
Parser konverze vstupu do syntaktického stromu využívá se knihovna ANTLR (+ možnost přepisovat AST) CREATE TABLE foo (a int, b int); STATEMENTS TABLE ACTION CREATE NAME foo TABLE COLUMNS a int b int příkaz se vztahuje k tabulkám příkaz vytvoř tabulku jméno tabulky seznam sloupců jméno sloupce typ sloupce, popř. další vlastnosti Krajča P. (DAMOL) RESIQL 8. 11. 2012 4 / 16
Front End konverze syntaktického stromu do objektů (typicky POJO) třída QLCompiler podle typu objektu a názvu akce volá konverzní metodu objekty mají strukturu: public class CreateTableCommand extends GenericCommand { private String tablename; private List<ColumnDefinition> columns; private List<String> primarykey;... public static final class ColumnDefinition { private String columnname; private String domain;... Krajča P. (DAMOL) RESIQL 8. 11. 2012 5 / 16
...konečně Akce předchozí objekt de facto popisuje, co se má s databází dělat v dalším kroce je objekt převeden na objekt provádějící danou akci oddělení těchto dvou kroků umožňuje některé operace zaměňovat (např. SET a DELETE) každá akce dědí ze třídy QLStatement public abstract class QLStatement implements Closeable { } // otestuje, jestli daný příkaz je možno provést protected void check(integritycheck check) { } // vrací popis problémů, které se vyskytly public List<String> getknownissues() {... } // provede daný příkaz public abstract QLResult invoke() throws BadRequestException; Krajča P. (DAMOL) RESIQL 8. 11. 2012 6 / 16
Manipulace s databází veškeré perzistentní informace (tabulky, indexy, definice pohledů, operátorů,... ) jsou uloženy stejně jako uživatelská data všechny tyto objekty spravuje třída Database pro každý typ objektu existuje samostastný Manager TableManager IndexManager ViewManager OperatorManager... přes tyto objekty probíhají všechny operace s databazí společné rozhraní, řeší závislosti mezi objekty,... komunikuje přímo se storage enginem, který se stará o uložení dat Krajča P. (DAMOL) RESIQL 8. 11. 2012 7 / 16
Storage engine BerkeleyDB Java Edition key-value store obstarává čistě uložení dat do tabulek + indexy vyhledávání v datech s pomocí B-stromů zajistění transakcí potenciálně nahraditelné něčím jiným (InnoDB, Falcon, JDBC databáze,... ) Krajča P. (DAMOL) RESIQL 8. 11. 2012 8 / 16
Životní cyklus dotazu II. RETRIEVE foo WHERE bar < 10; STATEMENTS RETRIEVE WHERE foo < bar 10 příkaz výraz první fáze zpracování dotazu identická jako v prvním případě odlišný je způsob zpracování výrazu (zásadní část RESIQL) Krajča P. (DAMOL) RESIQL 8. 11. 2012 9 / 16
Kompilace výrazů Aforismus (Greenspun s tenth rule of programming) Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp. syntaktický strom je převeden na strom objektů (instancí třídy AbstractOperator), např. WhereOperator Variable (foo) IntegerComparisonOperator (<) Variable (bar) Constant (10) každý objekt obsahuje: metody pro vyhodnocení výrazu informace vztahující se k typům dat (popř. souvisejícímu kontextu) metody pro další transformace Krajča P. (DAMOL) RESIQL 8. 11. 2012 10 / 16
Kompilace výrazů Aforismus (Greenspun s tenth rule of programming) Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp. syntaktický strom je převeden na strom objektů (instancí třídy AbstractOperator), např. WhereOperator Variable (foo) IntegerComparisonOperator (<) Variable (bar) Constant (10) každý objekt obsahuje: metody pro vyhodnocení výrazu informace vztahující se k typům dat (popř. souvisejícímu kontextu) metody pro další transformace Krajča P. (DAMOL) RESIQL 8. 11. 2012 10 / 16
Kompilace výrazů Aforismus (Greenspun s tenth rule of programming) Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp. syntaktický strom je převeden na strom objektů (instancí třídy AbstractOperator), např. WhereOperator Variable (foo) IntegerComparisonOperator (<) Variable (bar) Constant (10) každý objekt obsahuje: metody pro vyhodnocení výrazu informace vztahující se k typům dat (popř. souvisejícímu kontextu) metody pro další transformace Krajča P. (DAMOL) RESIQL 8. 11. 2012 10 / 16
Vyhodnocení výrazů nejdřív vyhodnocení výrazů v potomcích skalární objekty se vyhodnocují na odpovídající,,javovské objekty relační výrazy se vyhodnocují na Cursor: public interface Cursor extends Closeable { public boolean first() throws BadRequestException; public boolean next() throws BadRequestException; public Tuple fetch() throws BadRequestException;... } relační operátory zpracovávají data po řádcích (pokud je to možné) relační operátory vytváří prostředí, ve kterých jsou vyhodnocovány další výrazy (např. podmínka operátoru WHERE) v tomto prostředí jsou na symboly (odpovídájící sloupcům tabulky) navázany hodnoty z daného řádku Krajča P. (DAMOL) RESIQL 8. 11. 2012 11 / 16
Optimalizace (1/2) před vyhodnocením výrazu se provedou optimalizace transformace stromu objektů (AbstractOperator) na ekvivalentní aplikace algebraických zákonů (včetně částečného vyhodnocení podvýrazů) použití operátorů, které nemají ekvivalentní protějšek v jazyce RESIQL (např. využití indexů) sada pravidel pro přepisování pattern matching: DSL založený na Fluent interface (vláčcích) jednoduchý,,jazyk (přímo v Javě) schopný popsat základní vzory využívá čistě volání metod a anonymních tříd Krajča P. (DAMOL) RESIQL 8. 11. 2012 12 / 16
Optimalizace: příklady odstranění dvojího WHERE: foo WHERE bar WHERE baz = foo WHERE bar baz if (StructureCheck.check(operator).isInstanceOf(WhereOperator.class).itsArg(0).isInstanceOf(WhereOperator.class).test()) {... } eliminace neutrálního prvku (např. 0 + x = x) if (StructureCheck.check(operator).isInstanceOf(IntegerOperator.class).isToken(QLLexer.PLUS).itsArg(0).isEqual(ZERO INT).test()) return operator.getarg(1); Krajča P. (DAMOL) RESIQL 8. 11. 2012 13 / 16
Optimalizace: Indexy a podobnostní dotazy (1/2) Definition Podobnost y nad doménou D y je monotonní vzhledem k ostrému lineárnímu uspořádní na množině D y, pokud pro všechny prvky u, v, w D y platí právě když w v u nebo u v w. u D w u D v (1) běžně se podobnost odvozuje ze vzdálenosti hodnot s použitím antitonního škálovaní taková podobnost je monotonní pokud doména je restrikcí R, pak odpovídá < Krajča P. (DAMOL) RESIQL 8. 11. 2012 14 / 16
Optimalizace: Indexy a podobnostní dotazy (2/2) Pokud máme index (založený na B-stromu) nad sloupci y 1,..., y n, hodnoty c 1 D y1,..., c n D yn, monotonní operátor yn, pak lze efektivně získat řádky s nejvyššími ranky pro dotazy: Nástin algoritmu (y 1 = c 1 ) (y n 1 = c n 1 ) (y n yn c n ). (2) 1 dva kurzory jeden pohybující se vpřed a druhý vzad 2 na počátku jsou oba kurzory nastaveny na řádek splňující podmínku y 1 = c 1,..., y n 1 = c n 1, and y n = c n (nebo nejbližšího souseda) 3 kurzor pohybující se vzad se posune o jeden řádek zpět 4 podmínka (2) je vyhodnocena pro řádky, na které ukazují oba kurzory 5 řádek s vyšším rankem je vrácen a daný kurzor se posune o jeden řádek v daném směru algoritmus lze zobecnit pro operátory <,,, between.... Krajča P. (DAMOL) RESIQL 8. 11. 2012 15 / 16
Optimalizace: Indexy a podobnostní dotazy (2/2) Pokud máme index (založený na B-stromu) nad sloupci y 1,..., y n, hodnoty c 1 D y1,..., c n D yn, monotonní operátor yn, pak lze efektivně získat řádky s nejvyššími ranky pro dotazy: Nástin algoritmu (y 1 = c 1 ) (y n 1 = c n 1 ) (y n yn c n ). (2) 1 dva kurzory jeden pohybující se vpřed a druhý vzad 2 na počátku jsou oba kurzory nastaveny na řádek splňující podmínku y 1 = c 1,..., y n 1 = c n 1, and y n = c n (nebo nejbližšího souseda) 3 kurzor pohybující se vzad se posune o jeden řádek zpět 4 podmínka (2) je vyhodnocena pro řádky, na které ukazují oba kurzory 5 řádek s vyšším rankem je vrácen a daný kurzor se posune o jeden řádek v daném směru algoritmus lze zobecnit pro operátory <,,, between.... Krajča P. (DAMOL) RESIQL 8. 11. 2012 15 / 16
Přehled rozsahem menší až středně velký projekt přibližně rok práce na částečný úvazek použité knihovny: BDB JE, ANTLR, Guava, Log4J RESIQL: RDBMS + klient Počet tříd: cca 164 Počet řádků kódu: cca 13 tis. Integrační testy Počet testů: 83 Počet řádků kódu: cca 2 tis. Krajča P. (DAMOL) RESIQL 8. 11. 2012 16 / 16