Class: RedisMemo::Memoizable::Dependency

Inherits:
Object
  • Object
show all
Defined in:
lib/redis_memo/memoizable/dependency.rb

Overview

A Directed Acyclic Graph (DAG) of Memoizables

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeDependency

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

#nodesObject

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

#memosObject



11
12
13
# File 'lib/redis_memo/memoizable/dependency.rb', line 11

def memos
  @nodes.values
end