Files
grafana/pkg/expr/sql/frame_db.go
Kyle Brandt d64f41afdc SQL Expressions: Re-implement feature using go-mysql-server (#99521)
* Under feature flag `sqlExpressions` and is experimental
* Excluded from arm32
* Will not work with the Query Service yet
* Does not have limits in place yet
* Does not working with alerting yet
* Currently requires "prepare time series" Transform for time series viz
 
---------

Co-authored-by: Sam Jewell <sam.jewell@grafana.com>
2025-02-06 07:27:28 -05:00

66 lines
1.5 KiB
Go

//go:build !arm
package sql
import (
mysql "github.com/dolthub/go-mysql-server/sql"
"github.com/grafana/grafana-plugin-sdk-go/data"
)
var dbName = "frames"
// FramesDBProvider is a go-mysql-server DatabaseProvider that provides access to a set of Frames.
type FramesDBProvider struct {
db mysql.Database
}
func (p *FramesDBProvider) Database(_ *mysql.Context, _ string) (mysql.Database, error) {
return p.db, nil
}
func (p *FramesDBProvider) HasDatabase(_ *mysql.Context, _ string) bool {
return true
}
func (p *FramesDBProvider) AllDatabases(_ *mysql.Context) []mysql.Database {
return []mysql.Database{p.db}
}
// NewFramesDBProvider creates a new FramesDBProvider with the given set of Frames.
func NewFramesDBProvider(frames data.Frames) mysql.DatabaseProvider {
fMap := make(map[string]mysql.Table, len(frames))
for _, frame := range frames {
fMap[frame.RefID] = &FrameTable{Frame: frame}
}
return &FramesDBProvider{
db: &framesDB{
frames: fMap,
},
}
}
// framesDB is a go-mysql-server Database that provides access to a set of Frames.
type framesDB struct {
frames map[string]mysql.Table
}
func (db *framesDB) GetTableInsensitive(_ *mysql.Context, tblName string) (mysql.Table, bool, error) {
tbl, ok := mysql.GetTableInsensitive(tblName, db.frames)
if !ok {
return nil, false, nil
}
return tbl, ok, nil
}
func (db *framesDB) GetTableNames(_ *mysql.Context) ([]string, error) {
s := make([]string, 0, len(db.frames))
for k := range db.frames {
s = append(s, k)
}
return s, nil
}
func (db *framesDB) Name() string {
return dbName
}