Skip to content

Commit 130bd9b

Browse files
committed
internal/function: implement is_remote function
Signed-off-by: Miguel Molina <[email protected]>
1 parent 2d1f332 commit 130bd9b

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed

internal/function/is_remote.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package function
2+
3+
import (
4+
"reflect"
5+
6+
"gopkg.in/src-d/go-git.v4/plumbing"
7+
"gopkg.in/src-d/go-mysql-server.v0/sql"
8+
"gopkg.in/src-d/go-mysql-server.v0/sql/expression"
9+
)
10+
11+
// IsRemote checks the given string is a tag name.
12+
type IsRemote struct {
13+
expression.UnaryExpression
14+
}
15+
16+
// NewIsRemote creates a new IsRemote function.
17+
func NewIsRemote(e sql.Expression) *IsRemote {
18+
return &IsRemote{expression.UnaryExpression{Child: e}}
19+
}
20+
21+
var _ sql.Expression = (*IsRemote)(nil)
22+
23+
// Eval implements the expression interface.
24+
func (f *IsRemote) Eval(row sql.Row) (interface{}, error) {
25+
val, err := f.Child.Eval(row)
26+
if err != nil {
27+
return nil, err
28+
}
29+
30+
if val == nil {
31+
return false, nil
32+
}
33+
34+
name, ok := val.(string)
35+
if !ok {
36+
return nil, sql.ErrInvalidType.New(reflect.TypeOf(val).String())
37+
}
38+
39+
return plumbing.ReferenceName(name).IsRemote(), nil
40+
}
41+
42+
// Name implements the Expression interface.
43+
func (IsRemote) Name() string {
44+
return "is_remote"
45+
}
46+
47+
// TransformUp implements the Expression interface.
48+
func (f IsRemote) TransformUp(fn func(sql.Expression) sql.Expression) sql.Expression {
49+
return NewIsRemote(fn(f.Child))
50+
}
51+
52+
// Type implements the Expression interface.
53+
func (IsRemote) Type() sql.Type {
54+
return sql.Boolean
55+
}

internal/function/is_remote_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package function
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/require"
7+
"gopkg.in/src-d/go-mysql-server.v0/sql"
8+
"gopkg.in/src-d/go-mysql-server.v0/sql/expression"
9+
)
10+
11+
func TestIsRemote(t *testing.T) {
12+
f := NewIsRemote(expression.NewGetField(0, sql.Text, "name", true))
13+
14+
testCases := []struct {
15+
name string
16+
row sql.Row
17+
expected bool
18+
err bool
19+
}{
20+
{"null", sql.NewRow(nil), false, false},
21+
{"not a branch", sql.NewRow("foo bar"), false, false},
22+
{"not remote branch", sql.NewRow("refs/heads/foo"), false, false},
23+
{"remote branch", sql.NewRow("refs/remotes/foo/bar"), true, false},
24+
{"mismatched type", sql.NewRow(1), false, true},
25+
}
26+
27+
for _, tt := range testCases {
28+
t.Run(tt.name, func(t *testing.T) {
29+
require := require.New(t)
30+
val, err := f.Eval(tt.row)
31+
if tt.err {
32+
require.Error(err)
33+
require.True(sql.ErrInvalidType.Is(err))
34+
} else {
35+
require.NoError(err)
36+
require.Equal(tt.expected, val)
37+
}
38+
})
39+
}
40+
}

0 commit comments

Comments
 (0)