FriendsOfDoctrine / dbal-clickhouse

Doctrine DBAL driver for ClickHouse database
GNU General Public License v3.0
98 stars 80 forks source link

add totals #24

Open rumours86 opened 5 years ago

rumours86 commented 5 years ago

The "totals" may be not needed at results. It must be manipulated by input parameter. An extra data like additional "totals" entry can destroy existing applications.

I thought about it, but I have no idea how not to break existing applications and add total output

And it should not break anything, unless someone uses a query with "WITH TOTALS", but why use it if it cannot be displayed?

stanislav-reshetnev commented 5 years ago

I thought about it, but I have no idea how not to break existing applications and add total output

I added getTotals() method for the replaced vendor's class for it in my application:

    public function getTotals(): array
    {
        return $this->_client_statement->totals();
    }
rumours86 commented 5 years ago

I thought about it, but I have no idea how not to break existing applications and add total output

I added getTotals() method for the replaced vendor's class for it in my application:

    public function getTotals(): array
    {
        return $this->_client_statement->totals();
    }

how i can use this in controller or template or pager ?

stanislav-reshetnev commented 5 years ago

how i can use this in controller or template or pager ?

Here is using in my Symfony service:

        /** @var ClickhouseConnection $conn */
        $conn = $this->_doctrine_manager->getConnection('clickhouse');

        $q = $conn->createQueryBuilder();
// ...
        /** @var \App\VendorReplace\ClickhouseStatement $clickhouse_stmt */
        $clickhouse_stmt = $q->execute();
        $totals = $clickhouse_stmt->getTotals();

I do not use database access in controllers or templates.

rumours86 commented 5 years ago

okay

yapro commented 4 years ago

My solution:

/**@var \FOD\DBALClickHouse\Connection $conn */
$olapConnection = $this->_doctrine_manager->getConnection('clickhouse');
$clickHouseConnection = $olapConnection->getWrappedConnection();
$class = new \ReflectionClass($clickHouseConnection);
$property = $class->getProperty('smi2CHClient');
$property->setAccessible(true);
/** @var \ClickHouseDB\Client $client */
$client = $property->getValue($clickHouseConnection);
$params = ['field3' => 'value'];
$statement = $client->select('SELECT field1, COUNT(*) AS field2 FROM table1 WHERE field3 = :field3 GROUP BY field1 LIMIT 5, 10', $params);
$statement->rows(); // get rows by LIMIT 
$statement->countAll(); // Count all rows (like LIMIT not using) - for implementation my pagination

Details in the documentation https://github.com/smi2/phpClickHouse#start