def __init__(self, query: Query, settings: RequestSettings,) -> None: # Clickhouse query structure # Referencing them here directly since it makes it easier # to process this query independently from the Clickhouse Query # and there is no risk in doing so since they are immutable. self.__selected_columns = query.get_selected_columns_from_ast() self.__condition = query.get_condition_from_ast() self.__groupby = query.get_groupby_from_ast() self.__having = query.get_having_from_ast() self.__orderby = query.get_orderby_from_ast() self.__data_source = query.get_data_source() self.__arrayjoin = query.get_arrayjoin_from_ast() self.__granularity = query.get_granularity() self.__limit = query.get_limit() self.__limitby = query.get_limitby() self.__offset = query.get_offset() if self.__having: assert self.__groupby, "found HAVING clause with no GROUP BY" self.__turbo = settings.get_turbo() self.__final = query.get_final() self.__sample = query.get_sample() self.__hastotals = query.has_totals() self.__prewhere = query.get_prewhere_ast() self.__settings = settings self.__sql_data_list: Optional[Sequence[Tuple[str, str]]] = None self.__formatted_query: Optional[str] = None self.__sql_data: Optional[Mapping[str, str]] = None
def process_query(self, query: Query, request_settings: RequestSettings) -> None: missing_checkers = {checker for checker in self.__condition_checkers} def inspect_expression(condition: Expression) -> None: top_level = get_first_level_and_conditions(condition) for condition in top_level: for checker in self.__condition_checkers: if checker in missing_checkers: if checker.check(condition): missing_checkers.remove(checker) condition = query.get_condition() if condition is not None: inspect_expression(condition) prewhere = query.get_prewhere_ast() if prewhere is not None: inspect_expression(prewhere) missing_ids = {checker.get_id() for checker in missing_checkers} if get_config("mandatory_condition_enforce", 0): assert ( not missing_checkers ), f"Missing mandatory columns in query. Missing {missing_ids}" else: if missing_checkers: logger.error( "Query is missing mandatory columns", extra={"missing_checkers": missing_ids}, )
def process_query(self, query: Query, request_settings: RequestSettings) -> None: condition = query.get_condition_from_ast() if condition: query.set_ast_condition(condition.transform(self.process_condition)) prewhere = query.get_prewhere_ast() if prewhere: query.set_prewhere_ast_condition(prewhere.transform(self.process_condition)) if self.formatted: metrics.increment("query_processed", tags={"type": self.formatted})