Skip to content

Commit a4e46d3

Browse files
authored
Merge pull request #12 from sidhant92/develop
Support for default Field
2 parents fb590a9 + 6d9c971 commit a4e46d3

File tree

6 files changed

+58
-16
lines changed

6 files changed

+58
-16
lines changed

internal/parser/antlr/antlr_parser.go

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,26 @@ import (
1010
)
1111

1212
type ANTLRParser struct {
13-
UseCache bool
14-
cache *lru.Cache[string, domain.Node]
13+
UseCache bool
14+
cache *lru.Cache[string, domain.Node]
1515
}
1616

1717
func Default() *ANTLRParser {
1818
return &ANTLRParser{
19-
UseCache: false,
20-
cache: nil,
19+
UseCache: false,
20+
cache: nil,
2121
}
2222
}
2323

2424
func Cached(size int) *ANTLRParser {
2525
cache, _ := lru.New[string, domain.Node](size)
2626
return &ANTLRParser{
27-
UseCache: true,
28-
cache: cache,
27+
UseCache: true,
28+
cache: cache,
2929
}
3030
}
3131

32-
func (p *ANTLRParser) Parse(input string) (res domain.Node, err error) {
32+
func (p *ANTLRParser) Parse(input string, defaultField ...string) (res domain.Node, err error) {
3333
defer func() {
3434
if r := recover(); r != nil {
3535
log.Println("panic occurred:", r)
@@ -56,7 +56,11 @@ func (p *ANTLRParser) Parse(input string) (res domain.Node, err error) {
5656
lexer := lib.NewBooleanExpressionLexer(inputStream)
5757
stream := antlr.NewCommonTokenStream(lexer, antlr.TokenDefaultChannel)
5858
antlrParser := lib.NewBooleanExpressionParser(stream)
59-
listener := New()
59+
var df = ""
60+
if len(defaultField) > 0 {
61+
df = defaultField[0]
62+
}
63+
listener := New(df)
6064
antlr.ParseTreeWalkerDefault.Walk(listener, antlrParser.Parse())
6165
if p.UseCache {
6266
p.cache.Add(input, listener.GetResult())

internal/parser/antlr/listener.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,17 @@ type myListener struct {
1818
Result domain.Node
1919

2020
OperatorService *service.OperatorService
21+
22+
DefaultField string
2123
}
2224

23-
func New() *myListener {
25+
func New(defaultField string) *myListener {
2426
l := myListener{
2527
Nodes: []domain.Node{},
2628
LastToken: nil,
2729
Result: nil,
2830
OperatorService: service.NewOperatorService(),
31+
DefaultField: defaultField,
2932
}
3033
return &l
3134
}
@@ -132,7 +135,8 @@ func (l *myListener) ExitTypesExpression(c *lib.TypesExpressionContext) {
132135
}
133136

134137
func (l *myListener) ExitInExpression(c *lib.InExpressionContext) {
135-
field := c.GetField().GetText()
138+
l.ValidateField(c.GetField(), c.GetText())
139+
field := l.GetField(c.GetField().GetText())
136140

137141
typesContextFilter := func(tree antlr.Tree) bool { return reflect.TypeOf(tree) == reflect.TypeOf(&lib.TypesContext{}) }
138142
var typesContextChildren = util.Filter(c.GetData().GetChildren(), typesContextFilter)
@@ -154,7 +158,8 @@ func (l *myListener) ExitInExpression(c *lib.InExpressionContext) {
154158
}
155159

156160
func (l *myListener) ExitToExpression(c *lib.ToExpressionContext) {
157-
field := c.GetField().GetText()
161+
l.ValidateField(c.GetField(), c.GetText())
162+
field := l.GetField(c.GetField().GetText())
158163
lowerDataType := GetDataType(c.GetLower().GetStart())
159164
lowerValue, _ := util.ConvertValue(c.GetLower().GetStart().GetText(), lowerDataType)
160165
upperDataType := GetDataType(c.GetUpper().GetStart())
@@ -189,7 +194,7 @@ func (l *myListener) ExitNotExpression(c *lib.NotExpressionContext) {
189194
}
190195

191196
func (l *myListener) ExitComparatorExpression(c *lib.ComparatorExpressionContext) {
192-
field := c.GetLeft().GetText()
197+
field := l.GetField(c.GetLeft().GetText())
193198
dataType := GetDataType(c.GetRight().GetStart())
194199
value, _ := util.ConvertValue(c.GetRight().GetText(), dataType)
195200
operator := l.OperatorService.GetOperatorFromSymbol(c.GetOp().GetText())
@@ -249,3 +254,16 @@ func GetDataType(token antlr.Token) constant.DataType {
249254
return constant.STRING
250255
}
251256
}
257+
258+
func (l myListener) ValidateField(token antlr.Token, text string) {
259+
if token == nil || (len(token.GetText()) == 0 && len(text) == 0) {
260+
panic("Invalid Expression, field and default value both are empty")
261+
}
262+
}
263+
264+
func (l myListener) GetField(field string) string {
265+
if len(field) == 0 {
266+
return l.DefaultField
267+
}
268+
return field
269+
}

pkg/application/boolean_expression_evaluator.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ type BooleanExpressionEvaluator struct {
1515
OperatorService *service.OperatorService
1616
}
1717

18-
func (b *BooleanExpressionEvaluator) Evaluate(expression string, data map[string]interface{}) (bool, error) {
19-
node, err := b.Parser.Parse(expression)
18+
func (b *BooleanExpressionEvaluator) Evaluate(expression string, data map[string]interface{}, defaultField ...string) (bool, error) {
19+
node, err := b.Parser.Parse(expression, defaultField...)
2020
if err != nil {
2121
return false, err
2222
}

pkg/application/boolean_expression_evaluator_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,3 +409,21 @@ func TestStringEqualityWithQuotes(t *testing.T) {
409409
assert.Nil(t, err)
410410
assert.True(t, res)
411411
}
412+
413+
func TestDefaultFieldTrue(t *testing.T) {
414+
data := map[string]interface{}{
415+
"age": 19,
416+
}
417+
res, err := evaluator.Evaluate(">= 18 AND < 20", data, "age")
418+
assert.Nil(t, err)
419+
assert.True(t, res)
420+
}
421+
422+
func TestDefaultFieldFalse(t *testing.T) {
423+
data := map[string]interface{}{
424+
"age": 17,
425+
}
426+
res, err := evaluator.Evaluate(">= 18 AND < 20", data, "age")
427+
assert.Nil(t, err)
428+
assert.False(t, res)
429+
}

pkg/error/errors.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ var INVALID_DATA_TYPE = errors.New("invalid data type")
66

77
var INVALID_UNARY_OPERAND = errors.New("invalid unary operand")
88

9-
var KEY_DATA_NOT_PRESENT = errors.New("key data not present")
9+
var KEY_DATA_NOT_PRESENT = errors.New("key data not present")
10+
11+
var INVALID_EXPRESSION = errors.New("invalid expression")

pkg/parser/parser.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
)
77

88
type Parser interface {
9-
Parse(input string) (domain.Node, error)
9+
Parse(input string, defaultField ...string) (domain.Node, error)
1010
}
1111

1212
func New() Parser {

0 commit comments

Comments
 (0)