Class: Franz::Sash

Inherits:
Object
  • Object
show all
Defined in:
lib/franz/sash.rb

Overview

Sash - A threadsafe hash/array hybrid with access times

Think of it like a Hash where the keys map to “value buffers”

Examples:

s = Sash.new           # => #<Sash...>
s.keys                 # => []
s.insert :key, :value  # => value
s.get :key             # => [:value]
s.insert :key, :crazy  # => :crazy
s.mtime :key           # => 2014-02-18 21:24:30 -0800
s.flush :key           # => [:value, :crazy]

Instance Method Summary collapse

Constructor Details

#initializeSash

Create a new, empty Sash.



20
21
22
23
24
25
# File 'lib/franz/sash.rb', line 20

def initialize
  @mutex = Mutex.new
  @mtime = Hash.new { |default, key| default[key] = nil }
  @hash  = Hash.new { |default, key| default[key] = []  }
  @size  = Hash.new { |default, key| default[key] = 0   }
end

Instance Method Details

#flush(key) ⇒ Array<Object>

Flush and return a key’s value buffer.

Parameters:

  • key (Object)

Returns:

  • (Array<Object>)


81
82
83
84
85
86
87
88
89
90
# File 'lib/franz/sash.rb', line 81

def flush key
  value = nil
  @mutex.synchronize do
    value       = @hash[key]
    @hash[key]  = []
    @size[key]  = 0
    @mtime[key] = Time.now
  end
  return value
end

#get(key) ⇒ Array<Object>

Return a key’s value buffer.

Parameters:

  • key (Object)

Returns:

  • (Array<Object>)


57
# File 'lib/franz/sash.rb', line 57

def get key ; @hash[key] end

#insert(key, value) ⇒ Object

Insert a value into a key’s value buffer.

Parameters:

  • key (Object)
  • value (Object)

Returns:

  • (Object)

    the value



43
44
45
46
47
48
49
50
# File 'lib/franz/sash.rb', line 43

def insert key, value
  @mutex.synchronize do
    @hash[key] << value
    @size[key] += 1
    @mtime[key] = Time.now
  end
  return value
end

#keysArray<Object>

Grab a list of known keys.

Returns:

  • (Array<Object>)


30
# File 'lib/franz/sash.rb', line 30

def keys ; @hash.keys end

#lengthInteger

Return the number of keys.

Returns:

  • (Integer)


35
# File 'lib/franz/sash.rb', line 35

def length ; keys.length ; end

#mtime(key) ⇒ Time

Return the last time the key’s value buffer was modified.

Parameters:

  • key (Object)

Returns:

  • (Time)


74
# File 'lib/franz/sash.rb', line 74

def mtime key ; @mtime[key] end

#remove(key) ⇒ Array<Object>

Remove and return a key’s value buffer.

Parameters:

  • key (Object)

Returns:

  • (Array<Object>)


64
65
66
67
# File 'lib/franz/sash.rb', line 64

def remove key
  @size[key] -= 1
  @hash.delete(key)
end

#size(key) ⇒ Integer

Return the size of a key’s value buffer.

Parameters:

  • key (Object)

Returns:

  • (Integer)


97
98
99
# File 'lib/franz/sash.rb', line 97

def size key
  @size[key]
end