diff --git a/arangod/Indexes/HashIndex.cpp b/arangod/Indexes/HashIndex.cpp index 1f706380b4..c8a5057c9c 100644 --- a/arangod/Indexes/HashIndex.cpp +++ b/arangod/Indexes/HashIndex.cpp @@ -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* results = nullptr; + std::vector 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; } diff --git a/arangod/VocBase/vocbase.cpp b/arangod/VocBase/vocbase.cpp index fc21ff8255..1fef28a4ca 100644 --- a/arangod/VocBase/vocbase.cpp +++ b/arangod/VocBase/vocbase.cpp @@ -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 /// diff --git a/arangod/VocBase/vocbase.h b/arangod/VocBase/vocbase.h index c5bb02182e..361a2ea1b2 100644 --- a/arangod/VocBase/vocbase.h +++ b/arangod/VocBase/vocbase.h @@ -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 ////////////////////////////////////////////////////////////////////////////////