| 2259 | } |
| 2260 | |
| 2261 | void appendStrings( |
| 2262 | const uint64_t* nulls, |
| 2263 | folly::Range<const vector_size_t*> rows, |
| 2264 | const StringView* views, |
| 2265 | VectorStream* stream, |
| 2266 | Scratch& scratch) { |
| 2267 | if (nulls == nullptr) { |
| 2268 | stream->appendLengths(nullptr, rows, rows.size(), [&](auto row) { |
| 2269 | return views[row].size(); |
| 2270 | }); |
| 2271 | for (auto i = 0; i < rows.size(); ++i) { |
| 2272 | const auto& view = views[rows[i]]; |
| 2273 | stream->values().appendStringView( |
| 2274 | std::string_view(view.data(), view.size())); |
| 2275 | } |
| 2276 | return; |
| 2277 | } |
| 2278 | |
| 2279 | ScratchPtr<vector_size_t, 64> nonNullHolder(scratch); |
| 2280 | auto* nonNull = nonNullHolder.get(rows.size()); |
| 2281 | const auto numNonNull = |
| 2282 | simd::indicesOfSetBits(nulls, 0, rows.size(), nonNull); |
| 2283 | stream->appendLengths( |
| 2284 | nulls, rows, numNonNull, [&](auto row) { return views[row].size(); }); |
| 2285 | for (auto i = 0; i < numNonNull; ++i) { |
| 2286 | auto& view = views[rows[nonNull[i]]]; |
| 2287 | stream->values().appendStringView( |
| 2288 | std::string_view(view.data(), view.size())); |
| 2289 | } |
| 2290 | } |
| 2291 | |
| 2292 | void appendTimestamps( |
| 2293 | const uint64_t* nulls, |
no test coverage detected