Class: ReuseQueryResults::Storage
- Inherits:
-
Object
- Object
- ReuseQueryResults::Storage
- Defined in:
- lib/reuse_query_results/storage.rb
Instance Attribute Summary collapse
-
#databases ⇒ Object
readonly
Returns the value of attribute databases.
Instance Method Summary collapse
- #add(database, tables, sql, result) ⇒ Object
- #clear(database, table) ⇒ Object
- #clear_all ⇒ Object
- #clear_and_execute(database, table, &block) ⇒ Object
- #fetch(database, tables, sql) ⇒ Object
- #fetch_or_execute(database, tables, sql, &block) ⇒ Object
-
#initialize(sync_client: nil) ⇒ Storage
constructor
A new instance of Storage.
- #sync_mode? ⇒ Boolean
- #update_modified_timestamp(database, table) ⇒ Object
- #updated?(database, tables, cached_timestamp) ⇒ Boolean
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
#databases ⇒ Object (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? (database, table) end |
#clear_all ⇒ Object
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
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 (database, table) @sync_client.write("#{database}+#{table}", Time.now.to_i) end |
#updated?(database, tables, cached_timestamp) ⇒ Boolean
60 61 62 63 64 65 66 |
# File 'lib/reuse_query_results/storage.rb', line 60 def updated?(database, tables, ) tables.any? do |table| next unless = @sync_client.read("#{database}+#{table}") next if < next true end end |