holubj / NiftyGrid

DataGrid for Nette Framework

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

DibiFluentDataSource - groupBy

Kryspin opened this issue · comments

Když použiji groupBy, tak je špatně zobrazen počet položek v záhlaví (grid-results). Může to někdo potvrdit?

Problém bude v DibiFluentDataSource - funkce getCount - není napsáno s uvažováním GROUP BY

Návrhuji změnit danou funkci na toto:

public function getCount($column = '*')
    {
        return $this->fluent->count();
    }

Nechápu proč je tam tato složitost?

public function getCount($column = '*')
    {
        $fluent = clone $this->fluent;
        $fluent->removeClause('SELECT')->removeClause('ORDER BY');

        $modifiers = \DibiFluent::$modifiers;
        \DibiFluent::$modifiers['SELECT'] = '%sql';
        $fluent->select(array('COUNT(%n)', $column));
        \DibiFluent::$modifiers = $modifiers;

        return $fluent->fetchSingle();
    }

Co myslíte?

Stejný problém je i u NDataSource. Mam takovej pocit, že před zrušením podpory aliasů to tam fungovalo, ale byly tam zase jiné problémy. Ovlivňuje to i paginator, kterej zobrazuje špatný počet stránek.

Edit: Dibi vyzkoušet nemůžu, ale zkusim něco vymyslet pro NDataSource

Edit2: Jaký to položí dotaz s tvojí změnou?

S touto úpravou to U mě paginator funguje, v záhlaví je také vše OK.

Dotaz do dibi od funkce getCount:

SELECT COUNT(*) 
FROM ( 
SELECT store.id, store.type, store.code, store.dater, store.description, store.invoicei, store.rate,
store.updated, SUM(store_row.quantity) AS sumquantity 
FROM `store` 
LEFT JOIN `store_row` ON store.id = store_row.store_id 
WHERE store.id > 0 
GROUP BY `store`.`id` 
ORDER BY `store`.`code` DESC ) AS `data`

1.803 ms

Původní (nekorektní GROUP BY):

SELECT COUNT(*) 
FROM `store` 
LEFT JOIN `store_row` ON store.id = store_row.store_id 
WHERE store.id > 0 
GROUP BY `store`.`id` 
LIMIT 1

0.773ms

Sice je to o něco náročnější, ale nevypouští to logiku původního dotazu.

Asi by chtělo vyjádření od autora milo.

@Kryspin Ta složitost je tam kvůli http://forum.dibiphp.com/cs/792-velky-problem-s-dibidatasource-a-mysql MySQL nepoužívám tak nevím, jestli tímhle neduhem stále trpí. Popřemýšlím...

Chová se to stejně. GROUP BY se sice aplikuje, ale nás nezajímá součet, který máš v cyklu:

    $count = 0;
    foreach ($fluent as $row) {
        $count += $row->count;
    }

    return $count;

ale toto:

    $count = 0;
    foreach ($fluent as $row) {
        $count += 1;
    }

    return $count;

Pak to funguje s GROUP BY. Ale když tam není GROUP BY, tak to vrací zase nesmyl (count je vždy 1) :o(

Tak jedině takto :o) Nebude to nějaké zpomalení?

    $count = 0;
    $countsimple = 0;
    foreach ($fluent as $row) {
        $countsimple += 1;
        $count = $row->count;
    }
    if ($countsimple > 1) {
        return $countsimple;
    } else {
        return $count;
    }

Pak už to šlape jak má.

Ano ... děkuji za čas. Teď to funguje na 100%.

Je otázka zda problém, který je starý 3 roky (viz tvůj odkaz) je stále platný v nových verzích MySQL.

Tak už to jen pullnout.