//===--- Iterator.cpp - Query Symbol Retrieval ------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "Iterator.h" #include "llvm/ADT/STLExtras.h" #include <algorithm> #include <cassert> #include <numeric> namespace clang { namespace clangd { namespace dex { namespace { /// Implements Iterator over the intersection of other iterators. /// /// AndIterator iterates through common items among all children. It becomes /// exhausted as soon as any child becomes exhausted. After each mutation, the /// iterator restores the invariant: all children must point to the same item. class AndIterator : public Iterator { … }; /// Implements Iterator over the union of other iterators. /// /// OrIterator iterates through all items which can be pointed to by at least /// one child. To preserve the sorted order, this iterator always advances the /// child with smallest Child->peek() value. OrIterator becomes exhausted as /// soon as all of its children are exhausted. class OrIterator : public Iterator { … }; /// TrueIterator handles PostingLists which contain all items of the index. It /// stores size of the virtual posting list, and all operations are performed /// in O(1). class TrueIterator : public Iterator { … }; /// FalseIterator yields no results. class FalseIterator : public Iterator { … }; /// Boost iterator is a wrapper around its child which multiplies scores of /// each retrieved item by a given factor. class BoostIterator : public Iterator { … }; /// This iterator limits the number of items retrieved from the child iterator /// on top of the query tree. To ensure that query tree with LIMIT iterators /// inside works correctly, users have to call Root->consume(Root->peek()) each /// time item is retrieved at the root of query tree. class LimitIterator : public Iterator { … }; } // end namespace std::vector<std::pair<DocID, float>> consume(Iterator &It) { … } std::unique_ptr<Iterator> Corpus::intersect(std::vector<std::unique_ptr<Iterator>> Children) const { … } std::unique_ptr<Iterator> Corpus::unionOf(std::vector<std::unique_ptr<Iterator>> Children) const { … } std::unique_ptr<Iterator> Corpus::all() const { … } std::unique_ptr<Iterator> Corpus::none() const { … } std::unique_ptr<Iterator> Corpus::boost(std::unique_ptr<Iterator> Child, float Factor) const { … } std::unique_ptr<Iterator> Corpus::limit(std::unique_ptr<Iterator> Child, size_t Limit) const { … } } // namespace dex } // namespace clangd } // namespace clang