Class: ReuseQueryResults::Storage

Inherits:
Object
  • Object
show all
Defined in:
lib/reuse_query_results/storage.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(sync_client: nil) ⇒ Storage

Returns a new instance of Storage.



4
5
6
7
# File 'lib/reuse_query_results/storage.rb', line 4

def initialize(sync_client: nil)
  @sync_client = sync_client
  clear_all
end

Instance Attribute Details

#databasesObject (readonly)

Returns the value of attribute databases.



3
4
5
# File 'lib/reuse_query_results/storage.rb', line 3

def databases
  @databases
end

Instance Method Details

#add(database, tables, sql, result) ⇒ Object



9
10
11
# 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) ⇒ Object



21
22
23
24
25
26
27
28
29
# 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_allObject



13
14
15
16
17
18
19
# 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) ⇒ Object



40
41
42
43
# 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) ⇒ Object



45
46
47
48
49
50
# 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) ⇒ Object



31
32
33
34
35
36
37
38
# 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?Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/reuse_query_results/storage.rb', line 52

def sync_mode?
  !!@sync_client
end

#update_modified_timestamp(database, table) ⇒ Object



56
57
58
# 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) ⇒ Boolean

Returns:

  • (Boolean)


60
61
62
63
64
65
66
# 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