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