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,
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));
if (p == nullptr || *p == '\0') {
@ -80,6 +81,7 @@ int IndexIteratorContext::resolveId(char const* handle, size_t length,
}
key = p + 1;
outLength = length - (key - handle);
return TRI_ERROR_NO_ERROR;
}

View File

@ -49,7 +49,7 @@ struct IndexIteratorContext {
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;
mutable CollectionNameResolver const* resolver;

View File

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