Query History: Count using SQL, not post query (#82208)

* Count in SQL, not externally

* Fix linter
This commit is contained in:
Kristina
2024-02-20 07:32:40 -06:00
committed by GitHub
parent 1c8a2f136d
commit 9d6da82e36
2 changed files with 27 additions and 16 deletions

View File

@@ -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,
}

View File

@@ -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) {