Class: RailsErrorDashboard::Queries::SimilarErrors

Inherits:
Object
  • Object
show all
Defined in:
lib/rails_error_dashboard/queries/similar_errors.rb

Overview

Find errors similar to a target error using fuzzy matching

Uses SimilarityCalculator to compute similarity scores based on:

  • Backtrace pattern similarity (70% weight)

  • Message similarity (30% weight)

Returns errors with similarity >= threshold, sorted by score descending

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(error_id, threshold: 0.6, limit: 10) ⇒ SimilarErrors

Returns a new instance of SimilarErrors.



23
24
25
26
27
# File 'lib/rails_error_dashboard/queries/similar_errors.rb', line 23

def initialize(error_id, threshold: 0.6, limit: 10)
  @error_id = error_id
  @threshold = threshold.to_f
  @limit = limit.to_i
end

Class Method Details

.call(error_id, threshold: 0.6, limit: 10) ⇒ Array<Hash>

Find similar errors

Parameters:

  • error_id (Integer)

    ID of target error

  • threshold (Float) (defaults to: 0.6)

    Minimum similarity score (0.0-1.0), default 0.6

  • limit (Integer) (defaults to: 10)

    Maximum number of results, default 10

Returns:

  • (Array<Hash>)

    Array of ErrorLog, similarity: Float



19
20
21
# File 'lib/rails_error_dashboard/queries/similar_errors.rb', line 19

def self.call(error_id, threshold: 0.6, limit: 10)
  new(error_id, threshold: threshold, limit: limit).find_similar
end

Instance Method Details

#find_similarObject



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/rails_error_dashboard/queries/similar_errors.rb', line 29

def find_similar
  target_error = ErrorLog.find_by(id: @error_id)
  return [] unless target_error

  # Find candidate errors to compare
  candidates = find_candidates(target_error)

  # Calculate similarity scores
  similar_errors = candidates.map do |candidate|
    score = Services::SimilarityCalculator.call(target_error, candidate)
    next if score < @threshold

    {
      error: candidate,
      similarity: score.round(3)
    }
  end.compact

  # Sort by similarity score (highest first) and limit results
  similar_errors.sort_by { |item| -item[:similarity] }.first(@limit)
end