diff options
Diffstat (limited to 'src/mongo')
-rw-r--r-- | src/mongo/db/exec/sbe/stages/column_scan.cpp | 19 | ||||
-rw-r--r-- | src/mongo/db/exec/sbe/stages/column_scan.h | 6 | ||||
-rw-r--r-- | src/mongo/db/exec/sbe/values/column_store_encoder_test.cpp | 6 | ||||
-rw-r--r-- | src/mongo/db/index/column_key_generator_test.cpp | 3 | ||||
-rw-r--r-- | src/mongo/db/storage/column_store.h | 17 |
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) { |