Class: ClaudeMemory::Core::ResultBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/claude_memory/core/result_builder.rb

Overview

Pure utility for building fact result hashes from batch-fetched data Follows Functional Core pattern - no I/O, just transformations

Class Method Summary collapse

Class Method Details

.build_results(fact_ids, facts_by_id:, receipts_by_fact_id:, source:, similarity: nil) ⇒ Array<Hash>

Build fact results from batch-fetched facts and receipts

Parameters:

  • fact_ids (Array<Integer>)

    Fact IDs to build results for

  • facts_by_id (Hash)

    Map of fact_id => fact_hash

  • receipts_by_fact_id (Hash)

    Map of fact_id => array of receipts

  • source (Symbol)

    Source identifier (:project, :global, :legacy)

  • similarity (Float, nil) (defaults to: nil)

    Optional similarity score

Returns:

  • (Array<Hash>)

    Array of result hashes with :fact, :receipts, :source, :similarity



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

def self.build_results(fact_ids, facts_by_id:, receipts_by_fact_id:, source:, similarity: nil)
  fact_ids.map do |fact_id|
    fact = facts_by_id[fact_id]
    next unless fact

    result = {
      fact: fact,
      receipts: receipts_by_fact_id[fact_id] || [],
      source: source
    }
    result[:similarity] = similarity if similarity
    result
  end.compact
end

.build_results_with_scores(matches, facts_by_id:, receipts_by_fact_id:, source:) ⇒ Array<Hash>

Build results with variable similarity scores

Parameters:

  • matches (Array<Hash>)

    Array of matches with :fact_id and :similarity

  • facts_by_id (Hash)

    Map of fact_id => fact_hash

  • receipts_by_fact_id (Hash)

    Map of fact_id => array of receipts

  • source (Symbol)

    Source identifier

Returns:

  • (Array<Hash>)

    Array of result hashes with varying similarity scores



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/claude_memory/core/result_builder.rb', line 36

def self.build_results_with_scores(matches, facts_by_id:, receipts_by_fact_id:, source:)
  matches.map do |match|
    fact_id = match[:fact_id] || match[:candidate]&.[](:fact_id)
    next unless fact_id

    fact = facts_by_id[fact_id]
    next unless fact

    {
      fact: fact,
      receipts: receipts_by_fact_id[fact_id] || [],
      source: source,
      similarity: match[:similarity]
    }
  end.compact
end