class Mindtrick::Set

Attributes

max_length[R]
max_terms[R]
prefix[R]
redis[R]

Public Class Methods

new(opts = {}) click to toggle source
# File lib/mindtrick/set.rb, line 5
def initialize(opts = {})
  @redis      = opts[:redis]      || Redis.new
  @prefix     = opts[:prefix]     || 'mndtrk'
  @max_terms  = opts[:max_terms]  || 250
  @max_length = opts[:max_length] || 15
end

Public Instance Methods

add(term) click to toggle source
# File lib/mindtrick/set.rb, line 12
def add(term)
  fragmentize(term) do |k|
    redis.zincrby(k, 1, term)
    enforce_term_limit(k)
  end
end
fragmentize(term) { |prefixed| ... } click to toggle source
# File lib/mindtrick/set.rb, line 28
def fragmentize(term)
  term = Text.new(term)
  term.each_fragment do |f|
    if f.length <= max_length
      yield f.prefixed(prefix)
    else
      break
    end
  end
end
seed(term) click to toggle source
# File lib/mindtrick/set.rb, line 19
def seed(term)
  fragmentize(term) do |k|
    unless redis.zscore(k, term)
      redis.zadd(k, 1, term)
      enforce_term_limit(k)
    end
  end
end
suggest(partial, count = 10) click to toggle source
# File lib/mindtrick/set.rb, line 39
def suggest(partial, count = 10)
  key = Text.new(partial).prefixed(prefix)
  redis.zrevrange key, 0, count
end

Private Instance Methods

enforce_term_limit(key) click to toggle source
# File lib/mindtrick/set.rb, line 46
def enforce_term_limit(key)
  if (over = redis.zcount(key, 0, '+inf') - max_terms) > 0
    partials = redis.zrange(key, 0, over * 3).sample(over)
    redis.zrem(key, partials)
  end
end