Search: Replace search implementation (#23855)

This commit is contained in:
Emil Tullstedt
2020-04-27 14:16:03 +02:00
committed by GitHub
parent bace47d40e
commit 830e8dc5fd
8 changed files with 96 additions and 368 deletions

View File

@@ -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"
}

View File

@@ -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 {