Class: Maglev::ContextAssembler

Inherits:
Object
  • Object
show all
Defined in:
lib/maglev/context_assembler.rb

Defined Under Namespace

Classes: Context

Instance Method Summary collapse

Constructor Details

#initialize(max_characters: nil, per_owner_characters: nil) ⇒ ContextAssembler

Returns a new instance of ContextAssembler.



7
8
9
10
11
12
# File 'lib/maglev/context_assembler.rb', line 7

def initialize(max_characters: nil, per_owner_characters: nil)
  max_characters ||= Maglev.configuration.context_max_characters
  per_owner_characters ||= Maglev.configuration.context_per_owner_characters
  @max_characters = max_characters
  @per_owner_characters = per_owner_characters
end

Instance Method Details

#assemble(results) ⇒ Object



14
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
# File 'lib/maglev/context_assembler.rb', line 14

def assemble(results)
  entries = []
  sources = []
  owner_characters = Hash.new(0)
  text_length = 0

  sorted_results(results).each do |result|
    marker = "[S#{sources.length + 1}]"
    content = redacted_content(result)
    entry = entry_for(result, marker, content)
    owner_key = owner_key(result.owner)

    next if owner_characters[owner_key] + content.length > @per_owner_characters
    next if text_length + separator_length(entries) + entry.length > @max_characters

    separator_length = separator_length(entries)
    entries << entry
    text_length += separator_length + entry.length
    owner_characters[owner_key] += content.length
    sources << source_for(result, marker, content)
  end

  text = entries.join("\n")
  Context.new(
    text: text,
    sources: sources,
    metadata: {context_characters: text.length, source_count: sources.length}
  )
end