Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
# compl1.rb - Redis autocomplete example
# download female-names.txt from http://antirez.com/misc/female-names.txt
require 'rubygems'
require 'redis'
r = Redis.new
# Create the completion sorted set
if !r.exists(:compl)
puts "Loading entries in the Redis DB\n"
File.new('female-names.txt').each_line{|n|
n.strip!
(1..(n.length)).each{|l|
prefix = n[0...l]
r.zadd(:compl,0,prefix)
}
r.zadd(:compl,0,n+"*")
}
else
puts "NOT loading entries, there is already a 'compl' key\n"
end
# Complete the string "mar"
def complete(r,prefix,count)
results = []
rangelen = 50 # This is not random, try to get replies < MTU size
start = r.zrank(:compl,prefix)
return [] if !start
while results.length != count
range = r.zrange(:compl,start,start+rangelen-1)
start += rangelen
break if !range or range.length == 0
range.each {|entry|
minlen = [entry.length,prefix.length].min
if entry[0...minlen] != prefix[0...minlen]
count = results.count
break
end
if entry[-1..-1] == "*" and results.length != count
results << entry[0...-1]
end
}
end
return results
end
complete(r,"marcell",50).each{|res|
puts res
}
@djanowski

This comment has been minimized.

Show comment Hide comment
@djanowski

djanowski Sep 14, 2010

Started to extract and cleanup a bit: http://github.com/djanowski/replete

Started to extract and cleanup a bit: http://github.com/djanowski/replete

@j4mie

This comment has been minimized.

Show comment Hide comment
@j4mie

j4mie Sep 15, 2010

Quick line-by-line (ish) port to Python: http://gist.github.com/577852

j4mie commented Sep 15, 2010

Quick line-by-line (ish) port to Python: http://gist.github.com/577852

@girishso

This comment has been minimized.

Show comment Hide comment
@girishso

girishso Sep 18, 2010

What is the advantage over loading the entries in memory (as a ruby constant) and use that constant for autocompletion? Assuming redis will hold the entries in memory.

What is the advantage over loading the entries in memory (as a ruby constant) and use that constant for autocompletion? Assuming redis will hold the entries in memory.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment