Oznámení
Lean Query (téměř v cíli)
před 5 lety
- Tharos
- Člen | 1042
Ahoj,
koho by to zajímalo, tak už se velmi rychle blíží do cíle (rozumějte do vydání první verze) knihovna Lean Query (Packagist).
Právě jsem dal na GitHub malé demo, které řeší toto zadání.
Knihovna umožňuje takovéto hezké vysokoúrovňové zápisy nad Lean Mapperem (tudíž nad dibi, kteří stále ještě mnozí Nette uživatelé preferují):
$query = $domainQueryFactory->createQuery()
->select('borrowing')
->from(Borrowing::class, 'borrowing')
->join('borrowing.book', 'book')
->join('book.author', 'a')
->orderBy('a.name');
// $query->select('book, a, borrower')
// ->join('borrowing.borrower', 'borrower');
return $query->getEntities();
Z cílové funkcionality chybí už jenom WHERE
klauzule,
kterou doplním, tipuji, příští týden.
Rád bych vypíchl tu zakomentovanou část, jejíž odkomentování
způsobí to, že se všechna potřebná data pro výpis v tom skriptu demo.php
získají jedním dotazem do databáze. Je to samozřejmě určitý extrém,
kvůli přenášení redundandních dat se nejedná o žádnou výhru, ale je
myslím příjemné, že se v Lean Query dá velejemně řídit, jaké dotazy a
jakým způsobem se ve výsledku data z databáze získají.
Celé je to ekvivalent Doktrínovského Query Builderu a DQL, které mi bylo velkou inspirací.
Mám s touhle nadstavbou velké plány, hned v pořadí jsou pak Query Objekty, které budou právě nad Lean Query postavené. Vítám jakoukoliv odezvu!
před 5 lety
- David Grudl
- Nette Core | 6806
Když programátor píše téměř v cíli, znamená to, že se blíží ke startovní čáře ;-)
před 5 lety
- Tharos
- Člen | 1042
Ty jo, to už je sedm let? Naprosto neuvěřitelný, jaká je dibi babička. :)
Btw, koukám, že už tenkrát jsi měl opravdový respekt :). To teda respekt! :)
před 5 lety
- David Grudl
- Nette Core | 6806
Váhal jsem, jestli je ten komentář myšlen ironicky nebo jsem si ho psal sám, ale jméno Inza vše vysvětluje ;-)
před 5 lety
- Tharos
- Člen | 1042
Ahoj,
tak Lean Query se před malou chvílí dočkal avízované podpory
WHERE
klauzule.
Moc se mi líbí, jak mocné je ve věci skládání restrikcí dibi, a proto jsem si dal za cíl co nejvíce z něj vytěžit.
Výsledek dopadl podle mě výborně, protože se mi, zdá se, povedlo
zachovat úplně všechny možnosti dibi (modifikátory, placeholdery…), jen
s tou vysokoúrovňovou nadstavbou. Takže WHERE
v Lean Query
můžete zapisovat přesně tak, jak jste zvyklí z dibi, jen názvy tabulek a
sloupců můžete nahradit za názvy aliasů entit a jejich položek.
Že je podporované leccos ukazuje toto volání, které vede k tomuto SQL.
Všimněte si, o jak triviální věc k implementaci vlastně
šlo. To celé díky skvěle navrženému DibiTranslator
:), na
který se může většina práce prostě předat. Ten můj kód fakticky jenom
zajišťuje drobný preprocessor, který nahradí potřebné aliasy za názvy
tabulek a property za sloupce (samozřejmě mimo zápisy v uvozovkách nebo
v navazovaných parametrech atp., není naivní).
Abych to nějak předvedl i zde, představte si následující zadání nad modelem z prvního příspěvku:
„Vypište všechny výpůjčky, názvy vypůjčených knih, názvy jejich autorů a jména lidí, kteří si je vypůjčili. Výpis seřaďte abecedně podle jmen autorů knih a také platí, že se chceme zabývat pouze těmi knihami, které mají jeden z tagů ebook nebo popular. Ve výpise u každé takové knihy vypište její tagy, ale pouze z vyjmenovaných, ostatní nás prostě nezajímají.“
Doménový dotaz by vypadal následovně:
$query = $domainQueryFactory->createQuery()
->select('borrowing')
->from(Borrowing::class, 'borrowing')
->join('borrowing.book', 'book')
->join('book.author', 'a')
->join('book.tags', 't')->select('t')
->where('t.name IN %in', ['ebook', 'popular'])
->orderBy('a.name');
return $query->getEntities();
A výpis snad už není zapotřebí ukazovat…
Jak možná tušíte, pokud budete chtít, vystačíte si opět s pouhým jedním jediným dotazem do databáze. :)
V plánu mám ještě doplnit
LIMIT
a OFFSET
a pak bych asi už vydal verzi
1.0. Po ní už bych funkcionalitu přidával podle potřeby
své a uživatelů… Sám bych ocenil asi ještě rozšíření restrikcí při
JOINech, ale to už jsou víceméně drobnosti, které nebude problém
doplnit.
O víkendu jsem také lehce zrefaktoroval vnitřnosti knihovny a ověřil, že je vše pokryté testy. Kód knihovny je krátký a v podstatě úplně triviální, troufale jej od začátku vnímám jako production ready. :)
Enjoy!
Editoval Tharos (9. 6. 2014 8:28)