| 914 | } |
| 915 | |
| 916 | void exportViews( |
| 917 | const FlatVector<StringView>& vec, |
| 918 | const Selection& rows, |
| 919 | const ArrowOptions& options, |
| 920 | ArrowArray& out, |
| 921 | memory::MemoryPool* pool, |
| 922 | BoltToArrowBridgeHolder& holder) { |
| 923 | auto stringBuffers = vec.stringBuffers(); |
| 924 | size_t numStringBuffers = stringBuffers.size(); |
| 925 | size_t nonInlineCnt = 0, scanned = 0; |
| 926 | rows.apply([&](vector_size_t i) { |
| 927 | ++scanned; |
| 928 | if (!vec.isNullAt(i) && !vec.valueAtFast(i).isInline()) |
| 929 | ++nonInlineCnt; |
| 930 | }); |
| 931 | bool rebuiltFallback = false; |
| 932 | std::vector<uint64_t> fbOffsets; |
| 933 | BufferPtr fbBuf; |
| 934 | constexpr uint64_t kNoOffset = ~uint64_t{0}; |
| 935 | |
| 936 | if (nonInlineCnt > 0 && numStringBuffers == 0 && options.exportToArrowIPC) { |
| 937 | LOG(ERROR) << "[exportViews] non-inline strings but stringBuffers empty!"; |
| 938 | std::vector<uint64_t> fbOffsets; |
| 939 | BufferPtr fbBuf; |
| 940 | constexpr uint64_t kNoOffset = ~uint64_t{0}; |
| 941 | |
| 942 | if (nonInlineCnt > 0 && numStringBuffers == 0) { |
| 943 | LOG(WARNING) << "[exportViews] building fallback single string buffer"; |
| 944 | size_t totalBytes = 0; |
| 945 | rows.apply([&](vector_size_t i) { |
| 946 | if (!vec.isNullAt(i)) { |
| 947 | auto sv = vec.valueAtFast(i); |
| 948 | if (!sv.isInline()) |
| 949 | totalBytes += sv.size(); |
| 950 | } |
| 951 | }); |
| 952 | |
| 953 | if (totalBytes > 0) { |
| 954 | fbBuf = AlignedBuffer::allocate<char>(totalBytes, pool); |
| 955 | char* dst = fbBuf->asMutable<char>(); |
| 956 | |
| 957 | fbOffsets.assign(out.length, kNoOffset); |
| 958 | size_t cursor = 0; |
| 959 | vector_size_t j = 0; |
| 960 | rows.apply([&](vector_size_t i) { |
| 961 | if (!vec.isNullAt(i)) { |
| 962 | auto sv = vec.valueAtFast(i); |
| 963 | if (!sv.isInline() && sv.size() > 0) { |
| 964 | memcpy(dst + cursor, sv.data(), sv.size()); |
| 965 | fbOffsets[j] = cursor; |
| 966 | cursor += sv.size(); |
| 967 | } |
| 968 | } |
| 969 | ++j; |
| 970 | }); |
| 971 | |
| 972 | stringBuffers.clear(); |
| 973 | stringBuffers.push_back(fbBuf); |
no test coverage detected