diff --git a/src/common/algorithm/ReservoirSampling.h b/src/common/algorithm/ReservoirSampling.h index 6d846e1ad10..04cc937ad66 100644 --- a/src/common/algorithm/ReservoirSampling.h +++ b/src/common/algorithm/ReservoirSampling.h @@ -37,7 +37,13 @@ class ReservoirSampling final { return false; } - std::vector&& samples() && { return std::move(samples_); } + std::vector samples() { + auto result = std::move(samples_); + samples_.clear(); + samples_.reserve(num_); + cnt_ = 0; + return result; + } private: std::vector samples_; diff --git a/src/common/algorithm/test/ReservoirSamplingTest.cpp b/src/common/algorithm/test/ReservoirSamplingTest.cpp index 67e2c22e8ac..1a5d6c32bbb 100644 --- a/src/common/algorithm/test/ReservoirSamplingTest.cpp +++ b/src/common/algorithm/test/ReservoirSamplingTest.cpp @@ -18,7 +18,7 @@ TEST(ReservoirSamplingTest, Sample) { sampler.sampling(std::move(i)); } - auto result = std::move(sampler).samples(); + auto result = sampler.samples(); EXPECT_EQ(5, result.size()); for (auto i : result) { EXPECT_LE(0, i); @@ -27,16 +27,18 @@ TEST(ReservoirSamplingTest, Sample) { } { ReservoirSampling sampler(5); - std::vector sampleSpace = {0, 1, 2}; - for (auto i : sampleSpace) { - sampler.sampling(std::move(i)); - } + for (size_t count = 0; count < 10; count++) { + std::vector sampleSpace = {0, 1, 2}; + for (auto i : sampleSpace) { + sampler.sampling(std::move(i)); + } - auto result = std::move(sampler).samples(); - EXPECT_EQ(3, result.size()); - EXPECT_EQ(0, result[0]); - EXPECT_EQ(1, result[1]); - EXPECT_EQ(2, result[2]); + auto result = sampler.samples(); + EXPECT_EQ(3, result.size()); + EXPECT_EQ(0, result[0]); + EXPECT_EQ(1, result[1]); + EXPECT_EQ(2, result[2]); + } } } } // namespace algorithm diff --git a/src/storage/exec/GetNeighborsNode.h b/src/storage/exec/GetNeighborsNode.h index b3f0eab036f..96c4557810a 100644 --- a/src/storage/exec/GetNeighborsNode.h +++ b/src/storage/exec/GetNeighborsNode.h @@ -160,7 +160,7 @@ class GetNeighborsSampleNode : public GetNeighborsNode { } RowReaderWrapper reader; - auto samples = std::move(*sampler_).samples(); + auto samples = sampler_->samples(); for (auto& sample : samples) { auto columnIdx = std::get<4>(sample); // add edge prop value to the target column