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) }