| 118 | } |
| 119 | |
| 120 | static void selectFirstMatchForEachKey(const IColumn::Offsets & offsets, MutableColumns & columns, NullMap & null_map) |
| 121 | { |
| 122 | size_t total_rows = offsets.back(); |
| 123 | IColumn::Filter filter(total_rows, 0); |
| 124 | NullMap filtered_null_map(offsets.size(), 0); |
| 125 | |
| 126 | size_t offset = 0; |
| 127 | for (size_t i = 0; i < offsets.size(); ++i) |
| 128 | { |
| 129 | size_t n = offsets[i] - offsets[i - 1]; |
| 130 | if (n == 0) |
| 131 | continue; |
| 132 | filtered_null_map[i] = null_map[offset]; |
| 133 | filter[offset] = 1; |
| 134 | offset += n; |
| 135 | } |
| 136 | |
| 137 | for (auto && col : columns) |
| 138 | col = IColumn::mutate(col->filter(filter, offsets.size())); |
| 139 | null_map = std::move(filtered_null_map); |
| 140 | } |
| 141 | |
| 142 | JoinResultPtr DirectKeyValueJoin::joinBlock(Block block) |
| 143 | { |