class DbmsBuffers::LRUBuffer

The LRUBuffer applies least recently used as eviction strategy. For this, it saves the time of the last access with each buffered value.

Attributes

size[R]

Public Class Methods

new(size) click to toggle source
# File lib/dbms_buffers/lru.rb, line 11
def initialize(size)
  @size = size
  @buffer = []
  @time = 0
end

Public Instance Methods

access(value) click to toggle source
# File lib/dbms_buffers/lru.rb, line 17
def access(value)
  @time += 1
  try_touch(value) || try_insert_new(value) || try_replace(value)
end
contains?(value) click to toggle source
# File lib/dbms_buffers/lru.rb, line 26
def contains?(value)
  @buffer.any? { |entry| value == entry.value }
end
entries() click to toggle source
# File lib/dbms_buffers/lru.rb, line 22
def entries
  @buffer.clone
end
used() click to toggle source
# File lib/dbms_buffers/lru.rb, line 30
def used
  @buffer.size
end

Private Instance Methods

index(value) click to toggle source
# File lib/dbms_buffers/lru.rb, line 59
def index(value)
  @buffer.index { |entry| entry.value == value }
end
oldest_entry() click to toggle source
# File lib/dbms_buffers/lru.rb, line 63
def oldest_entry
  @buffer.min { |entry_a, entry_b| entry_a.timestamp <=> entry_b.timestamp }
end
touch(value) click to toggle source
# File lib/dbms_buffers/lru.rb, line 67
def touch(value)
  @buffer.find { |entry| entry.value == value }.timestamp = @time
end
try_insert_new(value) click to toggle source
# File lib/dbms_buffers/lru.rb, line 42
def try_insert_new(value)
  return false if used == @size

  entry = LRUBufferEntry.new(value, @time)
  @buffer << entry

  true
end
try_replace(value) click to toggle source
# File lib/dbms_buffers/lru.rb, line 51
def try_replace(value)
  entry = oldest_entry
  entry.value = value
  entry.timestamp = @time

  true
end
try_touch(value) click to toggle source
# File lib/dbms_buffers/lru.rb, line 36
def try_touch(value)
  result = contains? value
  touch(value) if result
  result
end