| 147 | } |
| 148 | |
| 149 | static PrettyColumnName formatFilterPretty( |
| 150 | const ActionsDAG & dag, |
| 151 | const String & column_name, |
| 152 | const std::unordered_map<String, PrettyColumnName> & pretty_names, |
| 153 | const std::unordered_map<String, RuntimeFilterInfo> & runtime_filter_names, |
| 154 | std::unordered_map<FutureSet::Hash, String, PreparedSets::Hashing> & subquery_set_names) |
| 155 | { |
| 156 | const auto * root = dag.tryFindInOutputs(column_name); |
| 157 | if (!root) |
| 158 | return PrettyColumnName(trimColumnIdentifier(column_name)); |
| 159 | |
| 160 | auto atoms = ActionsDAG::extractConjunctionAtoms(root); |
| 161 | |
| 162 | std::vector<String> user_parts; |
| 163 | std::vector<String> rf_parts; |
| 164 | for (const auto * atom : atoms) |
| 165 | { |
| 166 | if (atom->type == ActionsDAG::ActionType::FUNCTION |
| 167 | && atom->function_base |
| 168 | && atom->function_base->getName() == "__applyFilter") |
| 169 | rf_parts.push_back(formatNodePretty(atom, pretty_names, runtime_filter_names, subquery_set_names, 4)); |
| 170 | else |
| 171 | user_parts.push_back(formatNodePretty(atom, pretty_names, runtime_filter_names, subquery_set_names, 4)); |
| 172 | } |
| 173 | |
| 174 | String expression; |
| 175 | if (!user_parts.empty()) |
| 176 | expression = fmt::format(" {}", fmt::join(user_parts, " AND ")); |
| 177 | if (expression.empty() && rf_parts.empty()) |
| 178 | expression = fmt::format(" {}", trimColumnIdentifier(column_name)); |
| 179 | |
| 180 | String annotation; |
| 181 | if (!rf_parts.empty()) |
| 182 | annotation = fmt::format("Runtime filters: {}", fmt::join(rf_parts, " AND ")); |
| 183 | |
| 184 | return {std::move(expression), std::move(annotation)}; |
| 185 | } |
| 186 | |
| 187 | namespace |
| 188 | { |
no test coverage detected