Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions src/core/CLucene/index/MultiSegmentReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -757,6 +757,33 @@ bool MultiTermDocs::readRange(DocRange* docRange) {
}
}

bool MultiTermDocs::readBlock(DocRange* docRange) {
while (true) {
while (current == NULL) {
if (pointer < subReaders->length) {
base = starts[pointer];
current = termDocs(pointer++);
} else {
return false;
}
}
if (!current->readBlock(docRange)) {
current = nullptr;
} else {
if (docRange->doc_many && docRange->doc_many_size_ > 0) {
auto begin = docRange->doc_many->begin();
auto end = docRange->doc_many->begin() + docRange->doc_many_size_;
std::transform(begin, end, begin, [this](int32_t val) { return val + base; });
}
if (docRange->type_ == DocRangeType::kRange) {
docRange->doc_range.first += base;
docRange->doc_range.second += base;
}
return true;
}
}
}

bool MultiTermDocs::skipTo(const int32_t target) {
// do {
// if (!next())
Expand All @@ -775,6 +802,54 @@ bool MultiTermDocs::skipTo(const int32_t target) {
}
}

bool MultiTermDocs::skipToBlock(const int32_t target) {
bool switched_reader = false;
while (true) {
while (current == NULL) {
if (pointer < subReaders->length) {
base = starts[pointer];
current = termDocs(pointer++);
} else {
return true;
}
}

if (target >= starts[pointer]) {
current = nullptr;
switched_reader = true;
continue;
}

// A child without a skip list returns false even though switching readers
// invalidates the caller's cached block metadata.
return switched_reader || current->skipToBlock(target - base);
}
}

int32_t MultiTermDocs::getMaxBlockFreq() {
return current != NULL ? current->getMaxBlockFreq() : -1;
}

int32_t MultiTermDocs::getMaxBlockNorm() {
return current != NULL ? current->getMaxBlockNorm() : -1;
}

int32_t MultiTermDocs::getLastDocInBlock() {
if (current == NULL) {
return LUCENE_INT32_MAX_SHOULDBE;
}

int32_t lastDoc = current->getLastDocInBlock();
if (lastDoc == -1) {
return -1;
}
if (lastDoc == LUCENE_INT32_MAX_SHOULDBE) {
return pointer < subReaders->length ? starts[pointer] - 1
: LUCENE_INT32_MAX_SHOULDBE;
}
return base + lastDoc;
}

void MultiTermDocs::close() {
//Func - Closes all MultiTermDocs managed by this instance
//Pre - true
Expand Down
3 changes: 2 additions & 1 deletion src/core/CLucene/index/SegmentTermDocs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,8 @@ bool SegmentTermDocs::skipToBlock(const int32_t target) {
freqStream->seek(skipListReader->getFreqPointer());
skipProx(skipListReader->getProxPointer(), skipListReader->getPayloadLength());
_doc = skipListReader->getDoc();
count = newCount;
// -1 means the target is in the first skip block and no postings were skipped.
count = newCount < 0 ? 0 : newCount;
return true;
}
return false;
Expand Down
6 changes: 6 additions & 0 deletions src/core/CLucene/index/_MultiSegmentReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -173,9 +173,15 @@ class MultiTermDocs:public virtual TermDocs {
int32_t read(int32_t* docs, int32_t* freqs, int32_t length);
int32_t read(int32_t* docs, int32_t* freqs, int32_t* norms , int32_t length);
bool readRange(DocRange* docRange) override;
bool readBlock(DocRange* docRange) override;

/* A Possible future optimization could skip entire segments */
bool skipTo(const int32_t target);
bool skipToBlock(const int32_t target) override;

int32_t getMaxBlockFreq() override;
int32_t getMaxBlockNorm() override;
int32_t getLastDocInBlock() override;


void close();
Expand Down
Loading