@@ -105,6 +105,7 @@ class EloqIndexCursor final : public SortedDataInterface::Cursor {
105105 _endKey = Eloq::MongoKey::GetNegInfTxKey ();
106106
107107 _kvPair = &_ru->getKVPair ();
108+ _recordPtr = nullptr ;
108109 }
109110
110111 void setEndPosition (const BSONObj& key, bool inclusive) override {
@@ -234,19 +235,21 @@ class EloqIndexCursor final : public SortedDataInterface::Cursor {
234235 MONGO_LOG (1 ) << " finalKey" << finalKey;
235236
236237 _key.resetToKey (finalKey, _idx->ordering ());
237- _kvPair->keyRef ().SetPackedKey (_key.getBuffer (), _key.getSize ());
238- std::string_view sv{_key.getBuffer (), _key.getSize ()};
239- bool isForWrite = _opCtx->isUpsert ();
240- auto [exists, err] =
241- _ru->getKVInternal (_opCtx, *_indexName, _indexSchema->SchemaTs (), isForWrite);
238+ Eloq::MongoKey mongoKey (_key);
239+ auto [exists, err] = _ru->getKV (_opCtx,
240+ *_indexName,
241+ _indexSchema->SchemaTs (),
242+ &mongoKey,
243+ &_idReadRecord,
244+ _opCtx->isUpsert ());
242245 uassertStatusOK (TxErrorCodeToMongoStatus (err));
243246 if (exists) {
244247 // valid
245248 _id = RecordId{_key.getBuffer (), _key.getSize ()};
246249 _typeBits.reset ();
250+ _recordPtr = &_idReadRecord;
247251 } else {
248252 _eof = true ;
249- _kvPair->setValuePtr (nullptr );
250253 }
251254
252255 return _curr (parts);
@@ -335,24 +338,25 @@ class EloqIndexCursor final : public SortedDataInterface::Cursor {
335338 BufReader br{_scanTupleRecord->UnpackInfoData (),
336339 static_cast <unsigned int >(_scanTupleRecord->UnpackInfoSize ())};
337340 _typeBits.resetFromBuffer (&br);
338- _kvPair-> setValuePtr ( _scanTupleRecord) ;
341+ _recordPtr = _scanTupleRecord;
339342 } break ;
340-
341343 case IndexCursorType::UNIQUE: {
342344 _id = _scanTupleRecord->ToRecordId (false );
343345 BufReader br{_scanTupleRecord->UnpackInfoData (),
344346 static_cast <unsigned int >(_scanTupleRecord->UnpackInfoSize ())};
345347 _typeBits.resetFromBuffer (&br);
346- _kvPair-> setValuePtr ( nullptr ) ;
348+ _recordPtr = nullptr ;
347349 } break ;
348-
349350 case IndexCursorType::STANDARD: {
350351 _id = KeyString::decodeRecordIdStrAtEnd (_key.getBuffer (), _key.getSize ());
351352 BufReader br{_scanTupleRecord->UnpackInfoData (),
352353 static_cast <unsigned int >(_scanTupleRecord->UnpackInfoSize ())};
353354 _typeBits.resetFromBuffer (&br);
354- _kvPair->setValuePtr (nullptr );
355- } break ;
355+ _recordPtr = nullptr ;
356+ break ;
357+ }
358+ default :
359+ MONGO_UNREACHABLE;
356360 };
357361
358362 MONGO_LOG (1 ) << " EloqIndexCursor::_updateIdAndTypeBits " << _indexName->StringView ()
@@ -372,7 +376,15 @@ class EloqIndexCursor final : public SortedDataInterface::Cursor {
372376 bson = KeyString::toBson (_key.getBuffer (), _key.getSize (), _idx->ordering (), _typeBits);
373377 MONGO_LOG (1 ) << " bson: " << bson << " . _id: " << _id;
374378 }
375- return {{std::move (bson), _id}};
379+
380+ if (_recordPtr) {
381+ return {
382+ {std::move (bson),
383+ _id,
384+ {_recordPtr->EncodedBlobData (), static_cast <int >(_recordPtr->EncodedBlobSize ())}}};
385+ } else {
386+ return {{std::move (bson), _id}};
387+ }
376388 }
377389
378390 bool _atOrPastEndPointAfterSeeking () const {
@@ -426,8 +438,11 @@ class EloqIndexCursor final : public SortedDataInterface::Cursor {
426438 txservice::TxKey _endKey;
427439 EloqKVPair* _kvPair;
428440
429- Eloq::MongoKey _currentKey;
430- Eloq::MongoRecord _currentRecord;
441+ // EloqDoc is index-organized table, we can bookeeping the record data here to avoid re-fetching
442+ // it.
443+ const Eloq::MongoRecord* _recordPtr;
444+
445+ Eloq::MongoRecord _idReadRecord;
431446
432447 boost::optional<EloqCursor> _cursor;
433448};
0 commit comments