Class: RedisMemo::Memoizable::Dependency
- Inherits:
-
Object
- Object
- RedisMemo::Memoizable::Dependency
- Defined in:
- lib/redis_memo/memoizable/dependency.rb
Overview
A Directed Acyclic Graph (DAG) of Memoizables
Instance Attribute Summary collapse
-
#nodes ⇒ Object
Returns the value of attribute nodes.
Class Method Summary collapse
Instance Method Summary collapse
- #depends_on(dependency) ⇒ Object
-
#initialize ⇒ Dependency
constructor
A new instance of Dependency.
- #memos ⇒ Object
Constructor Details
#initialize ⇒ Dependency
Returns a new instance of Dependency.
7 8 9 |
# File 'lib/redis_memo/memoizable/dependency.rb', line 7 def initialize @nodes = {} end |
Instance Attribute Details
#nodes ⇒ Object
Returns the value of attribute nodes.
5 6 7 |
# File 'lib/redis_memo/memoizable/dependency.rb', line 5 def nodes @nodes end |
Class Method Details
.extract_from_relation(relation) ⇒ Object
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/redis_memo/memoizable/dependency.rb', line 47 def self.extract_from_relation(relation) connection = ActiveRecord::Base.connection unless connection.respond_to?(:dependency_of) raise RedisMemo::WithoutMemoization.new('Caching active record queries is currently disabled on RedisMemo') end # Extract the dependent memos of an Arel without calling exec_query to actually execute the query RedisMemo::MemoizeQuery::CachedSelect.with_new_query_context do query, binds, = connection.__send__(:to_sql_and_binds, relation.arel) RedisMemo::MemoizeQuery::CachedSelect.current_query = relation.arel is_query_cached = RedisMemo::MemoizeQuery::CachedSelect.extract_bind_params(query) unless is_query_cached raise RedisMemo::WithoutMemoization.new('Arel query is not cached using RedisMemo') end connection.dependency_of(:exec_query, query, nil, binds) end end |
Instance Method Details
#depends_on(dependency) ⇒ Object
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/redis_memo/memoizable/dependency.rb', line 15 def depends_on(dependency) case dependency when self.class nodes.merge!(dependency.nodes) when RedisMemo::Memoizable memo = dependency return if nodes.include?(memo.cache_key) nodes[memo.cache_key] = memo if memo.depends_on # Extract dependencies from the current memoizable and recurse instance_exec(&memo.depends_on) end when ActiveRecord::Relation extracted = self.class.extract_from_relation(dependency) nodes.merge!(extracted.nodes) when RedisMemo::MemoizeQuery::CachedSelect::BindParams dependency.params.each do |model, attrs_set| memo = model.redis_memo_class_memoizable nodes[memo.cache_key] = memo attrs_set.each do |attrs| memo = RedisMemo::MemoizeQuery.create_memo(model, **attrs) nodes[memo.cache_key] = memo end end else raise RedisMemo::ArgumentError.new("Invalid dependency #{dependency}") end end |
#memos ⇒ Object
11 12 13 |
# File 'lib/redis_memo/memoizable/dependency.rb', line 11 def memos @nodes.values end |