1
0
Fork 0

The new IndexNode can now serve with a SkiplistIndex when only a sort and no filter is given

This commit is contained in:
Michael Hackstein 2015-10-12 14:16:25 +02:00
parent dcc34e5312
commit 1c81f89a18
12 changed files with 63 additions and 23 deletions

View File

@ -179,8 +179,9 @@ namespace triagens {
arango::IndexIterator* getIterator (arango::IndexIteratorContext* context, arango::IndexIterator* getIterator (arango::IndexIteratorContext* context,
triagens::aql::Ast* ast, triagens::aql::Ast* ast,
triagens::aql::AstNode const* condition, triagens::aql::AstNode const* condition,
triagens::aql::Variable const* reference) const { triagens::aql::Variable const* reference,
return getInternals()->iteratorForCondition(context, ast, condition, reference); bool const reverse) const {
return getInternals()->iteratorForCondition(context, ast, condition, reference, reverse);
} }
triagens::aql::AstNode* specializeCondition (triagens::aql::AstNode const* node, triagens::aql::AstNode* specializeCondition (triagens::aql::AstNode const* node,

View File

@ -150,6 +150,10 @@ int IndexBlock::initialize () {
}; };
auto outVariable = static_cast<IndexNode const*>(getPlanNode())->outVariable(); auto outVariable = static_cast<IndexNode const*>(getPlanNode())->outVariable();
if (_condition == nullptr) {
// This Node has no condition. Iterate over the complete index.
return TRI_ERROR_NO_ERROR;
}
for (size_t i = 0; i < _condition->numMembers(); ++i) { for (size_t i = 0; i < _condition->numMembers(); ++i) {
auto andCond = _condition->getMemberUnchecked(i); auto andCond = _condition->getMemberUnchecked(i);
@ -255,14 +259,25 @@ bool IndexBlock::initIndexes () {
} }
_currentIndex = 0; _currentIndex = 0;
auto outVariable = static_cast<IndexNode const*>(getPlanNode())->outVariable(); IndexNode const* node = static_cast<IndexNode const*>(getPlanNode());
auto ast = static_cast<IndexNode const*>(getPlanNode())->_plan->getAst(); auto outVariable = node->outVariable();
_iterator = _indexes[_currentIndex]->getIterator(_context, ast, _condition->getMember(_currentIndex), outVariable); auto ast = node->_plan->getAst();
if (_condition == nullptr) {
_iterator = _indexes[_currentIndex]->getIterator(_context, ast, nullptr, outVariable, node->_reverse);
}
else {
_iterator = _indexes[_currentIndex]->getIterator(_context, ast, _condition->getMember(_currentIndex), outVariable, node->_reverse);
}
while (_iterator == nullptr) { while (_iterator == nullptr) {
++_currentIndex; ++_currentIndex;
if (_currentIndex < _indexes.size()) { if (_currentIndex < _indexes.size()) {
_iterator = _indexes[_currentIndex]->getIterator(_context, ast, _condition->getMember(_currentIndex), outVariable); if (_condition == nullptr) {
_iterator = _indexes[_currentIndex]->getIterator(_context, ast, nullptr, outVariable, node->_reverse);
}
else {
_iterator = _indexes[_currentIndex]->getIterator(_context, ast, _condition->getMember(_currentIndex), outVariable, node->_reverse);
}
} }
else { else {
// We were not able to initialize any index with this condition // We were not able to initialize any index with this condition
@ -280,10 +295,11 @@ void IndexBlock::startNextIterator () {
++_currentIndex; ++_currentIndex;
if (_currentIndex < _indexes.size()) { if (_currentIndex < _indexes.size()) {
auto outVariable = static_cast<IndexNode const*>(getPlanNode())->outVariable(); IndexNode const* node = static_cast<IndexNode const*>(getPlanNode());
auto ast = static_cast<IndexNode const*>(getPlanNode())->_plan->getAst(); auto outVariable = node->outVariable();
auto ast = node->_plan->getAst();
_iterator = _indexes[_currentIndex]->getIterator(_context, ast, _condition->getMember(_currentIndex), outVariable); _iterator = _indexes[_currentIndex]->getIterator(_context, ast, _condition->getMember(_currentIndex), outVariable, node->_reverse);
} }
/* /*
else { else {

View File

@ -616,7 +616,8 @@ bool EdgeIndex::supportsFilterCondition (triagens::aql::AstNode const* node,
IndexIterator* EdgeIndex::iteratorForCondition (IndexIteratorContext* context, IndexIterator* EdgeIndex::iteratorForCondition (IndexIteratorContext* context,
triagens::aql::Ast* ast, triagens::aql::Ast* ast,
triagens::aql::AstNode const* node, triagens::aql::AstNode const* node,
triagens::aql::Variable const* reference) const { triagens::aql::Variable const* reference,
bool const reverse) const {
TRI_ASSERT(node->type == aql::NODE_TYPE_OPERATOR_NARY_AND); TRI_ASSERT(node->type == aql::NODE_TYPE_OPERATOR_NARY_AND);
SimpleAttributeEqualityMatcher matcher({ SimpleAttributeEqualityMatcher matcher({

View File

@ -181,7 +181,8 @@ namespace triagens {
IndexIterator* iteratorForCondition (IndexIteratorContext*, IndexIterator* iteratorForCondition (IndexIteratorContext*,
triagens::aql::Ast*, triagens::aql::Ast*,
triagens::aql::AstNode const*, triagens::aql::AstNode const*,
triagens::aql::Variable const*) const override; triagens::aql::Variable const*,
bool const) const override;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// --SECTION-- private methods // --SECTION-- private methods

View File

@ -793,7 +793,8 @@ bool HashIndex::supportsFilterCondition (triagens::aql::AstNode const* node,
IndexIterator* HashIndex::iteratorForCondition (IndexIteratorContext* context, IndexIterator* HashIndex::iteratorForCondition (IndexIteratorContext* context,
triagens::aql::Ast* ast, triagens::aql::Ast* ast,
triagens::aql::AstNode const* node, triagens::aql::AstNode const* node,
triagens::aql::Variable const* reference) const { triagens::aql::Variable const* reference,
bool const reverse) const {
TRI_ASSERT(node->type == aql::NODE_TYPE_OPERATOR_NARY_AND); TRI_ASSERT(node->type == aql::NODE_TYPE_OPERATOR_NARY_AND);
SimpleAttributeEqualityMatcher matcher(fields()); SimpleAttributeEqualityMatcher matcher(fields());

View File

@ -185,7 +185,8 @@ namespace triagens {
IndexIterator* iteratorForCondition (IndexIteratorContext*, IndexIterator* iteratorForCondition (IndexIteratorContext*,
triagens::aql::Ast*, triagens::aql::Ast*,
triagens::aql::AstNode const*, triagens::aql::AstNode const*,
triagens::aql::Variable const*) const override; triagens::aql::Variable const*,
bool const) const override;
triagens::aql::AstNode* specializeCondition (triagens::aql::AstNode const*, triagens::aql::AstNode* specializeCondition (triagens::aql::AstNode const*,
triagens::aql::Variable const*) const override; triagens::aql::Variable const*) const override;

View File

@ -461,7 +461,8 @@ bool Index::supportsSortCondition (triagens::aql::SortCondition const*,
IndexIterator* Index::iteratorForCondition (IndexIteratorContext*, IndexIterator* Index::iteratorForCondition (IndexIteratorContext*,
triagens::aql::Ast*, triagens::aql::Ast*,
triagens::aql::AstNode const*, triagens::aql::AstNode const*,
triagens::aql::Variable const*) const { triagens::aql::Variable const*,
bool const) const {
// the super class index cannot create an iterator // the super class index cannot create an iterator
// the derived index classes have to manage this. // the derived index classes have to manage this.
return nullptr; return nullptr;

View File

@ -352,7 +352,8 @@ namespace triagens {
virtual IndexIterator* iteratorForCondition (IndexIteratorContext*, virtual IndexIterator* iteratorForCondition (IndexIteratorContext*,
triagens::aql::Ast*, triagens::aql::Ast*,
triagens::aql::AstNode const*, triagens::aql::AstNode const*,
triagens::aql::Variable const*) const; triagens::aql::Variable const*,
bool const) const;
virtual triagens::aql::AstNode* specializeCondition (triagens::aql::AstNode const*, virtual triagens::aql::AstNode* specializeCondition (triagens::aql::AstNode const*,
triagens::aql::Variable const*) const; triagens::aql::Variable const*) const;

View File

@ -323,7 +323,8 @@ bool PrimaryIndex::supportsFilterCondition (triagens::aql::AstNode const* node,
IndexIterator* PrimaryIndex::iteratorForCondition (IndexIteratorContext* context, IndexIterator* PrimaryIndex::iteratorForCondition (IndexIteratorContext* context,
triagens::aql::Ast* ast, triagens::aql::Ast* ast,
triagens::aql::AstNode const* node, triagens::aql::AstNode const* node,
triagens::aql::Variable const* reference) const { triagens::aql::Variable const* reference,
bool const reverse) const {
TRI_ASSERT(node->type == aql::NODE_TYPE_OPERATOR_NARY_AND); TRI_ASSERT(node->type == aql::NODE_TYPE_OPERATOR_NARY_AND);
SimpleAttributeEqualityMatcher matcher({ SimpleAttributeEqualityMatcher matcher({

View File

@ -205,7 +205,8 @@ namespace triagens {
IndexIterator* iteratorForCondition (IndexIteratorContext*, IndexIterator* iteratorForCondition (IndexIteratorContext*,
triagens::aql::Ast*, triagens::aql::Ast*,
triagens::aql::AstNode const*, triagens::aql::AstNode const*,
triagens::aql::Variable const*) const override; triagens::aql::Variable const*,
bool const) const override;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// --SECTION-- private methods // --SECTION-- private methods

View File

@ -31,12 +31,14 @@
#include "Aql/AstNode.h" #include "Aql/AstNode.h"
#include "Aql/SortCondition.h" #include "Aql/SortCondition.h"
#include "Basics/AttributeNameParser.h" #include "Basics/AttributeNameParser.h"
#include "Basics/json-utilities.h"
#include "Basics/logging.h" #include "Basics/logging.h"
#include "VocBase/document-collection.h" #include "VocBase/document-collection.h"
#include "VocBase/transaction.h" #include "VocBase/transaction.h"
#include "VocBase/VocShaper.h" #include "VocBase/VocShaper.h"
using namespace triagens::arango; using namespace triagens::arango;
using Json = triagens::basics::Json;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// --SECTION-- private functions // --SECTION-- private functions
@ -1176,9 +1178,20 @@ bool SkiplistIndex::supportsSortCondition (triagens::aql::SortCondition const* s
IndexIterator* SkiplistIndex::iteratorForCondition (IndexIteratorContext* context, IndexIterator* SkiplistIndex::iteratorForCondition (IndexIteratorContext* context,
triagens::aql::Ast* ast, triagens::aql::Ast* ast,
triagens::aql::AstNode const*node, triagens::aql::AstNode const* node,
triagens::aql::Variable const* reference) const { triagens::aql::Variable const* reference,
bool const reverse) const {
// Create the skiplistOperator for the IndexLookup // Create the skiplistOperator for the IndexLookup
if (node == nullptr) {
// We have no condition, we just use sort
Json nullArray(Json::Array);
nullArray.add(Json(Json::Null));
std::unique_ptr<TRI_index_operator_t> unboundOperator(TRI_CreateIndexOperator(TRI_GE_INDEX_OPERATOR, nullptr,
nullptr, nullArray.steal(), _shaper, 1));
std::vector<TRI_index_operator_t*> searchValues({unboundOperator.get()});
unboundOperator.release();
return new SkiplistIndexIterator(this, searchValues, reverse);
}
std::unordered_map<size_t, std::vector<triagens::aql::AstNode const*>> found; std::unordered_map<size_t, std::vector<triagens::aql::AstNode const*>> found;
size_t unused = 0; size_t unused = 0;
matchAttributes(node, reference, found, unused); matchAttributes(node, reference, found, unused);
@ -1378,7 +1391,7 @@ IndexIterator* SkiplistIndex::iteratorForCondition (IndexIteratorContext* contex
} }
} }
return new SkiplistIndexIterator(this, searchValues); return new SkiplistIndexIterator(this, searchValues, reverse);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------

View File

@ -178,10 +178,11 @@ namespace triagens {
public: public:
SkiplistIndexIterator (SkiplistIndex const* index, SkiplistIndexIterator (SkiplistIndex const* index,
std::vector<TRI_index_operator_t*> op) std::vector<TRI_index_operator_t*> op,
bool reverse)
: _index(index), : _index(index),
_operators(op), _operators(op),
_reverse(false), _reverse(reverse),
_currentOperator(0), _currentOperator(0),
_iterator(nullptr) { _iterator(nullptr) {
} }
@ -310,7 +311,8 @@ namespace triagens {
IndexIterator* iteratorForCondition (IndexIteratorContext*, IndexIterator* iteratorForCondition (IndexIteratorContext*,
triagens::aql::Ast*, triagens::aql::Ast*,
triagens::aql::AstNode const*, triagens::aql::AstNode const*,
triagens::aql::Variable const*) const override; triagens::aql::Variable const*,
bool const) const override;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------