require 'csv' require 'redis/connection/hiredis' require 'redis' require 'logger' require 'open-uri' class Earthquakes DATA_URL = 'http://earthquake.usgs.gov/earthquakes/catalogs/eqs7day-M1.txt' attr_accessor :id_set, :region_set def initialize @redis = Redis.new @id_set = 'earthquakes' @region_set = 'earthquake-regions' @logger = Logger.new(STDOUT) @logger.formatter = proc do |severity, datetime, progname, msg| "#{datetime}: #{msg}\n" end end def get_info(earthquake_id) if not /^eqid:/.match(earthquake_id) earthquake_id = "eqid:#{earthquake_id}" end @redis.hgetall(earthquake_id) end def all_ids @redis.smembers(@id_set).map { |i| i.gsub(/^eqid:/, '') } end def all_regions @redis.smembers(@region_set).map { |r| r.gsub(/^eqregion:/, '') } end def drop_all @logger.info('Removing data for each earthquake') all_ids.each do |i| @logger.info("Removing data for earthquake #{i.gsub(/^eqid:/, '')}") @redis.del(i) end @logger.info('Removing earthquake id set') @redis.del(@id_set) @logger.info('Removing earthquake region set') @redis.del(@region_set) end def load_data data = CSV.parse( open(DATA_URL).read, :headers => true, :header_converters => [:symbol] ) data.each do |row| @redis.multi do |r| @logger.info("Adding earthquake #{row[:eqid]}") key = "eqid:#{row[:eqid].downcase}" r.sadd(@id_set, key) row.headers.each do |header| r.hset(key, header.downcase, row[header]) end region_key = "eqregion:#{row[:region].downcase}" r.sadd(region_key, key) r.sadd(@region_set, region_key) end end end end if $0 == __FILE__ Earthquakes.new.send(ARGV.first) end