summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Seyster <justin.seyster@mongodb.com>2022-09-01 21:34:25 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-09-01 23:05:27 +0000
commit8de369efe3fb47e15000f6a8af722b53911392e6 (patch)
tree018a4afee35ec5310d5f7682c8c07f1a6882768d
parent07a8f061b8c63c799c1d6ecbc13656eaae0d1922 (diff)
downloadmongo-8de369efe3fb47e15000f6a8af722b53911392e6.tar.gz
SERVER-69104 Avoid repeated creation of ColumnStoreEncoder
-rw-r--r--src/mongo/db/exec/sbe/stages/column_scan.cpp19
-rw-r--r--src/mongo/db/exec/sbe/stages/column_scan.h6
-rw-r--r--src/mongo/db/exec/sbe/values/column_store_encoder_test.cpp6
-rw-r--r--src/mongo/db/index/column_key_generator_test.cpp3
-rw-r--r--src/mongo/db/storage/column_store.h17
5 files changed, 28 insertions, 23 deletions
diff --git a/src/mongo/db/exec/sbe/stages/column_scan.cpp b/src/mongo/db/exec/sbe/stages/column_scan.cpp
index 66da5619ceb..c9b960ace59 100644
--- a/src/mongo/db/exec/sbe/stages/column_scan.cpp
+++ b/src/mongo/db/exec/sbe/stages/column_scan.cpp
@@ -32,23 +32,10 @@
#include "mongo/db/exec/sbe/expressions/expression.h"
#include "mongo/db/exec/sbe/size_estimator.h"
-#include "mongo/db/exec/sbe/values/column_store_encoder.h"
-#include "mongo/db/exec/sbe/values/columnar.h"
#include "mongo/db/index/columns_access_method.h"
namespace mongo {
namespace sbe {
-namespace {
-TranslatedCell translateCell(PathView path, const SplitCellView& splitCellView) {
- value::ColumnStoreEncoder encoder{};
- SplitCellView::Cursor<value::ColumnStoreEncoder> cellCursor =
- splitCellView.subcellValuesGenerator<value::ColumnStoreEncoder>(std::move(encoder));
- return TranslatedCell{splitCellView.arrInfo, path, std::move(cellCursor)};
-}
-
-
-} // namespace
-
ColumnScanStage::ColumnScanStage(UUID collectionUuid,
StringData columnIndexName,
std::vector<std::string> paths,
@@ -307,6 +294,12 @@ void ColumnScanStage::open(bool reOpen) {
_open = true;
}
+TranslatedCell ColumnScanStage::translateCell(PathView path, const SplitCellView& splitCellView) {
+ SplitCellView::Cursor<value::ColumnStoreEncoder> cellCursor =
+ splitCellView.subcellValuesGenerator<value::ColumnStoreEncoder>(&_encoder);
+ return TranslatedCell{splitCellView.arrInfo, path, std::move(cellCursor)};
+}
+
void ColumnScanStage::readParentsIntoObj(StringData path,
value::Object* outObj,
StringDataSet* pathsReadSetOut) {
diff --git a/src/mongo/db/exec/sbe/stages/column_scan.h b/src/mongo/db/exec/sbe/stages/column_scan.h
index 71f8489dfb3..e567b75ad8e 100644
--- a/src/mongo/db/exec/sbe/stages/column_scan.h
+++ b/src/mongo/db/exec/sbe/stages/column_scan.h
@@ -34,6 +34,8 @@
#include "mongo/db/exec/sbe/stages/collection_helpers.h"
#include "mongo/db/exec/sbe/stages/plan_stats.h"
#include "mongo/db/exec/sbe/stages/stages.h"
+#include "mongo/db/exec/sbe/values/column_store_encoder.h"
+#include "mongo/db/exec/sbe/values/columnar.h"
#include "mongo/db/storage/column_store.h"
namespace mongo {
@@ -202,6 +204,8 @@ private:
ColumnScanStats::CursorStats& _stats;
};
+ TranslatedCell translateCell(PathView path, const SplitCellView& splitCellView);
+
void readParentsIntoObj(StringData path, value::Object* out, StringDataSet* pathsReadSetOut);
bool checkFilter(CellView cell, size_t filterIndex, const PathValue& path);
@@ -219,6 +223,8 @@ private:
// Move cursors to the next record to be processed.
RowId advanceCursors();
+ value::ColumnStoreEncoder _encoder{};
+
// The columnar index this stage is scanning and the associated row store collection.
const UUID _collUuid;
const std::string _columnIndexName;
diff --git a/src/mongo/db/exec/sbe/values/column_store_encoder_test.cpp b/src/mongo/db/exec/sbe/values/column_store_encoder_test.cpp
index fba973a606a..f47faa329c7 100644
--- a/src/mongo/db/exec/sbe/values/column_store_encoder_test.cpp
+++ b/src/mongo/db/exec/sbe/values/column_store_encoder_test.cpp
@@ -61,7 +61,7 @@ TEST(SBEColumnStoreEncoder, EncodeTest) {
StringData{columnStoreCell.buf(), static_cast<size_t>(columnStoreCell.len())});
value::ColumnStoreEncoder encoder;
- auto cellCursor = cellView.subcellValuesGenerator(encoder);
+ auto cellCursor = cellView.subcellValuesGenerator(&encoder);
{
auto cellValue = cellCursor.nextValue();
@@ -205,7 +205,7 @@ TEST(SBEColumnStoreEncoder, RoundTripConversionThroughSplitCellView) {
SplitCellView::parse(StringData{cellBuffer.buf(), static_cast<size_t>(cellBuffer.len())});
value::ColumnStoreEncoder encoder;
- auto cellCursor = cellView.subcellValuesGenerator(encoder);
+ auto cellCursor = cellView.subcellValuesGenerator(&encoder);
auto referenceIt = referenceBson.begin();
while (auto&& cursorResult = cellCursor.nextValue()) {
@@ -366,7 +366,7 @@ TEST(SBEColumnStoreEncoder, ColumnsWithEmbeddedBSONElements) {
// validating the translated outputs their respective comparison functions.
//
value::ColumnStoreEncoder encoder;
- auto cellCursor = cellView.subcellValuesGenerator(encoder);
+ auto cellCursor = cellView.subcellValuesGenerator(&encoder);
for (auto comparison : testComparisons) {
auto cellValue = cellCursor.nextValue();
diff --git a/src/mongo/db/index/column_key_generator_test.cpp b/src/mongo/db/index/column_key_generator_test.cpp
index 65ab565df13..5e75e4ea674 100644
--- a/src/mongo/db/index/column_key_generator_test.cpp
+++ b/src/mongo/db/index/column_key_generator_test.cpp
@@ -56,7 +56,8 @@ private:
public:
UnencodedCellView toUnencodedCellView(const SplitCellView& view) {
// Fill builder with bson-encoded elements from view.
- auto cursor = view.subcellValuesGenerator(ValueEncoder{&builder});
+ ValueEncoder encoder{&builder};
+ auto cursor = view.subcellValuesGenerator(&encoder);
while (cursor.nextValue()) {
// Work done in ValueEncoder::operator() rather than here.
}
diff --git a/src/mongo/db/storage/column_store.h b/src/mongo/db/storage/column_store.h
index 19472a633ec..c03170db3a7 100644
--- a/src/mongo/db/storage/column_store.h
+++ b/src/mongo/db/storage/column_store.h
@@ -391,7 +391,7 @@ struct SplitCellView {
return Out();
invariant(elemPtr < end);
- return decodeAndAdvance(elemPtr, encoder);
+ return decodeAndAdvance(elemPtr, *encoder);
}
bool hasNext() const {
return elemPtr != end;
@@ -399,14 +399,19 @@ struct SplitCellView {
const char* elemPtr;
const char* end;
- ValueEncoder encoder;
+ ValueEncoder* encoder; // Unowned
};
-
+ /**
+ * Construct a cursor that can iterate the values in a column store cell. Requires a
+ * 'ValueEncoder' that understands the binary format of cell data.
+ *
+ * Note: the 'ValueEncoder' is stored as an unowned pointer. The referenced encoder must stay
+ * valid for the lifetime of the returned cursor.
+ */
template <class ValueEncoder>
- auto subcellValuesGenerator(ValueEncoder&& valEncoder) const {
- return Cursor<ValueEncoder>{
- firstValuePtr, arrInfo.rawData(), std::forward<ValueEncoder>(valEncoder)};
+ auto subcellValuesGenerator(ValueEncoder* valEncoder) const {
+ return Cursor<ValueEncoder>{firstValuePtr, arrInfo.rawData(), valEncoder};
}
static SplitCellView parse(CellView cell) {