mirror of https://gitee.com/bigwinds/arangodb
micro optimizations
This commit is contained in:
parent
5aa808b5be
commit
524172ec83
|
@ -61,12 +61,11 @@ static bool IsEqualElementElement(void*,
|
|||
|
||||
static uint64_t HashKey(void*,
|
||||
VPackSlice const* key) {
|
||||
TRI_ASSERT(key->isArray());
|
||||
uint64_t hash = 0x0123456789abcdef;
|
||||
|
||||
if (!key->isArray()) {
|
||||
return hash;
|
||||
}
|
||||
for (size_t j = 0; j < key->length(); ++j) {
|
||||
size_t const n = key->length();
|
||||
|
||||
for (size_t j = 0; j < n; ++j) {
|
||||
// must use normalized hash here, to normalize different representations
|
||||
// of arrays/objects/numbers
|
||||
hash = (*key)[j].normalizedHash(hash);
|
||||
|
@ -82,11 +81,12 @@ static uint64_t HashKey(void*,
|
|||
static bool IsEqualKeyElement(void*,
|
||||
VPackSlice const* left,
|
||||
TRI_index_element_t const* right) {
|
||||
TRI_ASSERT(left->isArray());
|
||||
TRI_ASSERT(right->document() != nullptr);
|
||||
if (!left->isArray()) {
|
||||
return false;
|
||||
}
|
||||
for (size_t j = 0; j < left->length(); ++j) {
|
||||
|
||||
size_t const n = left->length();
|
||||
|
||||
for (size_t j = 0; j < n; ++j) {
|
||||
VPackSlice const leftVPack = (*left)[j];
|
||||
TRI_vpack_sub_t* rightSub = right->subObjects() + j;
|
||||
VPackSlice const rightVPack = rightSub->slice(right->document());
|
||||
|
@ -393,7 +393,7 @@ void HashIndex::transformSearchValues(VPackSlice const values,
|
|||
VPackArrayBuilder guard(&result);
|
||||
for (auto const& v : VPackArrayIterator(values)) {
|
||||
if (!v.isObject() || !v.hasKey(TRI_SLICE_KEY_EQUAL)) {
|
||||
THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_BAD_PARAMETER, "Hash index only allows == comparisson.");
|
||||
THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_BAD_PARAMETER, "Hash index only allows == comparison.");
|
||||
}
|
||||
result.add(v.get(TRI_SLICE_KEY_EQUAL));
|
||||
}
|
||||
|
@ -422,22 +422,18 @@ int HashIndex::lookup(arangodb::Transaction* trx,
|
|||
return TRI_ERROR_NO_ERROR;
|
||||
}
|
||||
|
||||
std::vector<TRI_index_element_t*>* results = nullptr;
|
||||
std::vector<TRI_index_element_t*> results;
|
||||
try {
|
||||
results = _multiArray->_hashArray->lookupByKey(trx, &key);
|
||||
_multiArray->_hashArray->lookupByKey(trx, &key, results);
|
||||
} catch (...) {
|
||||
return TRI_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
if (results != nullptr) {
|
||||
try {
|
||||
for (size_t i = 0; i < results->size(); i++) {
|
||||
documents.emplace_back((*results)[i]->document());
|
||||
}
|
||||
delete results;
|
||||
} catch (...) {
|
||||
delete results;
|
||||
return TRI_ERROR_OUT_OF_MEMORY;
|
||||
try {
|
||||
for (size_t i = 0; i < results.size(); i++) {
|
||||
documents.emplace_back(results[i]->document());
|
||||
}
|
||||
} catch (...) {
|
||||
return TRI_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return TRI_ERROR_NO_ERROR;
|
||||
}
|
||||
|
|
|
@ -1608,58 +1608,6 @@ TRI_vocbase_col_t* TRI_LookupCollectionByIdVocBase(TRI_vocbase_t* vocbase,
|
|||
return (*it).second;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief finds a collection by name, optionally creates it
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TRI_vocbase_col_t* TRI_FindCollectionByNameOrCreateVocBase(
|
||||
TRI_vocbase_t* vocbase, std::string const& name, TRI_col_type_t type) {
|
||||
if (name.empty()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
TRI_vocbase_col_t* found = nullptr;
|
||||
|
||||
{
|
||||
READ_LOCKER(readLocker, vocbase->_collectionsLock);
|
||||
|
||||
if (name[0] >= '0' && name[0] <= '9') {
|
||||
// support lookup by id, too
|
||||
try {
|
||||
TRI_voc_cid_t id =
|
||||
arangodb::basics::StringUtils::uint64(name);
|
||||
auto it = vocbase->_collectionsById.find(id);
|
||||
|
||||
if (it != vocbase->_collectionsById.end()) {
|
||||
found = (*it).second;
|
||||
}
|
||||
} catch (...) {
|
||||
// no need to throw here... found will still be a nullptr
|
||||
}
|
||||
} else {
|
||||
auto it = vocbase->_collectionsByName.find(name);
|
||||
|
||||
if (it != vocbase->_collectionsByName.end()) {
|
||||
found = (*it).second;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (found != nullptr) {
|
||||
return found;
|
||||
}
|
||||
|
||||
// collection not found. now create it
|
||||
VPackBuilder builder; // DO NOT FILL IT
|
||||
arangodb::VocbaseCollectionInfo parameter(
|
||||
vocbase, name.c_str(), (TRI_col_type_e)type,
|
||||
(TRI_voc_size_t)vocbase->_settings.defaultMaximalSize, builder.slice());
|
||||
TRI_vocbase_col_t* collection =
|
||||
TRI_CreateCollectionVocBase(vocbase, parameter, 0, true);
|
||||
|
||||
return collection;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief creates a new (document) collection from parameter set
|
||||
///
|
||||
|
|
|
@ -498,13 +498,6 @@ TRI_vocbase_col_t* TRI_LookupCollectionByNameVocBase(TRI_vocbase_t* vocbase,
|
|||
TRI_vocbase_col_t* TRI_LookupCollectionByIdVocBase(TRI_vocbase_t* vocbase,
|
||||
TRI_voc_cid_t cid);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief finds a collection by name or creates it
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TRI_vocbase_col_t* TRI_FindCollectionByNameOrCreateVocBase(
|
||||
TRI_vocbase_t* vocbase, std::string const& name, TRI_col_type_t type);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief creates a new (document) collection from parameter set
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
Loading…
Reference in New Issue