diff --git a/arangod/MMFiles/MMFilesHashIndex.cpp b/arangod/MMFiles/MMFilesHashIndex.cpp index 4ef0e5386f..203f985a72 100644 --- a/arangod/MMFiles/MMFilesHashIndex.cpp +++ b/arangod/MMFiles/MMFilesHashIndex.cpp @@ -51,6 +51,7 @@ MMFilesHashIndexLookupBuilder::MMFilesHashIndexLookupBuilder( : _builder(trx), _usesIn(false), _isEmpty(false), + _mappingFieldConditionArena(), _mappingFieldCondition{_mappingFieldConditionArena}, _inStorage(trx) { TRI_ASSERT(node->type == aql::NODE_TYPE_OPERATOR_NARY_AND); diff --git a/arangod/MMFiles/MMFilesHashIndex.h b/arangod/MMFiles/MMFilesHashIndex.h index bb909b12f5..ea53710bb5 100644 --- a/arangod/MMFiles/MMFilesHashIndex.h +++ b/arangod/MMFiles/MMFilesHashIndex.h @@ -179,8 +179,10 @@ class MMFilesHashIndexLookupBuilder { bool _isEmpty; size_t _coveredFields; - SmallVector _mappingFieldCondition; - SmallVector::allocator_type::arena_type _mappingFieldConditionArena; + using MappingCondition = + SmallVector; + MappingCondition::allocator_type::arena_type _mappingFieldConditionArena; + MappingCondition _mappingFieldCondition; std::unordered_map>> _inPosition; transaction::BuilderLeaser _inStorage; @@ -270,10 +272,10 @@ class MMFilesHashIndex final : public MMFilesPathBasedIndex { Index::FilterCosts supportsFilterCondition(std::vector> const& allIndexes, arangodb::aql::AstNode const* node, - arangodb::aql::Variable const* reference, + arangodb::aql::Variable const* reference, size_t itemsInIndex) const override; - std::unique_ptr iteratorForCondition(transaction::Methods* trx, + std::unique_ptr iteratorForCondition(transaction::Methods* trx, arangodb::aql::AstNode const* node, arangodb::aql::Variable const* reference, IndexIteratorOptions const& opts) override; diff --git a/arangod/MMFiles/MMFilesPrimaryIndex.cpp b/arangod/MMFiles/MMFilesPrimaryIndex.cpp index 7031604666..a586a3a184 100644 --- a/arangod/MMFiles/MMFilesPrimaryIndex.cpp +++ b/arangod/MMFiles/MMFilesPrimaryIndex.cpp @@ -21,7 +21,10 @@ /// @author Dr. Frank Celler //////////////////////////////////////////////////////////////////////////////// +#include + #include "Aql/AstNode.h" +#include "Aql/ExecutionBlock.h" #include "Basics/Exceptions.h" #include "Basics/StaticStrings.h" #include "Basics/hashes.h" @@ -161,7 +164,7 @@ bool MMFilesAllIndexIterator::next(LocalDocumentIdCallback const& cb, size_t lim bool MMFilesAllIndexIterator::nextDocument(DocumentCallback const& cb, size_t limit) { _documentIds.clear(); - _documentIds.reserve(limit); + _documentIds.reserve((std::min)(limit, aql::ExecutionBlock::DefaultBatchSize())); bool done = false; while (limit > 0) { @@ -474,8 +477,8 @@ std::unique_ptr MMFilesPrimaryIndex::iteratorForCondition( if (aap.opType == aql::NODE_TYPE_OPERATOR_BINARY_EQ) { // a.b == value return createEqIterator(trx, aap.attribute, aap.value); - } - + } + if (aap.opType == aql::NODE_TYPE_OPERATOR_BINARY_IN && aap.value->isArray()) { // a.b IN array