kak-clickhouse
kak-clickhouse copied to clipboard
Добавить нормальную реализацию join для КХ для QueryBuilder
К текущему 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]
А не вариант изменить текущий join под данный запрос?
В QueryBuilder весь текущий запрос поместить в секцию 'FROM'. Функцию buildJoin научить принимать не [[table, type, condition], [...], ...]
, а [Query, type, usingCondition]
.
И еще понадобится изменить саму функцию join, добавив входной параметр select, ибо кликхаус сам не умеет получать ВСЕ сгенерированные столбцы подзапросов и их придется указывать вручную.
В итоге будет чуть сложнее в использовании, но и плюсы есть. В clickhouse на одном уровне возможен только один join, а с такой реализацией если мы будем джоинить несколько запросов, то они будут вложенные друг в друга. Мне такой подход пригодился.
для php5.6 можно в рамках наследования от какого-то класса добавить или сделать меньше параметров на метод можно, а вот для тех, кто использует php7+ это будет ошибка.
несколько решений есть - это или полностью уходить от наследования от базового yii\db\QueryBuilder на собственную реализацию
делать сколько-же параметров что и в наследнике (ваш вариант) или сделать отдельные методы.
У самого php7.0.22, сделал отдельной функцией. Думаю можно и переопределить готовую оставив столько-же параметров, а от идеи с select в параметрах можно отказаться оставив возможность самому вручную уже после join прописывать select.
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)
а так хочется параметры переименовать)