Skip to content

Commit d2120e7

Browse files
authored
New nodes (#923)
New nodes
2 parents da9b1ed + ade8efc commit d2120e7

18 files changed

+149
-182
lines changed

.travis.yml

-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ before_script:
2525
- docker run -d --name bblfshd --privileged -p 9432:9432 bblfsh/bblfshd:v2.14.0-drivers
2626
- docker exec -it bblfshd bblfshctl driver list
2727
- go get -v github.com/go-sql-driver/mysql/...
28-
- go get gopkg.in/src-d/go-git-fixtures.v3/...
2928

3029
script:
3130
- make test-coverage codecov

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010

1111
- Varchar type.
1212
- FIRST and LAST aggregations.
13+
- Count distinct aggregation.
1314

1415
### Changed
1516

@@ -18,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1819
- Switch some types of known or maximum length (mostly hashes and emails)
1920
to VarChar with a size.
2021
- Traces now have a root span.
22+
- New API for node transformations.
2123

2224
### Fixed
2325

docs/using-gitbase/supported-syntax.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
## Grouping expressions
2020
- AVG
21-
- COUNT
21+
- COUNT and COUNT(DISTINCT)
2222
- MAX
2323
- MIN
2424
- SUM (always returns DOUBLE)

go.mod

+1-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ require (
1919
github.com/src-d/go-borges v0.0.0-20190628121335-da12a84d60fd
2020
github.com/src-d/go-git v4.7.0+incompatible
2121
github.com/src-d/go-git-fixtures v3.5.1-0.20190605154830-57f3972b0248+incompatible
22-
github.com/src-d/go-mysql-server v0.4.1-0.20190704102044-bbae51955887
22+
github.com/src-d/go-mysql-server v0.4.1-0.20190708083625-b61703ad45cc
2323
github.com/stretchr/testify v1.3.0
2424
github.com/uber-go/atomic v1.4.0 // indirect
2525
github.com/uber/jaeger-client-go v2.16.0+incompatible
@@ -33,7 +33,6 @@ require (
3333
gopkg.in/src-d/go-billy-siva.v4 v4.5.1
3434
gopkg.in/src-d/go-billy.v4 v4.3.0
3535
gopkg.in/src-d/go-errors.v1 v1.0.0
36-
gopkg.in/src-d/go-git-fixtures.v3 v3.5.0
3736
gopkg.in/src-d/go-git.v4 v4.12.0
3837
gopkg.in/yaml.v2 v2.2.2
3938
vitess.io/vitess v3.0.0-rc.3.0.20190602171040-12bfde34629c+incompatible

go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,8 @@ github.com/src-d/go-git v4.7.0+incompatible h1:IYSSnbAHeKmsfbQFi9ozbid+KNh0bKjlo
238238
github.com/src-d/go-git v4.7.0+incompatible/go.mod h1:1bQciz+hn0jzPQNsYj0hDFZHLJBdV7gXE2mWhC7EkFk=
239239
github.com/src-d/go-git-fixtures v3.5.1-0.20190605154830-57f3972b0248+incompatible h1:A5bKevhs9C//Nh8QV0J+1KphEaIa25cDe1DTs/yPxDI=
240240
github.com/src-d/go-git-fixtures v3.5.1-0.20190605154830-57f3972b0248+incompatible/go.mod h1:XcIQp7L+k0pgfTqfbaTKj3kxlBv8kYOKZ/tKNXbZFLg=
241-
github.com/src-d/go-mysql-server v0.4.1-0.20190704102044-bbae51955887 h1:yGeW4Zia4x5TYP/xPb2rKknO0qoAVZn9IWfw0AbmaPM=
242-
github.com/src-d/go-mysql-server v0.4.1-0.20190704102044-bbae51955887/go.mod h1:GO8SmBnN9LcKSXy6DYuBbqKtJvrRnHsBrlXvlVOX+NM=
241+
github.com/src-d/go-mysql-server v0.4.1-0.20190708083625-b61703ad45cc h1:Rgz2etoEnslCgMKCfwpKd0hBFrZVxpV33QAXjadVi0o=
242+
github.com/src-d/go-mysql-server v0.4.1-0.20190708083625-b61703ad45cc/go.mod h1:GO8SmBnN9LcKSXy6DYuBbqKtJvrRnHsBrlXvlVOX+NM=
243243
github.com/src-d/go-oniguruma v1.0.0/go.mod h1:chVbff8kcVtmrhxtZ3yBVLLquXbzCS6DrxQaAK/CeqM=
244244
github.com/src-d/go-oniguruma v1.1.0 h1:EG+Nm5n2JqWUaCjtM0NtutPxU7ZN5Tp50GWrrV8bTww=
245245
github.com/src-d/go-oniguruma v1.1.0/go.mod h1:chVbff8kcVtmrhxtZ3yBVLLquXbzCS6DrxQaAK/CeqM=

internal/commitstats/commit_test.go

+2-6
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ package commitstats
33
import (
44
"testing"
55

6+
fixtures "github.com/src-d/go-git-fixtures"
67
"github.com/stretchr/testify/assert"
78
"github.com/stretchr/testify/require"
8-
fixtures "gopkg.in/src-d/go-git-fixtures.v3"
99
"gopkg.in/src-d/go-git.v4"
1010
"gopkg.in/src-d/go-git.v4/plumbing"
1111
"gopkg.in/src-d/go-git.v4/plumbing/cache"
@@ -14,12 +14,8 @@ import (
1414
)
1515

1616
func TestCalculate(t *testing.T) {
17-
err := fixtures.Init()
18-
require.NoError(t, err)
19-
2017
defer func() {
21-
err := fixtures.Clean()
22-
require.NoError(t, err)
18+
require.NoError(t, fixtures.Clean())
2319
}()
2420

2521
tests := map[string]struct {

internal/commitstats/file_test.go

+3-12
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ package commitstats
33
import (
44
"testing"
55

6+
fixtures "github.com/src-d/go-git-fixtures"
67
"github.com/stretchr/testify/assert"
78
"github.com/stretchr/testify/require"
8-
fixtures "gopkg.in/src-d/go-git-fixtures.v3"
99
"gopkg.in/src-d/go-git.v4"
1010
"gopkg.in/src-d/go-git.v4/plumbing"
1111
"gopkg.in/src-d/go-git.v4/plumbing/cache"
@@ -15,13 +15,8 @@ import (
1515

1616
func TestNewFileStats(t *testing.T) {
1717
require := require.New(t)
18-
19-
err := fixtures.Init()
20-
require.NoError(err)
21-
2218
defer func() {
23-
err := fixtures.Clean()
24-
require.NoError(err)
19+
require.NoError(fixtures.Clean())
2520
}()
2621

2722
f := fixtures.Basic().One()
@@ -42,12 +37,8 @@ func TestNewFileStats(t *testing.T) {
4237
}
4338

4439
func TestCalculateByFile(t *testing.T) {
45-
err := fixtures.Init()
46-
require.NoError(t, err)
47-
4840
defer func() {
49-
err := fixtures.Clean()
50-
require.NoError(t, err)
41+
require.NoError(t, fixtures.Clean())
5142
}()
5243

5344
tests := map[string]struct {

internal/function/commit_file_stats.go

+15-16
Original file line numberDiff line numberDiff line change
@@ -46,28 +46,27 @@ func (CommitFileStats) Type() sql.Type {
4646
return sql.Array(sql.JSON)
4747
}
4848

49-
// TransformUp implements the Expression interface.
50-
func (f *CommitFileStats) TransformUp(fn sql.TransformExprFunc) (sql.Expression, error) {
51-
repo, err := f.Repository.TransformUp(fn)
52-
if err != nil {
53-
return nil, err
49+
// WithChildren implements the Expression interface.
50+
func (f *CommitFileStats) WithChildren(children ...sql.Expression) (sql.Expression, error) {
51+
expected := 2
52+
if f.From != nil {
53+
expected = 3
5454
}
5555

56-
to, err := f.To.TransformUp(fn)
57-
if err != nil {
58-
return nil, err
56+
if len(children) != expected {
57+
return nil, sql.ErrInvalidChildrenNumber.New(f, len(children), expected)
5958
}
6059

61-
if f.From == nil {
62-
return fn(&CommitFileStats{Repository: repo, To: to})
63-
}
64-
65-
from, err := f.From.TransformUp(fn)
66-
if err != nil {
67-
return nil, err
60+
repo := children[0]
61+
var from, to sql.Expression
62+
if f.From != nil {
63+
from = children[1]
64+
to = children[2]
65+
} else {
66+
to = children[1]
6867
}
6968

70-
return fn(&CommitFileStats{Repository: repo, From: from, To: to})
69+
return &CommitStats{repo, from, to}, nil
7170
}
7271

7372
// Children implements the Expression interface.

internal/function/commit_stats.go

+15-16
Original file line numberDiff line numberDiff line change
@@ -49,28 +49,27 @@ func (CommitStats) Type() sql.Type {
4949
return sql.JSON
5050
}
5151

52-
// TransformUp implements the Expression interface.
53-
func (f *CommitStats) TransformUp(fn sql.TransformExprFunc) (sql.Expression, error) {
54-
repo, err := f.Repository.TransformUp(fn)
55-
if err != nil {
56-
return nil, err
52+
// WithChildren implements the Expression interface.
53+
func (f *CommitStats) WithChildren(children ...sql.Expression) (sql.Expression, error) {
54+
expected := 2
55+
if f.From != nil {
56+
expected = 3
5757
}
5858

59-
to, err := f.To.TransformUp(fn)
60-
if err != nil {
61-
return nil, err
59+
if len(children) != expected {
60+
return nil, sql.ErrInvalidChildrenNumber.New(f, len(children), expected)
6261
}
6362

64-
if f.From == nil {
65-
return fn(&CommitStats{Repository: repo, To: to})
66-
}
67-
68-
from, err := f.From.TransformUp(fn)
69-
if err != nil {
70-
return nil, err
63+
repo := children[0]
64+
var from, to sql.Expression
65+
if f.From != nil {
66+
from = children[1]
67+
to = children[2]
68+
} else {
69+
to = children[1]
7170
}
7271

73-
return fn(&CommitStats{Repository: repo, From: from, To: to})
72+
return &CommitStats{repo, from, to}, nil
7473
}
7574

7675
// Children implements the Expression interface.

internal/function/commit_stats_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ import (
1111
"github.com/src-d/go-borges/plain"
1212
"github.com/stretchr/testify/require"
1313

14+
fixtures "github.com/src-d/go-git-fixtures"
1415
"github.com/src-d/go-mysql-server/sql"
1516
"github.com/src-d/go-mysql-server/sql/expression"
1617
"gopkg.in/src-d/go-billy.v4/osfs"
17-
fixtures "gopkg.in/src-d/go-git-fixtures.v3"
1818
"gopkg.in/src-d/go-git.v4/plumbing/cache"
1919
)
2020

@@ -86,7 +86,6 @@ func TestCommitStatsEval(t *testing.T) {
8686

8787
func setupPool(t *testing.T) (*gitbase.RepositoryPool, func()) {
8888
t.Helper()
89-
require.NoError(t, fixtures.Init())
9089

9190
path := fixtures.ByTag("worktree").One().Worktree().Root()
9291
pathLib := path + "-lib"

internal/function/is_remote.go

+6-7
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import (
44
"fmt"
55
"reflect"
66

7-
"gopkg.in/src-d/go-git.v4/plumbing"
87
"github.com/src-d/go-mysql-server/sql"
98
"github.com/src-d/go-mysql-server/sql/expression"
9+
"gopkg.in/src-d/go-git.v4/plumbing"
1010
)
1111

1212
// IsRemote checks the given string is a remote reference.
@@ -45,13 +45,12 @@ func (f IsRemote) String() string {
4545
return fmt.Sprintf("is_remote(%s)", f.Child)
4646
}
4747

48-
// TransformUp implements the Expression interface.
49-
func (f IsRemote) TransformUp(fn sql.TransformExprFunc) (sql.Expression, error) {
50-
child, err := f.Child.TransformUp(fn)
51-
if err != nil {
52-
return nil, err
48+
// WithChildren implements the Expression interface.
49+
func (f IsRemote) WithChildren(children ...sql.Expression) (sql.Expression, error) {
50+
if len(children) != 1 {
51+
return nil, sql.ErrInvalidChildrenNumber.New(f, len(children), 1)
5352
}
54-
return fn(NewIsRemote(child))
53+
return NewIsRemote(children[0]), nil
5554
}
5655

5756
// Type implements the Expression interface.

internal/function/is_tag.go

+6-7
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import (
44
"fmt"
55
"reflect"
66

7-
"gopkg.in/src-d/go-git.v4/plumbing"
87
"github.com/src-d/go-mysql-server/sql"
98
"github.com/src-d/go-mysql-server/sql/expression"
9+
"gopkg.in/src-d/go-git.v4/plumbing"
1010
)
1111

1212
// IsTag checks the given string is a tag name.
@@ -45,13 +45,12 @@ func (f IsTag) String() string {
4545
return fmt.Sprintf("is_tag(%s)", f.Child)
4646
}
4747

48-
// TransformUp implements the Expression interface.
49-
func (f IsTag) TransformUp(fn sql.TransformExprFunc) (sql.Expression, error) {
50-
child, err := f.Child.TransformUp(fn)
51-
if err != nil {
52-
return nil, err
48+
// WithChildren implements the Expression interface.
49+
func (f IsTag) WithChildren(children ...sql.Expression) (sql.Expression, error) {
50+
if len(children) != 1 {
51+
return nil, sql.ErrInvalidChildrenNumber.New(f, len(children), 1)
5352
}
54-
return fn(NewIsTag(child))
53+
return NewIsTag(children[0]), nil
5554
}
5655

5756
// Type implements the Expression interface.

internal/function/is_vendor.go

+5-7
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,10 @@ func (v *IsVendor) String() string {
4747
return fmt.Sprintf("IS_VENDOR(%s)", v.Child)
4848
}
4949

50-
// TransformUp implements the sql.Expression interface.
51-
func (v *IsVendor) TransformUp(f sql.TransformExprFunc) (sql.Expression, error) {
52-
child, err := v.Child.TransformUp(f)
53-
if err != nil {
54-
return nil, err
50+
// WithChildren implements the Expression interface.
51+
func (v IsVendor) WithChildren(children ...sql.Expression) (sql.Expression, error) {
52+
if len(children) != 1 {
53+
return nil, sql.ErrInvalidChildrenNumber.New(v, len(children), 1)
5554
}
56-
57-
return f(NewIsVendor(child))
55+
return NewIsVendor(children[0]), nil
5856
}

internal/function/language.go

+8-12
Original file line numberDiff line numberDiff line change
@@ -82,22 +82,18 @@ func (Language) Type() sql.Type {
8282
return sql.Text
8383
}
8484

85-
// TransformUp implements the Expression interface.
86-
func (f *Language) TransformUp(fn sql.TransformExprFunc) (sql.Expression, error) {
87-
left, err := f.Left.TransformUp(fn)
88-
if err != nil {
89-
return nil, err
85+
// WithChildren implements the Expression interface.
86+
func (f *Language) WithChildren(children ...sql.Expression) (sql.Expression, error) {
87+
expected := 1
88+
if f.Right != nil {
89+
expected = 2
9090
}
9191

92-
var right sql.Expression
93-
if f.Right != nil {
94-
right, err = f.Right.TransformUp(fn)
95-
if err != nil {
96-
return nil, err
97-
}
92+
if len(children) != expected {
93+
return nil, sql.ErrInvalidChildrenNumber.New(f, len(children), expected)
9894
}
9995

100-
return fn(&Language{left, right})
96+
return NewLanguage(children...)
10197
}
10298

10399
// Eval implements the Expression interface.

internal/function/loc.go

+3-13
Original file line numberDiff line numberDiff line change
@@ -47,19 +47,9 @@ func (LOC) Type() sql.Type {
4747
return sql.JSON
4848
}
4949

50-
// TransformUp implements the Expression interface.
51-
func (f *LOC) TransformUp(fn sql.TransformExprFunc) (sql.Expression, error) {
52-
left, err := f.Left.TransformUp(fn)
53-
if err != nil {
54-
return nil, err
55-
}
56-
57-
right, err := f.Right.TransformUp(fn)
58-
if err != nil {
59-
return nil, err
60-
}
61-
62-
return fn(&LOC{left, right})
50+
// WithChildren implements the Expression interface.
51+
func (f *LOC) WithChildren(children ...sql.Expression) (sql.Expression, error) {
52+
return NewLOC(children...)
6353
}
6454

6555
// Eval implements the Expression interface.

0 commit comments

Comments
 (0)