@@ -19,7 +19,7 @@ namespace Lucene
19
19
this ->haveSkipped = false ;
20
20
this ->lastDoc = 0 ;
21
21
this ->lastChildPointer = 0 ;
22
-
22
+
23
23
this ->skipStream = Collection<IndexInputPtr>::newInstance (maxSkipLevels);
24
24
this ->skipPointer = Collection<int64_t >::newInstance (maxSkipLevels);
25
25
this ->childPointer = Collection<int64_t >::newInstance (maxSkipLevels);
@@ -30,28 +30,28 @@ namespace Lucene
30
30
this ->inputIsBuffered = boost::dynamic_pointer_cast<BufferedIndexInput>(skipStream);
31
31
this ->skipInterval [0 ] = skipInterval;
32
32
this ->skipDoc = Collection<int32_t >::newInstance (maxSkipLevels);
33
-
33
+
34
34
MiscUtils::arrayFill (this ->skipPointer .begin (), 0 , this ->skipPointer .size (), 0 );
35
35
MiscUtils::arrayFill (this ->childPointer .begin (), 0 , this ->childPointer .size (), 0 );
36
36
MiscUtils::arrayFill (this ->numSkipped .begin (), 0 , this ->numSkipped .size (), 0 );
37
37
MiscUtils::arrayFill (this ->skipDoc .begin (), 0 , this ->skipDoc .size (), 0 );
38
-
38
+
39
39
for (int32_t i = 1 ; i < maxSkipLevels; ++i)
40
40
{
41
41
// cache skip intervals
42
42
this ->skipInterval [i] = this ->skipInterval [i - 1 ] * skipInterval;
43
43
}
44
44
}
45
-
45
+
46
46
MultiLevelSkipListReader::~MultiLevelSkipListReader ()
47
47
{
48
48
}
49
-
49
+
50
50
int32_t MultiLevelSkipListReader::getDoc ()
51
51
{
52
52
return lastDoc;
53
53
}
54
-
54
+
55
55
int32_t MultiLevelSkipListReader::skipTo (int32_t target)
56
56
{
57
57
if (!haveSkipped)
@@ -60,12 +60,12 @@ namespace Lucene
60
60
loadSkipLevels ();
61
61
haveSkipped = true ;
62
62
}
63
-
63
+
64
64
// walk up the levels until highest level is found that has a skip for this target
65
65
int32_t level = 0 ;
66
66
while (level < numberOfSkipLevels - 1 && target > skipDoc[level + 1 ])
67
67
++level;
68
-
68
+
69
69
while (level >= 0 )
70
70
{
71
71
if (target > skipDoc[level])
@@ -76,22 +76,22 @@ namespace Lucene
76
76
else
77
77
{
78
78
// no more skips on this level, go down one level
79
- if (level > 0 && lastChildPointer > ( int32_t ) skipStream[level - 1 ]->getFilePointer ())
79
+ if (level > 0 && lastChildPointer > skipStream[level - 1 ]->getFilePointer ())
80
80
seekChild (level - 1 );
81
81
--level;
82
82
}
83
83
}
84
-
84
+
85
85
return numSkipped[0 ] - skipInterval[0 ] - 1 ;
86
86
}
87
-
87
+
88
88
bool MultiLevelSkipListReader::loadNextSkip (int32_t level)
89
89
{
90
90
// we have to skip, the target document is greater than the current skip list entry
91
91
setLastSkipData (level);
92
-
92
+
93
93
numSkipped[level] += skipInterval[level];
94
-
94
+
95
95
if (numSkipped[level] > docCount)
96
96
{
97
97
// this skip list is exhausted
@@ -100,19 +100,19 @@ namespace Lucene
100
100
numberOfSkipLevels = level;
101
101
return false ;
102
102
}
103
-
103
+
104
104
// read next skip entry
105
105
skipDoc[level] += readSkipData (level, skipStream[level]);
106
-
106
+
107
107
if (level != 0 )
108
108
{
109
109
// read the child pointer if we are not on the leaf level
110
110
childPointer[level] = skipStream[level]->readVLong () + skipPointer[level - 1 ];
111
111
}
112
-
112
+
113
113
return true ;
114
114
}
115
-
115
+
116
116
void MultiLevelSkipListReader::seekChild (int32_t level)
117
117
{
118
118
skipStream[level]->seek (lastChildPointer);
@@ -121,7 +121,7 @@ namespace Lucene
121
121
if (level > 0 )
122
122
childPointer[level] = skipStream[level]->readVLong () + skipPointer[level - 1 ];
123
123
}
124
-
124
+
125
125
void MultiLevelSkipListReader::close ()
126
126
{
127
127
for (Collection<IndexInputPtr>::iterator skip = skipStream.begin (); skip != skipStream.end (); ++skip)
@@ -130,38 +130,38 @@ namespace Lucene
130
130
(*skip)->close ();
131
131
}
132
132
}
133
-
133
+
134
134
void MultiLevelSkipListReader::init (int64_t skipPointer, int32_t df)
135
135
{
136
136
this ->skipPointer [0 ] = skipPointer;
137
137
this ->docCount = df;
138
138
MiscUtils::arrayFill (skipDoc.begin (), 0 , skipDoc.size (), 0 );
139
139
MiscUtils::arrayFill (numSkipped.begin (), 0 , numSkipped.size (), 0 );
140
140
MiscUtils::arrayFill (childPointer.begin (), 0 , childPointer.size (), 0 );
141
-
141
+
142
142
haveSkipped = false ;
143
143
for (int32_t i = 1 ; i < numberOfSkipLevels; ++i)
144
144
skipStream[i].reset ();
145
145
}
146
-
146
+
147
147
void MultiLevelSkipListReader::loadSkipLevels ()
148
148
{
149
149
numberOfSkipLevels = docCount == 0 ? 0 : (int32_t )std::floor (std::log ((double )docCount) / std::log ((double )skipInterval[0 ]));
150
150
if (numberOfSkipLevels > maxNumberOfSkipLevels)
151
151
numberOfSkipLevels = maxNumberOfSkipLevels;
152
-
152
+
153
153
skipStream[0 ]->seek (skipPointer[0 ]);
154
-
154
+
155
155
int32_t toBuffer = numberOfLevelsToBuffer;
156
-
156
+
157
157
for (int32_t i = numberOfSkipLevels - 1 ; i > 0 ; --i)
158
158
{
159
159
// the length of the current level
160
160
int64_t length = skipStream[0 ]->readVLong ();
161
-
161
+
162
162
// the start pointer of the current level
163
163
skipPointer[i] = skipStream[0 ]->getFilePointer ();
164
-
164
+
165
165
if (toBuffer > 0 )
166
166
{
167
167
// buffer this level
@@ -174,60 +174,60 @@ namespace Lucene
174
174
skipStream[i] = boost::dynamic_pointer_cast<IndexInput>(skipStream[0 ]->clone ());
175
175
if (inputIsBuffered && length < BufferedIndexInput::BUFFER_SIZE)
176
176
boost::dynamic_pointer_cast<BufferedIndexInput>(skipStream[i])->setBufferSize ((int32_t )length);
177
-
177
+
178
178
// move base stream beyond the current level
179
179
skipStream[0 ]->seek (skipStream[0 ]->getFilePointer () + length);
180
180
}
181
181
}
182
-
182
+
183
183
// use base stream for the lowest level
184
184
skipPointer[0 ] = skipStream[0 ]->getFilePointer ();
185
185
}
186
-
186
+
187
187
void MultiLevelSkipListReader::setLastSkipData (int32_t level)
188
188
{
189
189
lastDoc = skipDoc[level];
190
190
lastChildPointer = childPointer[level];
191
191
}
192
-
192
+
193
193
SkipBuffer::SkipBuffer (IndexInputPtr input, int32_t length)
194
194
{
195
195
pos = 0 ;
196
196
data = ByteArray::newInstance (length);
197
197
pointer = input->getFilePointer ();
198
198
input->readBytes (data.get (), 0 , length);
199
199
}
200
-
200
+
201
201
SkipBuffer::~SkipBuffer ()
202
202
{
203
203
}
204
-
204
+
205
205
void SkipBuffer::close ()
206
206
{
207
207
data.reset ();
208
208
}
209
-
209
+
210
210
int64_t SkipBuffer::getFilePointer ()
211
211
{
212
212
return (pointer + pos);
213
213
}
214
-
214
+
215
215
int64_t SkipBuffer::length ()
216
216
{
217
217
return data.size ();
218
218
}
219
-
219
+
220
220
uint8_t SkipBuffer::readByte ()
221
221
{
222
222
return data[pos++];
223
223
}
224
-
224
+
225
225
void SkipBuffer::readBytes (uint8_t * b, int32_t offset, int32_t length)
226
226
{
227
227
MiscUtils::arrayCopy (data.get (), pos, b, offset, length);
228
228
pos += length;
229
229
}
230
-
230
+
231
231
void SkipBuffer::seek (int64_t pos)
232
232
{
233
233
this ->pos = (int32_t )(pos - pointer);
0 commit comments