lib/parsley-store.rb in parsley-store-0.1.5 vs lib/parsley-store.rb in parsley-store-0.2.0
- old
+ new
@@ -9,24 +9,52 @@
def initialize(local_db = LOCAL, slave_db = SLAVE)
@parser = ScientificNameParser.new
@local = Redis.new
@local.select(local_db)
- # slave replication is not set up yet, so I comment it out
- # @slave = Redis.new
- # @slave.select(slave_db)
end
- def parse(scientific_name)
- stored = @local.get(scientific_name)
- return JSON.parse(stored, :symbolize_names => true) if stored
+ def parse(scientific_name, opts = {})
+ @canonical_only = !!opts[:canonical_only]
+ @scientific_name = scientific_name
+
+ parsed_data = get_redis_data
+ return parsed_data if parsed_data
+
+ cache_parsed_data(parse_scientific_name)
+ end
+
+ private
+
+ def get_redis_data
+ if @canonical_only
+ stored = @local.hget(@scientific_name, 'canonical')
+ return stored if stored
+ else
+ stored = @local.get(@scientific_name)
+ return JSON.parse(stored, :symbolize_names => true) if stored
+ end
+ end
+
+ def parse_scientific_name
begin
- parsed = @parser.parse(scientific_name)
+ @parser.parse(@scientific_name)
rescue
@parser = ScientificNameParser.new
- parsed = @parser.parse(scientific_name)
+ @parser.parse(@scientific_name)
end
- serialized = parsed.to_json
- @local.set scientific_name, serialized
- parsed
end
+
+ def cache_parsed_data(parsed_data)
+ if @canonical_only
+ @local.hset @scientific_name, 'parsed', parsed_data[:scientificName][:parsed]
+ @local.hset @scientific_name, 'parser_version', parsed_data[:scientificName][:parser_version]
+ @local.hset @scientific_name, 'canonical', parsed_data[:scientificName][:canonical]
+ parsed_data[:scientificName][:canonical]
+ else
+ serialized = parsed_data.to_json
+ @local.set @scientific_name, serialized
+ parsed_data
+ end
+ end
+
end