Skip to content

Commit ac0e869

Browse files
author
Dean Karn
authored
fix && and || expression chaining (#8)
1 parent 8670192 commit ac0e869

File tree

4 files changed

+52
-13
lines changed

4 files changed

+52
-13
lines changed

CHANGELOG.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
66

77
## [Unreleased]
88

9+
## [0.3.2] - 2022-07-29
10+
### Fixed
11+
- && and || expression chaining.
12+
913
## [0.3.1] - 2022-07-19
1014
### Fixed
1115
- Fixed number parsing for exponential numbers eg. 1e10.
@@ -35,7 +39,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3539
### Added
3640
- Initial conversion from https://github.com/rust-playground/ksql.
3741

38-
[Unreleased]: https://github.com/go-playground/ksql/compare/v0.3.1...HEAD
42+
[Unreleased]: https://github.com/go-playground/ksql/compare/v0.3.2...HEAD
43+
[0.3.2]: https://github.com/go-playground/ksql/compare/v0.3.1...v0.3.2
3944
[0.3.1]: https://github.com/go-playground/ksql/compare/v0.3.0...v0.3.1
4045
[0.3.0]: https://github.com/go-playground/ksql/compare/v0.2.0...v0.3.0
4146
[0.2.0]: https://github.com/go-playground/ksql/compare/v0.1.1...v0.2.0

benchmarks_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ func BenchmarkParsingCoerceDateTimeSelectorConstant(b *testing.B) {
9393
}
9494

9595
func BenchmarkExecutionNumPlusNum(b *testing.B) {
96-
benchExecution(b, "1 + 1", ``)
96+
benchExecution(b, "1 + 1 + 1 + 1 + 1", ``)
9797
}
9898

9999
func BenchmarkExecutionIdentNum(b *testing.B) {

parser.go

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ func (p *parser) parseValue(token Token) (Expression, error) {
117117
expression, err := p.parseExpression()
118118
if err != nil {
119119
if errors.Is(err, io.EOF) {
120-
return nil, errors.New("expression after open parenthesis '(' ends unexpectedly.")
120+
return nil, errors.New("expression after open parenthesis '(' ends unexpectedly")
121121
}
122122
return nil, err
123123
}
@@ -347,12 +347,11 @@ func (p *parser) parseOperation(token Token, current Expression) (Expression, er
347347
}, nil
348348

349349
case Or:
350-
nextToken, err := p.nextOperatorToken(token)
351-
if err != nil {
352-
return nil, err
353-
}
354-
right, err := p.parseValue(nextToken)
350+
right, err := p.parseExpression()
355351
if err != nil {
352+
if errors.Is(err, io.EOF) {
353+
return nil, errors.New("expression after or '||' ends unexpectedly")
354+
}
356355
return nil, err
357356
}
358357
return or{
@@ -361,12 +360,11 @@ func (p *parser) parseOperation(token Token, current Expression) (Expression, er
361360
}, nil
362361

363362
case And:
364-
nextToken, err := p.nextOperatorToken(token)
365-
if err != nil {
366-
return nil, err
367-
}
368-
right, err := p.parseValue(nextToken)
363+
right, err := p.parseExpression()
369364
if err != nil {
365+
if errors.Is(err, io.EOF) {
366+
return nil, errors.New("expression after or '&&' ends unexpectedly")
367+
}
370368
return nil, err
371369
}
372370
return and{

parser_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,42 @@ func TestParser(t *testing.T) {
518518
src: ``,
519519
expected: true,
520520
},
521+
{
522+
name: "random expression 1",
523+
exp: `.NumberOfEmployees > "200" && .AnnualRevenue == "2000000"`,
524+
src: `{"AnnualRevenue":"2000000","NumberOfEmployees":"201","FirstName":"scott"}`,
525+
expected: true,
526+
},
527+
{
528+
name: "random expression 2",
529+
exp: `.AnnualRevenue >= "5000000" || (.NumberOfEmployees > "200" && .AnnualRevenue == "2000000")`,
530+
src: `{"AnnualRevenue":"2000000","NumberOfEmployees":"201","FirstName":"scott"}`,
531+
expected: true,
532+
},
533+
{
534+
name: "random expression 3",
535+
exp: `.AnnualRevenue >= "5000000" || (true && .AnnualRevenue == "2000000")`,
536+
src: `{"AnnualRevenue":"2000000","NumberOfEmployees":"201","FirstName":"scott"}`,
537+
expected: true,
538+
},
539+
{
540+
name: "random expression 4",
541+
exp: `.AnnualRevenue >= "5000000" || (.NumberOfEmployees > "200" && true)`,
542+
src: `{"AnnualRevenue":"2000000","NumberOfEmployees":"201","FirstName":"scott"}`,
543+
expected: true,
544+
},
545+
{
546+
name: "random expression 5",
547+
exp: `true || (.NumberOfEmployees > "200" && .AnnualRevenue == "2000000")`,
548+
src: `{"AnnualRevenue":"2000000","NumberOfEmployees":"201","FirstName":"scott"}`,
549+
expected: true,
550+
},
551+
{
552+
name: "random expression 6",
553+
exp: `false || (.NumberOfEmployees > "200" && .AnnualRevenue == "2000000")`,
554+
src: `{"AnnualRevenue":"2000000","NumberOfEmployees":"201","FirstName":"scott"}`,
555+
expected: true,
556+
},
521557
}
522558

523559
for _, tc := range tests {

0 commit comments

Comments
 (0)