def _format_query_body(query: Query) -> Mapping[str, Any]: expression_formatter = TracingExpressionFormatter() formatted = { "SELECT": [[e.name, e.expression.accept(expression_formatter)] for e in query.get_selected_columns_from_ast()], "GROUPBY": [e.accept(expression_formatter) for e in query.get_groupby_from_ast()], "ORDERBY": [[e.expression.accept(expression_formatter), e.direction] for e in query.get_orderby_from_ast()], } array_join = query.get_arrayjoin_from_ast() if array_join: formatted["ARRAYJOIN"] = array_join.accept(expression_formatter) condition = query.get_condition_from_ast() if condition: formatted["WHERE"] = condition.accept(expression_formatter) having = query.get_having_from_ast() if having: formatted["HAVING"] = having.accept(expression_formatter) limitby = query.get_limitby() if limitby: formatted["LIMITBY"] = { "LIMIT": limitby.limit, "BY": limitby.expression.accept(expression_formatter), } limit = query.get_limit() if limit: formatted["LIMIT"] = limit offset = query.get_offset() if offset: formatted["OFFSET"] = offset return formatted
def _format_groupby( query: AbstractQuery, formatter: ClickhouseExpressionFormatter) -> Optional[StringNode]: group_clause: Optional[StringNode] = None ast_groupby = query.get_groupby_from_ast() if ast_groupby: groupby_expressions = [e.accept(formatter) for e in ast_groupby] group_clause_str = f"{', '.join(groupby_expressions)}" if query.has_totals(): group_clause_str = f"{group_clause_str} WITH TOTALS" group_clause = StringNode(f"GROUP BY {group_clause_str}") return group_clause