1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "pagedict4_mem_rand_reader.h"
namespace search::diskindex::test {
PageDict4MemRandReader::PageDict4MemRandReader(uint32_t chunkSize, uint64_t numWordIds,
ThreeLevelCountWriteBuffers &wb)
: _decoders(chunkSize, numWordIds),
_buffers(_decoders.ssd, _decoders.spd, _decoders.pd, wb),
_ssr(_buffers._rcssd,
wb._ssHeaderLen, wb._ssFileBitSize,
wb._spHeaderLen, wb._spFileBitSize,
wb._pHeaderLen, wb._pFileBitSize),
_spData(reinterpret_cast<const char *>(_buffers._rcspd.getComprBuf())),
_pData(reinterpret_cast<const char *>(_buffers._rcpd.getComprBuf())),
_pageSize(search::bitcompression::PageDict4PageParams::getPageByteSize())
{
_ssr.setup(_decoders.ssd);
}
PageDict4MemRandReader::~PageDict4MemRandReader() = default;
bool
PageDict4MemRandReader::lookup(const std::string &key, uint64_t &wordNum,
PostingListCounts &counts, StartOffset &offsets)
{
PageDict4SSLookupRes sslr;
sslr = _ssr.lookup(key);
if (!sslr._res) {
counts.clear();
offsets = sslr._l6StartOffset;
wordNum = sslr._l6WordNum;
return false;
}
if (sslr._overflow) {
wordNum = sslr._l6WordNum;
counts = sslr._counts;
offsets = sslr._startOffset;
return true;
}
PageDict4SPLookupRes splr;
splr.lookup(_ssr,
_spData +
_pageSize * sslr._sparsePageNum,
key,
sslr._l6Word,
sslr._lastWord,
sslr._l6StartOffset,
sslr._l6WordNum,
sslr._pageNum);
PageDict4PLookupRes plr;
plr.lookup(_ssr,
_pData + _pageSize * splr._pageNum,
key,
splr._l3Word,
splr._lastWord,
splr._l3StartOffset,
splr._l3WordNum);
wordNum = plr._wordNum;
offsets = plr._startOffset;
if (plr._res) {
counts = plr._counts;
return true;
}
counts.clear();
return false;
}
}
|