1
0
Fork 0

optimizations for primary index lookups

This commit is contained in:
jsteemann 2016-06-24 17:23:43 +02:00
parent 37d5956bec
commit 50cbf416b3
4 changed files with 31 additions and 10 deletions

View File

@ -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") {

View File

@ -53,7 +53,7 @@ class PrimaryIndexIterator final : public IndexIterator {
TRI_ASSERT(_keys->slice().isArray());
}
~PrimaryIndexIterator() {}
~PrimaryIndexIterator();
TRI_doc_mptr_t* next() override;

View File

@ -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);
}
}

View File

@ -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;