Query History: Use a search index on new queries to filter in mixed data sources (#88979)
* Add search index table * Stab a test * Add more tests * Add basic index * Switch to UID and add a test for the index * Improve tests coverage * Remove redundant whitespaces * Load all data source APIs when query history is loaded * Fix column type * Fix migration * Clean-up the index * Fix linting * Fix migrations * Fix migrations * Fix migrations * Rename index to details
This commit is contained in:
@@ -9,6 +9,16 @@ import (
|
||||
"github.com/grafana/grafana/pkg/util"
|
||||
)
|
||||
|
||||
type Datasource struct {
|
||||
UID string `json:"uid"`
|
||||
}
|
||||
|
||||
type QueryHistoryDetails struct {
|
||||
ID int64 `xorm:"pk autoincr 'id'"`
|
||||
DatasourceUID string `xorm:"datasource_uid"`
|
||||
QueryHistoryItemUID string `xorm:"query_history_item_uid"`
|
||||
}
|
||||
|
||||
// createQuery adds a query into query history
|
||||
func (s QueryHistoryService) createQuery(ctx context.Context, user *user.SignedInUser, cmd CreateQueryInQueryHistoryCommand) (QueryHistoryDTO, error) {
|
||||
queryHistory := QueryHistory{
|
||||
@@ -29,6 +39,25 @@ func (s QueryHistoryService) createQuery(ctx context.Context, user *user.SignedI
|
||||
return QueryHistoryDTO{}, err
|
||||
}
|
||||
|
||||
dsUids, err := FindDataSourceUIDs(cmd.Queries)
|
||||
|
||||
if err == nil {
|
||||
var queryHistoryDetailsItems []QueryHistoryDetails
|
||||
for _, uid := range dsUids {
|
||||
queryHistoryDetailsItems = append(queryHistoryDetailsItems, QueryHistoryDetails{
|
||||
QueryHistoryItemUID: queryHistory.UID,
|
||||
DatasourceUID: uid,
|
||||
})
|
||||
}
|
||||
|
||||
err = s.store.WithDbSession(ctx, func(session *db.Session) error {
|
||||
for _, queryHistoryDetailsItem := range queryHistoryDetailsItems {
|
||||
_, err = session.Insert(queryHistoryDetailsItem)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
dto := QueryHistoryDTO{
|
||||
UID: queryHistory.UID,
|
||||
DatasourceUID: queryHistory.DatasourceUID,
|
||||
@@ -116,6 +145,12 @@ func (s QueryHistoryService) deleteQuery(ctx context.Context, user *user.SignedI
|
||||
s.log.Error("Failed to unstar query while deleting it from query history", "query", UID, "user", user.UserID, "error", err)
|
||||
}
|
||||
|
||||
// remove the details
|
||||
_, err = session.Table("query_history_details").Where("query_history_item_uid = ?", UID).Delete(QueryHistoryDetails{})
|
||||
if err != nil {
|
||||
s.log.Error("Failed to remove the details for the query item", "query", UID, "user", user.UserID, "error", err)
|
||||
}
|
||||
|
||||
// Then delete it
|
||||
id, err := session.Where("org_id = ? AND created_by = ? AND uid = ?", user.OrgID, user.UserID, UID).Delete(QueryHistory{})
|
||||
if err != nil {
|
||||
@@ -274,19 +309,28 @@ func (s QueryHistoryService) deleteStaleQueries(ctx context.Context, olderThan i
|
||||
var rowsCount int64
|
||||
|
||||
err := s.store.WithDbSession(ctx, func(session *db.Session) error {
|
||||
sql := `DELETE
|
||||
FROM query_history
|
||||
WHERE uid IN (
|
||||
SELECT uid FROM (
|
||||
SELECT uid FROM query_history
|
||||
LEFT JOIN query_history_star
|
||||
ON query_history_star.query_uid = query_history.uid
|
||||
WHERE query_history_star.query_uid IS NULL
|
||||
AND query_history.created_at <= ?
|
||||
ORDER BY query_history.id ASC
|
||||
LIMIT 10000
|
||||
) AS q
|
||||
)`
|
||||
uids_sql := `SELECT uid FROM (
|
||||
SELECT uid FROM query_history
|
||||
LEFT JOIN query_history_star
|
||||
ON query_history_star.query_uid = query_history.uid
|
||||
WHERE query_history_star.query_uid IS NULL
|
||||
AND query_history.created_at <= ?
|
||||
ORDER BY query_history.id ASC
|
||||
LIMIT 10000
|
||||
) AS q`
|
||||
|
||||
details_sql := `DELETE
|
||||
FROM query_history_details
|
||||
WHERE query_history_item_uid IN (` + uids_sql + `)`
|
||||
|
||||
sql := `DELETE
|
||||
FROM query_history
|
||||
WHERE uid IN (` + uids_sql + `)`
|
||||
|
||||
_, err := session.Exec(details_sql, strconv.FormatInt(olderThan, 10))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
res, err := session.Exec(sql, strconv.FormatInt(olderThan, 10))
|
||||
if err != nil {
|
||||
@@ -329,17 +373,17 @@ func (s QueryHistoryService) enforceQueryHistoryRowLimit(ctx context.Context, li
|
||||
if countRowsToDelete > 0 {
|
||||
var sql string
|
||||
if starredQueries {
|
||||
sql = `DELETE FROM query_history_star
|
||||
sql = `DELETE FROM query_history_star
|
||||
WHERE id IN (
|
||||
SELECT id FROM (
|
||||
SELECT id FROM query_history_star
|
||||
ORDER BY id ASC
|
||||
ORDER BY id ASC
|
||||
LIMIT ?
|
||||
) AS q
|
||||
)`
|
||||
} else {
|
||||
sql = `DELETE
|
||||
FROM query_history
|
||||
sql = `DELETE
|
||||
FROM query_history
|
||||
WHERE uid IN (
|
||||
SELECT uid FROM (
|
||||
SELECT uid FROM query_history
|
||||
|
||||
Reference in New Issue
Block a user