1
0
Fork 0

speed up primary index lookups

This commit is contained in:
jsteemann 2016-06-29 17:44:03 +02:00
parent 80f774cef3
commit dd92e97c03
3 changed files with 9 additions and 14 deletions

View File

@ -61,7 +61,8 @@ bool IndexIteratorContext::isCluster() const {
int IndexIteratorContext::resolveId(char const* handle, size_t length, int IndexIteratorContext::resolveId(char const* handle, size_t length,
TRI_voc_cid_t& cid, TRI_voc_cid_t& cid,
char const*& key) const { char const*& key,
size_t& outLength) const {
char const* p = static_cast<char const*>(memchr(handle, TRI_DOCUMENT_HANDLE_SEPARATOR_CHR, length)); char const* p = static_cast<char const*>(memchr(handle, TRI_DOCUMENT_HANDLE_SEPARATOR_CHR, length));
if (p == nullptr || *p == '\0') { if (p == nullptr || *p == '\0') {
@ -80,6 +81,7 @@ int IndexIteratorContext::resolveId(char const* handle, size_t length,
} }
key = p + 1; key = p + 1;
outLength = length - (key - handle);
return TRI_ERROR_NO_ERROR; return TRI_ERROR_NO_ERROR;
} }

View File

@ -49,7 +49,7 @@ struct IndexIteratorContext {
bool isCluster() const; bool isCluster() const;
int resolveId(char const*, size_t, TRI_voc_cid_t&, char const*&) const; int resolveId(char const*, size_t, TRI_voc_cid_t&, char const*&, size_t&) const;
TRI_vocbase_t* vocbase; TRI_vocbase_t* vocbase;
mutable CollectionNameResolver const* resolver; mutable CollectionNameResolver const* resolver;

View File

@ -97,7 +97,7 @@ PrimaryIndexIterator::~PrimaryIndexIterator() {
TRI_doc_mptr_t* PrimaryIndexIterator::next() { TRI_doc_mptr_t* PrimaryIndexIterator::next() {
while (_iterator.valid()) { while (_iterator.valid()) {
auto result = _index->lookup(_trx, _iterator.value()); auto result = _index->lookupKey(_trx, _iterator.value());
_iterator.next(); _iterator.next();
if (result != nullptr) { if (result != nullptr) {
@ -518,7 +518,8 @@ void PrimaryIndex::handleValNode(IndexIteratorContext* context,
// correct collection (i.e. _collection) // correct collection (i.e. _collection)
TRI_voc_cid_t cid; TRI_voc_cid_t cid;
char const* key; char const* key;
int res = context->resolveId(valNode->getStringValue(), valNode->getStringLength(), cid, key); size_t outLength;
int res = context->resolveId(valNode->getStringValue(), valNode->getStringLength(), cid, key, outLength);
if (res != TRI_ERROR_NO_ERROR) { if (res != TRI_ERROR_NO_ERROR) {
return; return;
@ -540,16 +541,8 @@ void PrimaryIndex::handleValNode(IndexIteratorContext* context,
} }
// use _key value from _id // use _key value from _id
keys->openArray(); keys->add(VPackValuePair(key, outLength, VPackValueType::String));
keys->openObject();
keys->add(StaticStrings::IndexEq, VPackValue(key));
keys->close();
keys->close();
} else { } else {
keys->openArray(); keys->add(VPackValuePair(valNode->getStringValue(), valNode->getStringLength(), VPackValueType::String));
keys->openObject();
keys->add(StaticStrings::IndexEq, VPackValuePair(valNode->getStringValue(), valNode->getStringLength(), VPackValueType::String));
keys->close();
keys->close();
} }
} }