Skip to content

Commit

Permalink
#69 Fix the sum and avg function for the only numeric value. (#70)
Browse files Browse the repository at this point in the history
  • Loading branch information
spyzhov authored Jun 14, 2024
1 parent a3c0a6b commit 71e4170
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 4 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ func main() {
You can download `ajson` cli from the [release page](https://github.com/spyzhov/ajson/releases), or install from the source:

```shell script
go get github.com/spyzhov/ajson/cmd/[email protected].2
go get github.com/spyzhov/ajson/cmd/[email protected].3
```

Usage:
Expand Down
2 changes: 1 addition & 1 deletion cmd/ajson/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (
"github.com/spyzhov/ajson"
)

var version = "v0.9.2"
var version = "v0.9.3"

func usage() {
text := ``
Expand Down
69 changes: 69 additions & 0 deletions jsonpath_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1595,3 +1595,72 @@ func TestEval_issue_67(t *testing.T) {
})
}
}

// TestEval_issue_69 is a test for https://github.com/spyzhov/ajson/issues/69
func TestEval_issue_69(t *testing.T) {
root := Must(Unmarshal([]byte(`
{
"items": [
{
"price":1,
"type": "A"
},
{
"price":2,
"type": "B"
},
{
"price":3,
"type": "C"
},
null
]
}`)))

tests := []struct {
name string
wantResult interface{}
}{
{
name: `sum($.items[?(@.type == "A")].price)`,
wantResult: float64(1),
},
{
name: `avg($.items[?(@.type == "A")].price)`,
wantResult: float64(1),
},
{
name: `sum($.items[?(@.type == "D")].price)`,
wantResult: nil,
},
{
name: `avg($.items[?(@.type == "D")].price)`,
wantResult: nil,
},
{
name: `sum($.items[?(@ == null)].price)`,
wantResult: nil,
},
{
name: `avg($.items[?(@ == null)].price)`,
wantResult: nil,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
gotResult, err := Eval(root, tt.name)
if err != nil {
t.Errorf("Eval(avg|sum) error = %v", err)
return
}
value, err := gotResult.Value()
if err != nil {
t.Errorf("Node.Value() error = %v", err)
return
}
if !reflect.DeepEqual(value, tt.wantResult) {
t.Errorf("Eval(avg|sum) gotResult = %v, want %v", gotResult, tt.wantResult)
}
})
}
}
14 changes: 14 additions & 0 deletions math.go
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,13 @@ var (
}
return valueNode(nil, "avg", Numeric, sum/float64(node.Size())), nil
}
if node.IsNumeric() {
value, err := node.GetNumeric()
if err != nil {
return nil, err
}
return valueNode(nil, "avg", Numeric, value), nil
}
return valueNode(nil, "avg", Null, nil), nil
},
"b64decode": func(node *Node) (result *Node, err error) {
Expand Down Expand Up @@ -481,6 +488,13 @@ var (
}
return valueNode(nil, "sum", Numeric, sum), nil
}
if node.IsNumeric() {
value, err := node.GetNumeric()
if err != nil {
return nil, err
}
return valueNode(nil, "sum", Numeric, value), nil
}
return valueNode(nil, "sum", Null, nil), nil
},
"not": func(node *Node) (result *Node, err error) {
Expand Down
6 changes: 4 additions & 2 deletions math_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -456,7 +456,7 @@ func TestFunctions2(t *testing.T) {
valueNode(nil, "", Numeric, "foo"),
valueNode(nil, "", Numeric, "foo"),
}), fail: true},
{name: "avg error 2", fname: "avg", value: _e, fail: false, result: NullNode("")},
{name: "avg error 2", fname: "avg", value: _e, fail: true},
{name: "avg array 1", fname: "avg", value: ArrayNode("test", []*Node{
NumericNode("", 1),
NumericNode("", 1),
Expand All @@ -475,6 +475,7 @@ func TestFunctions2(t *testing.T) {
}), result: NumericNode("", 2)},
{name: "avg array blank", fname: "avg", value: ArrayNode("test", []*Node{}), result: NumericNode("", 0)},
{name: "avg nil", fname: "avg", value: nil, result: NullNode("")},
{name: "avg one", fname: "avg", value: NumericNode("", 123), result: NumericNode("", 123)},

{name: "b64encode_std_padding multiple of 3", fname: "b64encode", value: StringNode("", "Short string"), result: StringNode("", "U2hvcnQgc3RyaW5n")},
{name: "b64encode_std_padding remainder 2", fname: "b64encode", value: StringNode("", "A test string"), result: StringNode("", "QSB0ZXN0IHN0cmluZw==")},
Expand Down Expand Up @@ -503,7 +504,7 @@ func TestFunctions2(t *testing.T) {
valueNode(nil, "", Numeric, "foo"),
valueNode(nil, "", Numeric, "foo"),
}), fail: true},
{name: "sum error 2", fname: "sum", value: _e, fail: false, result: NullNode("")},
{name: "sum error 2", fname: "sum", value: _e, fail: true},
{name: "sum array 1", fname: "sum", value: ArrayNode("test", []*Node{
NumericNode("", 1),
NumericNode("", 1),
Expand All @@ -522,6 +523,7 @@ func TestFunctions2(t *testing.T) {
}), result: NumericNode("", 6)},
{name: "sum array blank", fname: "sum", value: ArrayNode("test", []*Node{}), result: NumericNode("", 0)},
{name: "sum nil", fname: "sum", value: nil, result: NullNode("")},
{name: "sum one", fname: "sum", value: NumericNode("", 123), result: NumericNode("", 123)},

{name: "rand", fname: "rand", value: StringNode("test", "test"), fail: true},
{name: "randint", fname: "randint", value: StringNode("test", "test"), fail: true},
Expand Down

0 comments on commit 71e4170

Please sign in to comment.