Skip to content

Commit 63901f6

Browse files
authored
Merge pull request #453 from mcarmonaa/feature/new-uast-serialization
Feature/new uast serialization
2 parents ee289a8 + d14a4bf commit 63901f6

File tree

5 files changed

+451
-301
lines changed

5 files changed

+451
-301
lines changed

cmd/gitbase/command/server.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ type Server struct {
5656
DisableGit bool `long:"no-git" description:"disable the load of git standard repositories."`
5757
DisableSiva bool `long:"no-siva" description:"disable the load of siva files."`
5858
Verbose bool `short:"v" description:"Activates the verbose mode"`
59+
OldUast bool `long:"old-uast-serialization" description:"serialize uast in the old format" env:"GITBASE_UAST_SERIALIZATION"`
5960
}
6061

6162
type jaegerLogrus struct {
@@ -138,12 +139,17 @@ func (c *Server) Execute(args []string) error {
138139
c.engine,
139140
gitbase.NewSessionBuilder(c.pool,
140141
gitbase.WithSkipGitErrors(c.SkipGitErrors),
142+
gitbase.WithOldUASTSerialization(c.OldUast),
141143
),
142144
)
143145
if err != nil {
144146
return err
145147
}
146148

149+
if c.OldUast {
150+
function.UASTExpressionType = sql.Array(sql.Blob)
151+
}
152+
147153
logrus.Infof("server started and listening on %s:%d", c.Host, c.Port)
148154
return s.Start()
149155
}

internal/function/uast.go

Lines changed: 26 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,18 @@ import (
44
"fmt"
55
"strings"
66

7-
"github.com/sirupsen/logrus"
8-
"github.com/src-d/gitbase"
97
bblfsh "gopkg.in/bblfsh/client-go.v2"
108
"gopkg.in/bblfsh/client-go.v2/tools"
119
"gopkg.in/bblfsh/sdk.v1/uast"
1210

13-
errors "gopkg.in/src-d/go-errors.v1"
1411
"gopkg.in/src-d/go-mysql-server.v0/sql"
1512
"gopkg.in/src-d/go-mysql-server.v0/sql/expression"
1613
)
1714

1815
var (
19-
// ErrParseBlob is returned when the blob can't be parsed with bblfsh.
20-
ErrParseBlob = errors.NewKind("unable to parse the given blob using bblfsh: %s")
16+
// UASTExpressionType represents the returned SQL type by
17+
// the functions uast, uast_mode, uast_xpath and uast_children.
18+
UASTExpressionType sql.Type = sql.Blob
2119
)
2220

2321
// UAST returns an array of UAST nodes as blobs.
@@ -62,7 +60,7 @@ func (f UAST) Resolved() bool {
6260

6361
// Type implements the Expression interface.
6462
func (f UAST) Type() sql.Type {
65-
return sql.Array(sql.Blob)
63+
return UASTExpressionType
6664
}
6765

6866
// Children implements the Expression interface.
@@ -181,7 +179,7 @@ func (f UASTMode) Resolved() bool {
181179

182180
// Type implements the Expression interface.
183181
func (f UASTMode) Type() sql.Type {
184-
return sql.Array(sql.Blob)
182+
return UASTExpressionType
185183
}
186184

187185
// Children implements the Expression interface.
@@ -290,7 +288,7 @@ func NewUASTXPath(uast, xpath sql.Expression) sql.Expression {
290288

291289
// Type implements the Expression interface.
292290
func (UASTXPath) Type() sql.Type {
293-
return sql.Array(sql.Blob)
291+
return UASTExpressionType
294292
}
295293

296294
// Eval implements the Expression interface.
@@ -309,15 +307,15 @@ func (f *UASTXPath) Eval(ctx *sql.Context, row sql.Row) (out interface{}, err er
309307
return nil, err
310308
}
311309

312-
if left == nil {
313-
return nil, nil
314-
}
315-
316-
nodes, err := nodesFromBlobArray(left)
310+
nodes, err := getNodes(ctx, left)
317311
if err != nil {
318312
return nil, err
319313
}
320314

315+
if nodes == nil {
316+
return nil, nil
317+
}
318+
321319
xpath, err := exprToString(ctx, f.Right, row)
322320
if err != nil {
323321
return nil, err
@@ -327,58 +325,17 @@ func (f *UASTXPath) Eval(ctx *sql.Context, row sql.Row) (out interface{}, err er
327325
return nil, nil
328326
}
329327

330-
var result []interface{}
328+
var filtered []*uast.Node
331329
for _, n := range nodes {
332330
ns, err := tools.Filter(n, xpath)
333331
if err != nil {
334332
return nil, err
335333
}
336334

337-
m, err := marshalNodes(ns)
338-
if err != nil {
339-
return nil, err
340-
}
341-
342-
result = append(result, m...)
343-
}
344-
345-
return result, nil
346-
}
347-
348-
func nodesFromBlobArray(data interface{}) ([]*uast.Node, error) {
349-
data, err := sql.Array(sql.Blob).Convert(data)
350-
if err != nil {
351-
return nil, err
352-
}
353-
354-
arr := data.([]interface{})
355-
var nodes = make([]*uast.Node, len(arr))
356-
for i, n := range arr {
357-
node := uast.NewNode()
358-
if err := node.Unmarshal(n.([]byte)); err != nil {
359-
return nil, err
360-
}
361-
362-
nodes[i] = node
363-
}
364-
365-
return nodes, nil
366-
}
367-
368-
func marshalNodes(nodes []*uast.Node) ([]interface{}, error) {
369-
m := make([]interface{}, 0, len(nodes))
370-
for _, n := range nodes {
371-
if n != nil {
372-
data, err := n.Marshal()
373-
if err != nil {
374-
return nil, err
375-
}
376-
377-
m = append(m, data)
378-
}
335+
filtered = append(filtered, ns...)
379336
}
380337

381-
return m, nil
338+
return marshalNodes(ctx, filtered)
382339
}
383340

384341
func (f UASTXPath) String() string {
@@ -400,84 +357,6 @@ func (f UASTXPath) TransformUp(fn sql.TransformExprFunc) (sql.Expression, error)
400357
return fn(NewUASTXPath(left, right))
401358
}
402359

403-
func exprToString(
404-
ctx *sql.Context,
405-
e sql.Expression,
406-
r sql.Row,
407-
) (string, error) {
408-
if e == nil {
409-
return "", nil
410-
}
411-
412-
x, err := e.Eval(ctx, r)
413-
if err != nil {
414-
return "", err
415-
}
416-
417-
if x == nil {
418-
return "", nil
419-
}
420-
421-
x, err = sql.Text.Convert(x)
422-
if err != nil {
423-
return "", err
424-
}
425-
426-
return x.(string), nil
427-
}
428-
429-
func getUAST(
430-
ctx *sql.Context,
431-
bytes []byte,
432-
lang, xpath string,
433-
mode bblfsh.Mode,
434-
) (interface{}, error) {
435-
session, ok := ctx.Session.(*gitbase.Session)
436-
if !ok {
437-
return nil, gitbase.ErrInvalidGitbaseSession.New(ctx.Session)
438-
}
439-
440-
client, err := session.BblfshClient()
441-
if err != nil {
442-
return nil, err
443-
}
444-
445-
// If we have a language we must check if it's supported. If we don't, bblfsh
446-
// is the one that will have to identify the language.
447-
if lang != "" {
448-
ok, err = client.IsLanguageSupported(ctx, lang)
449-
if err != nil {
450-
return nil, err
451-
}
452-
453-
if !ok {
454-
return nil, nil
455-
}
456-
}
457-
458-
resp, err := client.ParseWithMode(ctx, mode, lang, bytes)
459-
if err != nil {
460-
logrus.Warn(ErrParseBlob.New(err))
461-
return nil, nil
462-
}
463-
464-
if len(resp.Errors) > 0 {
465-
logrus.Warn(ErrParseBlob.New(strings.Join(resp.Errors, "\n")))
466-
}
467-
468-
var nodes []*uast.Node
469-
if xpath == "" {
470-
nodes = []*uast.Node{resp.UAST}
471-
} else {
472-
nodes, err = tools.Filter(resp.UAST, xpath)
473-
if err != nil {
474-
return nil, err
475-
}
476-
}
477-
478-
return marshalNodes(nodes)
479-
}
480-
481360
// UASTExtract extracts keys from an UAST.
482361
type UASTExtract struct {
483362
expression.BinaryExpression
@@ -514,15 +393,15 @@ func (u *UASTExtract) Eval(ctx *sql.Context, row sql.Row) (out interface{}, err
514393
return nil, err
515394
}
516395

517-
if left == nil {
518-
return nil, nil
519-
}
520-
521-
nodes, err := nodesFromBlobArray(left)
396+
nodes, err := getNodes(ctx, left)
522397
if err != nil {
523398
return nil, err
524399
}
525400

401+
if nodes == nil {
402+
return nil, nil
403+
}
404+
526405
key, err := exprToString(ctx, u.Right, row)
527406
if err != nil {
528407
return nil, err
@@ -609,7 +488,7 @@ func (u *UASTChildren) String() string {
609488

610489
// Type implements the sql.Expression interface.
611490
func (u *UASTChildren) Type() sql.Type {
612-
return sql.Array(sql.Blob)
491+
return UASTExpressionType
613492
}
614493

615494
// TransformUp implements the sql.Expression interface.
@@ -638,17 +517,17 @@ func (u *UASTChildren) Eval(ctx *sql.Context, row sql.Row) (out interface{}, err
638517
return nil, err
639518
}
640519

641-
if child == nil {
642-
return nil, nil
643-
}
644-
645-
nodes, err := nodesFromBlobArray(child)
520+
nodes, err := getNodes(ctx, child)
646521
if err != nil {
647522
return nil, err
648523
}
649524

525+
if nodes == nil {
526+
return nil, nil
527+
}
528+
650529
children := flattenChildren(nodes)
651-
return marshalNodes(children)
530+
return marshalNodes(ctx, children)
652531
}
653532

654533
func flattenChildren(nodes []*uast.Node) []*uast.Node {

0 commit comments

Comments
 (0)