Извиняюсь, не вполне аккуратно сформулировал: речь об обходе по этому самому AST. Внутри пакета это делают классы для обработки параметров и для построения SQL, в документации нарисовано, как можно получить, например, список всех таблиц, участвующих в запросе: https://github.com/sad-spirit/pg-builder/wiki/walkersОбход по дереву - задача, про которую много пишут, но в реальности мне за 15 лет она встречалась раз или два. Даже в ecommerce с каталогом в виде дерева работать не приходится - или выводишь все категории списком, или работаешь с одной.
Ну я врать не буду, большую часть времени он и используется как обычный. :-D Правда в плюс к этому обычному идёт автоматическая проверка синтаксиса.@Sad Spirit, прошло несколько лет, расскажи об опыте использования и юзкейсах на практике.
Я к тому, что штука клевая и проделана огромная работа, но я вот почти не вижу кейсов, когда классического write only билдера было бы недостаточно. Ну, то есть, я могу их специально придумать, но на практике не припоминаю.
Что не очень получится сделать с обычным:
- Замена именованных параметров на нумерованные + получение типов параметров непосредственно из запроса. Первое теоретически делает и PDO, но там изрядно много "но". Второе для Postgres'а очень удобно для написания условий вида foo = anyfoo::integer[]), где параметр передаётся в виде массива.
- Стартуем с текстового представления большого запроса, потом добавляем к нему кусочки в тот же WHERE.
- При добавлении куска запроса проверяем, имеет ли запрос вид "SELECT count(*)"
- Можно проверить, где конкретная таблица во FROM и сделать с ней JOIN. Или просто не добавлять её второй раз, если уже есть.
Ну и парсер отдельно можно использовать, например, для разбора определений VIEW --- они лежат как раз в виде запросов в системных каталогах.
Возможен, кстати, и подход, где товарищи решили не париться и для парсинга запросов Postgres'а подтащить сам парсер Postgres'а: https://github.com/lfittl/libpg_query Но тут проблема в том, что получается парсить запросы целиком, а куски уже не очень.
Ну и щас я смотрю, даже обычные Query Builder'ы дрейфуют в сторону чего-то похожего на AST, тот же Zend\Db\Sql