Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Table suggestion after FROM keyword #159

Merged
merged 3 commits into from Aug 24, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
44 changes: 39 additions & 5 deletions cmd/genji/shell/shell.go
Expand Up @@ -104,7 +104,7 @@ func Run(opts *Options) error {

e := prompt.New(
sh.execute,
completer,
sh.completer,
prompt.OptionPrefix("genji> "),
prompt.OptionTitle("genji"),
prompt.OptionLivePrefix(sh.changelivePrefix),
Expand Down Expand Up @@ -238,11 +238,9 @@ func (sh *Shell) runCommand(in string) error {
}

return runIndexesCmd(db, cmd)
case ".help":
return runHelpCmd()
}

return fmt.Errorf("unknown command %q. Enter \".help\" for help.", cmd)
return fmt.Errorf("unknown command %q", cmd)
}

func (sh *Shell) runQuery(q string) error {
Expand Down Expand Up @@ -314,14 +312,50 @@ func (sh *Shell) changelivePrefix() (string, bool) {
return sh.livePrefix, sh.multiLine
}

func completer(in prompt.Document) []prompt.Suggest {
// getTables returns all the tables of the database
func (sh *Shell) getAllTables() ([]string, error) {
var tables []string
db, _ := sh.getDB()
res, err := db.Query("SELECT table_name FROM __genji_tables")
if err != nil {
return nil, err
}
defer res.Close()

err = res.Iterate(func(d document.Document) error {
var tableName string
err = document.Scan(d, &tableName)
if err != nil {
return err
}
tables = append(tables, tableName)
return nil
})

// if there is no table return table as a suggestion
if len(tables) == 0 {
tables = append(tables, "table_name")
}

return tables, nil
}

func (sh *Shell) completer(in prompt.Document) []prompt.Suggest {
_, err := parser.NewParser(strings.NewReader(in.Text)).ParseQuery()
if err != nil {
e, ok := err.(*parser.ParseError)
if !ok {
return []prompt.Suggest{}
}
expected := e.Expected
switch expected[0] {
case "table_name":
expected, err = sh.getAllTables()
if err != nil {
return []prompt.Suggest{}
}
}

suggestions := make([]prompt.Suggest, len(expected))
for i, e := range expected {
suggestions[i].Text = e
Expand Down
4 changes: 3 additions & 1 deletion sql/parser/delete.go
Expand Up @@ -20,7 +20,9 @@ func (p *Parser) parseDeleteStatement() (*planner.Tree, error) {
// Parse table name
cfg.TableName, err = p.parseIdent()
if err != nil {
return nil, err
pErr := err.(*ParseError)
pErr.Expected = []string{"table_name"}
return nil, pErr
}

// Parse condition: "WHERE EXPR".
Expand Down
4 changes: 3 additions & 1 deletion sql/parser/drop.go
Expand Up @@ -39,7 +39,9 @@ func (p *Parser) parseDropTableStatement() (query.DropTableStmt, error) {
// Parse table name
stmt.TableName, err = p.parseIdent()
if err != nil {
return stmt, err
pErr := err.(*ParseError)
pErr.Expected = []string{"table_name"}
return stmt, pErr
}

return stmt, nil
Expand Down
9 changes: 7 additions & 2 deletions sql/parser/select.go
Expand Up @@ -2,7 +2,6 @@ package parser

import (
"fmt"

"github.com/genjidb/genji/sql/planner"
"github.com/genjidb/genji/sql/query/expr"
"github.com/genjidb/genji/sql/scanner"
Expand Down Expand Up @@ -124,7 +123,13 @@ func (p *Parser) parseFrom() (string, bool, error) {

// Parse table name
ident, err := p.parseIdent()
return ident, true, err
if err != nil {
pErr := err.(*ParseError)
pErr.Expected = []string{"table_name"}
return ident, true, pErr
}

return ident, true, nil
}

func (p *Parser) parseOrderBy() (expr.FieldSelector, scanner.Token, error) {
Expand Down