DibiFluentDataSource - groupBy
Kryspin opened this issue · 10 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...
Můžete, prosím, vyzkoušet https://raw.github.com/milo/NiftyGrid/fix-count/DataSource/DibiFluentDataSource.php?
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á.
Zkus ještě jednou https://raw.github.com/milo/NiftyGrid/fix-count/DataSource/DibiFluentDataSource.php, upravil jsem.
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.