Class: EntityCache

Inherits:
Object
  • Object
show all
Includes:
Log::Dependency
Defined in:
lib/entity_cache/log.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/store/external.rb,
lib/entity_cache/store/internal.rb,
lib/entity_cache/controls/entity.rb,
lib/entity_cache/controls/record.rb,
lib/entity_cache/record/log_text.rb,
lib/entity_cache/controls/subject.rb,
lib/entity_cache/controls/version.rb,
lib/entity_cache/record/destructure.rb,
lib/entity_cache/record/transformer.rb,
lib/entity_cache/store/external/null.rb,
lib/entity_cache/store/internal/build.rb,
lib/entity_cache/controls/store/external.rb,
lib/entity_cache/controls/store/internal.rb,
lib/entity_cache/store/external/telemetry.rb,
lib/entity_cache/controls/persist_interval.rb,
lib/entity_cache/store/external/substitute.rb,
lib/entity_cache/store/internal/substitute.rb,
lib/entity_cache/store/internal/scope/global.rb,
lib/entity_cache/store/internal/scope/thread.rb,
lib/entity_cache/controls/store/external/write.rb,
lib/entity_cache/store/internal/build/defaults.rb,
lib/entity_cache/store/internal/scope/exclusive.rb,
lib/entity_cache/controls/store/external/example.rb,
lib/entity_cache/controls/store/external/not_implemented.rb

Direct Known Subclasses

Substitute::EntityCache

Defined Under Namespace

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

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#persist_interval ⇒ Object



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

def persist_interval
  @persist_interval ||= Defaults.persist_interval
end

Class Method Details

.build(subject, scope: nil, persist_interval: nil, external_store: nil, external_store_session: nil) ⇒ Object



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

def self.build(subject, scope: nil, persist_interval: nil, external_store: nil, external_store_session: nil)
  instance = new

  instance.configure(
    subject: subject,
    scope: scope,
    persist_interval: persist_interval,
    external_store: external_store,
    external_store_session: external_store_session
  )

  instance
end

Instance Method Details

#configure(subject:, scope: nil, persist_interval: nil, external_store: nil, external_store_session: nil) ⇒ Object



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

def configure(subject:, scope: nil, persist_interval: nil, external_store: nil, external_store_session: nil)
  external_store ||= Store::External::Null

  unless persist_interval.nil?
    self.persist_interval = persist_interval
  end

  Store::Internal.configure(self, subject, scope: scope)

  external_store.configure(self, subject, session: external_store_session)

  Clock::UTC.configure(self)
end

#get(id) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/entity_cache/entity_cache.rb', line 43

def get(id)
  logger.trace { "Get entity (ID: #{id.inspect})" }

  record = internal_store.get(id)

  if record.nil?
    record = restore(id)
  end

  if record.nil?
    logger.info { "Get entity failed; cache miss (ID: #{id.inspect}, #{Record::LogText.get(record)})" }
  else
    logger.info { "Get entity done (ID: #{id.inspect}, #{Record::LogText.get(record)})" }
  end

  record
end

#persist?(version, persisted_version) ⇒ Boolean

Returns:

  • (Boolean)


115
116
117
118
119
120
121
# File 'lib/entity_cache/entity_cache.rb', line 115

def persist?(version, persisted_version)
  persisted_version ||= -1

  age_versions = version - persisted_version

  age_versions >= persist_interval
end

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



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/entity_cache/entity_cache.rb', line 61

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

  updated_external_store = false

  record = Record.build(id, entity, version, time)

  logger.trace { "Put entity (ID: #{id.inspect}, #{Record::LogText.get(record)}, Persist Interval: #{persist_interval.inspect})" }

  if persist?(version, persisted_version)
    external_store.put(id, entity, version, time)

    persisted_version = version
    persisted_time = time
    updated_external_store = true
  end

  record.persisted_version = persisted_version
  record.persisted_time = persisted_time

  internal_store.put(record)

  logger.info { "Put entity done (ID: #{id.inspect}, #{Record::LogText.get(record)}, Persist Interval: #{persist_interval.inspect}, Updated External Store: #{updated_external_store})" }

  record
end

#restore(id) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/entity_cache/entity_cache.rb', line 88

def restore(id)
  logger.trace { "Restoring entity (ID: #{id.inspect})" }

  entity, version, time = external_store.get(id)

  if entity.nil?
    logger.debug { "Could not restore entity (ID: #{id.inspect})" }

    return nil
  end

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

  internal_store.put(record)

  logger.debug { "Restored entity (ID: #{id.inspect}, #{Record::LogText.get(record)})" }

  record
end