Class: RailsErrorDashboard::Queries::SimilarErrors
- Inherits:
-
Object
- Object
- RailsErrorDashboard::Queries::SimilarErrors
- 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
-
.call(error_id, threshold: 0.6, limit: 10) ⇒ Array<Hash>
Find similar errors.
Instance Method Summary collapse
- #find_similar ⇒ Object
-
#initialize(error_id, threshold: 0.6, limit: 10) ⇒ SimilarErrors
constructor
A new instance of SimilarErrors.
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
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_similar ⇒ Object
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 |