sanchezzzhak / kak-clickhouse

Yii2 ext. ClickHouse
69 stars 43 forks source link

Добавить нормальную реализацию join для КХ для QueryBuilder #21

Open sanchezzzhak opened 6 years ago

sanchezzzhak commented 6 years ago

К текущему join сделать ExeptionNotSupport так как структура запроса не работоспособная, ждем улучшения со стороны яндекса может они допилят работу join до стандарта

новый join будет работать согласно спецификации (по другому не умеет)

SELECT
    CounterID,
    hits,
    visits
FROM
(
    SELECT
        CounterID,
        count() AS hits
    FROM test.hits
    GROUP BY CounterID
) ANY LEFT JOIN
(
    SELECT
        CounterID,
        sum(Sign) AS visits
    FROM test.visits
    GROUP BY CounterID
) USING CounterID
ORDER BY hits DESC
LIMIT 10

Создадим 2 метода using($columns) где $columns - это строка или массив колонк queryJoin($type, $query) где $type [GLOBAL] ANY|ALL INNER|LEFT [OUTER]

navel commented 6 years ago

А не вариант изменить текущий join под данный запрос? В QueryBuilder весь текущий запрос поместить в секцию 'FROM'. Функцию buildJoin научить принимать не [[table, type, condition], [...], ...], а [Query, type, usingCondition]. И еще понадобится изменить саму функцию join, добавив входной параметр select, ибо кликхаус сам не умеет получать ВСЕ сгенерированные столбцы подзапросов и их придется указывать вручную.

В итоге будет чуть сложнее в использовании, но и плюсы есть. В clickhouse на одном уровне возможен только один join, а с такой реализацией если мы будем джоинить несколько запросов, то они будут вложенные друг в друга. Мне такой подход пригодился.

sanchezzzhak commented 6 years ago

для php5.6 можно в рамках наследования от какого-то класса добавить или сделать меньше параметров на метод можно, а вот для тех, кто использует php7+ это будет ошибка.

несколько решений есть - это или полностью уходить от наследования от базового yii\db\QueryBuilder на собственную реализацию

делать сколько-же параметров что и в наследнике (ваш вариант) или сделать отдельные методы.

navel commented 6 years ago

У самого php7.0.22, сделал отдельной функцией. Думаю можно и переопределить готовую оставив столько-же параметров, а от идеи с select в параметрах можно отказаться оставив возможность самому вручную уже после join прописывать select.

sanchezzzhak commented 6 years ago

select хочется автоматизировать, брать все включая using, а если задан select то использовать только его)

у меня ошибку выдает =)

Declaration of kak\clickhouse\Query::join($type, $query, $using, $params = Array) should be compatible with yii\db\Query::join($type, $table, $on = '', $params = Array)

а так хочется параметры переименовать)