1
0
Fork 0

micro optimizations

This commit is contained in:
jsteemann 2016-05-13 11:51:34 +02:00
parent 5aa808b5be
commit 524172ec83
3 changed files with 17 additions and 80 deletions

View File

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

View File

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

View File

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