mirror of https://gitee.com/bigwinds/arangodb
optimizations for primary index lookups
This commit is contained in:
parent
37d5956bec
commit
50cbf416b3
|
@ -29,6 +29,7 @@
|
|||
#include "Basics/tri-strings.h"
|
||||
#include "Indexes/SimpleAttributeEqualityMatcher.h"
|
||||
#include "Utils/Transaction.h"
|
||||
#include "Utils/TransactionContext.h"
|
||||
#include "VocBase/document-collection.h"
|
||||
#include "VocBase/transaction.h"
|
||||
|
||||
|
@ -77,6 +78,13 @@ static bool IsEqualElementElement(void*, TRI_doc_mptr_t const* left,
|
|||
return l.equals(r);
|
||||
}
|
||||
|
||||
PrimaryIndexIterator::~PrimaryIndexIterator() {
|
||||
if (_keys != nullptr) {
|
||||
// return the VPackBuilder to the transaction context
|
||||
_trx->transactionContextPtr()->returnBuilder(_keys.release());
|
||||
}
|
||||
}
|
||||
|
||||
TRI_doc_mptr_t* PrimaryIndexIterator::next() {
|
||||
while (_iterator.valid()) {
|
||||
auto result = _index->lookup(_trx, _iterator.value());
|
||||
|
@ -457,13 +465,15 @@ IndexIterator* PrimaryIndex::createInIterator(
|
|||
bool const isId = (attrNode->stringEquals(StaticStrings::IdString));
|
||||
|
||||
TRI_ASSERT(valNode->isArray());
|
||||
|
||||
// only leave the valid elements in the vector
|
||||
auto keys = std::make_unique<VPackBuilder>();
|
||||
|
||||
// lease builder, but immediately pass it to the unique_ptr so we don't leak
|
||||
TransactionBuilderLeaser builder(trx);
|
||||
std::unique_ptr<VPackBuilder> keys(builder.steal());
|
||||
keys->openArray();
|
||||
|
||||
size_t const n = valNode->numMembers();
|
||||
|
||||
// only leave the valid elements
|
||||
for (size_t i = 0; i < n; ++i) {
|
||||
handleValNode(context, keys.get(), valNode->getMemberUnchecked(i), isId);
|
||||
}
|
||||
|
@ -486,10 +496,12 @@ IndexIterator* PrimaryIndex::createEqIterator(
|
|||
// _key or _id?
|
||||
bool const isId = (attrNode->stringEquals(StaticStrings::IdString));
|
||||
|
||||
// only leave the valid elements in the vector
|
||||
auto keys = std::make_unique<VPackBuilder>();
|
||||
// lease builder, but immediately pass it to the unique_ptr so we don't leak
|
||||
TransactionBuilderLeaser builder(trx);
|
||||
std::unique_ptr<VPackBuilder> keys(builder.steal());
|
||||
keys->openArray();
|
||||
|
||||
// handle the sole element
|
||||
handleValNode(context, keys.get(), valNode, isId);
|
||||
|
||||
TRI_IF_FAILURE("PrimaryIndex::noIterator") {
|
||||
|
|
|
@ -53,7 +53,7 @@ class PrimaryIndexIterator final : public IndexIterator {
|
|||
TRI_ASSERT(_keys->slice().isArray());
|
||||
}
|
||||
|
||||
~PrimaryIndexIterator() {}
|
||||
~PrimaryIndexIterator();
|
||||
|
||||
TRI_doc_mptr_t* next() override;
|
||||
|
||||
|
|
|
@ -3460,6 +3460,7 @@ StringBufferLeaser::~StringBufferLeaser() {
|
|||
TransactionBuilderLeaser::TransactionBuilderLeaser(arangodb::Transaction* trx)
|
||||
: _transactionContext(trx->transactionContextPtr()),
|
||||
_builder(_transactionContext->leaseBuilder()) {
|
||||
TRI_ASSERT(_builder != nullptr);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -3469,6 +3470,7 @@ TransactionBuilderLeaser::TransactionBuilderLeaser(arangodb::Transaction* trx)
|
|||
TransactionBuilderLeaser::TransactionBuilderLeaser(arangodb::TransactionContext* transactionContext)
|
||||
: _transactionContext(transactionContext),
|
||||
_builder(_transactionContext->leaseBuilder()) {
|
||||
TRI_ASSERT(_builder != nullptr);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -3476,6 +3478,8 @@ TransactionBuilderLeaser::TransactionBuilderLeaser(arangodb::TransactionContext*
|
|||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TransactionBuilderLeaser::~TransactionBuilderLeaser() {
|
||||
_transactionContext->returnBuilder(_builder);
|
||||
if (_builder != nullptr) {
|
||||
_transactionContext->returnBuilder(_builder);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1009,9 +1009,14 @@ class TransactionBuilderLeaser {
|
|||
explicit TransactionBuilderLeaser(arangodb::Transaction*);
|
||||
explicit TransactionBuilderLeaser(arangodb::TransactionContext*);
|
||||
~TransactionBuilderLeaser();
|
||||
arangodb::velocypack::Builder* builder() const { return _builder; }
|
||||
arangodb::velocypack::Builder* operator->() const { return _builder; }
|
||||
arangodb::velocypack::Builder* get() const { return _builder; }
|
||||
inline arangodb::velocypack::Builder* builder() const { return _builder; }
|
||||
inline arangodb::velocypack::Builder* operator->() const { return _builder; }
|
||||
inline arangodb::velocypack::Builder* get() const { return _builder; }
|
||||
inline arangodb::velocypack::Builder* steal() {
|
||||
arangodb::velocypack::Builder* res = _builder;
|
||||
_builder = nullptr;
|
||||
return res;
|
||||
}
|
||||
private:
|
||||
arangodb::TransactionContext* _transactionContext;
|
||||
arangodb::velocypack::Builder* _builder;
|
||||
|
|
Loading…
Reference in New Issue