Class: Ferret::Index::MultiTermDocEnum

Inherits:
TermDocEnum show all
Defined in:
lib/ferret/index/multi_reader.rb

Direct Known Subclasses

MultiTermDocPosEnum

Instance Attribute Summary collapse

Instance Method Summary collapse

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

#baseObject

Returns the value of attribute base.



263
264
265
# File 'lib/ferret/index/multi_reader.rb', line 263

def base
  @base
end

#currentObject

Returns the value of attribute current.



263
264
265
# File 'lib/ferret/index/multi_reader.rb', line 263

def current
  @current
end

#pointerObject

Returns the value of attribute pointer.



263
264
265
# File 'lib/ferret/index/multi_reader.rb', line 263

def pointer
  @pointer
end

#readersObject

Returns the value of attribute readers.



263
264
265
# File 'lib/ferret/index/multi_reader.rb', line 263

def readers
  @readers
end

#startsObject

Returns the value of attribute starts.



263
264
265
# File 'lib/ferret/index/multi_reader.rb', line 263

def starts
  @starts
end

#termObject

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

#closeObject



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

#docObject



274
275
276
# File 'lib/ferret/index/multi_reader.rb', line 274

def doc
  return @base + @current.doc()
end

#freqObject



278
279
280
# File 'lib/ferret/index/multi_reader.rb', line 278

def freq
  return @current.freq()
end

#next?Boolean

Returns:

  • (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