diff --git a/pkg/api/search.go b/pkg/api/search.go index 234405535cf..bf6e5ad91fe 100644 --- a/pkg/api/search.go +++ b/pkg/api/search.go @@ -15,11 +15,17 @@ func Search(c *middleware.Context) { starred := c.Query("starred") limit := c.QueryInt("limit") dashboardType := c.Query("type") + folderId := c.QueryInt64("folderId") + mode := c.Query("mode") if limit == 0 { limit = 1000 } + if mode == "" { + mode = "list" + } + dbids := make([]int, 0) for _, id := range c.QueryStrings("dashboardIds") { dashboardId, err := strconv.Atoi(id) @@ -37,6 +43,8 @@ func Search(c *middleware.Context) { OrgId: c.OrgId, DashboardIds: dbids, Type: dashboardType, + FolderId: folderId, + Mode: mode, } err := bus.Dispatch(&searchQuery) diff --git a/pkg/services/search/handlers.go b/pkg/services/search/handlers.go index 7573912b8f8..1f89eb650a8 100644 --- a/pkg/services/search/handlers.go +++ b/pkg/services/search/handlers.go @@ -46,6 +46,8 @@ func searchHandler(query *Query) error { OrgId: query.OrgId, DashboardIds: query.DashboardIds, Type: query.Type, + ParentId: query.FolderId, + Mode: query.Mode, } if err := bus.Dispatch(&dashQuery); err != nil { diff --git a/pkg/services/search/models.go b/pkg/services/search/models.go index d44a9693403..d0468ac4576 100644 --- a/pkg/services/search/models.go +++ b/pkg/services/search/models.go @@ -48,6 +48,8 @@ type Query struct { IsStarred bool Type string DashboardIds []int + FolderId int64 + Mode string Result HitList } @@ -59,6 +61,8 @@ type FindPersistedDashboardsQuery struct { IsStarred bool DashboardIds []int Type string + ParentId int64 + Mode string Result HitList } diff --git a/pkg/services/sqlstore/dashboard.go b/pkg/services/sqlstore/dashboard.go index 23ad22e53c1..21baa63f2b0 100644 --- a/pkg/services/sqlstore/dashboard.go +++ b/pkg/services/sqlstore/dashboard.go @@ -25,7 +25,7 @@ func init() { func SaveDashboard(cmd *m.SaveDashboardCommand) error { return inTransaction(func(sess *DBSession) error { dash := cmd.GetDashboardModel() - fmt.Printf("ParentId: %v", dash.ParentId) + // try get existing dashboard var existing, sameTitle m.Dashboard @@ -209,9 +209,15 @@ func findDashboards(query *search.FindPersistedDashboardsQuery) ([]DashboardSear sql.WriteString(" AND dashboard.is_folder = 0") } + if query.ParentId > 0 { + sql.WriteString(" AND dashboard.parent_id = ?") + params = append(params, query.ParentId) + } + sql.WriteString(fmt.Sprintf(" ORDER BY dashboard.title ASC LIMIT 1000")) var res []DashboardSearchProjection + err := x.Sql(sql.String(), params...).Find(&res) if err != nil { return nil, err @@ -226,36 +232,20 @@ func SearchDashboards(query *search.FindPersistedDashboardsQuery) error { return err } - res, err = appendDashboardFolders(res) - if err != nil { - return err - } - - query.Result = make([]*search.Hit, 0) - hits := make(map[int64]*search.Hit) - - for _, item := range res { - hit, exists := hits[item.Id] - if !exists { - hit = &search.Hit{ - Id: item.Id, - Title: item.Title, - Uri: "db/" + item.Slug, - Type: getHitType(item), - ParentId: item.ParentId, - Tags: []string{}, - } - query.Result = append(query.Result, hit) - hits[item.Id] = hit - } - if len(item.Term) > 0 { - hit.Tags = append(hit.Tags, item.Term) + if query.Mode == "tree" { + res, err = appendDashboardFolders(res) + if err != nil { + return err } } - convertToDashboardFolders(query) + makeQueryResult(query, res) - return err + if query.Mode == "tree" { + convertToDashboardFolders(query) + } + + return nil } // appends parent folders for any hits to the search result @@ -298,6 +288,30 @@ func getHitType(item DashboardSearchProjection) search.HitType { return hitType } +func makeQueryResult(query *search.FindPersistedDashboardsQuery, res []DashboardSearchProjection) { + query.Result = make([]*search.Hit, 0) + hits := make(map[int64]*search.Hit) + + for _, item := range res { + hit, exists := hits[item.Id] + if !exists { + hit = &search.Hit{ + Id: item.Id, + Title: item.Title, + Uri: "db/" + item.Slug, + Type: getHitType(item), + ParentId: item.ParentId, + Tags: []string{}, + } + query.Result = append(query.Result, hit) + hits[item.Id] = hit + } + if len(item.Term) > 0 { + hit.Tags = append(hit.Tags, item.Term) + } + } +} + func convertToDashboardFolders(query *search.FindPersistedDashboardsQuery) error { root := make(map[int64]*search.Hit) var keys []int64 diff --git a/pkg/services/sqlstore/dashboard_test.go b/pkg/services/sqlstore/dashboard_test.go index 98dfc9eac40..98439cb7178 100644 --- a/pkg/services/sqlstore/dashboard_test.go +++ b/pkg/services/sqlstore/dashboard_test.go @@ -118,6 +118,7 @@ func TestDashboardDataAccess(t *testing.T) { query := search.FindPersistedDashboardsQuery{ Title: "test dash 23", OrgId: 1, + Mode: "tree", } err := SearchDashboards(&query) @@ -146,11 +147,26 @@ func TestDashboardDataAccess(t *testing.T) { So(hit.Type, ShouldEqual, search.DashHitFolder) }) + Convey("Should be able to search for a dashboard folder's children", func() { + query := search.FindPersistedDashboardsQuery{ + OrgId: 1, + ParentId: savedFolder.Id, + } + + err := SearchDashboards(&query) + So(err, ShouldBeNil) + + So(len(query.Result), ShouldEqual, 2) + hit := query.Result[0] + So(hit.Id, ShouldEqual, savedDash.Id) + }) + Convey("Should be able to search for dashboard by dashboard ids", func() { Convey("should be able to find two dashboards by id", func() { query := search.FindPersistedDashboardsQuery{ DashboardIds: []int{2, 3}, OrgId: 1, + Mode: "tree", } err := SearchDashboards(&query)