Tharos / LeanQuery

www.leanmapper.com
MIT License
6 stars 5 forks source link

\LeanQuery\DomainQuery nepozna limit / offset #4

Open achtan opened 10 years ago

Tharos commented 10 years ago

Vím o tom. Jde o první věc, kterou budu implementovat v týdnu od 14. července, až se vrátím z dovči. :)

pitlord commented 10 years ago

Jak to vypadá prosím s podporou limit / offset? Dost by mi to pomohlo, nenapadá mne, jak bez limitu řešit stránkování.

achtan commented 10 years ago

no zatial asi len tak ze si limit spravis v php, ale zamozrejme to nieje spravne riesenie

pitlord commented 10 years ago

Přidal jsem si do DomainQuery.php dvě metody:

        public function limit($limit)
    {
        $this->cleanCache();

        $this->clauses->limit = $limit;
        return $this;
    }

    public function offset($offset)
    {
        $this->cleanCache();

        $this->clauses->offset = $offset;
        return $this;
    }

A upravil metodu

    public function getEntities()
    {
        if ($this->entities === NULL) {
            $entities = array();
            $entityClass = $this->clauses->from['entityClass'];
            $result = $this->getResult($this->clauses->from['alias']);

            $i = 0;
            $limitIterator = 0;
            foreach ($result as $key => $row) {
                if(($i >= $this->clauses->offset and $limitIterator < $this->clauses->limit) or $this->clauses->limit == 0){
                    $entities[] = $entity = $this->entityFactory->createEntity($entityClass, new Row($result, $key));
                    $entity->makeAlive($this->entityFactory, $this->connection, $this->mapper);
                    $limitIterator++;
                }

                $i++;
            }
            $this->entities = $this->entityFactory->createCollection($entities);
        }
        return $this->entities;
    }

Takže limit a offset používat můžu, ale je to podle mého hodně dirty řešení.

Tharos commented 10 years ago

Ahoj,

důvod, proč jsem se k implementaci nakonec nedostal je, že u projektu, na kterém jsem chtěl Lean Query použít a ve které bych určitě řazení a limitování potřeboval, jsem po důkladném zvážení nakonec zjistil, že na něm Lean Query vyloženě nepotřebuji a vystačím si se samotným Lean Mapperem.

Implementace na úrovni SQL skýtá jednu záludnost. Jakmile k hlavní tabulce (té z klauzule FROM) připojíte nějakou odkazující tabulku (například FROM author JOIN book ON author.id = book.author_id), nelze LIMIT v SQL použít, respektive to nedává smysl.

Robustní implementace by si měla hlídat, kdy je na doménový dotaz možné ještě aplikovat SQL limit/offset a kdy už není. Co dělat ve druhém případě? Nepovolit limit/offset aplikovat? A vyhodit ho z dotazu, pokud už nastaven byl? Anebo by ho to mělo převést na nějakou in-memory variantu? To ale může být velká výkonnostní past…