Class: Ferret::Index::MultiTermDocEnum
- Inherits:
-
TermDocEnum
- Object
- TermDocEnum
- Ferret::Index::MultiTermDocEnum
- Defined in:
- lib/ferret/index/multi_reader.rb
Direct Known Subclasses
Instance Attribute Summary collapse
-
#base ⇒ Object
Returns the value of attribute base.
-
#current ⇒ Object
Returns the value of attribute current.
-
#pointer ⇒ Object
Returns the value of attribute pointer.
-
#readers ⇒ Object
Returns the value of attribute readers.
-
#starts ⇒ Object
Returns the value of attribute starts.
-
#term ⇒ Object
Returns the value of attribute term.
Instance Method Summary collapse
- #close ⇒ Object
- #doc ⇒ Object
- #freq ⇒ Object
-
#initialize(readers, starts) ⇒ MultiTermDocEnum
constructor
A new instance of MultiTermDocEnum.
- #next? ⇒ Boolean
-
#read(docs, freqs) ⇒ Object
Optimized implementation.
- #seek(term) ⇒ Object
-
#skip_to(target) ⇒ Object
As yet unoptimized implementation.
- #term_docs(i) ⇒ Object
- #term_docs_from_reader(reader) ⇒ Object
Constructor Details
#initialize(readers, starts) ⇒ MultiTermDocEnum
Returns a new instance of MultiTermDocEnum.
265 266 267 268 269 270 271 272 |
# File 'lib/ferret/index/multi_reader.rb', line 265 def initialize(readers, starts) @readers = readers @starts = starts @base = 0 @pointer = 0 @reader_term_docs = Array.new(readers.length) end |
Instance Attribute Details
#base ⇒ Object
Returns the value of attribute base.
263 264 265 |
# File 'lib/ferret/index/multi_reader.rb', line 263 def base @base end |
#current ⇒ Object
Returns the value of attribute current.
263 264 265 |
# File 'lib/ferret/index/multi_reader.rb', line 263 def current @current end |
#pointer ⇒ Object
Returns the value of attribute pointer.
263 264 265 |
# File 'lib/ferret/index/multi_reader.rb', line 263 def pointer @pointer end |
#readers ⇒ Object
Returns the value of attribute readers.
263 264 265 |
# File 'lib/ferret/index/multi_reader.rb', line 263 def readers @readers end |
#starts ⇒ Object
Returns the value of attribute starts.
263 264 265 |
# File 'lib/ferret/index/multi_reader.rb', line 263 def starts @starts end |
#term ⇒ Object
Returns the value of attribute term.
263 264 265 |
# File 'lib/ferret/index/multi_reader.rb', line 263 def term @term end |
Instance Method Details
#close ⇒ Object
356 357 358 359 360 |
# File 'lib/ferret/index/multi_reader.rb', line 356 def close() @reader_term_docs.compact.each do |rtd| rtd.close() end end |
#doc ⇒ Object
274 275 276 |
# File 'lib/ferret/index/multi_reader.rb', line 274 def doc return @base + @current.doc() end |
#freq ⇒ Object
278 279 280 |
# File 'lib/ferret/index/multi_reader.rb', line 278 def freq return @current.freq() end |
#next? ⇒ Boolean
289 290 291 292 293 294 295 296 297 298 299 300 |
# File 'lib/ferret/index/multi_reader.rb', line 289 def next? if @current and @current.next? return true elsif @pointer < @readers.length @base = @starts[@pointer] @current = term_docs(@pointer) @pointer += 1 return next?() else return false end end |
#read(docs, freqs) ⇒ Object
Optimized implementation. Unlike the Java version, this method always returns as many results as it can read.
304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 |
# File 'lib/ferret/index/multi_reader.rb', line 304 def read(docs, freqs) got = 0 last_got = 0 needed = docs.length while (true) while @current.nil? if @pointer < @readers.length # try next segment @base = @starts[@pointer] @current = term_docs(@pointer) @pointer += 1 else return got end end got = @current.read(docs, freqs, got) if (got == last_got) # none left in segment @current = nil else # got some b = @base # adjust doc numbers (last_got...got).each {|i| docs[i] += b} if got == needed return got else last_got = got end end end end |
#seek(term) ⇒ Object
282 283 284 285 286 287 |
# File 'lib/ferret/index/multi_reader.rb', line 282 def seek(term) @term = term @base = 0 @pointer = 0 @current = nil end |
#skip_to(target) ⇒ Object
As yet unoptimized implementation.
335 336 337 338 339 340 |
# File 'lib/ferret/index/multi_reader.rb', line 335 def skip_to(target) begin return false if not next? end while target > doc() return true end |
#term_docs(i) ⇒ Object
342 343 344 345 346 347 348 349 350 |
# File 'lib/ferret/index/multi_reader.rb', line 342 def term_docs(i) return nil if (@term == nil) result = @reader_term_docs[i] if (result == nil) result = @reader_term_docs[i] = term_docs_from_reader(@readers[i]) end result.seek(@term) return result end |
#term_docs_from_reader(reader) ⇒ Object
352 353 354 |
# File 'lib/ferret/index/multi_reader.rb', line 352 def term_docs_from_reader(reader) return reader.term_docs() end |