Skip to content

Commit

Permalink
fix && and || expression chaining (#8)
Browse files Browse the repository at this point in the history
  • Loading branch information
deankarn committed Jul 29, 2022
1 parent 8670192 commit ac0e869
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 13 deletions.
7 changes: 6 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.3.2] - 2022-07-29
### Fixed
- && and || expression chaining.

## [0.3.1] - 2022-07-19
### Fixed
- Fixed number parsing for exponential numbers eg. 1e10.
Expand Down Expand Up @@ -35,7 +39,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Initial conversion from https://github.com/rust-playground/ksql.

[Unreleased]: https://github.com/go-playground/ksql/compare/v0.3.1...HEAD
[Unreleased]: https://github.com/go-playground/ksql/compare/v0.3.2...HEAD
[0.3.2]: https://github.com/go-playground/ksql/compare/v0.3.1...v0.3.2
[0.3.1]: https://github.com/go-playground/ksql/compare/v0.3.0...v0.3.1
[0.3.0]: https://github.com/go-playground/ksql/compare/v0.2.0...v0.3.0
[0.2.0]: https://github.com/go-playground/ksql/compare/v0.1.1...v0.2.0
Expand Down
2 changes: 1 addition & 1 deletion benchmarks_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ func BenchmarkParsingCoerceDateTimeSelectorConstant(b *testing.B) {
}

func BenchmarkExecutionNumPlusNum(b *testing.B) {
benchExecution(b, "1 + 1", ``)
benchExecution(b, "1 + 1 + 1 + 1 + 1", ``)
}

func BenchmarkExecutionIdentNum(b *testing.B) {
Expand Down
20 changes: 9 additions & 11 deletions parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ func (p *parser) parseValue(token Token) (Expression, error) {
expression, err := p.parseExpression()
if err != nil {
if errors.Is(err, io.EOF) {
return nil, errors.New("expression after open parenthesis '(' ends unexpectedly.")
return nil, errors.New("expression after open parenthesis '(' ends unexpectedly")
}
return nil, err
}
Expand Down Expand Up @@ -347,12 +347,11 @@ func (p *parser) parseOperation(token Token, current Expression) (Expression, er
}, nil

case Or:
nextToken, err := p.nextOperatorToken(token)
if err != nil {
return nil, err
}
right, err := p.parseValue(nextToken)
right, err := p.parseExpression()
if err != nil {
if errors.Is(err, io.EOF) {
return nil, errors.New("expression after or '||' ends unexpectedly")
}
return nil, err
}
return or{
Expand All @@ -361,12 +360,11 @@ func (p *parser) parseOperation(token Token, current Expression) (Expression, er
}, nil

case And:
nextToken, err := p.nextOperatorToken(token)
if err != nil {
return nil, err
}
right, err := p.parseValue(nextToken)
right, err := p.parseExpression()
if err != nil {
if errors.Is(err, io.EOF) {
return nil, errors.New("expression after or '&&' ends unexpectedly")
}
return nil, err
}
return and{
Expand Down
36 changes: 36 additions & 0 deletions parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -518,6 +518,42 @@ func TestParser(t *testing.T) {
src: ``,
expected: true,
},
{
name: "random expression 1",
exp: `.NumberOfEmployees > "200" && .AnnualRevenue == "2000000"`,
src: `{"AnnualRevenue":"2000000","NumberOfEmployees":"201","FirstName":"scott"}`,
expected: true,
},
{
name: "random expression 2",
exp: `.AnnualRevenue >= "5000000" || (.NumberOfEmployees > "200" && .AnnualRevenue == "2000000")`,
src: `{"AnnualRevenue":"2000000","NumberOfEmployees":"201","FirstName":"scott"}`,
expected: true,
},
{
name: "random expression 3",
exp: `.AnnualRevenue >= "5000000" || (true && .AnnualRevenue == "2000000")`,
src: `{"AnnualRevenue":"2000000","NumberOfEmployees":"201","FirstName":"scott"}`,
expected: true,
},
{
name: "random expression 4",
exp: `.AnnualRevenue >= "5000000" || (.NumberOfEmployees > "200" && true)`,
src: `{"AnnualRevenue":"2000000","NumberOfEmployees":"201","FirstName":"scott"}`,
expected: true,
},
{
name: "random expression 5",
exp: `true || (.NumberOfEmployees > "200" && .AnnualRevenue == "2000000")`,
src: `{"AnnualRevenue":"2000000","NumberOfEmployees":"201","FirstName":"scott"}`,
expected: true,
},
{
name: "random expression 6",
exp: `false || (.NumberOfEmployees > "200" && .AnnualRevenue == "2000000")`,
src: `{"AnnualRevenue":"2000000","NumberOfEmployees":"201","FirstName":"scott"}`,
expected: true,
},
}

for _, tc := range tests {
Expand Down

0 comments on commit ac0e869

Please sign in to comment.