You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
box-o-sand/redis-with-ruby/earthquakes.rb

82 lines
1.8 KiB

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