Support for vizjsons versions on invalidation and purge

pull/6977/head
Juan Ignacio Sánchez Lara 9 years ago
parent 7885dda2e6
commit cbe9892b59

@ -68,6 +68,7 @@ WORKING_SPECS_1 = \
spec/lib/carto/http_header_authentication_spec.rb \
spec/lib/carto/users_metadata_redis_cache_spec.rb \
spec/lib/carto/http/client_spec.rb \
spec/helpers/redis_vizjson_cache_spec.rb \
spec/helpers/uuidhelper_spec.rb \
spec/helpers/url_validator_spec.rb \
spec/models/carto/bi_dataset_spec.rb \

@ -12,22 +12,20 @@ module CartoDB
end
def cached(visualization_id, https_flag = false)
key = key(visualization_id, https_flag)
key = key(visualization_id, https_flag, @vizjson_version)
value = redis.get(key)
if value.present?
return JSON.parse(value, symbolize_names: true)
JSON.parse(value, symbolize_names: true)
else
result = yield
serialized = JSON.generate(result)
redis.setex(key, 24.hours.to_i, serialized)
return result
result
end
end
def invalidate(visualization_id)
VIZJSON_VERSION_KEY.values.each do |vizjson_version_key|
redis.del [key(visualization_id, false, vizjson_version_key), key(visualization_id, true, vizjson_version_key)]
end
purge_ids([visualization_id])
end
def key(visualization_id, https_flag = false, vizjson_version = @vizjson_version)
@ -35,13 +33,19 @@ module CartoDB
end
def purge(vizs)
return unless vizs.count > 0
keys = vizs.map { |v| [key(v.id, false), key(v.id, true)] }.flatten
redis.del keys
purge_ids(vizs.map(&:id))
end
private
def purge_ids(ids)
return unless ids.count > 0
keys = VIZJSON_VERSION_KEY.keys.map { |vizjson_version|
ids.map { |id| [key(id, false, vizjson_version), key(id, true, vizjson_version)] }.flatten
}.flatten
redis.del keys
end
VIZJSON_VERSION_KEY = {
2 => '',
3 => '3'

@ -7,5 +7,9 @@ module Carto
!(Regexp.new(%r{\A#{UUIDTools::UUID_REGEXP}\Z}) =~ text).nil?
end
def random_uuid
UUIDTools::UUID.timestamp_create.to_s
end
end
end

@ -0,0 +1,54 @@
require_relative '../../app/helpers/redis_vizjson_cache'
require 'mock_redis'
require 'ostruct'
require_relative '../support/redis_test_doubles'
require_relative '../../lib/carto/uuidhelper'
describe CartoDB::Visualization::RedisVizjsonCache do
include Carto::UUIDHelper
# http and https
PROTOCOL_KEYS_COUNT = 2
# v2 and v3
VIZJSON_VERSION_COUNT = 2
KEYS_PER_VISUALIZATION = PROTOCOL_KEYS_COUNT * VIZJSON_VERSION_COUNT
let(:redis_spy) { RedisDoubles::RedisSpy.new }
let(:redis_mock) { MockRedis.new }
describe '#invalidate' do
it 'deletes all keys from a visualization' do
visualization_id = random_uuid
cache = CartoDB::Visualization::RedisVizjsonCache.new(redis_spy)
cache.invalidate(visualization_id)
deleted = redis_spy.deleted
deleted.count.should eq KEYS_PER_VISUALIZATION
deleted.count { |d| d.match(/http$/) }.should eq VIZJSON_VERSION_COUNT
deleted.count { |d| d.match(/https$/) }.should eq VIZJSON_VERSION_COUNT
deleted.count { |d| d.match(/#{visualization_id}/) }.should eq KEYS_PER_VISUALIZATION
end
end
describe '#purge' do
it 'deletes all keys from all visualizations from redis' do
vs = [OpenStruct.new(id: random_uuid), OpenStruct.new(id: random_uuid)]
cache = CartoDB::Visualization::RedisVizjsonCache.new(redis_spy)
cache.purge(vs)
deleted = redis_spy.deleted
deleted.count.should eq vs.count * KEYS_PER_VISUALIZATION
deleted.count { |d| d.match(/http$/) }.should eq vs.count * VIZJSON_VERSION_COUNT
deleted.count { |d| d.match(/https$/) }.should eq vs.count * VIZJSON_VERSION_COUNT
deleted.count { |d| d.match(/#{vs[0].id}/) }.should eq KEYS_PER_VISUALIZATION
deleted.count { |d| d.match(/#{vs[1].id}/) }.should eq KEYS_PER_VISUALIZATION
end
end
end

@ -0,0 +1,13 @@
module RedisDoubles
class RedisSpy
attr_reader :deleted
def initialize
@deleted = []
end
def del(keys)
@deleted.concat(keys)
end
end
end
Loading…
Cancel
Save