mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Search: Replace search implementation (#23855)
This commit is contained in:
@@ -3,8 +3,9 @@ package searchstore
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
|
||||
"strings"
|
||||
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
|
||||
)
|
||||
|
||||
// Builder defaults to returning a SQL query to get a list of all dashboards
|
||||
@@ -27,15 +28,17 @@ func (b *Builder) ToSql(limit, page int64) (string, []interface{}) {
|
||||
b.buildSelect()
|
||||
|
||||
b.sql.WriteString("( ")
|
||||
b.applyFilters()
|
||||
orderQuery := b.applyFilters()
|
||||
|
||||
b.sql.WriteString(b.Dialect.LimitOffset(limit, (page-1)*limit) + `) AS ids
|
||||
INNER JOIN dashboard ON ids.id = dashboard.id
|
||||
`)
|
||||
INNER JOIN dashboard ON ids.id = dashboard.id`)
|
||||
b.sql.WriteString("\n")
|
||||
|
||||
b.sql.WriteString(`
|
||||
LEFT OUTER JOIN dashboard AS folder ON folder.id = dashboard.folder_id
|
||||
b.sql.WriteString(
|
||||
`LEFT OUTER JOIN dashboard AS folder ON folder.id = dashboard.folder_id
|
||||
LEFT OUTER JOIN dashboard_tag ON dashboard.id = dashboard_tag.dashboard_id`)
|
||||
b.sql.WriteString("\n")
|
||||
b.sql.WriteString(orderQuery)
|
||||
|
||||
return b.sql.String(), b.params
|
||||
}
|
||||
@@ -56,8 +59,9 @@ func (b *Builder) buildSelect() {
|
||||
FROM `)
|
||||
}
|
||||
|
||||
func (b *Builder) applyFilters() {
|
||||
func (b *Builder) applyFilters() (ordering string) {
|
||||
joins := []string{}
|
||||
orderJoins := []string{}
|
||||
|
||||
wheres := []string{}
|
||||
whereParams := []interface{}{}
|
||||
@@ -89,6 +93,9 @@ func (b *Builder) applyFilters() {
|
||||
}
|
||||
|
||||
if f, ok := f.(FilterOrderBy); ok {
|
||||
if f, ok := f.(FilterLeftJoin); ok {
|
||||
orderJoins = append(orderJoins, fmt.Sprintf(" LEFT OUTER JOIN %s ", f.LeftJoin()))
|
||||
}
|
||||
orders = append(orders, f.OrderBy())
|
||||
}
|
||||
}
|
||||
@@ -107,6 +114,12 @@ func (b *Builder) applyFilters() {
|
||||
}
|
||||
|
||||
if len(orders) > 0 {
|
||||
b.sql.WriteString(fmt.Sprintf(" ORDER BY %s", strings.Join(orders, ", ")))
|
||||
orderBy := fmt.Sprintf(" ORDER BY %s", strings.Join(orders, ", "))
|
||||
b.sql.WriteString(orderBy)
|
||||
|
||||
order := strings.Join(orderJoins, "")
|
||||
order += orderBy
|
||||
return order
|
||||
}
|
||||
return " ORDER BY dashboard.id"
|
||||
}
|
||||
|
||||
@@ -4,6 +4,9 @@ package searchstore_test
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/grafana/grafana/pkg/components/simplejson"
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore"
|
||||
@@ -12,8 +15,6 @@ import (
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore/searchstore"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
var dialect migrator.Dialect
|
||||
@@ -47,25 +48,23 @@ func TestBuilder_EqualResults_Basic(t *testing.T) {
|
||||
Dialect: dialect,
|
||||
}
|
||||
|
||||
prevBuilder := sqlstore.NewSearchBuilder(user, limit, page, models.PERMISSION_EDIT)
|
||||
prevBuilder.WithDialect(dialect)
|
||||
|
||||
newRes := []sqlstore.DashboardSearchProjection{}
|
||||
res := []sqlstore.DashboardSearchProjection{}
|
||||
err = db.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error {
|
||||
sql, params := builder.ToSql(limit, page)
|
||||
return sess.SQL(sql, params...).Find(&newRes)
|
||||
return sess.SQL(sql, params...).Find(&res)
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
oldRes := []sqlstore.DashboardSearchProjection{}
|
||||
err = db.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error {
|
||||
sql, params := prevBuilder.ToSql()
|
||||
return sess.SQL(sql, params...).Find(&oldRes)
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Len(t, newRes, 1)
|
||||
assert.EqualValues(t, oldRes, newRes)
|
||||
assert.Len(t, res, 1)
|
||||
res[0].Uid = ""
|
||||
assert.EqualValues(t, []sqlstore.DashboardSearchProjection{
|
||||
{
|
||||
Id: 1,
|
||||
Title: "A",
|
||||
Slug: "a",
|
||||
Term: "templated",
|
||||
},
|
||||
}, res)
|
||||
}
|
||||
|
||||
func TestBuilder_Pagination(t *testing.T) {
|
||||
@@ -143,25 +142,14 @@ func TestBuilder_Permissions(t *testing.T) {
|
||||
Dialect: dialect,
|
||||
}
|
||||
|
||||
prevBuilder := sqlstore.NewSearchBuilder(user, limit, page, level)
|
||||
prevBuilder.WithDialect(dialect)
|
||||
|
||||
newRes := []sqlstore.DashboardSearchProjection{}
|
||||
res := []sqlstore.DashboardSearchProjection{}
|
||||
err = db.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error {
|
||||
sql, params := builder.ToSql(limit, page)
|
||||
return sess.SQL(sql, params...).Find(&newRes)
|
||||
return sess.SQL(sql, params...).Find(&res)
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
oldRes := []sqlstore.DashboardSearchProjection{}
|
||||
err = db.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error {
|
||||
sql, params := prevBuilder.ToSql()
|
||||
return sess.SQL(sql, params...).Find(&oldRes)
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Len(t, newRes, 0)
|
||||
assert.EqualValues(t, oldRes, newRes)
|
||||
assert.Len(t, res, 0)
|
||||
}
|
||||
|
||||
func setupTestEnvironment(t *testing.T) *sqlstore.SqlStore {
|
||||
|
||||
Reference in New Issue
Block a user