From 9d6da82e36b6fc1456e6112928cbbf41e41cbe4d Mon Sep 17 00:00:00 2001 From: Kristina Date: Tue, 20 Feb 2024 07:32:40 -0600 Subject: [PATCH] Query History: Count using SQL, not post query (#82208) * Count in SQL, not externally * Fix linter --- pkg/services/queryhistory/database.go | 10 ++++---- pkg/services/queryhistory/writers.go | 33 ++++++++++++++++++--------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/pkg/services/queryhistory/database.go b/pkg/services/queryhistory/database.go index 3d780481a01..a6357d48014 100644 --- a/pkg/services/queryhistory/database.go +++ b/pkg/services/queryhistory/database.go @@ -45,7 +45,7 @@ func (s QueryHistoryService) createQuery(ctx context.Context, user *user.SignedI // searchQueries searches for queries in query history based on provided parameters func (s QueryHistoryService) searchQueries(ctx context.Context, user *user.SignedInUser, query SearchInQueryHistoryQuery) (QueryHistorySearchResult, error) { var dtos []QueryHistoryDTO - var allQueries []any + var totalCount int if query.To <= 0 { query.To = s.now().Unix() @@ -73,7 +73,7 @@ func (s QueryHistoryService) searchQueries(ctx context.Context, user *user.Signe query_history.comment, query_history.queries, `) - writeStarredSQL(query, s.store, &dtosBuilder) + writeStarredSQL(query, s.store, &dtosBuilder, false) writeFiltersSQL(query, user, s.store, &dtosBuilder) writeSortSQL(query, s.store, &dtosBuilder) writeLimitSQL(query, s.store, &dtosBuilder) @@ -87,9 +87,9 @@ func (s QueryHistoryService) searchQueries(ctx context.Context, user *user.Signe countBuilder := db.SQLBuilder{} countBuilder.Write(`SELECT `) - writeStarredSQL(query, s.store, &countBuilder) + writeStarredSQL(query, s.store, &countBuilder, true) writeFiltersSQL(query, user, s.store, &countBuilder) - err = session.SQL(countBuilder.GetSQLString(), countBuilder.GetParams()...).Find(&allQueries) + _, err = session.SQL(countBuilder.GetSQLString(), countBuilder.GetParams()...).Get(&totalCount) return err }) @@ -99,7 +99,7 @@ func (s QueryHistoryService) searchQueries(ctx context.Context, user *user.Signe response := QueryHistorySearchResult{ QueryHistory: dtos, - TotalCount: len(allQueries), + TotalCount: totalCount, Page: query.Page, PerPage: query.Limit, } diff --git a/pkg/services/queryhistory/writers.go b/pkg/services/queryhistory/writers.go index 00199f47164..b1b6806b648 100644 --- a/pkg/services/queryhistory/writers.go +++ b/pkg/services/queryhistory/writers.go @@ -8,18 +8,29 @@ import ( "github.com/grafana/grafana/pkg/services/user" ) -func writeStarredSQL(query SearchInQueryHistoryQuery, sqlStore db.DB, builder *db.SQLBuilder) { - if query.OnlyStarred { - builder.Write(sqlStore.GetDialect().BooleanStr(true) + ` AS starred - FROM query_history - INNER JOIN query_history_star ON query_history_star.query_uid = query_history.uid - `) - } else { - builder.Write(` CASE WHEN query_history_star.query_uid IS NULL THEN ` + sqlStore.GetDialect().BooleanStr(false) + ` ELSE ` + sqlStore.GetDialect().BooleanStr(true) + ` END AS starred - FROM query_history - LEFT JOIN query_history_star ON query_history_star.query_uid = query_history.uid - `) +func writeStarredSQL(query SearchInQueryHistoryQuery, sqlStore db.DB, builder *db.SQLBuilder, isCount bool) { + var sql bytes.Buffer + if isCount { + sql.WriteString(`COUNT(`) } + if query.OnlyStarred { + sql.WriteString(sqlStore.GetDialect().BooleanStr(true)) + } else { + sql.WriteString(`CASE WHEN query_history_star.query_uid IS NULL THEN ` + sqlStore.GetDialect().BooleanStr(false) + ` ELSE ` + sqlStore.GetDialect().BooleanStr(true) + ` END`) + } + if isCount { + sql.WriteString(`)`) + } + sql.WriteString(` AS starred FROM query_history `) + + if query.OnlyStarred { + sql.WriteString(`INNER`) + } else { + sql.WriteString(`LEFT`) + } + + sql.WriteString(` JOIN query_history_star ON query_history_star.query_uid = query_history.uid `) + builder.Write(sql.String()) } func writeFiltersSQL(query SearchInQueryHistoryQuery, user *user.SignedInUser, sqlStore db.DB, builder *db.SQLBuilder) {