From 007cd144a9aeed48ba5253c007f155ad585bec34 Mon Sep 17 00:00:00 2001 From: Marcus Efraimsson Date: Fri, 21 Jan 2022 13:51:58 +0100 Subject: [PATCH] Search: Fix only searching for folder id zero (#44175) Fixes so that searching for folder id zero in folder/dashboard search returns dashboards located in the general folder and not including all folders as it did before. Fixes #40273 --- pkg/services/sqlstore/dashboard.go | 2 +- pkg/services/sqlstore/dashboard_test.go | 18 ++++++++++++++++++ pkg/services/sqlstore/searchstore/filters.go | 8 +++++++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/pkg/services/sqlstore/dashboard.go b/pkg/services/sqlstore/dashboard.go index 46c362e8dab..26fa105027e 100644 --- a/pkg/services/sqlstore/dashboard.go +++ b/pkg/services/sqlstore/dashboard.go @@ -305,7 +305,7 @@ func (ss *SQLStore) findDashboards(ctx context.Context, query *search.FindPersis } if len(query.FolderIds) > 0 { - filters = append(filters, searchstore.FolderFilter{IDs: query.FolderIds}) + filters = append(filters, searchstore.FolderFilter{Dialect: dialect, IDs: query.FolderIds}) } var res []DashboardSearchProjection diff --git a/pkg/services/sqlstore/dashboard_test.go b/pkg/services/sqlstore/dashboard_test.go index 616af63c0d4..f2ebe282ca2 100644 --- a/pkg/services/sqlstore/dashboard_test.go +++ b/pkg/services/sqlstore/dashboard_test.go @@ -384,6 +384,24 @@ func TestDashboardDataAccess(t *testing.T) { require.Equal(t, hit.FolderURL, fmt.Sprintf("/dashboards/f/%s/%s", savedFolder.Uid, savedFolder.Slug)) }) + t.Run("Should be able to search for general folder's children", func(t *testing.T) { + setup() + query := search.FindPersistedDashboardsQuery{ + OrgId: 1, + FolderIds: []int64{0}, + SignedInUser: &models.SignedInUser{OrgId: 1, OrgRole: models.ROLE_EDITOR}, + } + + err := sqlStore.SearchDashboards(context.Background(), &query) + require.NoError(t, err) + + require.Equal(t, len(query.Result), 1) + hit := query.Result[0] + require.Equal(t, savedDash2.Id, hit.ID) + require.Equal(t, fmt.Sprintf("/d/%s/%s", savedDash2.Uid, savedDash2.Slug), hit.URL) + require.Equal(t, int64(0), hit.FolderID) + }) + t.Run("Should be able to search for dashboard by dashboard ids", func(t *testing.T) { setup() query := search.FindPersistedDashboardsQuery{ diff --git a/pkg/services/sqlstore/searchstore/filters.go b/pkg/services/sqlstore/searchstore/filters.go index fc20ee494bc..234481513c2 100644 --- a/pkg/services/sqlstore/searchstore/filters.go +++ b/pkg/services/sqlstore/searchstore/filters.go @@ -87,10 +87,16 @@ func (f TitleFilter) Where() (string, []interface{}) { } type FolderFilter struct { - IDs []int64 + Dialect migrator.Dialect + IDs []int64 } func (f FolderFilter) Where() (string, []interface{}) { + if len(f.IDs) == 1 && f.IDs[0] == 0 { + sql := fmt.Sprintf("dashboard.folder_id = 0 AND dashboard.is_folder = %s", f.Dialect.BooleanStr(false)) + return sql, []interface{}{} + } + return sqlIDin("dashboard.folder_id", f.IDs) }