@@ -35,6 +35,18 @@ void populateData(Vector<T>& vec, const std::vector<T>& data) {
3535 }
3636}
3737
38+ uint64_t populateStringData (
39+ Buffer& stringBuffer,
40+ Vector<std::string_view>& data,
41+ const std::vector<std::string_view>& testData) {
42+ uint64_t extraMemory = 0 ;
43+ for (const auto & str : testData) {
44+ extraMemory += str.size ();
45+ data.emplace_back (stringBuffer.writeString (str));
46+ }
47+ return extraMemory;
48+ }
49+
3850template <typename T>
3951std::vector<T> toVector (std::string_view data) {
4052 const T* chunkData = reinterpret_cast <const T*>(data.data ());
@@ -508,13 +520,8 @@ TEST_F(StreamChunkerTestsBase, contentStreamStringChunking) {
508520 {
509521 std::vector<std::string_view> testData = {
510522 " short" , " a_longer_string" , " x" , " medium_size" , " tiny" };
511- auto & data = stream.mutableData ();
512- populateData (data, testData);
513-
514- // Calculate extra memory for string content
515- for (const auto & str : testData) {
516- stream.extraMemory () += str.size ();
517- }
523+ stream.extraMemory () += populateStringData (
524+ stream.stringBuffer (), stream.mutableData (), testData);
518525
519526 // Total string content sizes:
520527 // "short"(5) + "a_longer_string"(15) + "x"(1) + "medium_size"(11) +
@@ -582,16 +589,11 @@ TEST_F(StreamChunkerTestsBase, contentStreamStringChunking) {
582589
583590 // Test 4: We can reuse a stream post compaction.
584591 {
585- auto & data = stream.mutableData ();
586592 stream.extraMemory () = 0 ; // Reset extra memory
587593 std::vector<std::string_view> testData = {
588594 " hello" , " world" , " hello" , " world" };
589- populateData (data, testData);
590-
591- // Calculate extra memory for string content
592- for (const auto & str : testData) {
593- stream.extraMemory () += str.size ();
594- }
595+ stream.extraMemory () += populateStringData (
596+ stream.stringBuffer (), stream.mutableData (), testData);
595597
596598 auto chunker = getStreamChunker (
597599 stream,
@@ -619,17 +621,12 @@ TEST_F(StreamChunkerTestsBase, contentStreamStringChunking) {
619621 {
620622 std::vector<std::string_view> testData = {
621623 " a" , " short" , " really really large string" , " small" };
622- auto & data = stream.mutableData ();
623- populateData (data, testData);
624624
625625 // Size of "really really large string" and string view minus 1.
626626 maxChunkSize = 24 + sizeof (std::string_view);
627627
628- // Calculate extra memory for string content.
629- for (const auto & str : testData) {
630- stream.extraMemory () += str.size ();
631- }
632-
628+ stream.extraMemory () += populateStringData (
629+ stream.stringBuffer (), stream.mutableData (), testData);
633630 // "a"(1), "short"(5), "really really large string"(25), "small"(5) = 37
634631 // bytes of extra memory.
635632 ASSERT_EQ (stream.extraMemory (), 37 );
@@ -888,9 +885,7 @@ TEST_F(StreamChunkerTestsBase, nullableContentStreamStringChunking) {
888885 // insertion
889886 stream.ensureAdditionalNullsCapacity (
890887 /* mayHaveNulls=*/ true , static_cast <uint32_t >(nonNullsData.size ()));
891- auto & data = stream.mutableData ();
892888 auto & nonNulls = stream.mutableNonNulls ();
893- populateData (data, testData);
894889 populateData (nonNulls, nonNullsData);
895890
896891 // Set extra memory for string overhead
@@ -900,9 +895,9 @@ TEST_F(StreamChunkerTestsBase, nullableContentStreamStringChunking) {
900895 // size of nulls = 11 * 1 = 11 bytes
901896 // total size of stored string data = 36 bytes
902897 // total size of stream data = 56 + 56 + 11 + 36 = 159 bytes
903- for ( const auto & entry : testData) {
904- stream.extraMemory () += entry. size ( );
905- }
898+ stream. extraMemory () +=
899+ populateStringData ( stream.stringBuffer (), stream. mutableData (), testData );
900+
906901 ASSERT_EQ (stream.memoryUsed (), 159 );
907902
908903 // Test 1: Not last chunk
@@ -982,16 +977,13 @@ TEST_F(StreamChunkerTestsBase, nullableContentStreamStringChunking) {
982977 stream.ensureAdditionalNullsCapacity (
983978 /* mayHaveNulls=*/ false ,
984979 static_cast <uint32_t >(smallNonNullsData.size ()));
985- auto & smallData = stream.mutableData ();
986980 auto & smallNonNulls = stream.mutableNonNulls ();
987- populateData (smallData, smallTestData);
988981 populateData (smallNonNulls, smallNonNullsData);
989982
990983 // Reset extra memory for new test data
991984 stream.extraMemory () = 0 ;
992- for (const auto & entry : smallTestData) {
993- stream.extraMemory () += entry.size ();
994- }
985+ stream.extraMemory () += populateStringData (
986+ stream.stringBuffer (), stream.mutableData (), smallTestData);
995987
996988 const uint64_t minChunkSize =
997989 smallTestData.at (0 ).size () + sizeof (std::string_view);
@@ -1025,7 +1017,6 @@ TEST_F(StreamChunkerTestsBase, nullableContentStreamStringChunking) {
10251017 // Test 5: Single string exceeds maxChunkSize.
10261018 {
10271019 testData = {" a" , " short" , " really really large string" , " small" };
1028- populateData (data, testData);
10291020
10301021 nonNullsData = {true , false , true , true , false , true , false };
10311022 stream.ensureAdditionalNullsCapacity (
@@ -1037,9 +1028,8 @@ TEST_F(StreamChunkerTestsBase, nullableContentStreamStringChunking) {
10371028 const uint64_t maxChunkSize = 24 + sizeof (std::string_view) + sizeof (bool );
10381029
10391030 // Calculate extra memory for string content.
1040- for (const auto & str : testData) {
1041- stream.extraMemory () += str.size ();
1042- }
1031+ stream.extraMemory () += populateStringData (
1032+ stream.stringBuffer (), stream.mutableData (), testData);
10431033
10441034 // "a"(1), "short"(5), "really really large string"(25), "small"(5) =
10451035 // 37 bytes of extra memory.
@@ -1113,11 +1103,8 @@ TEST_F(StreamChunkerTestsBase, contentStreamStringChunkerRowCount) {
11131103 // Add strings with varying sizes.
11141104 std::vector<std::string_view> testData = {
11151105 " a" , " bb" , " ccc" , " dddd" , " eeeee" , " ffffff" };
1116- auto & data = stream.mutableData ();
1117- populateData (data, testData);
1118- for (const auto & str : testData) {
1119- stream.extraMemory () += str.size ();
1120- }
1106+ stream.extraMemory () +=
1107+ populateStringData (stream.stringBuffer (), stream.mutableData (), testData);
11211108
11221109 // Max chunk size that fits ~2-3 strings per chunk.
11231110 auto chunker = getStreamChunker (
@@ -1228,13 +1215,10 @@ TEST_F(StreamChunkerTestsBase, nullableContentStreamStringChunkerRowCount) {
12281215 std::vector<bool > nonNullsData = {true , false , true , true , false , true };
12291216 stream.ensureAdditionalNullsCapacity (
12301217 /* mayHaveNulls=*/ true , static_cast <uint32_t >(nonNullsData.size ()));
1231- auto & data = stream.mutableData ();
12321218 auto & nonNulls = stream.mutableNonNulls ();
1233- populateData (data, testData);
12341219 populateData (nonNulls, nonNullsData);
1235- for (const auto & str : testData) {
1236- stream.extraMemory () += str.size ();
1237- }
1220+ stream.extraMemory () +=
1221+ populateStringData (stream.stringBuffer (), stream.mutableData (), testData);
12381222
12391223 auto chunker = getStreamChunker (
12401224 stream,
0 commit comments