Class: EntityCache

Inherits:
Object
  • Object
show all
Includes:
Log::Dependency
Defined in:
lib/entity_cache/log.rb,
lib/entity_cache/error.rb,
lib/entity_cache/record.rb,
lib/entity_cache/defaults.rb,
lib/entity_cache/substitute.rb,
lib/entity_cache/controls/id.rb,
lib/entity_cache/entity_cache.rb,
lib/entity_cache/controls/time.rb,
lib/entity_cache/controls/entity.rb,
lib/entity_cache/controls/record.rb,
lib/entity_cache/controls/subject.rb,
lib/entity_cache/controls/version.rb,
lib/entity_cache/storage/temporary.rb,
lib/entity_cache/storage/persistent.rb,
lib/entity_cache/storage/persistent/none.rb,
lib/entity_cache/storage/temporary/build.rb,
lib/entity_cache/controls/persist_interval.rb,
lib/entity_cache/controls/storage/temporary.rb,
lib/entity_cache/controls/storage/persistent.rb,
lib/entity_cache/storage/persistent/telemetry.rb,
lib/entity_cache/storage/persistent/substitute.rb,
lib/entity_cache/storage/temporary/scope/error.rb,
lib/entity_cache/storage/temporary/scope/shared.rb,
lib/entity_cache/storage/temporary/scope/defaults.rb,
lib/entity_cache/storage/temporary/scope/exclusive.rb

Direct Known Subclasses

Substitute::EntityCache

Defined Under Namespace

Modules: Controls, Defaults, Storage, Substitute Classes: Log, Record

Constant Summary collapse

Error =
Class.new(RuntimeError)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#persist_interval ⇒ Object

Returns the value of attribute persist_interval.



6
7
8
# File 'lib/entity_cache/entity_cache.rb', line 6

def persist_interval
  @persist_interval
end

Class Method Details

.build(subject, scope: nil, persistent_store: nil, persist_interval: nil, session: nil) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/entity_cache/entity_cache.rb', line 12

def self.build(subject, scope: nil, persistent_store: nil, persist_interval: nil, session: nil)
  unless persistent_store.nil? == persist_interval.nil?
    raise Error, "Must specify both the persistent store and persist interval, or neither"
  end

  persistent_store ||= Defaults.persistent_store

  instance = new
  instance.persist_interval = persist_interval

  Clock::UTC.configure instance
  Storage::Temporary.configure(instance, subject, scope: scope)

  persistent_store.configure(instance, subject, session: session)

  instance
end

Instance Method Details

#get(id) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/entity_cache/entity_cache.rb', line 30

def get(id)
  logger.trace { "Reading cache (ID: #{id.inspect})" }

  record = temporary_store.get id
  record ||= restore id

  if record.nil?
    logger.info { "Cache miss (ID: #{id.inspect})" }
    return nil
  end

  logger.info { "Cache hit (ID: #{id.inspect}, Entity Class: #{record.entity.class.name}, Version: #{record.version.inspect}, Time: #{record.time})" }

  record
end

#put(id, entity, version, persisted_version = nil, persisted_time = nil, time: nil) ⇒ Object



46
47
48
49
50
51
52
53
54
# File 'lib/entity_cache/entity_cache.rb', line 46

def put(id, entity, version, persisted_version=nil, persisted_time=nil, time: nil)
  time ||= clock.iso8601(precision: 5)

  record = Record.new(id, entity, version, time, persisted_version, persisted_time)

  put_record(record)

  record
end

#put_record(record) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/entity_cache/entity_cache.rb', line 56

def put_record(record)
  logger.trace { "Writing cache (ID: #{record.id}, Entity Class: #{record.entity.class.name}, Version: #{record.version.inspect}, Time: #{record.time}, Persistent Version: #{record.persisted_version.inspect}, Persistent Time: #{record.persisted_time.inspect})" }

  if persist_interval && record.versions_since_persisted >= persist_interval
    persisted_time = clock.iso8601(precision: 5)

    persistent_store.put record.id, record.entity, record.version, persisted_time

    record.persisted_version = record.version
    record.persisted_time = persisted_time
  end

  logger.info { "Cache written (ID: #{record.id}, Entity Class: #{record.entity.class.name}, Version: #{record.version.inspect}, Time: #{record.time}, Persistent Version: #{record.persisted_version.inspect}, Persistent Time: #{record.persisted_time.inspect})" }

  temporary_store.put record
end

#restore(id) ⇒ Object



73
74
75
76
77
78
79
80
81
82
# File 'lib/entity_cache/entity_cache.rb', line 73

def restore(id)
  entity, persisted_version, persisted_time = persistent_store.get(id)

  return nil if entity.nil?

  version = persisted_version
  time = persisted_time

  put(id, entity, version, persisted_version, persisted_time, time: time)
end