class Hikki::Adapters::RedisCollection

Attributes

connection[R]
uuid_generator[R]

Public Class Methods

new(collection, connection, uuid_generator) click to toggle source
Calls superclass method
# File lib/hikki/adapters/redis_collection.rb, line 6
def initialize(collection, connection, uuid_generator)
  super(collection)
  @connection = connection
  @uuid_generator = uuid_generator
end

Public Instance Methods

all(options={}) click to toggle source
# File lib/hikki/adapters/redis_collection.rb, line 28
def all(options={})
  options = normalize_options(options)
  connection.hvals(collection_key)[page_range(options)].map { |j| JSON.parse(j) }
end
find(id) click to toggle source
# File lib/hikki/adapters/redis_collection.rb, line 24
def find(id)
  JSON.parse(connection.hget(collection_key, id.to_s) || '{}')
end
find_by(field, value, options={}) click to toggle source
# File lib/hikki/adapters/redis_collection.rb, line 33
def find_by(field, value, options={})
  options = normalize_options(options)
  return find_by_index(field, value, options) if has_index?(field)
  all.select { |o| o.fetch(field.to_s) == value }[page_range(options)]
end
has_index?(field) click to toggle source
# File lib/hikki/adapters/redis_collection.rb, line 51
def has_index?(field)
  connection.sismember collection_indexes_key, field.to_s
end
id_for(data) click to toggle source
# File lib/hikki/adapters/redis_collection.rb, line 59
def id_for(data)
  data.fetch('id', uuid_generator.uuid).to_s
end
index(field) click to toggle source
# File lib/hikki/adapters/redis_collection.rb, line 12
def index(field)
  connection.sadd collection_indexes_key, field.to_s
  true
end
indexes() click to toggle source
# File lib/hikki/adapters/redis_collection.rb, line 55
def indexes
  connection.smembers collection_indexes_key
end
remove(id) click to toggle source
# File lib/hikki/adapters/redis_collection.rb, line 39
def remove(id)
  remove_from_index(find(id))
  connection.hdel collection_key, id.to_s
  true
end
remove_all() click to toggle source
# File lib/hikki/adapters/redis_collection.rb, line 45
def remove_all
  indexes.each { |field| connection.del collection_index_key(field) }
  connection.del collection_indexes_key
  connection.del collection_key
end
save(data) click to toggle source
# File lib/hikki/adapters/redis_collection.rb, line 17
def save(data)
  data = normalize_data(data)
  connection.hset collection_key, data['id'], data.to_json
  add_to_index(data)
  data
end

Private Instance Methods

add_to_index(data) click to toggle source
# File lib/hikki/adapters/redis_collection.rb, line 76
def add_to_index(data)
  indexes.each do |field|
    existing = indexed_ids(field, data[field])
    existing << data['id'] unless existing.include? data['id']
    connection.hset collection_index_key(field), data[field], existing.to_json
  end
end
collection_index_key(field) click to toggle source
# File lib/hikki/adapters/redis_collection.rb, line 68
def collection_index_key(field)
  "hikki:#{collection}:#{field.to_s}"
end
collection_indexes_key() click to toggle source
# File lib/hikki/adapters/redis_collection.rb, line 64
def collection_indexes_key
  "hikki:#{collection}:indexes"
end
collection_key() click to toggle source
# File lib/hikki/adapters/redis_collection.rb, line 72
def collection_key
  "hikki:#{collection}"
end
find_by_index(field, value, options) click to toggle source
# File lib/hikki/adapters/redis_collection.rb, line 97
def find_by_index(field, value, options)
  ids = indexed_ids(field, value)
  results = connection.pipelined { ids.each { |id| connection.hget collection_key, id } }
  results.map { |j| JSON.parse(j) }.reject { |v| v == {} }[page_range(options)]
end
indexed_ids(field, value) click to toggle source
# File lib/hikki/adapters/redis_collection.rb, line 93
def indexed_ids(field, value)
  JSON.parse(connection.hget(collection_index_key(field), value.to_s) || '[]')
end
remove_from_index(data) click to toggle source
# File lib/hikki/adapters/redis_collection.rb, line 84
def remove_from_index(data)
  return if data == {}
  indexes.each do |field|
    ids = indexed_ids(field, data[field])
    ids.delete(data['id'])
    connection.hset collection_index_key(field), data[field].to_s, ids.to_json
  end
end