This commit is contained in:
Andy Arthur
2020-06-11 11:09:43 -05:00
parent d7df5f6306
commit 21e6574a51
4 changed files with 87 additions and 76 deletions

View File

@@ -15,9 +15,11 @@
package querydiff
import (
"github.com/liquidata-inc/dolt/go/store/atomicerr"
"github.com/liquidata-inc/go-mysql-server/sql"
"io"
"github.com/liquidata-inc/go-mysql-server/sql"
"github.com/liquidata-inc/dolt/go/store/atomicerr"
)
const (

View File

@@ -15,9 +15,9 @@
package querydiff
import (
"context"
"errors"
"fmt"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/diff"
"io"
sqle "github.com/liquidata-inc/go-mysql-server"
@@ -25,6 +25,9 @@ import (
"github.com/liquidata-inc/go-mysql-server/sql/parse"
"github.com/liquidata-inc/go-mysql-server/sql/plan"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/diff"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/doltdb"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/env"
dsqle "github.com/liquidata-inc/dolt/go/libraries/doltcore/sqle"
)
@@ -36,8 +39,15 @@ type QueryDiffer struct {
toIter sql.RowIter
}
func MakeQueryDiffer(fromCtx, toCtx *sql.Context, fromEng, toEng *sqle.Engine, query string) (*QueryDiffer, error) {
// todo: make the sql engines here
func MakeQueryDiffer(ctx context.Context, dEnv *env.DoltEnv, fromRoot, toRoot *doltdb.RootValue, query string) (*QueryDiffer, error) {
fromCtx, fromEng, err := makeSqlEngine(ctx, dEnv, fromRoot)
if err != nil {
return nil, err
}
toCtx, toEng, err := makeSqlEngine(ctx, dEnv, toRoot)
if err != nil {
return nil, err
}
from, to, err := hackThatPlan(fromCtx, toCtx, fromEng, toEng, query)
if err != nil {
@@ -140,7 +150,6 @@ func hackThatPlan(fromCtx *sql.Context, toCtx *sql.Context, fromEng *sqle.Engine
}
func recurseModifyPlans(fromCtx, toCtx *sql.Context, from, to sql.Node) (modFrom, modTo sql.Node, err error) {
// todo: don't assume plans are equal
switch from.(type) {
case *plan.Sort:
nd, err := newSortNodeDiffer(fromCtx, toCtx, from.(*plan.Sort), to.(*plan.Sort))
@@ -169,3 +178,37 @@ func recurseModifyPlans(fromCtx, toCtx *sql.Context, from, to sql.Node) (modFrom
}
return modFrom, modTo, nil
}
func makeSqlEngine(ctx context.Context, dEnv *env.DoltEnv, root *doltdb.RootValue) (*sql.Context, *sqle.Engine, error) {
doltSqlDB := dsqle.NewDatabase("db", dEnv.DoltDB, dEnv.RepoState, dEnv.RepoStateWriter())
sqlCtx := sql.NewContext(ctx,
sql.WithSession(dsqle.DefaultDoltSession()),
sql.WithIndexRegistry(sql.NewIndexRegistry()),
sql.WithViewRegistry(sql.NewViewRegistry()))
sqlCtx.SetCurrentDatabase("db")
engine := sqle.NewDefault()
engine.AddDatabase(sql.NewInformationSchemaDatabase(engine.Catalog))
dsess := dsqle.DSessFromSess(sqlCtx.Session)
engine.AddDatabase(doltSqlDB)
err := dsess.AddDB(sqlCtx, doltSqlDB)
if err != nil {
return nil, nil, err
}
err = doltSqlDB.SetRoot(sqlCtx, root)
if err != nil {
return nil, nil, err
}
err = dsqle.RegisterSchemaFragments(sqlCtx, doltSqlDB, root)
if err != nil {
return nil, nil, err
}
return sqlCtx, engine, nil
}

View File

@@ -211,7 +211,7 @@ func (nd *sortNodeDiffer) FromNode() sql.Node {
return sqlNodeWrapper{
Node: nd.fromNode,
iter: rowIterWrapper{
next: func() (row sql.Row, err error) {
next: func() (row sql.Row, err error) {
return nd.nextFromRow()
},
close: func() error {
@@ -225,7 +225,7 @@ func (nd *sortNodeDiffer) ToNode() sql.Node {
return sqlNodeWrapper{
Node: nd.toNode,
iter: rowIterWrapper{
next: func() (row sql.Row, err error) {
next: func() (row sql.Row, err error) {
return nd.nextToRow()
},
close: func() error {
@@ -242,11 +242,11 @@ func (nd *sortNodeDiffer) Close() error {
}
// RowIter implements the Node interface.
func (nd *sortNodeDiffer) RowIter(ctx *sql.Context) (sql.RowIter, error) {
panic("RowIter() cannot be called on NodeDiffer, use fromNode() and ToIter()")
func (nd *sortNodeDiffer) RowIter(_ *sql.Context) (sql.RowIter, error) {
panic("RowIter() cannot be called on NodeDiffer, use FromNode() and ToNode()")
}
// WithChildren implements the Node interface.
func (nd *sortNodeDiffer) WithChildren(children ...sql.Node) (sql.Node, error) {
func (nd *sortNodeDiffer) WithChildren(_ ...sql.Node) (sql.Node, error) {
panic("unimplemented")
}