Skip to content

Instantly share code, notes, and snippets.

@antirez
Created September 10, 2010 17:35

Revisions

  1. antirez revised this gist Sep 13, 2010. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions compl1.rb
    Original file line number Diff line number Diff line change
    @@ -31,7 +31,7 @@ def complete(r,prefix,count)
    while results.length != count
    range = r.zrange(:compl,start,start+rangelen-1)
    start += rangelen
    break if range.length == 0
    break if !range or range.length == 0
    range.each {|entry|
    minlen = [entry.length,prefix.length].min
    if entry[0...minlen] != prefix[0...minlen]
    @@ -46,6 +46,6 @@ def complete(r,prefix,count)
    return results
    end

    complete(r,"mar",10).each{|res|
    complete(r,"marcell",50).each{|res|
    puts res
    }
  2. antirez revised this gist Sep 13, 2010. 1 changed file with 4 additions and 2 deletions.
    6 changes: 4 additions & 2 deletions compl1.rb
    Original file line number Diff line number Diff line change
    @@ -30,10 +30,12 @@ def complete(r,prefix,count)
    return [] if !start
    while results.length != count
    range = r.zrange(:compl,start,start+rangelen-1)
    start += rangelen
    break if range.length == 0
    range.each {|entry|
    if entry.length >= prefix.length and entry[0...prefix.length] != prefix
    count = results.length
    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
  3. antirez revised this gist Sep 13, 2010. 1 changed file with 5 additions and 2 deletions.
    7 changes: 5 additions & 2 deletions compl1.rb
    Original file line number Diff line number Diff line change
    @@ -32,7 +32,10 @@ def complete(r,prefix,count)
    range = r.zrange(:compl,start,start+rangelen-1)
    break if range.length == 0
    range.each {|entry|
    break if entry.length >= prefix.length and entry[0...prefix.length] != prefix
    if entry.length >= prefix.length and entry[0...prefix.length] != prefix
    count = results.length
    break
    end
    if entry[-1..-1] == "*" and results.length != count
    results << entry[0...-1]
    end
    @@ -41,6 +44,6 @@ def complete(r,prefix,count)
    return results
    end

    complete(r,"marce",10).each{|res|
    complete(r,"mar",10).each{|res|
    puts res
    }
  4. antirez revised this gist Sep 13, 2010. 1 changed file with 2 additions and 1 deletion.
    3 changes: 2 additions & 1 deletion compl1.rb
    Original file line number Diff line number Diff line change
    @@ -32,6 +32,7 @@ def complete(r,prefix,count)
    range = r.zrange(:compl,start,start+rangelen-1)
    break if range.length == 0
    range.each {|entry|
    break if entry.length >= prefix.length and entry[0...prefix.length] != prefix
    if entry[-1..-1] == "*" and results.length != count
    results << entry[0...-1]
    end
    @@ -40,6 +41,6 @@ def complete(r,prefix,count)
    return results
    end

    complete(r,"mar",10).each{|res|
    complete(r,"marce",10).each{|res|
    puts res
    }
  5. antirez created this gist Sep 10, 2010.
    45 changes: 45 additions & 0 deletions compl1.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,45 @@
    # 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)
    break if range.length == 0
    range.each {|entry|
    if entry[-1..-1] == "*" and results.length != count
    results << entry[0...-1]
    end
    }
    end
    return results
    end

    complete(r,"mar",10).each{|res|
    puts res
    }