Search
query.h
Vyhodnocování dotazů v databázových systémech často obnáší procházení velkého množství dat. Aby bylo vyhodnocování efektivní, databáze často odhadují jaká posloupnost operací vede k nejrychlejšímu výsledku. V této domácí úloze si zkusíte rozhodnout (a vyzkoušet), jaký přístup k vyhodnocení dotazů je nejvhodnější – při čemž se zaměříme na to, jak vyhodnocování dotazu co možná nejlépe paralelizovat.
Vaším úkolem bude vyhodnotit sadu dotazů na jednu tabulku. U každého dotazu bude Vaším úkolem rozhodnout, zda existuje alespoň jeden záznam v tabulce, pro který námi zadaná podmínka platí. My se Vás budeme ptát na pravdivostní hodnotu konjunkce (respektive disjunkce) těchto dílčích dotazů. V řeči SQL dotazů se tedy jedná (schématicky) o dotazy typu:
SELECT 1 WHERE EXISTS (SELECT * FROM data_table WHERE predicates[0](...)) AND EXISTS (SELECT * FROM data_table WHERE predicates[1](...)) AND EXISTS (SELECT * FROM data_table WHERE predicates[2](...)) AND ...
SELECT 1 WHERE EXISTS (SELECT * FROM data_table WHERE predicates[0](...)) OR EXISTS (SELECT * FROM data_table WHERE predicates[1](...)) OR EXISTS (SELECT * FROM data_table WHERE predicates[2](...)) OR ...
V případě, že chceme vyhodnocování takových dotazů paralelizovat, máme k dispozici dva základní dekompoziční přístupy:
exists select * from data_table where predicates[0](…)
Vaším úkolem bude zamyslet se nad tím, který z těchto přístupů bude vhodnější pro který typ dotazu za předpokladu, že konjunkce (respektive disjunkce) je pravdivá. Následující otázky Vám mohou pomoci tento problém vyřešit:
true
Vaším úkolem je doimplementovat těla metod is_satisfied_for_all a is_satisfied_for_any v souboru query.h. Tyto metody mají za úkol rozhodnout, zda konjunkce (respektive disjunkce) dílčích dotazů je splněná.
is_satisfied_for_all
is_satisfied_for_any