mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-09-07 09:05:55 +00:00
190 lines
4.1 KiB
Go
190 lines
4.1 KiB
Go
package query
|
|
|
|
import (
|
|
"testing"
|
|
. "github.com/smartystreets/goconvey/convey"
|
|
)
|
|
|
|
func TestLexer(t *testing.T) {
|
|
Convey("Basic lexical analysis", t, func() {
|
|
var tokens []Token
|
|
var err error
|
|
|
|
tokens, err = Lex("get(10)")
|
|
So(err, ShouldBeNil)
|
|
So(len(tokens), ShouldEqual, 4)
|
|
So(tokens, ShouldResemble, []Token{
|
|
{"get", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"10", TYPE_VALUE},
|
|
{")", TYPE_RP},
|
|
})
|
|
|
|
tokens, err = Lex("get(id=10)")
|
|
So(err, ShouldBeNil)
|
|
So(tokens, ShouldResemble, []Token{
|
|
{"get", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"id", TYPE_KEYWORD},
|
|
{"=", TYPE_EQUALS},
|
|
{"10", TYPE_VALUE},
|
|
{")", TYPE_RP},
|
|
})
|
|
|
|
tokens, err = Lex("get(id=10, frame=brand)")
|
|
So(err, ShouldBeNil)
|
|
So(tokens, ShouldResemble, []Token{
|
|
{"get", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"id", TYPE_KEYWORD},
|
|
{"=", TYPE_EQUALS},
|
|
{"10", TYPE_VALUE},
|
|
{",", TYPE_COMMA},
|
|
{"frame", TYPE_KEYWORD},
|
|
{"=", TYPE_EQUALS},
|
|
{"brand", TYPE_VALUE},
|
|
{")", TYPE_RP},
|
|
})
|
|
|
|
tokens, err = Lex("union(get(10))")
|
|
So(err, ShouldBeNil)
|
|
So(tokens, ShouldResemble, []Token{
|
|
{"union", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"get", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"10", TYPE_VALUE},
|
|
{")", TYPE_RP},
|
|
{")", TYPE_RP},
|
|
})
|
|
|
|
tokens, err = Lex("intersect(get(10), get(11), get(12))")
|
|
So(err, ShouldBeNil)
|
|
So(tokens, ShouldResemble, []Token{
|
|
{"intersect", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"get", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"10", TYPE_VALUE},
|
|
{")", TYPE_RP},
|
|
{",", TYPE_COMMA},
|
|
{"get", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"11", TYPE_VALUE},
|
|
{")", TYPE_RP},
|
|
{",", TYPE_COMMA},
|
|
{"get", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"12", TYPE_VALUE},
|
|
{")", TYPE_RP},
|
|
{")", TYPE_RP},
|
|
})
|
|
|
|
tokens, err = Lex("intersect(get(10), get(11), concat(get(12),get(14)))")
|
|
So(err, ShouldBeNil)
|
|
So(tokens, ShouldResemble, []Token{
|
|
{"intersect", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"get", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"10", TYPE_VALUE},
|
|
{")", TYPE_RP},
|
|
{",", TYPE_COMMA},
|
|
{"get", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"11", TYPE_VALUE},
|
|
{")", TYPE_RP},
|
|
{",", TYPE_COMMA},
|
|
{"concat", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"get", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"12", TYPE_VALUE},
|
|
{")", TYPE_RP},
|
|
{",", TYPE_COMMA},
|
|
{"get", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"14", TYPE_VALUE},
|
|
{")", TYPE_RP},
|
|
{")", TYPE_RP},
|
|
{")", TYPE_RP},
|
|
})
|
|
|
|
tokens, err = Lex("concat(get(1, brand),get(2))")
|
|
So(err, ShouldBeNil)
|
|
So(tokens, ShouldResemble, []Token{
|
|
{"concat", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"get", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"1", TYPE_VALUE},
|
|
{",", TYPE_COMMA},
|
|
{"brand", TYPE_VALUE},
|
|
{")", TYPE_RP},
|
|
{",", TYPE_COMMA},
|
|
{"get", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"2", TYPE_VALUE},
|
|
{")", TYPE_RP},
|
|
{")", TYPE_RP},
|
|
})
|
|
|
|
tokens, err = Lex("set(1, 987)")
|
|
So(err, ShouldBeNil)
|
|
So(tokens, ShouldResemble, []Token{
|
|
{"set", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"1", TYPE_VALUE},
|
|
{",", TYPE_COMMA},
|
|
{"987", TYPE_VALUE},
|
|
{")", TYPE_RP},
|
|
})
|
|
|
|
tokens, err = Lex("set(1, general, 987)")
|
|
So(err, ShouldBeNil)
|
|
So(tokens, ShouldResemble, []Token{
|
|
{"set", TYPE_FUNC},
|
|
{"(", TYPE_LP},
|
|
{"1", TYPE_VALUE},
|
|
{",", TYPE_COMMA},
|
|
{"general", TYPE_VALUE},
|
|
{",", TYPE_COMMA},
|
|
{"987", TYPE_VALUE},
|
|
{")", TYPE_RP},
|
|
})
|
|
|
|
tokens, err = Lex("top-n(get(10), 8)")
|
|
So(tokens, ShouldResemble, []Token{
|
|
Token{"top-n", TYPE_FUNC},
|
|
Token{"(", TYPE_LP},
|
|
Token{"get", TYPE_FUNC},
|
|
Token{"(", TYPE_LP},
|
|
Token{"10", TYPE_VALUE},
|
|
Token{")", TYPE_RP},
|
|
Token{",", TYPE_COMMA},
|
|
Token{"8", TYPE_VALUE},
|
|
Token{")", TYPE_RP},
|
|
})
|
|
|
|
tokens, err = Lex("top-n(get(10, general), [1,2,3])")
|
|
So(tokens, ShouldResemble, []Token{
|
|
Token{"top-n", TYPE_FUNC},
|
|
Token{"(", TYPE_LP},
|
|
Token{"get", TYPE_FUNC},
|
|
Token{"(", TYPE_LP},
|
|
Token{"10", TYPE_VALUE},
|
|
Token{",", TYPE_COMMA},
|
|
Token{"general", TYPE_VALUE},
|
|
Token{")", TYPE_RP},
|
|
Token{",", TYPE_COMMA},
|
|
Token{"[", TYPE_LB},
|
|
Token{"1", TYPE_VALUE},
|
|
Token{",", TYPE_COMMA},
|
|
Token{"2", TYPE_VALUE},
|
|
Token{",", TYPE_COMMA},
|
|
Token{"3", TYPE_VALUE},
|
|
Token{"]", TYPE_RB},
|
|
Token{")", TYPE_RP},
|
|
})
|
|
})
|
|
}
|