Class: RecordSearch::Search
- Inherits:
-
Object
- Object
- RecordSearch::Search
- Defined in:
- lib/recordsearch/search.rb
Constant Summary collapse
- INDEX_SIZE =
TODO is there a sizeof(long) ?
4
Instance Method Summary collapse
-
#close ⇒ Object
Close the files.
-
#initialize(db, db_idx = nil) ⇒ Search
constructor
Returns a new Search object.
-
#search(key) ⇒ Object
Searches object
key
in the file using binary search.
Constructor Details
#initialize(db, db_idx = nil) ⇒ Search
Returns a new Search object. db
is the file having the data used for your searches. db_idx
is the index created with RecordSearch#index if it’s nil, it will construct a filename appending ‘.idx’ to the value db
has.
11 12 13 14 15 16 17 |
# File 'lib/recordsearch/search.rb', line 11 def initialize(db, db_idx=nil) @db = File.open(db, 'r') db_idx = db + '.idx' if db_idx.nil? @db_idx = File.open(db_idx, 'r') @db_size = File.stat(db_idx).size / INDEX_SIZE @db_pos = 0 end |
Instance Method Details
#close ⇒ Object
Close the files.
20 21 22 23 24 |
# File 'lib/recordsearch/search.rb', line 20 def close @db.close @db_idx.close @db = @db_idx = nil end |
#search(key) ⇒ Object
Searches object key
in the file using binary search. If found returns what your implementation of parse returned, nil
otherwise.
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 |
# File 'lib/recordsearch/search.rb', line 28 def search(key) from = 0 to = @db_size - 1 pivot = nil while from < to middle = ((from + to) / 2).to_i pivot = read(middle) if lt(key, pivot) to = middle next elsif gt(key, pivot) from = middle + 1 next end result = nil result = pivot if eq(key, pivot) return result end if from == to pivot = read(from) return pivot if eq(pivot, pivot) end end |