diff options
| author | mo khan <mo.khan@gmail.com> | 2020-05-15 09:12:49 -0600 |
|---|---|---|
| committer | mo khan <mo.khan@gmail.com> | 2020-05-15 09:12:49 -0600 |
| commit | e14f8086b5d64ac5e643e524279bb2ccc627ee7c (patch) | |
| tree | 1f38016b7d29db07d6b52c27098ab175702ad279 /lib | |
| parent | f1a6736ed78c9fb48645f45505b57b61cc71c822 (diff) | |
Load from in memory index
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/spandx/core/index_file.rb | 55 | ||||
| -rw-r--r-- | lib/spandx/core/relation.rb | 7 |
2 files changed, 46 insertions, 16 deletions
diff --git a/lib/spandx/core/index_file.rb b/lib/spandx/core/index_file.rb index a99a5dd..ba059ca 100644 --- a/lib/spandx/core/index_file.rb +++ b/lib/spandx/core/index_file.rb @@ -8,6 +8,7 @@ module Spandx def initialize(data_file) @data_file = data_file @path = Pathname.new("#{data_file.absolute_path}.lines") + @entries = {} end def each @@ -41,11 +42,23 @@ module Spandx end def size + #path.exist? ? path.size / 2 : (data&.size || 0) data&.size || 0 end def position_for(row_number) - data[row_number] + #puts [row_number, data.size].inspect + data.fetch(row_number) + + #@entries.fetch(row_number) do |key| + #offset = row_number * 2 + #@entries[key] = IO.read(path, 2, offset, mode: 'rb').unpack1('v') + + ##@entries[key] = File.open(path, mode: 'rb') do |io| + ##io.seek(row_number * 2) + ##io.read(2).unpack1('v') + ##end + #end end def scan @@ -58,7 +71,7 @@ module Spandx return unless data_file.exist? sort(data_file) - rebuild_index! + #rebuild_index! end private @@ -73,36 +86,50 @@ module Spandx def rebuild_index! data_file.open_file do |data_io| - File.open(path, mode: 'w') do |index_io| - lines_in(data_io).each_with_index do |line, index| - index_io.pwrite([line].pack('v'), index * 2) + File.open(path, mode: 'wb') do |index_io| + lines = lines_in(data_io) + lines.each do |pos| + #puts [pos].inspect + data_io.seek(pos) + x = data_io.gets + puts ['bidx', pos, x].inspect + index_io.write([pos].pack('v')) end end end end def load - return build_index_from_data_file unless path.exist? - - load_index_file + return build_index_from_data_file # unless path.exist? + + #puts 'read index file' + #[].tap do |items| + #i = 0 + #each_index do |position| + ##puts ['ridx', i, position].inspect + #i+=1 + #items << position + #end + #end end def build_index_from_data_file data_file.open_file { |io| lines_in(io) } end - def load_index_file - [].tap do |items| - File.open(path, mode: 'rb') do |io| - items << io.read(2).unpack1('v') until io.eof? - end + def each_index + File.open(path, mode: 'rb') do |io| + yield io.read(2).unpack1('v') until io.eof? end end def lines_in(io) lines = [0] io.seek(0) - lines << io.pos while io.gets + while (x = io.gets) + #puts ['widx', x, io.pos, x.size].inspect + lines << io.pos + end lines.pop if lines.size > 1 lines end diff --git a/lib/spandx/core/relation.rb b/lib/spandx/core/relation.rb index a8bd2fe..9f5ded1 100644 --- a/lib/spandx/core/relation.rb +++ b/lib/spandx/core/relation.rb @@ -21,8 +21,11 @@ module Spandx end def row(number) - io.seek(index.position_for(number)) - parse_row(io.gets) + offset = index.position_for(number) + io.seek(offset) + x = parse_row(io.gets) + #puts ['row', number, offset, x].inspect + x end private |
