Sha256: 836c112f0130c2ddfe2d82f2c8e958e277852c7ebaef08b489ffcdf74733eb02

Contents?: true

Size: 1.87 KB

Versions: 4

Compression:

Stored size: 1.87 KB

Contents

module Lunar
  class Index
    attr :ns
  
    def self.create(prefix)
      new(prefix).tap { |i| yield i }.index
    end

    def self.delete(prefix, key)
      new(prefix).tap { |i| i.key key }.delete 
    end

    def initialize(prefix, redis = nil)
      @ns    = Lunar.nest[prefix]
      @attrs = {}
      @redis = (redis || Lunar.redis)
      @numeric_attrs = {}
    end

    def key(key = nil)
      @key = key if key
      @key
    end

    def attrs=(attrs)
      attrs.each { |k, v| attr k, v } 
    end

    def attr(field, value = nil)
      @attrs[field.to_sym] = value if value
      @attrs[field.to_sym]
    end

    def numeric_attr(field, value = nil)
      @numeric_attrs[field.to_sym] = value if value
      @numeric_attrs[field.to_sym]
    end
    alias :integer :numeric_attr
    alias :float   :numeric_attr

    def index
      index_str_attrs
      index_numeric_attrs

      return self
    end

    def delete
      keys = @redis.keys @ns[key]['*']
      keys.each do |k|
        field = k.gsub("#{ @ns[key] }:", '')
        words = @redis.smembers(k)
        words.each do |w|
          @redis.zrem @ns[field][Lunar.encode(w)], key
        end
        @redis.del k 
      end
    end

  protected
    def index_str_attrs
      @attrs.each do |field, value|
        scoring = Scoring.new(value)
        words   = []
        scoring.scores.each do |word, score|
          words << word
          @redis.zadd @ns[field][Lunar.encode(word)], score, key
          @redis.sadd @ns[key][field], word
        end

        unused_words = @redis.smembers(@ns[key][field]) - words
        unused_words.each do |word|
          @redis.zrem @ns[field][Lunar.encode(word)], key
          @redis.srem @ns[key][field], word
        end
      end
    end

    def index_numeric_attrs
      @numeric_attrs.each do |field, value|
        @redis.zadd @ns[field], value, key
      end
    end

  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
lunar-0.2.3 lib/lunar/index.rb
lunar-0.2.2 lib/lunar/index.rb
lunar-0.2.1 lib/lunar/index.rb
lunar-0.2.0 lib/lunar/index.rb