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