module Risky::SecondaryIndexes

Public Class Methods

included(base) click to toggle source
# File lib/risky/secondary_indexes.rb, line 3
def self.included(base)
  base.extend ClassMethods
end
new(key = nil, values = {}, indexes2i = {}) click to toggle source

Instance methods

Calls superclass method
# File lib/risky/secondary_indexes.rb, line 129
def initialize(key = nil, values = {}, indexes2i = {})
  super((key.nil? ? nil : key.to_s), values)

  # Parse anything not parsed correctly by Yajl (no support for json_create)
  self.class.values.each do |k,v|
    if self[k].is_a?(Hash) && self[k]['json_class']
      klass = Risky::Inflector.constantize(self[k]['json_class'])
      self[k] = klass.send(:json_create, self[k])
    end
  end

  @indexes2i = {}

  indexes2i.each do |k,v|
    send(k.to_s + '=', v)
  end
end

Public Instance Methods

indexes2i() click to toggle source
# File lib/risky/secondary_indexes.rb, line 189
def indexes2i
  @indexes2i
end
inspect() click to toggle source
# File lib/risky/secondary_indexes.rb, line 193
def inspect
  "#<#{self.class} #{key} #{@indexes2i.inspect} #{@values.inspect}>"
end
load_riak_object(riak_object, opts = {:merge => true}) click to toggle source
Calls superclass method
# File lib/risky/secondary_indexes.rb, line 164
def load_riak_object(riak_object, opts = {:merge => true})
  super(riak_object, opts)

  # Parse anything not parsed correctly by Yajl (no support for json_create)
  self.class.values.each do |k,v|
    if self[k].is_a?(Hash) && self[k]['json_class']
      klass = Risky::Inflector.constantize(self[k]['json_class'])
      self[k] = klass.send(:json_create, self[k])
    end
  end

  self.class.indexes2i.each do |k, v|
    case v[:type]
    when :int
      @indexes2i[k] = v[:multi] ? @riak_object.indexes["#{k}_int"].map(&:to_i) : @riak_object.indexes["#{k}_int"].first.to_i
    when :bin
      @indexes2i[k] = v[:multi] ? @riak_object.indexes["#{k}_bin"].map(&:to_s) : @riak_object.indexes["#{k}_bin"].first.to_s
    else
      raise TypeError, "Invalid 2i type '#{v[:type]}' for index #{k} on #{self.class.name}"
    end
  end

  self
end
save(opts = {}) click to toggle source
Calls superclass method
# File lib/risky/secondary_indexes.rb, line 147
def save(opts = {})
  self.class.indexes2i.each do |k, v|
    raise ArgumentError, "Nil for index #{k} on #{self.class.name}" if (v[:multi] ? @indexes2i[k].nil? : @indexes2i[k].blank?) && !v[:allow_nil]

    case v[:type]
    when :int
      @riak_object.indexes["#{k}_int"] = v[:multi] && @indexes2i[k].respond_to?(:map) ? @indexes2i[k].map(&:to_i) : [ @indexes2i[k].to_i ]
    when :bin
      @riak_object.indexes["#{k}_bin"] = v[:multi] && @indexes2i[k].respond_to?(:map) ? @indexes2i[k].map(&:to_s) : [ @indexes2i[k].to_s ]
    else
      raise TypeError, "Invalid 2i type '#{v[:type]}' for index #{k} on #{self.class.name}"
    end
  end

  super(opts)
end