class ReuseQueryResults::Storage
Attributes
databases[R]
Public Class Methods
new(sync_client: nil)
click to toggle source
# File lib/reuse_query_results/storage.rb, line 4 def initialize(sync_client: nil) @sync_client = sync_client clear_all end
Public Instance Methods
add(database, tables, sql, result)
click to toggle source
# File lib/reuse_query_results/storage.rb, line 9 def add(database, tables, sql, result) @databases[database][tables][sql] = { data: result, timestamp: Time.now.to_i } end
clear(database, table)
click to toggle source
# File lib/reuse_query_results/storage.rb, line 21 def clear(database, table) @databases[database].keys.select { |tables| tables.include?(table) }.each { |tables| @databases[database][tables] = {} } return unless sync_mode? update_modified_timestamp(database, table) end
clear_all()
click to toggle source
# File lib/reuse_query_results/storage.rb, line 13 def clear_all @databases = Hash.new do |h, k| h[k] = Hash.new { |h2, k2| h2[k2] = {} } end return unless sync_mode? @sync_client.clear end
clear_and_execute(database, table, &block)
click to toggle source
# File lib/reuse_query_results/storage.rb, line 40 def clear_and_execute(database, table, &block) clear(database, table) block.call end
fetch(database, tables, sql)
click to toggle source
# File lib/reuse_query_results/storage.rb, line 45 def fetch(database, tables, sql) result = @databases[database][tables][sql] return nil unless result return result[:data] unless sync_mode? return updated?(database, tables, result[:timestamp]) ? nil : result[:data] end
fetch_or_execute(database, tables, sql, &block)
click to toggle source
# File lib/reuse_query_results/storage.rb, line 31 def fetch_or_execute(database, tables, sql, &block) cached_result = fetch(database, tables, sql) if cached_result Rails.logger.debug("REUSE CACHE: #{sql}") return cached_result end block.call.tap { |result| add(database, tables, sql, result) } end
sync_mode?()
click to toggle source
# File lib/reuse_query_results/storage.rb, line 52 def sync_mode? !!@sync_client end
update_modified_timestamp(database, table)
click to toggle source
# File lib/reuse_query_results/storage.rb, line 56 def update_modified_timestamp(database, table) @sync_client.write("#{database}+#{table}", Time.now.to_i) end
updated?(database, tables, cached_timestamp)
click to toggle source
# File lib/reuse_query_results/storage.rb, line 60 def updated?(database, tables, cached_timestamp) tables.any? do |table| next unless updated_timestamp = @sync_client.read("#{database}+#{table}") next if updated_timestamp < cached_timestamp next true end end