tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

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)