2016-10-17 07:14:01 +03:00
|
|
|
package ast
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
2023-04-02 22:49:45 +03:00
|
|
|
"github.com/stretchr/testify/assert"
|
2023-11-20 04:06:36 +03:00
|
|
|
|
|
|
|
"github.com/neilotoole/slogt"
|
2016-10-17 07:14:01 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestWalker(t *testing.T) {
|
2023-07-03 18:34:19 +03:00
|
|
|
const q1 = `@mydb1 | .user | join(.address, .user.uid == .address.uid) | .uid, .username, .country`
|
2016-10-17 07:14:01 +03:00
|
|
|
|
2023-07-03 18:34:19 +03:00
|
|
|
p := getSLQParser(q1)
|
2016-10-17 07:14:01 +03:00
|
|
|
query := p.Query()
|
2023-07-03 18:34:19 +03:00
|
|
|
ast, err := buildAST(slogt.New(t), query)
|
2016-10-17 07:14:01 +03:00
|
|
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.NotNil(t, ast)
|
|
|
|
|
2023-04-07 11:00:49 +03:00
|
|
|
walker := NewWalker(ast)
|
2016-10-17 07:14:01 +03:00
|
|
|
count := 0
|
|
|
|
|
2023-04-07 11:00:49 +03:00
|
|
|
visitor := func(w *Walker, node Node) error {
|
2016-10-17 07:14:01 +03:00
|
|
|
count++
|
|
|
|
return w.visitChildren(node)
|
|
|
|
}
|
|
|
|
|
2023-03-22 09:17:34 +03:00
|
|
|
walker.AddVisitor(typeJoinNode, visitor)
|
2016-10-17 07:14:01 +03:00
|
|
|
err = walker.Walk()
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, 1, count)
|
|
|
|
|
|
|
|
// test multiple visitors on the same node type
|
2023-04-07 11:00:49 +03:00
|
|
|
walker = NewWalker(ast)
|
2016-10-17 07:14:01 +03:00
|
|
|
countA := 0
|
2023-04-07 11:00:49 +03:00
|
|
|
visitorA := func(w *Walker, node Node) error {
|
2016-10-17 07:14:01 +03:00
|
|
|
countA++
|
|
|
|
return w.visitChildren(node)
|
|
|
|
}
|
|
|
|
countB := 0
|
2023-04-07 11:00:49 +03:00
|
|
|
visitorB := func(w *Walker, node Node) error {
|
2016-10-17 07:14:01 +03:00
|
|
|
countB++
|
|
|
|
return w.visitChildren(node)
|
|
|
|
}
|
|
|
|
|
2023-03-22 09:17:34 +03:00
|
|
|
walker.AddVisitor(typeTblSelectorNode, visitorA)
|
|
|
|
walker.AddVisitor(typeColSelectorNode, visitorB)
|
2016-10-17 07:14:01 +03:00
|
|
|
err = walker.Walk()
|
|
|
|
assert.Nil(t, err)
|
2023-07-03 18:34:19 +03:00
|
|
|
assert.Equal(t, 1, countA)
|
2023-03-22 09:17:34 +03:00
|
|
|
assert.Equal(t, 3, countB)
|
2016-10-17 07:14:01 +03:00
|
|
|
}
|