| 187 | |
| 188 | |
| 189 | void IBlockInputStream::updateExtremes(Block & block) |
| 190 | { |
| 191 | size_t num_columns = block.columns(); |
| 192 | |
| 193 | if (!extremes) |
| 194 | { |
| 195 | MutableColumns extremes_columns(num_columns); |
| 196 | |
| 197 | for (size_t i = 0; i < num_columns; ++i) |
| 198 | { |
| 199 | const ColumnPtr & src = block.safeGetByPosition(i).column; |
| 200 | |
| 201 | if (isColumnConst(*src)) |
| 202 | { |
| 203 | /// Equal min and max. |
| 204 | extremes_columns[i] = src->cloneResized(2); |
| 205 | } |
| 206 | else |
| 207 | { |
| 208 | Field min_value; |
| 209 | Field max_value; |
| 210 | |
| 211 | src->getExtremes(min_value, max_value); |
| 212 | |
| 213 | extremes_columns[i] = src->cloneEmpty(); |
| 214 | |
| 215 | extremes_columns[i]->insert(min_value); |
| 216 | extremes_columns[i]->insert(max_value); |
| 217 | } |
| 218 | } |
| 219 | |
| 220 | extremes = block.cloneWithColumns(std::move(extremes_columns)); |
| 221 | } |
| 222 | else |
| 223 | { |
| 224 | for (size_t i = 0; i < num_columns; ++i) |
| 225 | { |
| 226 | ColumnPtr & old_extremes = extremes.safeGetByPosition(i).column; |
| 227 | |
| 228 | if (isColumnConst(*old_extremes)) |
| 229 | continue; |
| 230 | |
| 231 | Field min_value = (*old_extremes)[0]; |
| 232 | Field max_value = (*old_extremes)[1]; |
| 233 | |
| 234 | Field cur_min_value; |
| 235 | Field cur_max_value; |
| 236 | |
| 237 | block.safeGetByPosition(i).column->getExtremes(cur_min_value, cur_max_value); |
| 238 | |
| 239 | if (cur_min_value < min_value) |
| 240 | min_value = cur_min_value; |
| 241 | if (cur_max_value > max_value) |
| 242 | max_value = cur_max_value; |
| 243 | |
| 244 | MutableColumnPtr new_extremes = old_extremes->cloneEmpty(); |
| 245 | |
| 246 | new_extremes->insert(min_value); |
nothing calls this directly
no test coverage detected