@@ -13,15 +13,16 @@ use crate::{
1313 RecommendationsConversionRateResponse , RecommendationsPerUserResponse ,
1414 RecommendationsWithClicksCTRResponse , RecommendationsWithClicksCTRResponseClickhouse ,
1515 RecommendationsWithoutClicksCTRResponse , RecommendationsWithoutClicksCTRResponseClickhouse ,
16- SearchAnalyticsFilter , SearchCTRMetrics , SearchCTRMetricsClickhouse , SearchClusterTopics ,
17- SearchConversionRateResponse , SearchQueriesWithClicksCTRResponse ,
18- SearchQueriesWithClicksCTRResponseClickhouse , SearchQueriesWithoutClicksCTRResponse ,
19- SearchQueriesWithoutClicksCTRResponseClickhouse , SearchQueryEvent ,
20- SearchQueryEventClickhouse , SearchSortBy , SearchTypeCount , SearchesPerUserResponse ,
21- SortOrder , TopComponents , TopComponentsResponse , TopDatasetsResponse ,
22- TopDatasetsResponseClickhouse , TopPages , TopPagesResponse , TopicAnalyticsFilter ,
23- TopicAnalyticsSummaryClickhouse , TopicDetailsResponse , TopicQueriesResponse ,
24- TopicQueryClickhouse , TopicsOverTimeResponse , TotalUniqueUsersResponse ,
16+ SearchAnalyticsFilter , SearchAverageRatingResponse , SearchCTRMetrics ,
17+ SearchCTRMetricsClickhouse , SearchClusterTopics , SearchConversionRateResponse ,
18+ SearchQueriesWithClicksCTRResponse , SearchQueriesWithClicksCTRResponseClickhouse ,
19+ SearchQueriesWithoutClicksCTRResponse , SearchQueriesWithoutClicksCTRResponseClickhouse ,
20+ SearchQueryEvent , SearchQueryEventClickhouse , SearchSortBy , SearchTypeCount ,
21+ SearchesPerUserResponse , SortOrder , TopComponents , TopComponentsResponse ,
22+ TopDatasetsResponse , TopDatasetsResponseClickhouse , TopPages , TopPagesResponse ,
23+ TopicAnalyticsFilter , TopicAnalyticsSummaryClickhouse , TopicDetailsResponse ,
24+ TopicQueriesResponse , TopicQueryClickhouse , TopicsOverTimeResponse ,
25+ TotalUniqueUsersResponse ,
2526 } ,
2627 errors:: ServiceError ,
2728 handlers:: analytics_handler:: GetTopDatasetsRequestBody ,
@@ -2697,3 +2698,67 @@ pub async fn get_chat_average_rating_query(
26972698 points : chat_average_rating. into_iter ( ) . map ( |x| x. into ( ) ) . collect ( ) ,
26982699 } )
26992700}
2701+
2702+ pub async fn get_search_average_rating_query (
2703+ dataset_id : uuid:: Uuid ,
2704+ filter : Option < SearchAnalyticsFilter > ,
2705+ granularity : Option < Granularity > ,
2706+ clickhouse_client : & clickhouse:: Client ,
2707+ ) -> Result < SearchAverageRatingResponse , ServiceError > {
2708+ let interval = match granularity {
2709+ Some ( Granularity :: Second ) => "1 SECOND" ,
2710+ Some ( Granularity :: Minute ) => "1 MINUTE" ,
2711+ Some ( Granularity :: Hour ) => "1 HOUR" ,
2712+ Some ( Granularity :: Day ) => "1 DAY" ,
2713+ Some ( Granularity :: Month ) => "1 MONTH" ,
2714+ None => "1 HOUR" ,
2715+ } ;
2716+
2717+ let mut query_string = format ! (
2718+ "SELECT
2719+ CAST(toStartOfInterval(created_at, INTERVAL {}) AS DateTime) AS time_stamp,
2720+ avg(JSONExtract(search_queries.query_rating, 'rating', 'Float64')) as avg_rating
2721+ FROM search_queries
2722+ WHERE dataset_id = ? AND search_queries.query_rating != ''
2723+ " ,
2724+ interval,
2725+ ) ;
2726+
2727+ if let Some ( filter_params) = & filter {
2728+ query_string = filter_params. add_to_query ( query_string) ;
2729+ }
2730+
2731+ query_string. push_str (
2732+ "
2733+ GROUP BY
2734+ time_stamp
2735+ ORDER BY
2736+ time_stamp
2737+ LIMIT 1000" ,
2738+ ) ;
2739+
2740+ let search_average_rating = clickhouse_client
2741+ . query ( query_string. as_str ( ) )
2742+ . bind ( dataset_id)
2743+ . fetch_all :: < FloatTimePointClickhouse > ( )
2744+ . await
2745+ . map_err ( |e| {
2746+ log:: error!( "Error fetching search average rating: {:?}" , e) ;
2747+ ServiceError :: InternalServerError ( "Error fetching search average rating" . to_string ( ) )
2748+ } ) ?;
2749+
2750+ let avg_search_rating = if !search_average_rating. is_empty ( ) {
2751+ search_average_rating. iter ( ) . map ( |x| x. point ) . sum :: < f64 > ( )
2752+ / search_average_rating. len ( ) as f64
2753+ } else {
2754+ 0.0
2755+ } ;
2756+
2757+ Ok ( SearchAverageRatingResponse {
2758+ avg_search_rating,
2759+ points : search_average_rating
2760+ . into_iter ( )
2761+ . map ( |x| x. into ( ) )
2762+ . collect ( ) ,
2763+ } )
2764+ }
0 commit comments