Class: Engram::Adapters::InMemoryStore
- Inherits:
-
Object
- Object
- Engram::Adapters::InMemoryStore
- Includes:
- Ports::MemoryStore
- Defined in:
- lib/engram/adapters/in_memory_store.rb
Overview
In-process MemoryStore. Used as the zero-config default and in unit tests. Search is exact cosine similarity over the stored vectors.
Instance Method Summary collapse
- #add(record) ⇒ Object
- #all(scope:) ⇒ Object
- #clear ⇒ Object
- #delete(id:) ⇒ Object
-
#initialize ⇒ InMemoryStore
constructor
A new instance of InMemoryStore.
- #search(embedding:, scope:, limit:, kinds: nil) ⇒ Object
- #touch(id:, at: Time.now) ⇒ Object
- #update(id:, record:) ⇒ Object
Constructor Details
#initialize ⇒ InMemoryStore
Returns a new instance of InMemoryStore.
10 11 12 13 |
# File 'lib/engram/adapters/in_memory_store.rb', line 10 def initialize @records = {} @sequence = 0 end |
Instance Method Details
#add(record) ⇒ Object
15 16 17 18 19 20 21 |
# File 'lib/engram/adapters/in_memory_store.rb', line 15 def add(record) validate_scope!(record.scope) record.id ||= (@sequence += 1) @records[record.id] = record record end |
#all(scope:) ⇒ Object
35 36 37 |
# File 'lib/engram/adapters/in_memory_store.rb', line 35 def all(scope:) @records.values.select { |r| r.scope == scope } end |
#clear ⇒ Object
56 57 58 59 |
# File 'lib/engram/adapters/in_memory_store.rb', line 56 def clear @records.clear @sequence = 0 end |
#delete(id:) ⇒ Object
46 47 48 |
# File 'lib/engram/adapters/in_memory_store.rb', line 46 def delete(id:) @records.delete(id) end |
#search(embedding:, scope:, limit:, kinds: nil) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/engram/adapters/in_memory_store.rb', line 23 def search(embedding:, scope:, limit:, kinds: nil) allowed_kinds = normalize_kinds(kinds) @records .values .select { |r| searchable?(r, scope, allowed_kinds) } .map { |r| [r, Engram::Math.cosine_similarity(, r.)] } .sort_by { |(_, score)| -score } .first(limit) .map { |(record, _)| record } end |
#touch(id:, at: Time.now) ⇒ Object
50 51 52 53 54 |
# File 'lib/engram/adapters/in_memory_store.rb', line 50 def touch(id:, at: Time.now) record = @records[id] record.last_accessed_at = at if record record end |