Class: Ragdoll::Api::V1::AnalyticsController

Inherits:
BaseController
  • Object
show all
Defined in:
app/controllers/ragdoll/api/v1/analytics_controller.rb

Instance Method Summary collapse

Instance Method Details

#indexObject



7
8
9
10
11
12
13
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
43
44
45
46
47
48
49
50
51
52
53
54
# File 'app/controllers/ragdoll/api/v1/analytics_controller.rb', line 7

def index
  analytics_data = {
    document_stats: {
      total_documents: ::Ragdoll::Document.count,
      processed_documents: ::Ragdoll::Document.where(status: 'processed').count,
      failed_documents: ::Ragdoll::Document.where(status: 'failed').count,
      pending_documents: ::Ragdoll::Document.where(status: 'pending').count,
      total_embeddings: ::Ragdoll::Embedding.count
    },
    
    search_stats: {
      total_searches: ::Ragdoll::Search.count,
      unique_queries: ::Ragdoll::Search.distinct.count(:query),
      searches_today: ::Ragdoll::Search.where(created_at: Date.current.beginning_of_day..Date.current.end_of_day).count,
      searches_this_week: ::Ragdoll::Search.where(created_at: Date.current.beginning_of_week..Date.current.end_of_day).count,
      average_similarity: ::Ragdoll::Search.where.not(avg_similarity_score: nil).average(:avg_similarity_score)&.round(3) || 0
    },
    
    popular_queries: ::Ragdoll::Search.group(:query).count.sort_by { |query, count| -count }.first(10).to_h,
    
    document_types: ::Ragdoll::Document.group(:document_type).count,
    
    top_documents: ::Ragdoll::Embedding
      .joins("JOIN ragdoll_contents ON ragdoll_contents.id = ragdoll_embeddings.embeddable_id")
      .joins("JOIN ragdoll_documents ON ragdoll_documents.id = ragdoll_contents.document_id")
      .group('ragdoll_documents.title')
      .order('SUM(ragdoll_embeddings.usage_count) DESC')
      .limit(10)
      .sum(:usage_count),
    
    search_trends: (6.days.ago.to_date..Date.current).map do |date|
      count = ::Ragdoll::Search.where(created_at: date.beginning_of_day..date.end_of_day).count
      [date.strftime('%m/%d'), count]
    end.to_h,
    
    embedding_usage: ::Ragdoll::Embedding
      .joins("JOIN ragdoll_contents ON ragdoll_contents.id = ragdoll_embeddings.embeddable_id")
      .joins("JOIN ragdoll_documents ON ragdoll_documents.id = ragdoll_contents.document_id")
      .group('ragdoll_documents.title')
      .order('SUM(ragdoll_embeddings.usage_count) DESC')
      .limit(10)
      .sum(:usage_count),
    
    similarity_distribution: build_similarity_distribution
  }
  
  render json: analytics_data
end