mirror of https://gitee.com/bigwinds/arangodb
speed up primary index lookups
This commit is contained in:
parent
80f774cef3
commit
dd92e97c03
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue